ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDA5ZTQ3MWYuLmU3MjcxMzA0IDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTE4NSw2ICsxODUsNyBAQAogCXRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbCBcCiAJdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lJY2NQaG9uZUJvb2suYWlkbCBcCiAJdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lTbXMuYWlkbCBcCisJdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lXYXBQdXNoTWFuYWdlci5haWRsIFwKIAl3aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbCBcCiAJdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lFeHRlbmRlZE5ldHdvcmtTZXJ2aWNlLmFpZGwgXAogCXZwbi9qYXZhL2FuZHJvaWQvbmV0L3Zwbi9JVnBuU2VydmljZS5haWRsIFwKZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBlMTBiMzU3Li5jNDMwNzViIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0xOTU5OCw2ICsxOTU5OCwxOCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWxlcnREaWFsb2cuQnVpbGRlciIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZW1lIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjcmVhdGUiCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5BbGVydERpYWxvZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NDIyMCw2ICs1NDIzMiw0MiBAQAogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJxdWVyeU51bUVudHJpZXMiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJxdWVyeU51bUVudHJpZXMiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Njc5Nyw2ICs1Njg0NSwyOSBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBCeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGF2aW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxpbWl0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJ1aWxkUXVlcnkiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb25JbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBCeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01Njg3NCw2ICs1Njk0NSwzMyBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBCeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGF2aW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJ1aWxkVW5pb25TdWJRdWVyeSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHlwZURpc2NyaW1pbmF0b3JDb2x1bW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaW9uQ29sdW1ucyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5zUHJlc2VudEluVGFibGUiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbXB1dGVkQ29sdW1uc09mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0eXBlRGlzY3JpbWluYXRvclZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBCeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01NzA5Miw2ICs1NzE5MCwxOTI4IEBACiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgogPC9wYWNrYWdlPgorPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5kcm0iCis+Cis8Y2xhc3MgbmFtZT0iRHJtQ29udmVydGVkU3RhdHVzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEcm1Db252ZXJ0ZWRTdGF0dXMiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtQ29udmVydGVkU3RhdHVzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iX3N0YXR1c0NvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iX2NvbnZlcnRlZERhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iX29mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJTVEFUVVNfRVJST1IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRVU19JTlBVVERBVEFfRVJST1IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRVU19PSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY29udmVydGVkRGF0YSIKKyB0eXBlPSJieXRlW10iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im9mZnNldCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN0YXR1c0NvZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRHJtRXJyb3JFdmVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmRybS5Ecm1FdmVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybUVycm9yRXZlbnQiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtRXJyb3JFdmVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXF1ZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iVFlQRV9OT1RfU1VQUE9SVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjAwMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX05PX0lOVEVSTkVUX0NPTk5FQ1RJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDA1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfT1VUX09GX01FTU9SWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIwMDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIwMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9SRU1PVkVfQUxMX1JJR0hUU19GQUlMRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDA3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUklHSFRTX05PVF9JTlNUQUxMRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDAxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUklHSFRTX1JFTkVXQUxfTk9UX0FMTE9XRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEcm1FdmVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtRXZlbnQiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtRXZlbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1bmlxdWVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRNZXNzYWdlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVuaXF1ZUlkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRFJNX0lORk9fU1RBVFVTX09CSkVDVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkcm1faW5mb19zdGF0dXNfb2JqZWN0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfQUxMX1JJR0hUU19SRU1PVkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX0RSTV9JTkZPX1BST0NFU1NFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRybUluZm8iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybUluZm8iCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtSW5mbyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZm9UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybUluZm8iCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtSW5mbyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZm9UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0IgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERhdGEiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5mb1R5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWltZVR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O2phdmEubGFuZy5PYmplY3QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImtleUl0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRHJtSW5mb0V2ZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuZHJtLkRybUV2ZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtSW5mb0V2ZW50IgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybUluZm9FdmVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXF1ZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iVFlQRV9BQ0NPVU5UX0FMUkVBRFlfUkVHSVNURVJFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1JFTU9WRV9SSUdIVFMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUklHSFRTX0lOU1RBTExFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9XQUlUX0ZPUl9SSUdIVFMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEcm1JbmZvUmVxdWVzdCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtSW5mb1JlcXVlc3QiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtSW5mb1JlcXVlc3QiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmZvVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbmZvVHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNaW1lVHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7amF2YS5sYW5nLk9iamVjdCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ia2V5SXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFDQ09VTlRfSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YWNjb3VudF9pZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVUJTQ1JJUFRJT05fSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c3Vic2NyaXB0aW9uX2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUkVHSVNUUkFUSU9OX0lORk8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX1BST0dSRVNTX0lORk8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRybUluZm9TdGF0dXMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybUluZm9TdGF0dXMiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtSW5mb1N0YXR1cyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Il9zdGF0dXNDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Il9pbmZvVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJfZGF0YSIgdHlwZT0iYW5kcm9pZC5kcm0uUHJvY2Vzc2VkRGF0YSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iX21pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJTVEFUVVNfRVJST1IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRVU19PSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGF0YSIKKyB0eXBlPSJhbmRyb2lkLmRybS5Qcm9jZXNzZWREYXRhIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbmZvVHlwZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1pbWVUeXBlIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN0YXR1c0NvZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRHJtTWFuYWdlckNsaWVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtTWFuYWdlckNsaWVudCIKKyB0eXBlPSJhbmRyb2lkLmRybS5Ecm1NYW5hZ2VyQ2xpZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhY3F1aXJlRHJtSW5mbyIKKyByZXR1cm49ImFuZHJvaWQuZHJtLkRybUluZm8iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRybUluZm9SZXF1ZXN0IiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1JbmZvUmVxdWVzdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhY3F1aXJlUmlnaHRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcm1JbmZvUmVxdWVzdCIgdHlwZT0iYW5kcm9pZC5kcm0uRHJtSW5mb1JlcXVlc3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuSGFuZGxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuSGFuZGxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNoZWNrUmlnaHRzU3RhdHVzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNoZWNrUmlnaHRzU3RhdHVzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjaGVja1JpZ2h0c1N0YXR1cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2hlY2tSaWdodHNTdGF0dXMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZUNvbnZlcnRTZXNzaW9uIgorIHJldHVybj0iYW5kcm9pZC5kcm0uRHJtQ29udmVydGVkU3RhdHVzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb252ZXJ0SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb252ZXJ0RGF0YSIKKyByZXR1cm49ImFuZHJvaWQuZHJtLkRybUNvbnZlcnRlZFN0YXR1cyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udmVydElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0RGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEF2YWlsYWJsZURybUVuZ2luZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29uc3RyYWludHMiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29uc3RyYWludHMiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERybU9iamVjdFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERybU9iamVjdFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZXRhZGF0YSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1ldGFkYXRhIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE9yaWdpbmFsTWltZVR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE9yaWdpbmFsTWltZVR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuQ29udmVydFNlc3Npb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InByb2Nlc3NEcm1JbmZvIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcm1JbmZvIiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1JbmZvIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUFsbFJpZ2h0cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVSaWdodHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlUmlnaHRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlUmlnaHRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcm1SaWdodHMiIHR5cGU9ImFuZHJvaWQuZHJtLkRybVJpZ2h0cyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHRzUGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGVudFBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uRXJyb3JMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JMaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kcm0uRHJtTWFuYWdlckNsaWVudC5PbkVycm9yTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25FdmVudExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudExpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1NYW5hZ2VyQ2xpZW50Lk9uRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkluZm9MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mb0xpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1NYW5hZ2VyQ2xpZW50Lk9uSW5mb0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRVJST1JfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVJST1JfVU5LTk9XTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yMDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRHJtTWFuYWdlckNsaWVudC5PbkVycm9yTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uRXJyb3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNsaWVudCIgdHlwZT0iYW5kcm9pZC5kcm0uRHJtTWFuYWdlckNsaWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQuZHJtLkRybUVycm9yRXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJEcm1NYW5hZ2VyQ2xpZW50Lk9uRXZlbnRMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25FdmVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2xpZW50IiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1NYW5hZ2VyQ2xpZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC5kcm0uRHJtRXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9ImphdmEudXRpbC5IYXNoTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iRHJtTWFuYWdlckNsaWVudC5PbkluZm9MaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25JbmZvIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGllbnQiIHR5cGU9ImFuZHJvaWQuZHJtLkRybU1hbmFnZXJDbGllbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLmRybS5Ecm1JbmZvRXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkRybVJpZ2h0cyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtUmlnaHRzIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVJpZ2h0cyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJpZ2h0c0ZpbGVQYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtUmlnaHRzIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVJpZ2h0cyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJpZ2h0c0ZpbGVQYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYWNjb3VudElkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEcm1SaWdodHMiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtUmlnaHRzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHRzRmlsZVBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhY2NvdW50SWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnNjcmlwdGlvbklkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEcm1SaWdodHMiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtUmlnaHRzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHRzRmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtUmlnaHRzIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVJpZ2h0cyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuZHJtLlByb2Nlc3NlZERhdGEiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0QWNjb3VudElkIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREYXRhIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJzY3JpcHRpb25JZCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRHJtU3RvcmUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybVN0b3JlIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVN0b3JlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRybVN0b3JlLkFjdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEcm1TdG9yZS5BY3Rpb24iCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtU3RvcmUuQWN0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iREVGQVVMVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhFQ1VURSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1VUUFVUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQUkVWSUVXIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSSU5HVE9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNGRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRHJtU3RvcmUuQ29uc3RyYWludHNDb2x1bW5zIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGZpZWxkIG5hbWU9IkVYVEVOREVEX01FVEFEQVRBIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2V4dGVuZGVkX21ldGFkYXRhJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkxJQ0VOU0VfQVZBSUxBQkxFX1RJTUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7bGljZW5zZV9hdmFpbGFibGVfdGltZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMSUNFTlNFX0VYUElSWV9USU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2xpY2Vuc2VfZXhwaXJ5X3RpbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTElDRU5TRV9TVEFSVF9USU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2xpY2Vuc2Vfc3RhcnRfdGltZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVhfUkVQRUFUX0NPVU5UIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O21heF9yZXBlYXRfY291bnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkVNQUlOSU5HX1JFUEVBVF9DT1VOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtyZW1haW5pbmdfcmVwZWF0X2NvdW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iRHJtU3RvcmUuRHJtT2JqZWN0VHlwZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEcm1TdG9yZS5Ecm1PYmplY3RUeXBlIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVN0b3JlLkRybU9iamVjdFR5cGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJDT05URU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSSUdIVFNfT0JKRUNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUklHR0VSX09CSkVDVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5LTk9XTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRybVN0b3JlLlBsYXliYWNrIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybVN0b3JlLlBsYXliYWNrIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVN0b3JlLlBsYXliYWNrIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iUEFVU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFU1VNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUT1AiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEcm1TdG9yZS5SaWdodHNTdGF0dXMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtU3RvcmUuUmlnaHRzU3RhdHVzIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVN0b3JlLlJpZ2h0c1N0YXR1cyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9IlJJR0hUU19FWFBJUkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSSUdIVFNfSU5WQUxJRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUklHSFRTX05PVF9BQ1FVSVJFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUklHSFRTX1ZBTElEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRHJtU3VwcG9ydEluZm8iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRybVN1cHBvcnRJbmZvIgorIHR5cGU9ImFuZHJvaWQuZHJtLkRybVN1cHBvcnRJbmZvIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZEZpbGVTdWZmaXgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlU3VmZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZE1pbWVUeXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGVzY3JpcHJpdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RmlsZVN1ZmZpeEl0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGVzY3JpcHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEcm1VdGlscyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRHJtVXRpbHMiCisgdHlwZT0iYW5kcm9pZC5kcm0uRHJtVXRpbHMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0ZW5kZWRNZXRhZGF0YVBhcnNlciIKKyByZXR1cm49ImFuZHJvaWQuZHJtLkRybVV0aWxzLkV4dGVuZGVkTWV0YWRhdGFQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXh0ZW5kZWRNZXRhZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRybVV0aWxzLkV4dGVuZGVkTWV0YWRhdGFQYXJzZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJrZXlJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcm9jZXNzZWREYXRhIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0QWNjb3VudElkIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREYXRhIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnNjcmlwdGlvbklkIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuZ2VzdHVyZSIKID4KIDxjbGFzcyBuYW1lPSJHZXN0dXJlIgpAQCAtMTIxMzIzLDYgKzEyMzM0MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iQkFUVEVSWV9IRUFMVEhfQ09MRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQkFUVEVSWV9IRUFMVEhfREVBRCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEyNDcxNyw2ICsxMjY3NDgsMzkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RST1BCT1hfRU5UUllfQURERUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRST1BCT1hfRU5UUllfQURERUQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfVEFHIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RhZyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9USU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RpbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSVNfRU1QVFkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTAwODQsNiArMjEyMTQ4LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9iamVjdCIgdHlwZT0iVCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRBbGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2xsZWN0aW9uIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgVCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkQWxsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xlYXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKZGlmZiAtLWdpdCBhL2NtZHMvYm9vdGFuaW1hdGlvbi9Cb290QW5pbWF0aW9uLmNwcCBiL2NtZHMvYm9vdGFuaW1hdGlvbi9Cb290QW5pbWF0aW9uLmNwcAppbmRleCA3YTdmOGVkLi42NjUwYTcxIDEwMDY0NAotLS0gYS9jbWRzL2Jvb3RhbmltYXRpb24vQm9vdEFuaW1hdGlvbi5jcHAKKysrIGIvY21kcy9ib290YW5pbWF0aW9uL0Jvb3RBbmltYXRpb24uY3BwCkBAIC00OSw2ICs0OSw5IEBACiAKICNpbmNsdWRlICJCb290QW5pbWF0aW9uLmgiCiAKKyNkZWZpbmUgVVNFUl9CT09UQU5JTUFUSU9OX0ZJTEUgIi9kYXRhL2xvY2FsL2Jvb3RhbmltYXRpb24uemlwIgorI2RlZmluZSBTWVNURU1fQk9PVEFOSU1BVElPTl9GSUxFICIvc3lzdGVtL21lZGlhL2Jvb3RhbmltYXRpb24uemlwIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjQ0LDE0ICsyNDcsMTIgQEAKICAgICBtRmxpbmdlclN1cmZhY2VDb250cm9sID0gY29udHJvbDsKICAgICBtRmxpbmdlclN1cmZhY2UgPSBzOwogCi0gICAgbUFuZHJvaWRBbmltYXRpb24gPSBmYWxzZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtWmlwLm9wZW4oIi9kYXRhL2xvY2FsL2Jvb3RhbmltYXRpb24uemlwIik7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBlcnIgPSBtWmlwLm9wZW4oIi9zeXN0ZW0vbWVkaWEvYm9vdGFuaW1hdGlvbi56aXAiKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUFuZHJvaWRBbmltYXRpb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQorICAgIG1BbmRyb2lkQW5pbWF0aW9uID0gdHJ1ZTsKKyAgICBpZiAoKGFjY2VzcyhVU0VSX0JPT1RBTklNQVRJT05fRklMRSwgUl9PSykgPT0gMCkgJiYKKyAgICAgICAgICAgIChtWmlwLm9wZW4oVVNFUl9CT09UQU5JTUFUSU9OX0ZJTEUpID09IE5PX0VSUk9SKSB8fAorICAgICAgICAgICAgKGFjY2VzcyhTWVNURU1fQk9PVEFOSU1BVElPTl9GSUxFLCBSX09LKSA9PSAwKSAmJgorICAgICAgICAgICAgKG1aaXAub3BlbihTWVNURU1fQk9PVEFOSU1BVElPTl9GSUxFKSA9PSBOT19FUlJPUikpCisgICAgICAgIG1BbmRyb2lkQW5pbWF0aW9uID0gZmFsc2U7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhIGIvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQppbmRleCAzMjZlMmM4Li5kNzY0YWE5IDEwMDY0NAotLS0gYS9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCisrKyBiL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKQEAgLTQwMyw5ICs0MDMsMTEgQEAKICAgICAgICAgaWYgKG5vbkxvY2FsaXplZCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbm9uTG9jYWxpemVkLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KLSAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRSZXNvdXJjZXMocGlpKTsKLSAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHIuZ2V0U3RyaW5nKHJlcyk7CisgICAgICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRSZXNvdXJjZXMocGlpKTsKKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gci5nZXRTdHJpbmcocmVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9jbWRzL3NlcnZpY2VtYW5hZ2VyL3NlcnZpY2VfbWFuYWdlci5jIGIvY21kcy9zZXJ2aWNlbWFuYWdlci9zZXJ2aWNlX21hbmFnZXIuYwppbmRleCBhNWExZjAxLi4xNDUzNmJkIDEwMDY0NAotLS0gYS9jbWRzL3NlcnZpY2VtYW5hZ2VyL3NlcnZpY2VfbWFuYWdlci5jCisrKyBiL2NtZHMvc2VydmljZW1hbmFnZXIvc2VydmljZV9tYW5hZ2VyLmMKQEAgLTM0LDYgKzM0LDggQEAKICAgICB7IEFJRF9NRURJQSwgIm1lZGlhLnBsYXllciIgfSwKICAgICB7IEFJRF9NRURJQSwgIm1lZGlhLmNhbWVyYSIgfSwKICAgICB7IEFJRF9NRURJQSwgIm1lZGlhLmF1ZGlvX3BvbGljeSIgfSwKKyAgICB7IEFJRF9EUk1JTywgImRybS5kcm1JT1NlcnZpY2UiIH0sCisgICAgeyBBSURfRFJNLCAgICJkcm0uZHJtTWFuYWdlciIgfSwKICAgICB7IEFJRF9ORkMsICAgIm5mYyIgfSwKICAgICB7IEFJRF9SQURJTywgInJhZGlvLnBob25lIiB9LAogICAgIHsgQUlEX1JBRElPLCAicmFkaW8uc21zIiB9LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQppbmRleCBiNDU5MzIwLi45NzEyYjJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQpAQCAtMjY1LDEyICsyNjUsMjIgQEAKICAgICAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIEFsZXJ0Q29udHJvbGxlci5BbGVydFBhcmFtcyBQOworICAgICAgICBwcml2YXRlIGludCBtVGhlbWU7CiAgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0b3IgdXNpbmcgYSBjb250ZXh0IGZvciB0aGlzIGJ1aWxkZXIgYW5kIHRoZSB7QGxpbmsgQWxlcnREaWFsb2d9IGl0IGNyZWF0ZXMuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQnVpbGRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgY29udGV4dCBhbmQgdGhlbWUgZm9yIHRoaXMgYnVpbGRlciBhbmQKKyAgICAgICAgICogdGhlIHtAbGluayBBbGVydERpYWxvZ30gaXQgY3JlYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7CiAgICAgICAgICAgICBQID0gbmV3IEFsZXJ0Q29udHJvbGxlci5BbGVydFBhcmFtcyhjb250ZXh0KTsKKyAgICAgICAgICAgIG1UaGVtZSA9IHRoZW1lOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvKioKQEAgLTc4Myw3ICs3OTMsNyBAQAogICAgICAgICAgKiB0byBkbyBhbmQgd2FudCB0aGlzIHRvIGJlIGNyZWF0ZWQgYW5kIGRpc3BsYXllZC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBBbGVydERpYWxvZyBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2coUC5tQ29udGV4dCk7CisgICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2coUC5tQ29udGV4dCwgbVRoZW1lKTsKICAgICAgICAgICAgIFAuYXBwbHkoZGlhbG9nLm1BbGVydCk7CiAgICAgICAgICAgICBkaWFsb2cuc2V0Q2FuY2VsYWJsZShQLm1DYW5jZWxhYmxlKTsKICAgICAgICAgICAgIGRpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKFAubU9uQ2FuY2VsTGlzdGVuZXIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKaW5kZXggOGY5NDBkNS4uMjM4MjU5NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYWN0aXZpdHkgaW4gcmVjZWl2ZXJQYWNrYWdlIHRoYXQgaGFuZGxlcyBBQ1RJT05fQVBQX0VSUk9SLgogICAgICAqCi0gICAgICogQHBhcmFtIHBtIFBhY2thZ2VNYW5hZ2VyIGlzbnRhbmNlCisgICAgICogQHBhcmFtIHBtIFBhY2thZ2VNYW5hZ2VyIGluc3RhbmNlCiAgICAgICogQHBhcmFtIGVycm9yUGFja2FnZSBwYWNrYWdlIHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IKICAgICAgKiBAcGFyYW0gcmVjZWl2ZXJQYWNrYWdlIGNhbmRpZGF0ZSBwYWNrYWdlIHRvIHJlY2VpdmUgdGhlIGVycm9yCiAgICAgICogQHJldHVybiBhY3Rpdml0eSBjb21wb25lbnQgd2l0aGluIHJlY2VpdmVyUGFja2FnZSB3aGljaCBoYW5kbGVzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IDQ2YWQ2NGMuLjBlNDczYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC01Myw3ICs1Myw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyLlBhY2thZ2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKQEAgLTg4LDExICs4Nyw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TdGF0RnM7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlscy5GaWxlU3RhdHVzOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwpAQCAtMjY3LDE4ICsyNjQsMTggQEAKICAgICBwdWJsaWMgTG9vcGVyIGdldE1haW5Mb29wZXIoKSB7CiAgICAgICAgIHJldHVybiBtTWFpblRocmVhZC5nZXRMb29wZXIoKTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiAobVBhY2thZ2VJbmZvICE9IG51bGwpID8KICAgICAgICAgICAgICAgICBtUGFja2FnZUluZm8uZ2V0QXBwbGljYXRpb24oKSA6IG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uKCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoaW50IHJlc2lkKSB7CiAgICAgICAgIG1UaGVtZVJlc291cmNlID0gcmVzaWQ7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJlc291cmNlcy5UaGVtZSBnZXRUaGVtZSgpIHsKICAgICAgICAgaWYgKG1UaGVtZSA9PSBudWxsKSB7CkBAIC00NDQsNyArNDQxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbUZpbGVzRGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgaWYoIW1GaWxlc0Rpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gY3JlYXRlIGZpbGVzIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gY3JlYXRlIGZpbGVzIGRpcmVjdG9yeSAiICsgbUZpbGVzRGlyLmdldFBhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoCkBAIC00NTUsNyArNDUyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBtRmlsZXNEaXI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZSBnZXRFeHRlcm5hbEZpbGVzRGlyKFN0cmluZyB0eXBlKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTQ4Nyw3ICs0ODQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGRpcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldENhY2hlRGlyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CkBAIC01MDcsNyArNTA0LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUNhY2hlRGlyOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldEV4dGVybmFsQ2FjaGVEaXIoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTUyOSw3ICs1MjYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbENhY2hlRGlyOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RmlsZVN0cmVhbVBhdGgoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIG1ha2VGaWxlbmFtZShnZXRGaWxlc0RpcigpLCBuYW1lKTsKQEAgLTU3MCw3ICs1NjcsNyBAQAogICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0IDogRU1QVFlfRklMRV9MSVNUOwogICAgIH0KIAotICAgIAorCiAgICAgcHJpdmF0ZSBGaWxlIGdldERhdGFiYXNlc0RpcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1EYXRhYmFzZXNEaXIgPT0gbnVsbCkgewpAQCAtNTgyLDcgKzU3OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlc0RpcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRXYWxscGFwZXIoKSB7CiAgICAgICAgIHJldHVybiBnZXRXYWxscGFwZXJNYW5hZ2VyKCkuZ2V0RHJhd2FibGUoKTsKQEAgLTY1MCw3ICs2NDcsNyBAQAogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUgPSBpbnRlbnQucmVzb2x2ZVR5cGVJZk5lZWRlZChnZXRDb250ZW50UmVzb2x2ZXIoKSk7CkBAIC0xNTg3LDE1ICsxNTg0LDE1IEBACiAgICAgZmluYWwgdm9pZCBzZXRBY3Rpdml0eVRva2VuKElCaW5kZXIgdG9rZW4pIHsKICAgICAgICAgbUFjdGl2aXR5VG9rZW4gPSB0b2tlbjsKICAgICB9Ci0gICAgCisKICAgICBmaW5hbCB2b2lkIHNldE91dGVyQ29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbU91dGVyQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgfQotICAgIAorCiAgICAgZmluYWwgQ29udGV4dCBnZXRPdXRlckNvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiBtT3V0ZXJDb250ZXh0OwogICAgIH0KLSAgICAKKwogICAgIGZpbmFsIElCaW5kZXIgZ2V0QWN0aXZpdHlUb2tlbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3Rpdml0eVRva2VuOwogICAgIH0KQEAgLTE2NzMsNyArMTY3MCw3IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VQcm92aWRlcihJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gbU1haW5UaHJlYWQucmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5VGhyZWFkIG1NYWluVGhyZWFkOwogICAgIH0KIApAQCAtMTcwNiw3ICsxNzAzLDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFja2FnZSBtYW5hZ2VyIGhhcyBkaWVkIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBjYW5vbmljYWxUb0N1cnJlbnRQYWNrYWdlTmFtZXMoU3RyaW5nW10gbmFtZXMpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzE1LDcgKzE3MTIsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQYWNrYWdlIG1hbmFnZXIgaGFzIGRpZWQiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEludGVudCBnZXRMYXVuY2hJbnRlbnRGb3JQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICAgICAgLy8gRmlyc3Qgc2VlIGlmIHRoZSBwYWNrYWdlIGhhcyBhbiBJTkZPIGFjdGl2aXR5OyB0aGUgZXhpc3RlbmNlIG9mCkBAIC0xNzM3LDggKzE3MzQsOSBAQAogICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTik7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKHBhY2thZ2VOYW1lLCByZXNvbHZlSW5mby5hY3Rpdml0eUluZm8ubmFtZSk7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChpbnRlbnRUb1Jlc29sdmUpOworICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShyZXNvbHZlSW5mby5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlSW5mby5hY3Rpdml0eUluZm8ubmFtZSk7CiAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgcmV0dXJuIGludGVudDsKICAgICAgICAgfQpAQCAtMTkwNCw3ICsxOTAyLDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFja2FnZSBtYW5hZ2VyIGhhcyBkaWVkIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N5c3RlbUZlYXR1cmUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xOTEzLDcgKzE5MTEsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQYWNrYWdlIG1hbmFnZXIgaGFzIGRpZWQiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBjaGVja1Blcm1pc3Npb24oU3RyaW5nIHBlcm1OYW1lLCBTdHJpbmcgcGtnTmFtZSkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTE5ODUsOSArMTk4Myw5IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBhY2thZ2UgbWFuYWdlciBoYXMgZGllZCIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFVpZEZvclNoYXJlZFVzZXIoU3RyaW5nIHNoYXJlZFVzZXJOYW1lKSAKKyAgICAgICAgcHVibGljIGludCBnZXRVaWRGb3JTaGFyZWRVc2VyKFN0cmluZyBzaGFyZWRVc2VyTmFtZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IHVpZCA9IG1QTS5nZXRVaWRGb3JTaGFyZWRVc2VyKHNoYXJlZFVzZXJOYW1lKTsKQEAgLTIzOTEsNyArMjM4OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlTmFtZSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7CiAgICAgICAgICAgICBmaW5hbCBpbnQgaWNvbklkOwpAQCAtMjU2Myw3ICsyNTYxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSwgCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQXBwbGljYXRpb25Vc2VyRGF0YShTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmNsZWFyQXBwbGljYXRpb25Vc2VyRGF0YShwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjU3Miw3ICsyNTcwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzKFN0cmluZyBwYWNrYWdlTmFtZSwgCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUFwcGxpY2F0aW9uQ2FjaGVGaWxlcyhTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmRlbGV0ZUFwcGxpY2F0aW9uQ2FjaGVGaWxlcyhwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjU5Nyw5ICsyNTk1LDkgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRQYWNrYWdlU2l6ZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lLCAKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0UGFja2FnZVNpemVJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBJUGFja2FnZVN0YXRzT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmdldFBhY2thZ2VTaXplSW5mbyhwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjY0NCw3ICsyNjQyLDcgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCByZXBsYWNlUHJlZmVycmVkQWN0aXZpdHkoSW50ZW50RmlsdGVyIGZpbHRlciwKICAgICAgICAgICAgICAgICBpbnQgbWF0Y2gsIENvbXBvbmVudE5hbWVbXSBzZXQsIENvbXBvbmVudE5hbWUgYWN0aXZpdHkpIHsKQEAgLTI2NjMsNyArMjY2MSw3IEBACiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiEKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRBY3Rpdml0aWVzKExpc3Q8SW50ZW50RmlsdGVyPiBvdXRGaWx0ZXJzLAogICAgICAgICAgICAgICAgIExpc3Q8Q29tcG9uZW50TmFtZT4gb3V0QWN0aXZpdGllcywgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CkBAIC0yNjc0LDcgKzI2NzIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUsIGludCBmbGFncykgewpAQCAtMjcwNCw3ICsyNzAyLDcgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RhdGVQaWNrZXJEaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EYXRlUGlja2VyRGlhbG9nLmphdmEKaW5kZXggMDA5NjcxZi4uOGJhNDgwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RhdGVQaWNrZXJEaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGF0ZVBpY2tlckRpYWxvZy5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlcjsKQEAgLTM5LDEzICszOCwxMyBAQAogICogPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9oZWxsby1kYXRlcGlja2VyLmh0bWwiPkRhdGUgUGlja2VyCiAgKiB0dXRvcmlhbDwvYT4uPC9wPgogICovCi1wdWJsaWMgY2xhc3MgRGF0ZVBpY2tlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyLCAKK3B1YmxpYyBjbGFzcyBEYXRlUGlja2VyRGlhbG9nIGV4dGVuZHMgQWxlcnREaWFsb2cgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIsCiAgICAgICAgIE9uRGF0ZUNoYW5nZWRMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUiA9ICJ5ZWFyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEggPSAibW9udGgiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVkgPSAiZGF5IjsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgRGF0ZVBpY2tlciBtRGF0ZVBpY2tlcjsKICAgICBwcml2YXRlIGZpbmFsIE9uRGF0ZVNldExpc3RlbmVyIG1DYWxsQmFjazsKICAgICBwcml2YXRlIGZpbmFsIENhbGVuZGFyIG1DYWxlbmRhcjsKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgICAgIGludCB5ZWFyLAogICAgICAgICAgICAgaW50IG1vbnRoT2ZZZWFyLAogICAgICAgICAgICAgaW50IGRheU9mTW9udGgpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCwgCisgICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQsCiAgICAgICAgICAgICAgICAgY2FsbEJhY2ssIHllYXIsIG1vbnRoT2ZZZWFyLCBkYXlPZk1vbnRoKTsKICAgICB9CiAKQEAgLTEwOSwxNyArMTA4LDE3IEBACiAgICAgICAgIG1Jbml0aWFsRGF5ID0gZGF5T2ZNb250aDsKICAgICAgICAgRGF0ZUZvcm1hdFN5bWJvbHMgc3ltYm9scyA9IG5ldyBEYXRlRm9ybWF0U3ltYm9scygpOwogICAgICAgICBtV2Vla0RheXMgPSBzeW1ib2xzLmdldFNob3J0V2Vla2RheXMoKTsKLSAgICAgICAgCisKICAgICAgICAgbVRpdGxlRGF0ZUZvcm1hdCA9IGphdmEudGV4dC5EYXRlRm9ybWF0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRlSW5zdGFuY2UoamF2YS50ZXh0LkRhdGVGb3JtYXQuRlVMTCk7CiAgICAgICAgIG1DYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAgIHVwZGF0ZVRpdGxlKG1Jbml0aWFsWWVhciwgbUluaXRpYWxNb250aCwgbUluaXRpYWxEYXkpOwotICAgICAgICAKLSAgICAgICAgc2V0QnV0dG9uKGNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5kYXRlX3RpbWVfc2V0KSwgdGhpcyk7Ci0gICAgICAgIHNldEJ1dHRvbjIoY29udGV4dC5nZXRUZXh0KFIuc3RyaW5nLmNhbmNlbCksIChPbkNsaWNrTGlzdGVuZXIpIG51bGwpOworCisgICAgICAgIHNldEJ1dHRvbihCVVRUT05fUE9TSVRJVkUsIGNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5kYXRlX3RpbWVfc2V0KSwgdGhpcyk7CisgICAgICAgIHNldEJ1dHRvbihCVVRUT05fTkVHQVRJVkUsIGNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5jYW5jZWwpLCAoT25DbGlja0xpc3RlbmVyKSBudWxsKTsKICAgICAgICAgc2V0SWNvbihSLmRyYXdhYmxlLmljX2RpYWxvZ190aW1lKTsKLSAgICAgICAgCi0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gCisKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQogICAgICAgICAgICAgICAgIChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwogICAgICAgICBWaWV3IHZpZXcgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmRhdGVfcGlja2VyX2RpYWxvZywgbnVsbCk7CiAgICAgICAgIHNldFZpZXcodmlldyk7CkBAIC0xMzksMjAgKzEzOCwyMCBAQAogICAgICAgICB0aXRsZS5zZXRTaW5nbGVMaW5lKCk7CiAgICAgICAgIHRpdGxlLnNldEVsbGlwc2l6ZShUcnVuY2F0ZUF0LkVORCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKICAgICAgICAgaWYgKG1DYWxsQmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICBtRGF0ZVBpY2tlci5jbGVhckZvY3VzKCk7Ci0gICAgICAgICAgICBtQ2FsbEJhY2sub25EYXRlU2V0KG1EYXRlUGlja2VyLCBtRGF0ZVBpY2tlci5nZXRZZWFyKCksIAorICAgICAgICAgICAgbUNhbGxCYWNrLm9uRGF0ZVNldChtRGF0ZVBpY2tlciwgbURhdGVQaWNrZXIuZ2V0WWVhcigpLAogICAgICAgICAgICAgICAgICAgICBtRGF0ZVBpY2tlci5nZXRNb250aCgpLCBtRGF0ZVBpY2tlci5nZXREYXlPZk1vbnRoKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgb25EYXRlQ2hhbmdlZChEYXRlUGlja2VyIHZpZXcsIGludCB5ZWFyLAogICAgICAgICAgICAgaW50IG1vbnRoLCBpbnQgZGF5KSB7CiAgICAgICAgIHVwZGF0ZVRpdGxlKHllYXIsIG1vbnRoLCBkYXkpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURhdGUoaW50IHllYXIsIGludCBtb250aE9mWWVhciwgaW50IGRheU9mTW9udGgpIHsKICAgICAgICAgbUluaXRpYWxZZWFyID0geWVhcjsKICAgICAgICAgbUluaXRpYWxNb250aCA9IG1vbnRoT2ZZZWFyOwpAQCAtMTY2LDcgKzE2NSw3IEBACiAgICAgICAgIG1DYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXkpOwogICAgICAgICBzZXRUaXRsZShtVGl0bGVEYXRlRm9ybWF0LmZvcm1hdChtQ2FsZW5kYXIuZ2V0VGltZSgpKSk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1bmRsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewogICAgICAgICBCdW5kbGUgc3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CkBAIC0xNzUsNyArMTc0LDcgQEAKICAgICAgICAgc3RhdGUucHV0SW50KERBWSwgbURhdGVQaWNrZXIuZ2V0RGF5T2ZNb250aCgpKTsKICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IGEyNGZjYWUuLjc4NDVlMDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zODAsNyArMzgwLDcgQEAKICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgd2luID0gcGVyZm9ybURlc3Ryb3kociwgZmluaXNoKTsKICAgICAgICAgICAgIGlmIChmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUocik7CisgICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMucmVtb3ZlKGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCmluZGV4IDg1Njk0M2QuLjQxNGEyYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKQEAgLTM3NCw3ICszNzQsNyBAQAogICAgICAgICBpZiAodGhpcy5jb250ZW50VmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aGF0LmNvbnRlbnRWaWV3ID0gdGhpcy5jb250ZW50Vmlldy5jbG9uZSgpOwogICAgICAgICB9Ci0gICAgICAgIHRoYXQuaWNvbkxldmVsID0gdGhhdC5pY29uTGV2ZWw7CisgICAgICAgIHRoYXQuaWNvbkxldmVsID0gdGhpcy5pY29uTGV2ZWw7CiAgICAgICAgIHRoYXQuc291bmQgPSB0aGlzLnNvdW5kOyAvLyBhbmRyb2lkLm5ldC5VcmkgaXMgaW1tdXRhYmxlCiAgICAgICAgIHRoYXQuYXVkaW9TdHJlYW1UeXBlID0gdGhpcy5hdWRpb1N0cmVhbVR5cGU7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCmluZGV4IDFmYWU1MTYuLmUzMjQyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMzksMTMgKzM5LDE3IEBACiAgKiA8L3VsPgogICoKICAqIDxwPgotICogRWFjaCBvZiB0aGUgbm90aWZ5IG1ldGhvZHMgdGFrZXMgYW4gaW50IGlkIHBhcmFtZXRlci4gIFRoaXMgaWQgaWRlbnRpZmllcwotICogdGhpcyBub3RpZmljYXRpb24gZnJvbSB5b3VyIGFwcCB0byB0aGUgc3lzdGVtLCBzbyB0aGF0IGlkIHNob3VsZCBiZSB1bmlxdWUKLSAqIHdpdGhpbiB5b3VyIGFwcC4gIElmIHlvdSBjYWxsIG9uZSBvZiB0aGUgbm90aWZ5IG1ldGhvZHMgd2l0aCBhbiBpZCB0aGF0IGlzCi0gKiBjdXJyZW50bHkgYWN0aXZlIGFuZCBhIG5ldyBzZXQgb2Ygbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMsIGl0IHdpbGwgYmUKLSAqIHVwZGF0ZWQuICBGb3IgZXhhbXBsZSwgaWYgeW91IHBhc3MgYSBuZXcgc3RhdHVzIGJhciBpY29uLCB0aGUgb2xkIGljb24gaW4KLSAqIHRoZSBzdGF0dXMgYmFyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG9uZS4gIFRoaXMgaXMgYWxzbyB0aGUgc2FtZQotICogaWQgeW91IHBhc3MgdG8gdGhlIHtAbGluayAjY2FuY2VsfSBtZXRob2QgdG8gY2xlYXIgdGhpcyBub3RpZmljYXRpb24uCisgKiBFYWNoIG9mIHRoZSBub3RpZnkgbWV0aG9kcyB0YWtlcyBhbiBpbnQgaWQgcGFyYW1ldGVyIGFuZCBvcHRpb25hbGx5IGEKKyAqIHtAbGluayBTdHJpbmd9IHRhZyBwYXJhbWV0ZXIsIHdoaWNoIG1heSBiZSB7QGNvZGUgbnVsbH0uICBUaGVzZSBwYXJhbWV0ZXJzCisgKiBhcmUgdXNlZCB0byBmb3JtIGEgcGFpciAodGFnLCBpZCksIG9yICh7QGNvZGUgbnVsbH0sIGlkKSBpZiB0YWcgaXMKKyAqIHVuc3BlY2lmaWVkLiAgVGhpcyBwYWlyIGlkZW50aWZpZXMgdGhpcyBub3RpZmljYXRpb24gZnJvbSB5b3VyIGFwcCB0byB0aGUKKyAqIHN5c3RlbSwgc28gdGhhdCBwYWlyIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHlvdXIgYXBwLiAgSWYgeW91IGNhbGwgb25lCisgKiBvZiB0aGUgbm90aWZ5IG1ldGhvZHMgd2l0aCBhICh0YWcsIGlkKSBwYWlyIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZSBhbmQKKyAqIGEgbmV3IHNldCBvZiBub3RpZmljYXRpb24gcGFyYW1ldGVycywgaXQgd2lsbCBiZSB1cGRhdGVkLiAgRm9yIGV4YW1wbGUsCisgKiBpZiB5b3UgcGFzcyBhIG5ldyBzdGF0dXMgYmFyIGljb24sIHRoZSBvbGQgaWNvbiBpbiB0aGUgc3RhdHVzIGJhciB3aWxsCisgKiBiZSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgb25lLiAgVGhpcyBpcyBhbHNvIHRoZSBzYW1lIHRhZyBhbmQgaWQgeW91IHBhc3MKKyAqIHRvIHRoZSB7QGxpbmsgI2NhbmNlbChpbnQpfSBvciB7QGxpbmsgI2NhbmNlbChTdHJpbmcsIGludCl9IG1ldGhvZCB0byBjbGVhcgorICogdGhpcyBub3RpZmljYXRpb24uCiAgKgogICogPHA+CiAgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKQEAgLTk0LDEyICs5OCwxMSBAQAogICAgIC8qKgogICAgICAqIFBlcnNpc3RlbnQgbm90aWZpY2F0aW9uIG9uIHRoZSBzdGF0dXMgYmFyLAogICAgICAqCi0gICAgICogQHBhcmFtIHRhZyBBbiBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBub3RpZmljYXRpb24gdW5pcXVlIHdpdGhpbiB5b3VyCi0gICAgICogICAgICAgIGFwcGxpY2F0aW9uLgorICAgICAqIEBwYXJhbSB0YWcgQSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBub3RpZmljYXRpb24uICBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBpZCBBbiBpZGVudGlmaWVyIGZvciB0aGlzIG5vdGlmaWNhdGlvbi4gIFRoZSBwYWlyICh0YWcsIGlkKSBtdXN0IGJlIHVuaXF1ZQorICAgICAqICAgICAgICB3aXRoaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uIEEge0BsaW5rIE5vdGlmaWNhdGlvbn0gb2JqZWN0IGRlc2NyaWJpbmcgaG93IHRvCiAgICAgICogICAgICAgIG5vdGlmeSB0aGUgdXNlciwgb3RoZXIgdGhhbiB0aGUgdmlldyB5b3UncmUgcHJvdmlkaW5nLiBNdXN0IG5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBub3RpZmljYXRpb24gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmluZyBpZGVudGlmaWVyIHRoYXQKLSAgICAgKiBjYW4gYmUgdXNlZCB0byBjYW5jZWwgdGhlIG5vdGlmaWNhdGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeShTdHJpbmcgdGFnLCBpbnQgaWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pCiAgICAgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaERpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaERpYWxvZy5qYXZhCmluZGV4IGNkMjJmYTEuLjRlYjg5YWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nLmphdmEKQEAgLTExMDksNiArMTEwOSw5IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGEgc3VjY2Vzc2Z1bCBsYXVuY2gsIGZhbHNlIGlmIGNvdWxkIG5vdCAoZS5nLiBiYWQgcG9zaXRpb24pLgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oaW50IHBvc2l0aW9uLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIGlmIChtU3VnZ2VzdGlvbnNBZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBDdXJzb3IgYyA9IG1TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q3Vyc29yKCk7CiAgICAgICAgIGlmICgoYyAhPSBudWxsKSAmJiBjLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSkgewogCkBAIC0xMTMzLDcgKzExMzYsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSWYgdGhlIGludGVudCB3YXMgY3JlYXRlZCBmcm9tIGEgc3VnZ2VzdGlvbiwgaXQgd2lsbCBhbHdheXMgaGF2ZSBhbiBleHBsaWNpdAogICAgICAgICAgICAgLy8gY29tcG9uZW50IGhlcmUuCi0gICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiU3RhcnRpbmcgKGFzIG91cnNlbHZlcykgIiArIGludGVudC50b1VSSSgpKTsKKyAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJTdGFydGluZyAoYXMgb3Vyc2VsdmVzKSAiICsgaW50ZW50LnRvVXJpKDApKTsKICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgICAgICAgICAvLyBJZiB0aGUgc2VhcmNoIHN3aXRjaGVzIHRvIGEgZGlmZmVyZW50IGFjdGl2aXR5LAogICAgICAgICAgICAgLy8gU2VhcmNoRGlhbG9nV3JhcHBlciNwZXJmb3JtQWN0aXZpdHlSZXN1bWluZwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1RpbWVQaWNrZXJEaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nLmphdmEKaW5kZXggNjJkM2Y3ZC4uNTIxZDQxYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1RpbWVQaWNrZXJEaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvVGltZVBpY2tlckRpYWxvZy5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgKiA8cD5TZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2hlbGxvLXRpbWVwaWNrZXIuaHRtbCI+VGltZSBQaWNrZXIKICAqIHR1dG9yaWFsPC9hPi48L3A+CiAgKi8KLXB1YmxpYyBjbGFzcyBUaW1lUGlja2VyRGlhbG9nIGV4dGVuZHMgQWxlcnREaWFsb2cgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIsIAorcHVibGljIGNsYXNzIFRpbWVQaWNrZXJEaWFsb2cgZXh0ZW5kcyBBbGVydERpYWxvZyBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciwKICAgICAgICAgT25UaW1lQ2hhbmdlZExpc3RlbmVyIHsKIAogICAgIC8qKgpAQCAtNTYsMTIgKzU2LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVVIgPSAiaG91ciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURSA9ICJtaW51dGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU18yNF9IT1VSID0gImlzMjRob3VyIjsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgVGltZVBpY2tlciBtVGltZVBpY2tlcjsKICAgICBwcml2YXRlIGZpbmFsIE9uVGltZVNldExpc3RlbmVyIG1DYWxsYmFjazsKICAgICBwcml2YXRlIGZpbmFsIENhbGVuZGFyIG1DYWxlbmRhcjsKICAgICBwcml2YXRlIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IG1EYXRlRm9ybWF0OwotICAgIAorCiAgICAgaW50IG1Jbml0aWFsSG91ck9mRGF5OwogICAgIGludCBtSW5pdGlhbE1pbnV0ZTsKICAgICBib29sZWFuIG1JczI0SG91clZpZXc7CkBAIC0xMDEsMTIgKzEwMSwxMyBAQAogICAgICAgICBtRGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0VGltZUZvcm1hdChjb250ZXh0KTsKICAgICAgICAgbUNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgdXBkYXRlVGl0bGUobUluaXRpYWxIb3VyT2ZEYXksIG1Jbml0aWFsTWludXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNldEJ1dHRvbihjb250ZXh0LmdldFRleHQoUi5zdHJpbmcuZGF0ZV90aW1lX3NldCksIHRoaXMpOwotICAgICAgICBzZXRCdXR0b24yKGNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5jYW5jZWwpLCAoT25DbGlja0xpc3RlbmVyKSBudWxsKTsKKworICAgICAgICBzZXRCdXR0b24oQlVUVE9OX1BPU0lUSVZFLCBjb250ZXh0LmdldFRleHQoUi5zdHJpbmcuZGF0ZV90aW1lX3NldCksIHRoaXMpOworICAgICAgICBzZXRCdXR0b24oQlVUVE9OX05FR0FUSVZFLCBjb250ZXh0LmdldFRleHQoUi5zdHJpbmcuY2FuY2VsKSwKKyAgICAgICAgICAgICAgICAoT25DbGlja0xpc3RlbmVyKSBudWxsKTsKICAgICAgICAgc2V0SWNvbihSLmRyYXdhYmxlLmljX2RpYWxvZ190aW1lKTsKLSAgICAgICAgCi0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gCisKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQogICAgICAgICAgICAgICAgIChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwogICAgICAgICBWaWV3IHZpZXcgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRpbWVfcGlja2VyX2RpYWxvZywgbnVsbCk7CiAgICAgICAgIHNldFZpZXcodmlldyk7CkBAIC0xMTgsMTEgKzExOSwxMSBAQAogICAgICAgICBtVGltZVBpY2tlci5zZXRJczI0SG91clZpZXcobUlzMjRIb3VyVmlldyk7CiAgICAgICAgIG1UaW1lUGlja2VyLnNldE9uVGltZUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewogICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgIG1UaW1lUGlja2VyLmNsZWFyRm9jdXMoKTsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblRpbWVTZXQobVRpbWVQaWNrZXIsIG1UaW1lUGlja2VyLmdldEN1cnJlbnRIb3VyKCksIAorICAgICAgICAgICAgbUNhbGxiYWNrLm9uVGltZVNldChtVGltZVBpY2tlciwgbVRpbWVQaWNrZXIuZ2V0Q3VycmVudEhvdXIoKSwKICAgICAgICAgICAgICAgICAgICAgbVRpbWVQaWNrZXIuZ2V0Q3VycmVudE1pbnV0ZSgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoVGltZVBpY2tlciB2aWV3LCBpbnQgaG91ck9mRGF5LCBpbnQgbWludXRlKSB7CiAgICAgICAgIHVwZGF0ZVRpdGxlKGhvdXJPZkRheSwgbWludXRlKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaW1lKGludCBob3VyT2ZEYXksIGludCBtaW51dE9mSG91cikgewogICAgICAgICBtVGltZVBpY2tlci5zZXRDdXJyZW50SG91cihob3VyT2ZEYXkpOwogICAgICAgICBtVGltZVBpY2tlci5zZXRDdXJyZW50TWludXRlKG1pbnV0T2ZIb3VyKTsKQEAgLTE0MSw3ICsxNDIsNyBAQAogICAgICAgICBtQ2FsZW5kYXIuc2V0KENhbGVuZGFyLk1JTlVURSwgbWludXRlKTsKICAgICAgICAgc2V0VGl0bGUobURhdGVGb3JtYXQuZm9ybWF0KG1DYWxlbmRhci5nZXRUaW1lKCkpKTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVuZGxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CiAgICAgICAgIEJ1bmRsZSBzdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKQEAgLTE1MCw3ICsxNTEsNyBAQAogICAgICAgICBzdGF0ZS5wdXRCb29sZWFuKElTXzI0X0hPVVIsIG1UaW1lUGlja2VyLmlzMjRIb3VyVmlldygpKTsKICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2FsbHBhcGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dhbGxwYXBlck1hbmFnZXIuamF2YQppbmRleCBlNDU1YTU5Li45MmI3Y2Y1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2FsbHBhcGVyTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9XYWxscGFwZXJNYW5hZ2VyLmphdmEKQEAgLTIzNSw4ICsyMzUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZ2VuZXJhdGUgY2FzZTogbm8gc2l6ZSByZXF1ZXN0ZWQsIGp1c3QgbG9hZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0bWFwIGFzLWlzLgotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVjb2RlIGZpbGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTI3Nyw3ICsyODIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZ2VuZXJhdGUgY2FzZTogbm8gc2l6ZSByZXF1ZXN0ZWQsIGp1c3QgbG9hZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0bWFwIGFzLWlzLgotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oaXMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBkZWNvZGUgc3RyZWFtIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkNGNlNmExLi5kMmFiODVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogCkBAIC0xNDksNyArMTQ4LDcgQEAKICAgICAgKiAgICAgaW5zdGFuY2VzIGFzIHBvc3NpYmxlLjwvdGQ+CiAgICAgICogIDwvdHI+CiAgICAgICogPC90YWJsZT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBzZWUgQXBwV2lkZ2V0UHJvdmlkZXIjb25VcGRhdGUgQXBwV2lkZ2V0UHJvdmlkZXIub25VcGRhdGUoQ29udGV4dCBjb250ZXh0LCBBcHBXaWRnZXRNYW5hZ2VyIGFwcFdpZGdldE1hbmFnZXIsIGludFtdIGFwcFdpZGdldElkcykKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQVBQV0lER0VUX1VQREFURSA9ICJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX1VQREFURSI7CkBAIC0xNjMsNyArMTYyLDcgQEAKIAogICAgIC8qKgogICAgICAqIFNlbnQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhbiBBcHBXaWRnZXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsYXN0IGhvc3QuCi0gICAgICogCisgICAgICoKICAgICAgKiBAc2VlIEFwcFdpZGdldFByb3ZpZGVyI29uRW5hYmxlZCBBcHBXaWRnZXRQcm92aWRlci5vbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0KQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BUFBXSURHRVRfRElTQUJMRUQgPSAiYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9ESVNBQkxFRCI7CkBAIC0xNzIsNyArMTcxLDcgQEAKICAgICAgKiBTZW50IHdoZW4gYW4gaW5zdGFuY2Ugb2YgYW4gQXBwV2lkZ2V0IGlzIGFkZGVkIHRvIGEgaG9zdCBmb3IgdGhlIGZpcnN0IHRpbWUuCiAgICAgICogVGhpcyBicm9hZGNhc3QgaXMgc2VudCBhdCBib290IHRpbWUgaWYgdGhlcmUgaXMgYSBBcHBXaWRnZXRIb3N0IGluc3RhbGxlZCB3aXRoCiAgICAgICogYW4gaW5zdGFuY2UgZm9yIHRoaXMgcHJvdmlkZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAc2VlIEFwcFdpZGdldFByb3ZpZGVyI29uRW5hYmxlZCBBcHBXaWRnZXRQcm92aWRlci5vbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0KQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BUFBXSURHRVRfRU5BQkxFRCA9ICJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX0VOQUJMRUQiOwpAQCAtMTgzLDIwICsxODIsMjEgQEAKICAgICAgKiBAc2VlIEFwcFdpZGdldFByb3ZpZGVySW5mbwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfREFUQV9BUFBXSURHRVRfUFJPVklERVIgPSAiYW5kcm9pZC5hcHB3aWRnZXQucHJvdmlkZXIiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRmllbGQgZm9yIHRoZSBtYW5pZmVzdCBtZXRhLWRhdGEgdGFnIHVzZWQgdG8gaW5kaWNhdGUgYW55IHByZXZpb3VzIG5hbWUgZm9yIHRoZQogICAgICAqIGFwcCB3aWRnZXQgcmVjZWl2ZXIuCiAgICAgICoKICAgICAgKiBAc2VlIEFwcFdpZGdldFByb3ZpZGVySW5mbwotICAgICAqIAorICAgICAqCiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfQVBQV0lER0VUX09MRF9OQU1FID0gImFuZHJvaWQuYXBwd2lkZ2V0Lm9sZE5hbWUiOwogCi0gICAgc3RhdGljIFdlYWtIYXNoTWFwPENvbnRleHQsIFdlYWtSZWZlcmVuY2U8QXBwV2lkZ2V0TWFuYWdlcj4+IHNNYW5hZ2VyQ2FjaGUgPSBuZXcgV2Vha0hhc2hNYXAoKTsKKyAgICBzdGF0aWMgV2Vha0hhc2hNYXA8Q29udGV4dCwgV2Vha1JlZmVyZW5jZTxBcHBXaWRnZXRNYW5hZ2VyPj4gc01hbmFnZXJDYWNoZSA9CisgICAgICAgIG5ldyBXZWFrSGFzaE1hcDxDb250ZXh0LCBXZWFrUmVmZXJlbmNlPEFwcFdpZGdldE1hbmFnZXI+PigpOwogICAgIHN0YXRpYyBJQXBwV2lkZ2V0U2VydmljZSBzU2VydmljZTsKLSAgICAKKwogICAgIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIERpc3BsYXlNZXRyaWNzIG1EaXNwbGF5TWV0cmljczsKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFwcFdpZGdldE1hbmFnZXIoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgc01hbmFnZXJDYWNoZS5wdXQoY29udGV4dCwgbmV3IFdlYWtSZWZlcmVuY2UocmVzdWx0KSk7CisgICAgICAgICAgICAgICAgc01hbmFnZXJDYWNoZS5wdXQoY29udGV4dCwgbmV3IFdlYWtSZWZlcmVuY2U8QXBwV2lkZ2V0TWFuYWdlcj4ocmVzdWx0KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CkBAIC0zMTAsNyArMzEwLDcgQEAKICAgICAgICAgICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBpbmZvID0gc1NlcnZpY2UuZ2V0QXBwV2lkZ2V0SW5mbyhhcHBXaWRnZXRJZCk7CiAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBjb21wbGV4IHRvIGRwLgotICAgICAgICAgICAgICAgIGluZm8ubWluV2lkdGggPSAKKyAgICAgICAgICAgICAgICBpbmZvLm1pbldpZHRoID0KICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluV2lkdGgsIG1EaXNwbGF5TWV0cmljcyk7CiAgICAgICAgICAgICAgICAgaW5mby5taW5IZWlnaHQgPQogICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5IZWlnaHQsIG1EaXNwbGF5TWV0cmljcyk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXBwV2lkZ2V0SWRzIHRoYXQgaGF2ZSBiZWVuIGJvdW5kIHRvIHRoZSBnaXZlbiBBcHBXaWRnZXQKICAgICAgKiBwcm92aWRlci4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gdGhhdCBpcyB0aGUKICAgICAgKiAgICAgICAgICAgIEFwcFdpZGdldCBwcm92aWRlciB0byBmaW5kIGFwcFdpZGdldElkcyBmb3IuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQXRDb21tYW5kSGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0F0Q29tbWFuZEhhbmRsZXIuamF2YQppbmRleCA4ZGUyMTMzLi42ZGVhYjM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQXRDb21tYW5kSGFuZGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9BdENvbW1hbmRIYW5kbGVyLmphdmEKQEAgLTczLDcgKzczLDcgQEAKICAgICAgKiAgICAgICAgICAgICBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGlzIGFycmF5LgogICAgICAqIEByZXR1cm4gICAgIFRoZSByZXN1bHQgb2YgdGhpcyBjb21tYW5kLgogICAgICAqLwotICAgIC8vIFR5cGljYWxseSB1c2VkIHRvIHNldCB0aGlzIHBhcmFtdGVyCisgICAgLy8gVHlwaWNhbGx5IHVzZWQgdG8gc2V0IHRoaXMgcGFyYW1ldGVyCiAgICAgcHVibGljIEF0Q29tbWFuZFJlc3VsdCBoYW5kbGVTZXRDb21tYW5kKE9iamVjdFtdIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIG5ldyBBdENvbW1hbmRSZXN1bHQoQXRDb21tYW5kUmVzdWx0LkVSUk9SKTsKICAgICB9CkBAIC04MywxMSArODMsMTIgQEAKICAgICAgKiBUZXN0IGNvbW1hbmRzIGFyZSBwYXJ0IG9mIHRoZSBFeHRlbmRlZCBjb21tYW5kIHN5bnRheCwgYW5kIGFyZSB0eXBpY2FsbHkKICAgICAgKiB1c2VkIHRvIHJlcXVlc3QgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmFuZ2Ugb2YgbGVnYWwgdmFsdWVzIHRoYXQgIkZPTyIKICAgICAgKiBjYW4gdGFrZS48cD4KLSAgICAgKiBCeSBkZWZ1YWx0IHdlIHJldHVybiBhbiBPSyByZXN1bHQsIHRvIGluZGljYXRlIHRoYXQgdGhpcyBjb21tYW5kIGlzIGF0CisgICAgICogQnkgZGVmYXVsdCB3ZSByZXR1cm4gYW4gT0sgcmVzdWx0LCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgY29tbWFuZCBpcyBhdAogICAgICAqIGxlYXN0IHJlY29nbml6ZWQuPHA+CiAgICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoaXMgY29tbWFuZC4KICAgICAgKi8KICAgICBwdWJsaWMgQXRDb21tYW5kUmVzdWx0IGhhbmRsZVRlc3RDb21tYW5kKCkgewogICAgICAgICByZXR1cm4gbmV3IEF0Q29tbWFuZFJlc3VsdChBdENvbW1hbmRSZXN1bHQuT0spOwogICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFzc2lnbmVkTnVtYmVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFzc2lnbmVkTnVtYmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmM4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXNzaWduZWROdW1iZXJzLmphdmEKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCisvKioKKyAqIEJsdWV0b290aCBBc3NpZ25lZCBOdW1iZXJzLgorICogPHA+CisgKiBGb3Igbm93IHdlIG9ubHkgaW5jbHVkZSBDb21wYW55IElEIHZhbHVlcy4KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy90ZWNobmljYWwvYXNzaWduZWRudW1iZXJzL2lkZW50aWZpZXJzLmh0bSI+CisgKiBUaGUgT2ZmaWNpYWwgQmx1ZXRvb3RoIFNJRyBNZW1iZXIgV2Vic2l0ZSB8IENvbXBhbnkgSWRlbnRpZmllcnM8L2E+CisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEJsdWV0b290aEFzc2lnbmVkTnVtYmVycyB7CisKKyAgICAvLy8vIEJsdWV0b290aCBTSUcgQ29tcGFueSBJRCB2YWx1ZXMKKworICAgIC8qCisgICAgICogRXJpY3Nzb24gVGVjaG5vbG9neSBMaWNlbnNpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJJQ1NTT05fVEVDSE5PTE9HWSA9IDB4MDAwMDsKKworICAgIC8qCisgICAgICogTm9raWEgTW9iaWxlIFBob25lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0tJQV9NT0JJTEVfUEhPTkVTID0gMHgwMDAxOworCisgICAgLyoKKyAgICAgKiBJbnRlbCBDb3JwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVMID0gMHgwMDAyOworCisgICAgLyoKKyAgICAgKiBJQk0gQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQk0gPSAweDAwMDM7CisKKyAgICAvKgorICAgICAqIFRvc2hpYmEgQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1NISUJBID0gMHgwMDA0OworCisgICAgLyoKKyAgICAgKiAzQ29tLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVFQ09NID0gMHgwMDA1OworCisgICAgLyoKKyAgICAgKiBNaWNyb3NvZnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlDUk9TT0ZUID0gMHgwMDA2OworCisgICAgLyoKKyAgICAgKiBMdWNlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFVDRU5UID0gMHgwMDA3OworCisgICAgLyoKKyAgICAgKiBNb3Rvcm9sYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1RPUk9MQSA9IDB4MDAwODsKKworICAgIC8qCisgICAgICogSW5maW5lb24gVGVjaG5vbG9naWVzIEFHLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklORU9OX1RFQ0hOT0xPR0lFUyA9IDB4MDAwOTsKKworICAgIC8qCisgICAgICogQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FNQlJJREdFX1NJTElDT05fUkFESU8gPSAweDAwMEE7CisKKyAgICAvKgorICAgICAqIFNpbGljb24gV2F2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUxJQ09OX1dBVkUgPSAweDAwMEI7CisKKyAgICAvKgorICAgICAqIERpZ2lhbnN3ZXIgQS9TLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lBTlNXRVIgPSAweDAwMEM7CisKKyAgICAvKgorICAgICAqIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhBU19JTlNUUlVNRU5UUyA9IDB4MDAwRDsKKworICAgIC8qCisgICAgICogUGFydGh1cyBUZWNobm9sb2dpZXMgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRIVVNfVEVDSE5PTE9HSUVTID0gMHgwMDBFOworCisgICAgLyoKKyAgICAgKiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENPTSA9IDB4MDAwRjsKKworICAgIC8qCisgICAgICogTWl0ZWwgU2VtaWNvbmR1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVRFTF9TRU1JQ09ORFVDVE9SID0gMHgwMDEwOworCisgICAgLyoKKyAgICAgKiBXaWRjb21tLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lEQ09NTSA9IDB4MDAxMTsKKworICAgIC8qCisgICAgICogWmVldm8sIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRUVWTyA9IDB4MDAxMjsKKworICAgIC8qCisgICAgICogQXRtZWwgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRNRUwgPSAweDAwMTM7CisKKyAgICAvKgorICAgICAqIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlUU1VCSVNISV9FTEVDVFJJQyA9IDB4MDAxNDsKKworICAgIC8qCisgICAgICogUlRYIFRlbGVjb20gQS9TLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJUWF9URUxFQ09NID0gMHgwMDE1OworCisgICAgLyoKKyAgICAgKiBLQyBUZWNobm9sb2d5IEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLQ19URUNITk9MT0dZID0gMHgwMDE2OworCisgICAgLyoKKyAgICAgKiBOZXdsb2dpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdMT0dJQyA9IDB4MDAxNzsKKworICAgIC8qCisgICAgICogVHJhbnNpbGljYSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUxJQ0EgPSAweDAwMTg7CisKKyAgICAvKgorICAgICAqIFJvaGRlICYgU2Nod2FyeiBHbWJIICYgQ28uIEtHLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPSERFX0FORF9TQ0hXQVJaID0gMHgwMDE5OworCisgICAgLyoKKyAgICAgKiBUVFBDb20gTGltaXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVFBDT00gPSAweDAwMUE7CisKKyAgICAvKgorICAgICAqIFNpZ25pYSBUZWNobm9sb2dpZXMsIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOSUFfVEVDSE5PTE9HSUVTID0gMHgwMDFCOworCisgICAgLyoKKyAgICAgKiBDb25leGFudCBTeXN0ZW1zIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05FWEFOVF9TWVNURU1TID0gMHgwMDFDOworCisgICAgLyoKKyAgICAgKiBRdWFsY29tbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMQ09NTSA9IDB4MDAxRDsKKworICAgIC8qCisgICAgICogSW52ZW50ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WRU5URUwgPSAweDAwMUU7CisKKyAgICAvKgorICAgICAqIEFWTSBCZXJsaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZNX0JFUkxJTiA9IDB4MDAxRjsKKworICAgIC8qCisgICAgICogQmFuZFNwZWVkLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFORFNQRUVEID0gMHgwMDIwOworCisgICAgLyoKKyAgICAgKiBNYW5zZWxsYSBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOU0VMTEEgPSAweDAwMjE7CisKKyAgICAvKgorICAgICAqIE5FQyBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORUMgPSAweDAwMjI7CisKKyAgICAvKgorICAgICAqIFdhdmVQbHVzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FWRVBMVVNfVEVDSE5PTE9HWSA9IDB4MDAyMzsKKworICAgIC8qCisgICAgICogQWxjYXRlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTENBVEVMID0gMHgwMDI0OworCisgICAgLyoKKyAgICAgKiBQaGlsaXBzIFNlbWljb25kdWN0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBISUxJUFNfU0VNSUNPTkRVQ1RPUlMgPSAweDAwMjU7CisKKyAgICAvKgorICAgICAqIEMgVGVjaG5vbG9naWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENfVEVDSE5PTE9HSUVTID0gMHgwMDI2OworCisgICAgLyoKKyAgICAgKiBPcGVuIEludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX0lOVEVSRkFDRSA9IDB4MDAyNzsKKworICAgIC8qCisgICAgICogUiBGIE1pY3JvIERldmljZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkZfTUlDUk9fREVWSUNFUyA9IDB4MDAyODsKKworICAgIC8qCisgICAgICogSGl0YWNoaSBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElUQUNISSA9IDB4MDAyOTsKKworICAgIC8qCisgICAgICogU3ltYm9sIFRlY2hub2xvZ2llcywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTUJPTF9URUNITk9MT0dJRVMgPSAweDAwMkE7CisKKyAgICAvKgorICAgICAqIFRlbm92aXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVOT1ZJUyA9IDB4MDAyQjsKKworICAgIC8qCisgICAgICogTWFjcm9uaXggSW50ZXJuYXRpb25hbCBDby4gTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BQ1JPTklYID0gMHgwMDJDOworCisgICAgLyoKKyAgICAgKiBHQ1QgU2VtaWNvbmR1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHQ1RfU0VNSUNPTkRVQ1RPUiA9IDB4MDAyRDsKKworICAgIC8qCisgICAgICogTm9yd29vZCBTeXN0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUldPT0RfU1lTVEVNUyA9IDB4MDAyRTsKKworICAgIC8qCisgICAgICogTWV3VGVsIFRlY2hub2xvZ3kgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FV1RFTF9URUNITk9MT0dZID0gMHgwMDJGOworCisgICAgLyoKKyAgICAgKiBTVCBNaWNyb2VsZWN0cm9uaWNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01JQ1JPRUxFQ1RST05JQ1MgPSAweDAwMzA7CisKKyAgICAvKgorICAgICAqIFN5bm9wc3lzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTk9QU1lTID0gMHgwMDMxOworCisgICAgLyoKKyAgICAgKiBSZWQtTSAoQ29tbXVuaWNhdGlvbnMpIEx0ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURfTSA9IDB4MDAzMjsKKworICAgIC8qCisgICAgICogQ29tbWlsIEx0ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NSUwgPSAweDAwMzM7CisKKyAgICAvKgorICAgICAqIENvbXB1dGVyIEFjY2VzcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uIChDQVRDKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRDID0gMHgwMDM0OworCisgICAgLyoKKyAgICAgKiBFY2xpcHNlIChIUSBFc3BhbmEpIFMuTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQ0xJUFNFID0gMHgwMDM1OworCisgICAgLyoKKyAgICAgKiBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU5FU0FTX1RFQ0hOT0xPR1kgPSAweDAwMzY7CisKKyAgICAvKgorICAgICAqIE1vYmlsaWFuIENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PQklMSUFOX0NPUlBPUkFUSU9OID0gMHgwMDM3OworCisgICAgLyoKKyAgICAgKiBUZXJheC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVJBWCA9IDB4MDAzODsKKworICAgIC8qCisgICAgICogSW50ZWdyYXRlZCBTeXN0ZW0gU29sdXRpb24gQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR1JBVEVEX1NZU1RFTV9TT0xVVElPTiA9IDB4MDAzOTsKKworICAgIC8qCisgICAgICogTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVFNVU0hJVEFfRUxFQ1RSSUMgPSAweDAwM0E7CisKKyAgICAvKgorICAgICAqIEdlbm51bSBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5OVU0gPSAweDAwM0I7CisKKyAgICAvKgorICAgICAqIFJlc2VhcmNoIEluIE1vdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFQVJDSF9JTl9NT1RJT04gPSAweDAwM0M7CisKKyAgICAvKgorICAgICAqIElQZXh0cmVtZSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQRVhUUkVNRSA9IDB4MDAzRDsKKworICAgIC8qCisgICAgICogU3lzdGVtcyBhbmQgQ2hpcHMsIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU1TX0FORF9DSElQUyA9IDB4MDAzRTsKKworICAgIC8qCisgICAgICogQmx1ZXRvb3RoIFNJRywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMVUVUT09USF9TSUcgPSAweDAwM0Y7CisKKyAgICAvKgorICAgICAqIFNlaWtvIEVwc29uIENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFSUtPX0VQU09OID0gMHgwMDQwOworCisgICAgLyoKKyAgICAgKiBJbnRlZ3JhdGVkIFNpbGljb24gU29sdXRpb24gVGFpd2FuLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdSQVRFRF9TSUxJQ09OX1NPTFVUSU9OID0gMHgwMDQxOworCisgICAgLyoKKyAgICAgKiBDT05XSVNFIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTldJU0VfVEVDSE5PTE9HWSA9IDB4MDA0MjsKKworICAgIC8qCisgICAgICogUEFSUk9UIFNBLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlJPVCA9IDB4MDA0MzsKKworICAgIC8qCisgICAgICogU29ja2V0IE1vYmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfTU9CSUxFID0gMHgwMDQ0OworCisgICAgLyoKKyAgICAgKiBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRIRVJPU19DT01NVU5JQ0FUSU9OUyA9IDB4MDA0NTsKKworICAgIC8qCisgICAgICogTWVkaWFUZWssIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQVRFSyA9IDB4MDA0NjsKKworICAgIC8qCisgICAgICogQmx1ZWdpZ2EuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRUdJR0EgPSAweDAwNDc7CisKKyAgICAvKgorICAgICAqIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFSVkVMTCA9IDB4MDA0ODsKKworICAgIC8qCisgICAgICogM0RTUCBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJFRV9EU1AgPSAweDAwNDk7CisKKyAgICAvKgorICAgICAqIEFjY2VsIFNlbWljb25kdWN0b3IgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VMX1NFTUlDT05EVUNUT1IgPSAweDAwNEE7CisKKyAgICAvKgorICAgICAqIENvbnRpbmVudGFsIEF1dG9tb3RpdmUgU3lzdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5FTlRBTF9BVVRPTU9USVZFID0gMHgwMDRCOworCisgICAgLyoKKyAgICAgKiBBcHBsZSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExFID0gMHgwMDRDOworCisgICAgLyoKKyAgICAgKiBTdGFjY2F0byBDb21tdW5pY2F0aW9ucywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUNDQVRPX0NPTU1VTklDQVRJT05TID0gMHgwMDREOworCisgICAgLyoKKyAgICAgKiBBdmFnbyBUZWNobm9sb2dpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBR08gPSAweDAwNEU7CisKKyAgICAvKgorICAgICAqIEFQVCBMaWNlbnNpbmcgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQVF9MSUNFTlNJTkcgPSAweDAwNEY7CisKKyAgICAvKgorICAgICAqIFNpUkYgVGVjaG5vbG9neSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJUkZfVEVDSE5PTE9HWSA9IDB4MDA1MDsKKworICAgIC8qCisgICAgICogVHplcm8gVGVjaG5vbG9naWVzLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFpFUk9fVEVDSE5PTE9HSUVTID0gMHgwMDUxOworCisgICAgLyoKKyAgICAgKiBKJk0gQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSl9BTkRfTSA9IDB4MDA1MjsKKworICAgIC8qCisgICAgICogRnJlZTJtb3ZlIEFCLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSRUUyTU9WRSA9IDB4MDA1MzsKKworICAgIC8qCisgICAgICogM0RpSm95IENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVFX0RJSk9ZID0gMHgwMDU0OworCisgICAgLyoKKyAgICAgKiBQbGFudHJvbmljcywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQU5UUk9OSUNTID0gMHgwMDU1OworCisgICAgLyoKKyAgICAgKiBTb255IEVyaWNzc29uIE1vYmlsZSBDb21tdW5pY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT05ZX0VSSUNTU09OID0gMHgwMDU2OworCisgICAgLyoKKyAgICAgKiBIYXJtYW4gSW50ZXJuYXRpb25hbCBJbmR1c3RyaWVzLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFSTUFOX0lOVEVSTkFUSU9OQUwgPSAweDAwNTc7CisKKyAgICAvKgorICAgICAqIFZpemlvLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklaSU8gPSAweDAwNTg7CisKKyAgICAvKgorICAgICAqIE5vcmRpYyBTZW1pY29uZHVjdG9yIEFTQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JESUNfU0VNSUNPTkRVQ1RPUiA9IDB4MDA1OTsKKworICAgIC8qCisgICAgICogRU0gTWljcm9lbGVjdHJvbmljLU1hcmluIFNBLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNX01JQ1JPRUxFQ1RST05JQ19NQVJJTiA9IDB4MDA1QTsKKworICAgIC8qCisgICAgICogUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFMSU5LX1RFQ0hOT0xPR1kgPSAweDAwNUI7CisKKyAgICAvKgorICAgICAqIEJlbGtpbiBJbnRlcm5hdGlvbmFsLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVMS0lOX0lOVEVSTkFUSU9OQUwgPSAweDAwNUM7CisKKyAgICAvKgorICAgICAqIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFMVEVLX1NFTUlDT05EVUNUT1IgPSAweDAwNUQ7CisKKyAgICAvKgorICAgICAqIFN0b25lc3RyZWV0IE9uZSwgTExDLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT05FU1RSRUVUX09ORSA9IDB4MDA1RTsKKworICAgIC8qCisgICAgICogV2ljZW50cmljLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lDRU5UUklDID0gMHgwMDVGOworCisgICAgLyoKKyAgICAgKiBSaXZpZXJhV2F2ZXMgUy5BLlMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklWSUVSQVdBVkVTID0gMHgwMDYwOworCisgICAgLyoKKyAgICAgKiBZb3UgY2FuJ3QgaW5zdGFudGlhdGUgb25lIG9mIHRoZXNlLgorICAgICAqLworICAgIHByaXZhdGUgQmx1ZXRvb3RoQXNzaWduZWROdW1iZXJzKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKaW5kZXggMTk3YjAyMi4uZGExYWE0NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCkBAIC04NSw2ICs4NSw0MyBAQAogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuRElTQ09OTkVDVF9JTklUSUFUT1IiOwogCiAgICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogSW5kaWNhdGVzIGEgaGVhZHNldCBoYXMgcG9zdGVkIGEgdmVuZG9yLXNwZWNpZmljIGV2ZW50LgorICAgICAqIDxwPkFsd2F5cyBjb250YWlucyB0aGUgZXh0cmEgZmllbGRzIHtAbGluayAjRVhUUkFfREVWSUNFfSwKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRH0sIGFuZAorICAgICAqIHtAbGluayAjRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHU30uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlQgPQorICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuYWN0aW9uLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UIjsKKworICAgIC8qKgorICAgICAqIEEgU3RyaW5nIGV4dHJhIGZpZWxkIGluIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfQorICAgICAqIGludGVudHMgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNvbW1hbmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ01EID0KKyAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCI7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnQgZXh0cmEgZmllbGQgaW4ge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9CisgICAgICogaW50ZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBDb21wYW55IElEIG9mIHRoZSB2ZW5kb3IgZGVmaW5pbmcgdGhlIHZlbmRvci1zcGVjaWZpYworICAgICAqIGNvbW1hbmQuCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL3d3dy5ibHVldG9vdGgub3JnL1RlY2huaWNhbC9Bc3NpZ25lZE51bWJlcnMvaWRlbnRpZmllcnMuaHRtIj4KKyAgICAgKiBCbHVldG9vdGggU0lHIEFzc2lnbmVkIE51bWJlcnMgLSBDb21wYW55IElkZW50aWZpZXJzPC9hPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQgPQorICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ09NUEFOWV9JRCI7CisKKyAgICAvKioKKyAgICAgKiBBIFBhcmNlbGFibGUgU3RyaW5nIGFycmF5IGV4dHJhIGZpZWxkIGluCisgICAgICoge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9IGludGVudHMgdGhhdCBjb250YWlucworICAgICAqIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1MgPQorICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHUyI7CisKKworICAgIC8qKgogICAgICAqIFRPRE8oQVBJIHJlbGVhc2UpOiBDb25zaWRlciBpbmNvcnBvcmF0aW5nIGFzIG5ldyBzdGF0ZSBpbgogICAgICAqIEhFQURTRVRfU1RBVEVfQ0hBTkdFRAogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0hlYWRzZXRCYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSGVhZHNldEJhc2UuamF2YQppbmRleCAyMjQ5NWE3Li45ZWYyZWI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSGVhZHNldEJhc2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSGVhZHNldEJhc2UuamF2YQpAQCAtNzQsOCArNzQsOCBAQAogCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbGVhbnVwTmF0aXZlRGF0YU5hdGl2ZSgpOwogCi0gICAgcHVibGljIEhlYWRzZXRCYXNlKFBvd2VyTWFuYWdlciBwbSwgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgaW50IHJmY29tbUNoYW5uZWwpIHsKKyAgICBwdWJsaWMgSGVhZHNldEJhc2UoUG93ZXJNYW5hZ2VyIHBtLCBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByZmNvbW1DaGFubmVsKSB7CiAgICAgICAgIG1EaXJlY3Rpb24gPSBESVJFQ1RJT05fT1VUR09JTkc7CiAgICAgICAgIG1Db25uZWN0VGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIG1BZGFwdGVyID0gYWRhcHRlcjsKQEAgLTg5LDkgKzg5LDEwIEBACiAgICAgICAgIGluaXRpYWxpemVOYXRpdmVEYXRhTmF0aXZlKC0xKTsKICAgICB9CiAKLSAgICAvKiBDcmVhdGUgZnJvbSBhbiBhbHJlYWR5IGV4aXN0aW5nIHJmY29tbSBjb25uZWN0aW9uICovCi0gICAgcHVibGljIEhlYWRzZXRCYXNlKFBvd2VyTWFuYWdlciBwbSwgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgaW50IHNvY2tldEZkLCBpbnQgcmZjb21tQ2hhbm5lbCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgLyogQ3JlYXRlIGZyb20gYW4gZXhpc3RpbmcgcmZjb21tIGNvbm5lY3Rpb24gKi8KKyAgICBwdWJsaWMgSGVhZHNldEJhc2UoUG93ZXJNYW5hZ2VyIHBtLCBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2NrZXRGZCwgaW50IHJmY29tbUNoYW5uZWwsIEhhbmRsZXIgaGFuZGxlcikgewogICAgICAgICBtRGlyZWN0aW9uID0gRElSRUNUSU9OX0lOQ09NSU5HOwogICAgICAgICBtQ29ubmVjdFRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CkBAIC0xNDIsOCArMTQzLDkgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXRQYXJzZXIoKSB7CiAgICAgICAgIG1BdFBhcnNlciA9IG5ldyBBdFBhcnNlcigpOwotICAgICAgICAvL1RPRE8oKTogR2V0IHJpZCBvZiB0aGlzIGFzIHRoZXJlIGFyZSBubyBwYXJzZXJzIHJlZ2lzdGVyZWQuIEJ1dCBiZWNhdXNlIG9mIGRlcGVuZGVuY2llcywKLSAgICAgICAgLy9pdCBuZWVkcyB0byBiZSBkb25lIGFzIHBhcnQgb2YgcmVmYWN0b3JpbmcgSGVhZHNldEJhc2UgYW5kIEJsdWV0b290aEhhbmRzZnJlZQorCisgICAgICAgIC8vVE9ETygpOiBHZXQgcmlkIG9mIHRoaXMgYXMgdGhlcmUgYXJlIG5vIHBhcnNlcnMgcmVnaXN0ZXJlZC4gQnV0IGJlY2F1c2Ugb2YgZGVwZW5kZW5jaWVzCisgICAgICAgIC8vIGl0IG5lZWRzIHRvIGJlIGRvbmUgYXMgcGFydCBvZiByZWZhY3RvcmluZyBIZWFkc2V0QmFzZSBhbmQgQmx1ZXRvb3RoSGFuZHNmcmVlCiAgICAgfQogCiAgICAgcHVibGljIEF0UGFyc2VyIGdldEF0UGFyc2VyKCkgewpAQCAtMTU5LDggKzE2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXQgPSByZWFkTmF0aXZlKDUwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUlucHV0KGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3JlYWRfZXJyb3IgPSBnZXRMYXN0UmVhZFN0YXR1c05hdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3JlYWRfZXJyb3IgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJoZWFkc2V0IHJlYWQgZXJyb3IgIiArIGxhc3RfcmVhZF9lcnJvcik7CkBAIC0xNzksOCArMTgwLDYgQEAKICAgICAgICAgbUV2ZW50VGhyZWFkLnN0YXJ0KCk7CiAgICAgfQogCi0KLQogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyByZWFkTmF0aXZlKGludCB0aW1lb3V0X21zKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0TGFzdFJlYWRTdGF0dXNOYXRpdmUoKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKaW5kZXggODFmZjQxNC4uZDE2YjNkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCkBAIC0yMDEsNiArMjAxLDcgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gZ2V0IHR5cGUgZm9yOiAiICsgdXJsICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKQEAgLTIxNiw2ICsyMTcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gZ2V0IHR5cGUgZm9yOiAiICsgdXJsICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzk0LDkgKzEzOTgsMTEgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGludGVncmF0ZSBDbG9zZUd1YXJkIHN1cHBvcnQuCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmKCFtQ2xvc2VGbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci50aGlzLnJlbGVhc2VQcm92aWRlcihtQ29udGVudFByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3Vyc29yIGZpbmFsaXplZCB3aXRob3V0IHByaW9yIGNsb3NlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1VyaU1hdGNoZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvVXJpTWF0Y2hlci5qYXZhCmluZGV4IDcyZWM0NjkuLjg0MWM4ZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvVXJpTWF0Y2hlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvVXJpTWF0Y2hlci5qYXZhCkBAIC0yNSw4ICsyNSw4IEBACiAvKioKIFV0aWxpdHkgY2xhc3MgdG8gYWlkIGluIG1hdGNoaW5nIFVSSXMgaW4gY29udGVudCBwcm92aWRlcnMuCiAKLTxwPlRvIHVzZSB0aGlzIGNsYXNzLCBidWlsZCB1cCBhIHRyZWUgb2YgVXJpTWF0Y2hlciBvYmplY3RzLgotVHlwaWNhbGx5LCBpdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorPHA+VG8gdXNlIHRoaXMgY2xhc3MsIGJ1aWxkIHVwIGEgdHJlZSBvZiA8Y29kZT5VcmlNYXRjaGVyPC9jb2RlPiBvYmplY3RzLgorRm9yIGV4YW1wbGU6CiA8cHJlPgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRU9QTEUgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRU9QTEVfSUQgPSAyOwpAQCAtNDgsMzYgKzQ4LDM1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTExTX0lEID0gMTI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTExTX0ZJTFRFUiA9IDE1OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpTWF0Y2hlciBzVVJJTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpTWF0Y2hlciBzVVJJTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOwogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUiLCBQRU9QTEUpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUvIyIsIFBFT1BMRV9JRCk7Ci0gICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiL3Blb3BsZS8jL3Bob25lcyIsIFBFT1BMRV9QSE9ORVMpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUvIy9waG9uZXMvIyIsIFBFT1BMRV9QSE9ORVNfSUQpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUvIy9jb250YWN0X21ldGhvZHMiLCBQRU9QTEVfQ09OVEFDVE1FVEhPRFMpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUvIy9jb250YWN0X21ldGhvZHMvIyIsIFBFT1BMRV9DT05UQUNUTUVUSE9EU19JRCk7Ci0gICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiL2RlbGV0ZWRfcGVvcGxlIiwgREVMRVRFRF9QRU9QTEUpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9waG9uZXMiLCBQSE9ORVMpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9waG9uZXMvZmlsdGVyLyoiLCBQSE9ORVNfRklMVEVSKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGhvbmVzLyMiLCBQSE9ORVNfSUQpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9jb250YWN0X21ldGhvZHMiLCBDT05UQUNUTUVUSE9EUyk7Ci0gICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiL2NvbnRhY3RfbWV0aG9kcy8jIiwgQ09OVEFDVE1FVEhPRFNfSUQpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNhbGxfbG9nIiwgIi9jYWxscyIsIENBTExTKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICIvY2FsbHMvZmlsdGVyLyoiLCBDQUxMU19GSUxURVIpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNhbGxfbG9nIiwgIi9jYWxscy8jIiwgQ0FMTFNfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBlb3BsZSIsIFBFT1BMRSk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGVvcGxlLyMiLCBQRU9QTEVfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBlb3BsZS8jL3Bob25lcyIsIFBFT1BMRV9QSE9ORVMpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBlb3BsZS8jL3Bob25lcy8jIiwgUEVPUExFX1BIT05FU19JRCk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGVvcGxlLyMvY29udGFjdF9tZXRob2RzIiwgUEVPUExFX0NPTlRBQ1RNRVRIT0RTKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwZW9wbGUvIy9jb250YWN0X21ldGhvZHMvIyIsIFBFT1BMRV9DT05UQUNUTUVUSE9EU19JRCk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiZGVsZXRlZF9wZW9wbGUiLCBERUxFVEVEX1BFT1BMRSk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGhvbmVzIiwgUEhPTkVTKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwaG9uZXMvZmlsdGVyLyoiLCBQSE9ORVNfRklMVEVSKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwaG9uZXMvIyIsIFBIT05FU19JRCk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiY29udGFjdF9tZXRob2RzIiwgQ09OVEFDVE1FVEhPRFMpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgImNvbnRhY3RfbWV0aG9kcy8jIiwgQ09OVEFDVE1FVEhPRFNfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNhbGxfbG9nIiwgImNhbGxzIiwgQ0FMTFMpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNhbGxfbG9nIiwgImNhbGxzL2ZpbHRlci8qIiwgQ0FMTFNfRklMVEVSKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICJjYWxscy8jIiwgQ0FMTFNfSUQpOwogICAgIH0KIDwvcHJlPgotPHA+VGhlbiB3aGVuIHlvdSBuZWVkIHRvIG1hdGNoIG1hdGNoIGFnYWluc3QgYSBVUkksIGNhbGwge0BsaW5rICNtYXRjaH0sIHByb3ZpZGluZwotdGhlIHRva2VuaXplZCB1cmwgeW91J3ZlIGJlZW4gZ2l2ZW4sIGFuZCB0aGUgdmFsdWUgeW91IHdhbnQgaWYgdGhlcmUgaXNuJ3QKLWEgbWF0Y2guICBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0IHRvIGJ1aWxkIGEgcXVlcnksIHJldHVybiBhIHR5cGUsIGluc2VydCBvcgotZGVsZXRlIGEgcm93LCBvciB3aGF0ZXZlciB5b3UgbmVlZCwgd2l0aG91dCBkdXBsaWNhdGluZyBhbGwgb2YgdGhlIGlmLWVsc2UKLWxvZ2ljIHlvdSdkIG90aGVyd2lzZSBuZWVkLiAgTGlrZSB0aGlzOgorPHA+VGhlbiB3aGVuIHlvdSBuZWVkIHRvIG1hdGNoIGFnYWluc3QgYSBVUkksIGNhbGwge0BsaW5rICNtYXRjaH0sIHByb3ZpZGluZwordGhlIFVSTCB0aGF0IHlvdSBoYXZlIGJlZW4gZ2l2ZW4uICBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0IHRvIGJ1aWxkIGEgcXVlcnksCityZXR1cm4gYSB0eXBlLCBpbnNlcnQgb3IgZGVsZXRlIGEgcm93LCBvciB3aGF0ZXZlciB5b3UgbmVlZCwgd2l0aG91dCBkdXBsaWNhdGluZworYWxsIG9mIHRoZSBpZi1lbHNlIGxvZ2ljIHRoYXQgeW91IHdvdWxkIG90aGVyd2lzZSBuZWVkLiAgRm9yIGV4YW1wbGU6CiA8cHJlPgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmdbXSB1cmwpCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpCiAgICAgewotICAgICAgICBpbnQgbWF0Y2ggPSBzVVJJTWF0Y2hlci5tYXRjaCh1cmwsIE5PX01BVENIKTsKKyAgICAgICAgaW50IG1hdGNoID0gc1VSSU1hdGNoZXIubWF0Y2godXJsKTsKICAgICAgICAgc3dpdGNoIChtYXRjaCkKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBQRU9QTEU6CkBAIC05MywxOSArOTIsMjAgQEAKICAgICAgICAgfQogICAgIH0KIDwvcHJlPgotaW5zdGVhZCBvZgoraW5zdGVhZCBvZjoKIDxwcmU+Ci0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFN0cmluZ1tdIHVybCkKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkKICAgICB7Ci0gICAgICAgIGlmICh1cmwubGVuZ3RoID49IDIpIHsKLSAgICAgICAgICAgIGlmICh1cmxbMV0uZXF1YWxzKCJwZW9wbGUiKSkgewotICAgICAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoID09IDIpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhTZWdtZW50cyA9IHVybC5nZXRQYXRoU2VnbWVudHMoKTsKKyAgICAgICAgaWYgKHBhdGhTZWdtZW50cy5zaXplKCkgPj0gMikgeworICAgICAgICAgICAgaWYgKCJwZW9wbGUiLmVxdWFscyhwYXRoU2VnbWVudHMuZ2V0KDEpKSkgeworICAgICAgICAgICAgICAgIGlmIChwYXRoU2VnbWVudHMuc2l6ZSgpID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3BlcnNvbiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhTZWdtZW50cy5zaXplKCkgPT0gMykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3BlcnNvbiI7CiAuLi4gc25pcCAuLi4KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3NuYWlsLW1haWwiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmxlbmd0aCA9PSAzKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoU2VnbWVudHMuc2l6ZSgpID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9zbmFpbC1tYWlsIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOWJiM2I3NS4uZTlhMjkyOQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTW92aWU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNjYsNiArNjcsOCBAQAogICAgICAgICAgICAgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8Q29sb3JTdGF0ZUxpc3Q+IG1QcmVsb2FkZWRDb2xvclN0YXRlTGlzdHMKICAgICAgICAgICAgID0gbmV3IFNwYXJzZUFycmF5PENvbG9yU3RhdGVMaXN0PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUHJlbG9hZGVkQ29sb3JEcmF3YWJsZXMKKyAgICAgICAgICAgID0gbmV3IExvbmdTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPigpOwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbVByZWxvYWRlZDsKIAogICAgIC8qcGFja2FnZSovIGZpbmFsIFR5cGVkVmFsdWUgbVRtcFZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKQEAgLTc1LDYgKzc4LDggQEAKICAgICAgICAgICAgID0gbmV3IExvbmdTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+ID4oKTsKICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PFdlYWtSZWZlcmVuY2U8Q29sb3JTdGF0ZUxpc3Q+ID4gbUNvbG9yU3RhdGVMaXN0Q2FjaGUKICAgICAgICAgICAgID0gbmV3IFNwYXJzZUFycmF5PFdlYWtSZWZlcmVuY2U8Q29sb3JTdGF0ZUxpc3Q+ID4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExvbmdTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+ID4gbUNvbG9yRHJhd2FibGVDYWNoZQorICAgICAgICAgICAgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gPigpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJlbG9hZGluZzsKIAogICAgIC8qcGFja2FnZSovIFR5cGVkQXJyYXkgbUNhY2hlZFN0eWxlZEF0dHJpYnV0ZXMgPSBudWxsOwpAQCAtMTI5OSwzNyArMTMwNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAoaW50KShtTWV0cmljcy5kZW5zaXR5KjE2MCksIG1Db25maWd1cmF0aW9uLmtleWJvYXJkLAogICAgICAgICAgICAgICAgICAgICBrZXlib2FyZEhpZGRlbiwgbUNvbmZpZ3VyYXRpb24ubmF2aWdhdGlvbiwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0LCBtQ29uZmlndXJhdGlvbi51aU1vZGUsIHNTZGtWZXJzaW9uKTsKLSAgICAgICAgICAgIGludCBOID0gbURyYXdhYmxlQ2FjaGUuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNsZWFuaW5nIHVwIGRyYXdhYmxlcyBjb25maWcgY2hhbmdlczogMHgiCi0gICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoY29uZmlnQ2hhbmdlcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gcmVmID0gbURyYXdhYmxlQ2FjaGUudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjcyA9IHJlZi5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm5lZWROZXdSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZXMsIGNzLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZMVVNISU5HICMweCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExvbmcudG9IZXhTdHJpbmcobURyYXdhYmxlQ2FjaGUua2V5QXQoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gIiArIGNzICsgIiB3aXRoIGNoYW5nZXM6IDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ2FjaGUuc2V0VmFsdWVBdChpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoREVCVUdfQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiKEtlZXBpbmcgIzB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMb25nLnRvSGV4U3RyaW5nKG1EcmF3YWJsZUNhY2hlLmtleUF0KGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gIiArIGNzICsgIiB3aXRoIGNoYW5nZXM6IDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNzLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EcmF3YWJsZUNhY2hlLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGNsZWFyRHJhd2FibGVDYWNoZShtRHJhd2FibGVDYWNoZSwgY29uZmlnQ2hhbmdlcyk7CisgICAgICAgICAgICBjbGVhckRyYXdhYmxlQ2FjaGUobUNvbG9yRHJhd2FibGVDYWNoZSwgY29uZmlnQ2hhbmdlcyk7CisKICAgICAgICAgICAgIG1Db2xvclN0YXRlTGlzdENhY2hlLmNsZWFyKCk7CisKKwogICAgICAgICAgICAgZmx1c2hMYXlvdXRDYWNoZSgpOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTEzMzksNiArMTMyMCw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyRHJhd2FibGVDYWNoZSgKKyAgICAgICAgICAgIExvbmdTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPENvbnN0YW50U3RhdGU+PiBjYWNoZSwKKyAgICAgICAgICAgIGludCBjb25maWdDaGFuZ2VzKSB7CisgICAgICAgIGludCBOID0gY2FjaGUuc2l6ZSgpOworICAgICAgICBpZiAoREVCVUdfQ09ORklHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJDbGVhbmluZyB1cCBkcmF3YWJsZXMgY29uZmlnIGNoYW5nZXM6IDB4IgorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoY29uZmlnQ2hhbmdlcykpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gcmVmID0gY2FjaGUudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChyZWYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgY3MgPSByZWYuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubmVlZE5ld1Jlc291cmNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzLCBjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfQ09ORklHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRkxVU0hJTkcgIzB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMb25nLnRvSGV4U3RyaW5nKG1EcmF3YWJsZUNhY2hlLmtleUF0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gIiArIGNzICsgIiB3aXRoIGNoYW5nZXM6IDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNzLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0VmFsdWVBdChpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVR19DT05GSUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIihLZWVwaW5nICMweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMb25nLnRvSGV4U3RyaW5nKGNhY2hlLmtleUF0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLyAiICsgY3MgKyAiIHdpdGggY2hhbmdlczogMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3lzdGVtIHJlc291cmNlcyBjb25maWd1cmF0aW9uIGlmIHRoZXkgaGF2ZSBwcmV2aW91c2x5CiAgICAgICogYmVlbiBpbml0aWFsaXplZC4KQEAgLTE2NjEsMTMgKzE2NzYsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGxvbmcga2V5ID0gKCgobG9uZykgdmFsdWUuYXNzZXRDb29raWUpIDw8IDMyKSB8IHZhbHVlLmRhdGE7Ci0gICAgICAgIERyYXdhYmxlIGRyID0gZ2V0Q2FjaGVkRHJhd2FibGUoa2V5KTsKKyAgICAgICAgYm9vbGVhbiBpc0NvbG9yRHJhd2FibGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUgPj0gVHlwZWRWYWx1ZS5UWVBFX0ZJUlNUX0NPTE9SX0lOVCAmJgorICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPD0gVHlwZWRWYWx1ZS5UWVBFX0xBU1RfQ09MT1JfSU5UKSB7CisgICAgICAgICAgICBpc0NvbG9yRHJhd2FibGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIERyYXdhYmxlIGRyID0gZ2V0Q2FjaGVkRHJhd2FibGUoaXNDb2xvckRyYXdhYmxlID8gbUNvbG9yRHJhd2FibGVDYWNoZSA6IG1EcmF3YWJsZUNhY2hlLCBrZXkpOwogCiAgICAgICAgIGlmIChkciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZHI7CiAgICAgICAgIH0KIAotICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIGNzID0gc1ByZWxvYWRlZERyYXdhYmxlcy5nZXQoa2V5KTsKKyAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjcyA9IGlzQ29sb3JEcmF3YWJsZSA/IHNQcmVsb2FkZWRDb2xvckRyYXdhYmxlcy5nZXQoa2V5KSA6IHNQcmVsb2FkZWREcmF3YWJsZXMuZ2V0KGtleSk7CiAgICAgICAgIGlmIChjcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBkciA9IGNzLm5ld0RyYXdhYmxlKHRoaXMpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTcyNiwxMyArMTc0NiwyMSBAQAogICAgICAgICAgICAgY3MgPSBkci5nZXRDb25zdGFudFN0YXRlKCk7CiAgICAgICAgICAgICBpZiAoY3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChtUHJlbG9hZGluZykgewotICAgICAgICAgICAgICAgICAgICBzUHJlbG9hZGVkRHJhd2FibGVzLnB1dChrZXksIGNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29sb3JEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc1ByZWxvYWRlZENvbG9yRHJhd2FibGVzLnB1dChrZXksIGNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcmVsb2FkZWREcmF3YWJsZXMucHV0KGtleSwgY3MpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVG1wVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vTG9nLmkoVEFHLCAiU2F2aW5nIGNhY2hlZCBkcmF3YWJsZSBAICMiICsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGtleS5pbnRWYWx1ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICsgIiBpbiAiICsgdGhpcyArICI6ICIgKyBjcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVDYWNoZS5wdXQoa2V5LCBuZXcgV2Vha1JlZmVyZW5jZTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPihjcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29sb3JEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckRyYXdhYmxlQ2FjaGUucHV0KGtleSwgbmV3IFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4oY3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ2FjaGUucHV0KGtleSwgbmV3IFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4oY3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3NDEsOSArMTc2OSwxMSBAQAogICAgICAgICByZXR1cm4gZHI7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRDYWNoZWREcmF3YWJsZShsb25nIGtleSkgeworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0Q2FjaGVkRHJhd2FibGUoCisgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8V2Vha1JlZmVyZW5jZTxDb25zdGFudFN0YXRlPj4gZHJhd2FibGVDYWNoZSwKKyAgICAgICAgICAgIGxvbmcga2V5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFZhbHVlKSB7Ci0gICAgICAgICAgICBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHdyID0gbURyYXdhYmxlQ2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHdyID0gZHJhd2FibGVDYWNoZS5nZXQoa2V5KTsKICAgICAgICAgICAgIGlmICh3ciAhPSBudWxsKSB7ICAgLy8gd2UgaGF2ZSB0aGUga2V5CiAgICAgICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBlbnRyeSA9IHdyLmdldCgpOwogICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CkBAIC0xNzUzLDcgKzE3ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubmV3RHJhd2FibGUodGhpcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgeyAgLy8gb3VyIGVudHJ5IGhhcyBiZWVuIHB1cmdlZAotICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVDYWNoZS5kZWxldGUoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd2FibGVDYWNoZS5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1N0cmluZ0Jsb2NrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9TdHJpbmdCbG9jay5qYXZhCmluZGV4IDVlOTBiOTEuLjIzYTZmOTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1N0cmluZ0Jsb2NrLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvU3RyaW5nQmxvY2suamF2YQpAQCAtODcsMjEgKzg3LDQ4IEBACiAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChtU3R5bGVJRHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMgPSBuZXcgU3R5bGVJRHMoKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLmJvbGRJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgImIiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLml0YWxpY0lkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAiaSIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMudW5kZXJsaW5lSWQgPSBuYXRpdmVJbmRleE9mU3RyaW5nKG1OYXRpdmUsICJ1Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy50dElkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAidHQiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLmJpZ0lkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAiYmlnIik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zbWFsbElkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAic21hbGwiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnN1cElkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAic3VwIik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zdWJJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgInN1YiIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc3RyaWtlSWQgPSBuYXRpdmVJbmRleE9mU3RyaW5nKG1OYXRpdmUsICJzdHJpa2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLmxpc3RJdGVtSWQgPSBuYXRpdmVJbmRleE9mU3RyaW5nKG1OYXRpdmUsICJsaSIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMubWFycXVlZUlkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAibWFycXVlZSIpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cudihUQUcsICJCb2xkSWQ9IiArIG1TdHlsZUlEcy5ib2xkSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIEl0YWxpY0lkPSIgKyBtU3R5bGVJRHMuaXRhbGljSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIFVuZGVybGluZUlkPSIgKyBtU3R5bGVJRHMudW5kZXJsaW5lSWQpOworICAgICAgICAgICAgICAgIC8vIHRoZSBzdHlsZSBhcnJheSBpcyBhIGZsYXQgYXJyYXkgb2YgPHR5cGUsIHN0YXJ0LCBlbmQ+IGhlbmNlCisgICAgICAgICAgICAgICAgLy8gdGhlIG1hZ2ljIGNvbnN0YW50IDMuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3R5bGVJbmRleCA9IDA7IHN0eWxlSW5kZXggPCBzdHlsZS5sZW5ndGg7IHN0eWxlSW5kZXggKz0gMykgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGVJZCA9IHN0eWxlW3N0eWxlSW5kZXhdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkID09IG1TdHlsZUlEcy5ib2xkSWQgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMuaXRhbGljSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHlsZUlkID09IG1TdHlsZUlEcy51bmRlcmxpbmVJZCB8fCBzdHlsZUlkID09IG1TdHlsZUlEcy50dElkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMuYmlnSWQgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMuc21hbGxJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLnN1YklkIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLnN1cElkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMuc3RyaWtlSWQgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMubGlzdEl0ZW1JZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLm1hcnF1ZWVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWQgYWxyZWFkeSBmb3VuZCBza2lwIHRvIG5leHQgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlVGFnID0gbmF0aXZlR2V0U3RyaW5nKG1OYXRpdmUsIHN0eWxlSWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVRhZy5lcXVhbHMoImIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLmJvbGRJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJpIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5pdGFsaWNJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJ1IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy51bmRlcmxpbmVJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJ0dCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMudHRJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJiaWciKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLmJpZ0lkID0gc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVRhZy5lcXVhbHMoInNtYWxsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zbWFsbElkID0gc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVRhZy5lcXVhbHMoInN1cCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc3VwSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygic3ViIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zdWJJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJzdHJpa2UiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnN0cmlrZUlkID0gc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVRhZy5lcXVhbHMoImxpIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5saXN0SXRlbUlkID0gc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVRhZy5lcXVhbHMoIm1hcnF1ZWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLm1hcnF1ZWVJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICByZXMgPSBhcHBseVN0eWxlcyhzdHIsIHN0eWxlLCBtU3R5bGVJRHMpOwpAQCAtMTE5LDE3ICsxNDYsMTcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3R5bGVJRHMgewotICAgICAgICBwcml2YXRlIGludCBib2xkSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGl0YWxpY0lkOwotICAgICAgICBwcml2YXRlIGludCB1bmRlcmxpbmVJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgdHRJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYmlnSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IHNtYWxsSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IHN1YklkOwotICAgICAgICBwcml2YXRlIGludCBzdXBJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc3RyaWtlSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGxpc3RJdGVtSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1hcnF1ZWVJZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYm9sZElkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IGl0YWxpY0lkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IHVuZGVybGluZUlkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IHR0SWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYmlnSWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc21hbGxJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBzdWJJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBzdXBJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBzdHJpa2VJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBsaXN0SXRlbUlkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IG1hcnF1ZWVJZCA9IC0xOwogICAgIH0KIAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIGFwcGx5U3R5bGVzKFN0cmluZyBzdHIsIGludFtdIHN0eWxlLCBTdHlsZUlEcyBpZHMpIHsKQEAgLTQwMyw2ICs0MzAsNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0U2l6ZShpbnQgb2JqKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hdGl2ZUdldFN0cmluZyhpbnQgb2JqLCBpbnQgaWR4KTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50W10gbmF0aXZlR2V0U3R5bGUoaW50IG9iaiwgaW50IGlkeCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBuYXRpdmVJbmRleE9mU3RyaW5nKGludCBvYmosIFN0cmluZyBzdHIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3Ryb3koaW50IG9iaik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQppbmRleCAwMzhlZWRmLi5hNWU1ZTQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAqIEBwYXJhbSB3aW5kb3cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaWxsV2luZG93KGludCBwb3NpdGlvbiwgQ3Vyc29yV2luZG93IHdpbmRvdykgewotICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gZ2V0Q291bnQoKSkgeworICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGdldENvdW50KCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB3aW5kb3cuYWNxdWlyZVJlZmVyZW5jZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5lMzM5YTYzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMjExLDcgKzIxMSw5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4gYXMgYSBieXRlIGFycmF5LgogICAgICAqCi0gICAgICogPHA+SWYgdGhlIG5hdGl2ZSBjb250ZW50IG9mIHRoYXQgY29sdW1uIGlzIG5vdCBibG9iIGV4Y2VwdGlvbiBtYXkgdGhyb3cKKyAgICAgKiA8cD5UaGUgcmVzdWx0IGFuZCB3aGV0aGVyIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgICAgKiBjb2x1bW4gdmFsdWUgaXMgbnVsbCBvciB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGEgYmxvYiB0eXBlIGlzCisgICAgICogaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IGNvbHVtbiBhcyBhIGJ5dGUgYXJyYXkuCkBAIC0yMjEsOCArMjIzLDkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGNvbHVtbiBhcyBhIFN0cmluZy4KICAgICAgKgotICAgICAqIDxwPklmIHRoZSBuYXRpdmUgY29udGVudCBvZiB0aGF0IGNvbHVtbiBpcyBub3QgdGV4dCB0aGUgcmVzdWx0IHdpbGwgYmUKLSAgICAgKiB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgdGhlIGNvbHVtbiB2YWx1ZSB0byBTdHJpbmcudmFsdWVPZih4KS4KKyAgICAgKiA8cD5UaGUgcmVzdWx0IGFuZCB3aGV0aGVyIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgICAgKiBjb2x1bW4gdmFsdWUgaXMgbnVsbCBvciB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGEgc3RyaW5nIHR5cGUgaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgY29sdW1uIGFzIGEgU3RyaW5nLgpAQCAtMjQyLDggKzI0NSwxMCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgY29sdW1uIGFzIGEgc2hvcnQuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IG51bWVyaWMgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gU2hvcnQudmFsdWVPZih4KS4KKyAgICAgKiA8cD5UaGUgcmVzdWx0IGFuZCB3aGV0aGVyIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgICAgKiBjb2x1bW4gdmFsdWUgaXMgbnVsbCwgdGhlIGNvbHVtbiB0eXBlIGlzIG5vdCBhbiBpbnRlZ3JhbCB0eXBlLCBvciB0aGUKKyAgICAgKiBpbnRlZ2VyIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlIFs8Y29kZT5TaG9ydC5NSU5fVkFMVUU8L2NvZGU+LAorICAgICAqIDxjb2RlPlNob3J0Lk1BWF9WQUxVRTwvY29kZT5dIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhhdCBjb2x1bW4gYXMgYSBzaG9ydC4KQEAgLTI1Myw4ICsyNTgsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGNvbHVtbiBhcyBhbiBpbnQuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IG51bWVyaWMgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gSW50ZWdlci52YWx1ZU9mKHgpLgorICAgICAqIDxwPlRoZSByZXN1bHQgYW5kIHdoZXRoZXIgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZQorICAgICAqIGNvbHVtbiB2YWx1ZSBpcyBudWxsLCB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGFuIGludGVncmFsIHR5cGUsIG9yIHRoZQorICAgICAqIGludGVnZXIgdmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzxjb2RlPkludGVnZXIuTUlOX1ZBTFVFPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5JbnRlZ2VyLk1BWF9WQUxVRTwvY29kZT5dIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhhdCBjb2x1bW4gYXMgYW4gaW50LgpAQCAtMjY0LDggKzI3MSwxMCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgY29sdW1uIGFzIGEgbG9uZy4KICAgICAgKgotICAgICAqIDxwPklmIHRoZSBuYXRpdmUgY29udGVudCBvZiB0aGF0IGNvbHVtbiBpcyBub3QgbnVtZXJpYyB0aGUgcmVzdWx0IHdpbGwgYmUKLSAgICAgKiB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgdGhlIGNvbHVtbiB2YWx1ZSB0byBMb25nLnZhbHVlT2YoeCkuCisgICAgICogPHA+VGhlIHJlc3VsdCBhbmQgd2hldGhlciB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgICAgICogY29sdW1uIHZhbHVlIGlzIG51bGwsIHRoZSBjb2x1bW4gdHlwZSBpcyBub3QgYW4gaW50ZWdyYWwgdHlwZSwgb3IgdGhlCisgICAgICogaW50ZWdlciB2YWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbPGNvZGU+TG9uZy5NSU5fVkFMVUU8L2NvZGU+LAorICAgICAqIDxjb2RlPkxvbmcuTUFYX1ZBTFVFPC9jb2RlPl0gaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IGNvbHVtbiBhcyBhIGxvbmcuCkBAIC0yNzUsOCArMjg0LDEwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4gYXMgYSBmbG9hdC4KICAgICAgKgotICAgICAqIDxwPklmIHRoZSBuYXRpdmUgY29udGVudCBvZiB0aGF0IGNvbHVtbiBpcyBub3QgbnVtZXJpYyB0aGUgcmVzdWx0IHdpbGwgYmUKLSAgICAgKiB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgdGhlIGNvbHVtbiB2YWx1ZSB0byBGbG9hdC52YWx1ZU9mKHgpLgorICAgICAqIDxwPlRoZSByZXN1bHQgYW5kIHdoZXRoZXIgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZQorICAgICAqIGNvbHVtbiB2YWx1ZSBpcyBudWxsLCB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGEgZmxvYXRpbmctcG9pbnQgdHlwZSwgb3IgdGhlCisgICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWUgaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgY29sdW1uIGFzIGEgZmxvYXQuCkBAIC0yODYsOCArMjk3LDEwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4gYXMgYSBkb3VibGUuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IG51bWVyaWMgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gRG91YmxlLnZhbHVlT2YoeCkuCisgICAgICogPHA+VGhlIHJlc3VsdCBhbmQgd2hldGhlciB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgICAgICogY29sdW1uIHZhbHVlIGlzIG51bGwsIHRoZSBjb2x1bW4gdHlwZSBpcyBub3QgYSBmbG9hdGluZy1wb2ludCB0eXBlLCBvciB0aGUKKyAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgY29sdW1uIGFzIGEgZG91YmxlLgpAQCAtNTczLDcgKzU4Niw4IEBACiAgICAgICogdGhhdCBhcmUgcmVxdWlyZWQgdG8gZmV0Y2ggZGF0YSBmb3IgdGhlIGN1cnNvci4KICAgICAgKgogICAgICAqIDxwPlRoZXNlIHZhbHVlcyBtYXkgb25seSBjaGFuZ2Ugd2hlbiByZXF1ZXJ5IGlzIGNhbGxlZC4KLSAgICAgKiBAcmV0dXJuIGN1cnNvci1kZWZpbmVkIHZhbHVlcywgb3IgQnVuZGxlLkVNVFBZIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMuIE5ldmVyIG51bGwuCisgICAgICogQHJldHVybiBjdXJzb3ItZGVmaW5lZCB2YWx1ZXMsIG9yIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZSNFTVBUWSBCdW5kbGUuRU1QVFl9IGlmIHRoZXJlCisgICAgICogICAgICAgICBhcmUgbm8gdmFsdWVzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KICAgICBCdW5kbGUgZ2V0RXh0cmFzKCk7CiAKQEAgLTU4Myw4ICs1OTcsMTAgQEAKICAgICAgKgogICAgICAqIDxwPk9uZSB1c2Ugb2YgdGhpcyBpcyB0byB0ZWxsIGEgY3Vyc29yIHRoYXQgaXQgc2hvdWxkIHJldHJ5IGl0cyBuZXR3b3JrIHJlcXVlc3QgYWZ0ZXIgaXQKICAgICAgKiByZXBvcnRlZCBhbiBlcnJvci4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIGV4dHJhIHZhbHVlcywgb3IgQnVuZGxlLkVNVFBZLiBOZXZlciBudWxsLgotICAgICAqIEByZXR1cm4gZXh0cmEgdmFsdWVzLCBvciBCdW5kbGUuRU1UUFkuIE5ldmVyIG51bGwuCisgICAgICogQHBhcmFtIGV4dHJhcyBleHRyYSB2YWx1ZXMsIG9yIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZSNFTVBUWSBCdW5kbGUuRU1QVFl9LgorICAgICAqICAgICAgICAgTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiBleHRyYSB2YWx1ZXMsIG9yIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZSNFTVBUWSBCdW5kbGUuRU1QVFl9LgorICAgICAqICAgICAgICAgTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCiAgICAgQnVuZGxlIHJlc3BvbmQoQnVuZGxlIGV4dHJhcyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjc2YjkxZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yNDUsNiArMjQ1LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCAoPGNvZGU+cm93PC9jb2RlPiwgPGNvZGU+Y29sPC9jb2RlPikgYXMgYSA8Y29kZT5ieXRlPC9jb2RlPiBhcnJheS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLiBJZiB0aGUKKyAgICAgKiB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGEgc3RyaW5nIHR5cGUsIHRoZW4gdGhlIHJlc3VsdAorICAgICAqIGlzIHRoZSBhcnJheSBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIHN0cmluZyB2YWx1ZS4gSWYgdGhlIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMgaW50ZWdyYWwgb3IgZmxvYXRpbmctcG9pbnQsCisgICAgICogdGhlbiBhbiB7QGxpbmsgU1FMaXRlRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgYnl0ZVtdIGdldEJsb2JfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCkBAIC0zMzIsNiArMzQxLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgKDxjb2RlPnJvdzwvY29kZT4sIDxjb2RlPmNvbDwvY29kZT4pIGFzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLiBJZiB0aGUKKyAgICAgKiB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGludGVncmFsLCB0aGVuIHRoZSByZXN1bHQgaXMgdGhlIHN0cmluZworICAgICAqIHRoYXQgaXMgb2J0YWluZWQgYnkgZm9ybWF0dGluZyB0aGUgaW50ZWdlciB2YWx1ZSB3aXRoIHRoZSA8Y29kZT5wcmludGY8L2NvZGU+CisgICAgICogZmFtaWx5IG9mIGZ1bmN0aW9ucyB1c2luZyBmb3JtYXQgc3BlY2lmaWVyIDxjb2RlPiVsbGQ8L2NvZGU+LiBJZiB0aGUKKyAgICAgKiB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGZsb2F0aW5nLXBvaW50LCB0aGVuIHRoZSByZXN1bHQgaXMgdGhlIHN0cmluZworICAgICAqIHRoYXQgaXMgb2J0YWluZWQgYnkgZm9ybWF0dGluZyB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgd2l0aCB0aGUKKyAgICAgKiA8Y29kZT5wcmludGY8L2NvZGU+IGZhbWlseSBvZiBmdW5jdGlvbnMgdXNpbmcgZm9ybWF0IHNwZWNpZmllciA8Y29kZT4lZzwvY29kZT4uCisgICAgICogSWYgdGhlIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMgYSBibG9iIHR5cGUsIHRoZW4gYW4KKyAgICAgKiB7QGxpbmsgU1FMaXRlRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGdldFN0cmluZ19uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKQEAgLTM4Myw2ICs0MDUsMTcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCAoPGNvZGU+cm93PC9jb2RlPiwgPGNvZGU+Y29sPC9jb2RlPikgYXMgYSA8Y29kZT5sb25nPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIDxjb2RlPjBMPC9jb2RlPiBpcyByZXR1cm5lZC4gSWYgdGhlCisgICAgICogdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBhIHN0cmluZyB0eXBlLCB0aGVuIHRoZSByZXN1bHQKKyAgICAgKiBpcyB0aGUgPGNvZGU+bG9uZzwvY29kZT4gdGhhdCBpcyBvYnRhaW5lZCBieSBwYXJzaW5nIHRoZSBzdHJpbmcgdmFsdWUgd2l0aAorICAgICAqIDxjb2RlPnN0cnRvbGw8L2NvZGU+LiBJZiB0aGUgdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcworICAgICAqIGZsb2F0aW5nLXBvaW50LCB0aGVuIHRoZSByZXN1bHQgaXMgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIGNhc3RlZCB0byBhIDxjb2RlPmxvbmc8L2NvZGU+LgorICAgICAqIElmIHRoZSB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGEgYmxvYiB0eXBlLCB0aGVuIGFuCisgICAgICoge0BsaW5rIFNRTGl0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgZ2V0TG9uZ19uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKQEAgLTQwMiw2ICs0MzUsMTcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCAoPGNvZGU+cm93PC9jb2RlPiwgPGNvZGU+Y29sPC9jb2RlPikgYXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHZhbHVlIGlzIG51bGwsIHRoZW4gPGNvZGU+MC4wPC9jb2RlPiBpcyByZXR1cm5lZC4gSWYgdGhlCisgICAgICogdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBhIHN0cmluZyB0eXBlLCB0aGVuIHRoZSByZXN1bHQKKyAgICAgKiBpcyB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0aGF0IGlzIG9idGFpbmVkIGJ5IHBhcnNpbmcgdGhlIHN0cmluZyB2YWx1ZSB3aXRoCisgICAgICogPGNvZGU+c3RydG9kPC9jb2RlPi4gSWYgdGhlIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMKKyAgICAgKiBpbnRlZ3JhbCwgdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBpbnRlZ2VyIHZhbHVlIGNhc3RlZCB0byBhIDxjb2RlPmRvdWJsZTwvY29kZT4uCisgICAgICogSWYgdGhlIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMgYSBibG9iIHR5cGUsIHRoZW4gYW4KKyAgICAgKiB7QGxpbmsgU1FMaXRlRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgZG91YmxlIGdldERvdWJsZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQppbmRleCA2NjQwNmNhLi45NWZjMWZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCkBAIC01MCw4ICs1MCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvdW50UHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXXsiY291bnQoKikifTsKLQogICAgIC8qKgogICAgICAqIFNwZWNpYWwgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYW4gZXhjZXB0aW9uIHJlc3VsdCBhdCB0aGUgaGVhZGVyIG9mCiAgICAgICogYSBwYXJjZWwsIHRvIGJlIHVzZWQgd2hlbiByZXR1cm5pbmcgYW4gZXhjZXB0aW9uIGZyb20gYSB0cmFuc2FjdGlvbi4KQEAgLTYwNCwxNCArNjAyLDQwIEBACiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIHF1ZXJ5TnVtRW50cmllcyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHRhYmxlKSB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeSh0YWJsZSwgY291bnRQcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3Vyc29yLm1vdmVUb0ZpcnN0KCk7Ci0gICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldExvbmcoMCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gcXVlcnlOdW1FbnRyaWVzKGRiLCB0YWJsZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHRhYmxlIGZvciB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLgorICAgICAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UgdGhlIHRhYmxlIGlzIGluCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBxdWVyeQorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBmaWx0ZXIgZGVjbGFyaW5nIHdoaWNoIHJvd3MgdG8gcmV0dXJuLAorICAgICAqICAgICAgICAgICAgICBmb3JtYXR0ZWQgYXMgYW4gU1FMIFdIRVJFIGNsYXVzZSAoZXhjbHVkaW5nIHRoZSBXSEVSRSBpdHNlbGYpLgorICAgICAqICAgICAgICAgICAgICBQYXNzaW5nIG51bGwgd2lsbCBjb3VudCBhbGwgcm93cyBmb3IgdGhlIGdpdmVuIHRhYmxlCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlIGZpbHRlcmVkIGJ5IHRoZSBzZWxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgcXVlcnlOdW1FbnRyaWVzKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgdGFibGUsIFN0cmluZyBzZWxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5TnVtRW50cmllcyhkYiwgdGFibGUsIHNlbGVjdGlvbiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHRhYmxlIGZvciB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLgorICAgICAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UgdGhlIHRhYmxlIGlzIGluCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBxdWVyeQorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBmaWx0ZXIgZGVjbGFyaW5nIHdoaWNoIHJvd3MgdG8gcmV0dXJuLAorICAgICAqICAgICAgICAgICAgICBmb3JtYXR0ZWQgYXMgYW4gU1FMIFdIRVJFIGNsYXVzZSAoZXhjbHVkaW5nIHRoZSBXSEVSRSBpdHNlbGYpLgorICAgICAqICAgICAgICAgICAgICBQYXNzaW5nIG51bGwgd2lsbCBjb3VudCBhbGwgcm93cyBmb3IgdGhlIGdpdmVuIHRhYmxlCisgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgWW91IG1heSBpbmNsdWRlID9zIGluIHNlbGVjdGlvbiwKKyAgICAgKiAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmFsdWVzIGZyb20gc2VsZWN0aW9uQXJncywKKyAgICAgKiAgICAgICAgICAgICAgaW4gb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAqICAgICAgICAgICAgICBUaGUgdmFsdWVzIHdpbGwgYmUgYm91bmQgYXMgU3RyaW5ncy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUgZmlsdGVyZWQgYnkgdGhlIHNlbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBxdWVyeU51bUVudHJpZXMoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyB0YWJsZSwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAoIVRleHRVdGlscy5pc0VtcHR5KHNlbGVjdGlvbikpID8gIiB3aGVyZSAiICsgc2VsZWN0aW9uIDogIiI7CisgICAgICAgIHJldHVybiBsb25nRm9yUXVlcnkoZGIsICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgdGFibGUgKyBzLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQppbmRleCBkOGRjYWY3Li5jNTkyMTM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCkBAIC0xMzIsMTEgKzEzMiwxMSBAQAogICAgICAgICAgICAgLy8gdGhlIGN1cnNvcidzIHN0YXRlIGRvZXNuJ3QgY2hhbmdlCiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnNvclN0YXRlICE9IG1UaHJlYWRTdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3Vyc29yU3RhdGUgIT0gbVRocmVhZFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1RdWVyeS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAogICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgewpAQCAtMjE4LDkgKzIxOCw4IEBACiAgICAgICAgIG1Db2x1bW5OYW1lTWFwID0gbnVsbDsKICAgICAgICAgbVF1ZXJ5ID0gcXVlcnk7CiAKKyAgICAgICAgZGIubG9jaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZGIubG9jaygpOwotCiAgICAgICAgICAgICAvLyBTZXR1cCB0aGUgbGlzdCBvZiBjb2x1bW5zCiAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQgPSBtUXVlcnkuY29sdW1uQ291bnRMb2NrZWQoKTsKICAgICAgICAgICAgIG1Db2x1bW5zID0gbmV3IFN0cmluZ1tjb2x1bW5Db3VudF07CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnlCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnlCdWlsZGVyLmphdmEKaW5kZXggNjEwYmY3MC4uYjZhY2EyYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5QnVpbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YQpAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgc3FsID0gYnVpbGRRdWVyeSgKLSAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgZ3JvdXBCeSwgaGF2aW5nLAorICAgICAgICAgICAgICAgIHByb2plY3Rpb25Jbiwgc2VsZWN0aW9uLCBncm91cEJ5LCBoYXZpbmcsCiAgICAgICAgICAgICAgICAgc29ydE9yZGVyLCBsaW1pdCk7CiAKICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgewpAQCAtMzQ1LDEwICszNDUsNiBAQAogICAgICAqICAgZm9ybWF0dGVkIGFzIGFuIFNRTCBXSEVSRSBjbGF1c2UgKGV4Y2x1ZGluZyB0aGUgV0hFUkUKICAgICAgKiAgIGl0c2VsZikuICBQYXNzaW5nIG51bGwgd2lsbCByZXR1cm4gYWxsIHJvd3MgZm9yIHRoZSBnaXZlbgogICAgICAqICAgVVJMLgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFlvdSBtYXkgaW5jbHVkZSA/cyBpbiBzZWxlY3Rpb24sIHdoaWNoCi0gICAgICogICB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZXMgZnJvbSBzZWxlY3Rpb25BcmdzLCBpbiBvcmRlcgotICAgICAqICAgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgc2VsZWN0aW9uLiAgVGhlIHZhbHVlcyB3aWxsIGJlIGJvdW5kCi0gICAgICogICBhcyBTdHJpbmdzLgogICAgICAqIEBwYXJhbSBncm91cEJ5IEEgZmlsdGVyIGRlY2xhcmluZyBob3cgdG8gZ3JvdXAgcm93cywgZm9ybWF0dGVkCiAgICAgICogICBhcyBhbiBTUUwgR1JPVVAgQlkgY2xhdXNlIChleGNsdWRpbmcgdGhlIEdST1VQIEJZIGl0c2VsZikuCiAgICAgICogICBQYXNzaW5nIG51bGwgd2lsbCBjYXVzZSB0aGUgcm93cyB0byBub3QgYmUgZ3JvdXBlZC4KQEAgLTM2NSw4ICszNjEsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBTUUwgU0VMRUNUIHN0YXRlbWVudAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRRdWVyeSgKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb25JbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKLSAgICAgICAgICAgIFN0cmluZyBncm91cEJ5LCBTdHJpbmcgaGF2aW5nLCBTdHJpbmcgc29ydE9yZGVyLCBTdHJpbmcgbGltaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb25JbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nIGdyb3VwQnksCisgICAgICAgICAgICBTdHJpbmcgaGF2aW5nLCBTdHJpbmcgc29ydE9yZGVyLCBTdHJpbmcgbGltaXQpIHsKICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IGNvbXB1dGVQcm9qZWN0aW9uKHByb2plY3Rpb25Jbik7CiAKICAgICAgICAgU3RyaW5nQnVpbGRlciB3aGVyZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0zOTQsNiArMzkwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QncyBzaWduYXR1cmUgaXMgbWlzbGVhZGluZyBzaW5jZSBubyBTUUwgcGFyYW1ldGVyCisgICAgICogc3Vic3RpdHV0aW9uIGlzIGNhcnJpZWQgb3V0LiAgVGhlIHNlbGVjdGlvbiBhcmd1bWVudHMgcGFyYW1ldGVyIGRvZXMgbm90IGdldAorICAgICAqIHVzZWQgYXQgYWxsLiAgVG8gYXZvaWQgY29uZnVzaW9uLCBjYWxsCisgICAgICoge0BsaW5rICNidWlsZFF1ZXJ5KFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkUXVlcnkoCisgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uSW4sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgZ3JvdXBCeSwgU3RyaW5nIGhhdmluZywgU3RyaW5nIHNvcnRPcmRlciwgU3RyaW5nIGxpbWl0KSB7CisgICAgICAgIHJldHVybiBidWlsZFF1ZXJ5KHByb2plY3Rpb25Jbiwgc2VsZWN0aW9uLCBncm91cEJ5LCBoYXZpbmcsIHNvcnRPcmRlciwgbGltaXQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIFNFTEVDVCBzdGF0ZW1lbnQgc3VpdGFibGUgZm9yIHVzZSBpbiBhIGdyb3VwIG9mCiAgICAgICogU0VMRUNUIHN0YXRlbWVudHMgdGhhdCB3aWxsIGJlIGpvaW5lZCB0aHJvdWdoIFVOSU9OIG9wZXJhdG9ycwogICAgICAqIGluIGJ1aWxkVW5pb25RdWVyeS4KQEAgLTQyMiwxMCArNDMxLDYgQEAKICAgICAgKiAgIGZvcm1hdHRlZCBhcyBhbiBTUUwgV0hFUkUgY2xhdXNlIChleGNsdWRpbmcgdGhlIFdIRVJFCiAgICAgICogICBpdHNlbGYpLiAgUGFzc2luZyBudWxsIHdpbGwgcmV0dXJuIGFsbCByb3dzIGZvciB0aGUgZ2l2ZW4KICAgICAgKiAgIFVSTC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBZb3UgbWF5IGluY2x1ZGUgP3MgaW4gc2VsZWN0aW9uLCB3aGljaAotICAgICAqICAgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmFsdWVzIGZyb20gc2VsZWN0aW9uQXJncywgaW4gb3JkZXIKLSAgICAgKiAgIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIHNlbGVjdGlvbi4gIFRoZSB2YWx1ZXMgd2lsbCBiZSBib3VuZAotICAgICAqICAgYXMgU3RyaW5ncy4KICAgICAgKiBAcGFyYW0gZ3JvdXBCeSBBIGZpbHRlciBkZWNsYXJpbmcgaG93IHRvIGdyb3VwIHJvd3MsIGZvcm1hdHRlZAogICAgICAqICAgYXMgYW4gU1FMIEdST1VQIEJZIGNsYXVzZSAoZXhjbHVkaW5nIHRoZSBHUk9VUCBCWSBpdHNlbGYpLgogICAgICAqICAgUGFzc2luZyBudWxsIHdpbGwgY2F1c2UgdGhlIHJvd3MgdG8gbm90IGJlIGdyb3VwZWQuCkBAIC00NDMsNyArNDQ4LDYgQEAKICAgICAgICAgICAgIGludCBjb21wdXRlZENvbHVtbnNPZmZzZXQsCiAgICAgICAgICAgICBTdHJpbmcgdHlwZURpc2NyaW1pbmF0b3JWYWx1ZSwKICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAogICAgICAgICAgICAgU3RyaW5nIGdyb3VwQnksCiAgICAgICAgICAgICBTdHJpbmcgaGF2aW5nKSB7CiAgICAgICAgIGludCB1bmlvbkNvbHVtbnNDb3VudCA9IHVuaW9uQ29sdW1ucy5sZW5ndGg7CkBAIC00NjMsMTIgKzQ2NywzNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBidWlsZFF1ZXJ5KAotICAgICAgICAgICAgICAgIHByb2plY3Rpb25Jbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBncm91cEJ5LCBoYXZpbmcsCisgICAgICAgICAgICAgICAgcHJvamVjdGlvbkluLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywKICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLywKICAgICAgICAgICAgICAgICBudWxsIC8qIGxpbWl0ICovKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCdzIHNpZ25hdHVyZSBpcyBtaXNsZWFkaW5nIHNpbmNlIG5vIFNRTCBwYXJhbWV0ZXIKKyAgICAgKiBzdWJzdGl0dXRpb24gaXMgY2FycmllZCBvdXQuICBUaGUgc2VsZWN0aW9uIGFyZ3VtZW50cyBwYXJhbWV0ZXIgZG9lcyBub3QgZ2V0CisgICAgICogdXNlZCBhdCBhbGwuICBUbyBhdm9pZCBjb25mdXNpb24sIGNhbGwKKyAgICAgKiB7QGxpbmsgI2J1aWxkVW5pb25TdWJRdWVyeX0KKyAgICAgKiBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFN0cmluZyBidWlsZFVuaW9uU3ViUXVlcnkoCisgICAgICAgICAgICBTdHJpbmcgdHlwZURpc2NyaW1pbmF0b3JDb2x1bW4sCisgICAgICAgICAgICBTdHJpbmdbXSB1bmlvbkNvbHVtbnMsCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBjb2x1bW5zUHJlc2VudEluVGFibGUsCisgICAgICAgICAgICBpbnQgY29tcHV0ZWRDb2x1bW5zT2Zmc2V0LAorICAgICAgICAgICAgU3RyaW5nIHR5cGVEaXNjcmltaW5hdG9yVmFsdWUsCisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgIFN0cmluZyBncm91cEJ5LAorICAgICAgICAgICAgU3RyaW5nIGhhdmluZykgeworICAgICAgICByZXR1cm4gYnVpbGRVbmlvblN1YlF1ZXJ5KAorICAgICAgICAgICAgICAgIHR5cGVEaXNjcmltaW5hdG9yQ29sdW1uLCB1bmlvbkNvbHVtbnMsIGNvbHVtbnNQcmVzZW50SW5UYWJsZSwKKyAgICAgICAgICAgICAgICBjb21wdXRlZENvbHVtbnNPZmZzZXQsIHR5cGVEaXNjcmltaW5hdG9yVmFsdWUsIHNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBncm91cEJ5LCBoYXZpbmcpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdpdmVuIGEgc2V0IG9mIHN1YnF1ZXJpZXMsIGFsbCBvZiB3aGljaCBhcmUgU0VMRUNUIHN0YXRlbWVudHMsCiAgICAgICogY29uc3RydWN0IGEgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSB1bmlvbiBvZiB3aGF0IHRob3NlCiAgICAgICogc3VicXVlcmllcyByZXR1cm4uCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBjZDVjZWViLi40OTRlOTIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIxLDYgKzIxLDkgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworCiAvKioKICAqIENsYXNzIHRoYXQgYW5zd2VycyBxdWVyaWVzIGFib3V0IHRoZSBzdGF0ZSBvZiBuZXR3b3JrIGNvbm5lY3Rpdml0eS4gSXQgYWxzbwogICogbm90aWZpZXMgYXBwbGljYXRpb25zIHdoZW4gbmV0d29yayBjb25uZWN0aXZpdHkgY2hhbmdlcy4gR2V0IGFuIGluc3RhbmNlCkBAIC0zMzcsOCArMzQwLDI5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBuZXR3b3JrVHlwZSwgaW50IGhvc3RBZGRyZXNzKSB7CisgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MoaG9zdEFkZHJlc3MpOworCisgICAgICAgIGlmIChpbmV0QWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhuZXR3b3JrVHlwZSwgaW5ldEFkZHJlc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBob3N0IHZpYSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgaW50ZXJmYWNlLiBBbiBhdHRlbXB0IHRvIGFkZCBhIHJvdXRlIHRoYXQKKyAgICAgKiBhbHJlYWR5IGV4aXN0cyBpcyBpZ25vcmVkLCBidXQgdHJlYXRlZCBhcyBzdWNjZXNzZnVsLgorICAgICAqIEBwYXJhbSBuZXR3b3JrVHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV0d29yayBvdmVyIHdoaWNoIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgaXMgdG8gYmUgcm91dGVkCisgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3RBZGRyZXNzKGludCBuZXR3b3JrVHlwZSwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgYnl0ZVtdIGFkZHJlc3MgPSBob3N0QWRkcmVzcy5nZXRBZGRyZXNzKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVxdWVzdFJvdXRlVG9Ib3N0KG5ldHdvcmtUeXBlLCBob3N0QWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhuZXR3b3JrVHlwZSwgYWRkcmVzcyk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKaW5kZXggYjczNGFjNy4uYWZjY2RkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKQEAgLTQ3LDYgKzQ3LDggQEAKIAogICAgIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBuZXR3b3JrVHlwZSwgaW50IGhvc3RBZGRyZXNzKTsKIAorICAgIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhpbnQgbmV0d29ya1R5cGUsIGluIGJ5dGVbXSBob3N0QWRkcmVzcyk7CisKICAgICBib29sZWFuIGdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwogCiAgICAgdm9pZCBzZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoYm9vbGVhbiBhbGxvd0JhY2tncm91bmREYXRhKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGI1NTk2MDEzLi4zMmMyZDY0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAoraW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yMyw3ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKQEAgLTQ5MSwxNyArNDkyLDE2IEBACiAgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAogICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgogICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgeworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewogICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgSW50ZWdlci50b0hleFN0cmluZyhob3N0QWRkcmVzcykgKworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIGhvc3RBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKwogICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUgKyAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgaG9zdEFkZHJlc3MgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcykgPT0gMDsKKyAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCmluZGV4IDAzOWRmZmYuLjkxNDBkYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTgsMTMgKzE4LDE0IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAKQEAgLTEzMywxMyArMTM0LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIW1Qcml2YXRlRG5zUm91dGVTZXQpIHsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJTdHJpbmcgOiBnZXROYW1lU2VydmVycygpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFkZHIgPSBOZXR3b3JrVXRpbHMubG9va3VwSG9zdChhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkciAhPSAtMSAmJiBhZGRyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiICBhZGRpbmcgIithZGRyU3RyaW5nKyIgKCIrYWRkcisiKSIpOwotICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBhZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkclN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhZGRyU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiAgYWRkaW5nICIgKyBhZGRyU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBpbmV0QWRkcmVzcywgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiIEROUyBhZGRyZXNzICIgKyBhZGRyU3RyaW5nICsgIiA6IEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTYyLDcgKzE2OCwxNCBAQAogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgbURlZmF1bHRHYXRld2F5QWRkcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuc2V0RGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICBpZiAoaW5ldEFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIG1EZWZhdWx0R2F0ZXdheUFkZHIgRXJyb3IiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuYWRkRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBpbmV0QWRkcmVzcykgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgVW5hYmxlIHRvIGFkZCBkZWZhdWx0IHJvdXRlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzk5LDcgKzQxMiw3IEBACiAgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgeworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKaW5kZXggODEzNjJjOS4uOGJkZmRmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQpAQCAtMTcsMjUgKzE3LDM5IEBACiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldDRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXQ2QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKIC8qKgogICogTmF0aXZlIG1ldGhvZHMgZm9yIG1hbmFnaW5nIG5ldHdvcmsgaW50ZXJmYWNlcy4KICAqCiAgKiB7QGhpZGV9CiAgKi8KIHB1YmxpYyBjbGFzcyBOZXR3b3JrVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrVXRpbHMiOworCiAgICAgLyoqIEJyaW5nIHRoZSBuYW1lZCBuZXR3b3JrIGludGVyZmFjZSB1cC4gKi8KICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZW5hYmxlSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKIAogICAgIC8qKiBCcmluZyB0aGUgbmFtZWQgbmV0d29yayBpbnRlcmZhY2UgZG93bi4gKi8KICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZGlzYWJsZUludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKLSAgICAvKiogQWRkIGEgcm91dGUgdG8gdGhlIHNwZWNpZmllZCBob3N0IHZpYSB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBhZGRIb3N0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBob3N0YWRkcik7Ci0KLSAgICAvKiogQWRkIGEgZGVmYXVsdCByb3V0ZSBmb3IgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgc2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgZ3dheUFkZHIpOworICAgIC8qKgorICAgICAqIEFkZCBhIHJvdXRlIHRvIHRoZSByb3V0aW5nIHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUgdGhlIGludGVyZmFjZSB0byByb3V0ZSB0aHJvdWdoLgorICAgICAqIEBwYXJhbSBkc3QgdGhlIG5ldHdvcmsgb3IgaG9zdCB0byByb3V0ZSB0by4gTWF5IGJlIElQdjQgb3IgSVB2NiwgZS5nLgorICAgICAqICIwLjAuMC4wIiBvciAiMjAwMTo0ODYwOjoiLgorICAgICAqIEBwYXJhbSBwcmVmaXhMZW5ndGggdGhlIHByZWZpeCBsZW5ndGggb2YgdGhlIHJvdXRlLgorICAgICAqIEBwYXJhbSBndyB0aGUgZ2F0ZXdheSB0byB1c2UsIGUuZy4sICIxOTIuMTY4LjI1MS4xIi4gSWYgbnVsbCwKKyAgICAgKiBpbmRpY2F0ZXMgYSBkaXJlY3RseS1jb25uZWN0ZWQgcm91dGUuCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGFkZFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBTdHJpbmcgZHN0LAorICAgICAgICAgIGludCBwcmVmaXhMZW5ndGgsIFN0cmluZyBndyk7CiAKICAgICAvKiogUmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpOwpAQCAtMTA2LDI3ICsxMjAsNzkgQEAKICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBpcEFkZHJlc3MsIGludCBuZXRtYXNrLCBpbnQgZ2F0ZXdheSwgaW50IGRuczEsIGludCBkbnMyKTsKIAogICAgIC8qKgotICAgICAqIExvb2sgdXAgYSBob3N0IG5hbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGFuIGludC4gV29ya3MgaWYgdGhlIGFyZ3VtZW50Ci0gICAgICogaXMgYW4gSVAgYWRkcmVzcyBpbiBkb3Qgbm90YXRpb24uIE9idmlvdXNseSwgdGhpcyBjYW4gb25seSBiZSB1c2VkIGZvciBJUHY0Ci0gICAgICogYWRkcmVzc2VzLgotICAgICAqIEBwYXJhbSBob3N0bmFtZSB0aGUgbmFtZSBvZiB0aGUgaG9zdCAob3IgdGhlIElQIGFkZHJlc3MpCi0gICAgICogQHJldHVybiB0aGUgSVAgYWRkcmVzcyBhcyBhbiB7QGNvZGUgaW50fSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAgICAgKiBDb252ZXJ0IGEgSVB2NCBhZGRyZXNzIGZyb20gYW4gaW50ZWdlciB0byBhbiBJbmV0QWRkcmVzcy4KKyAgICAgKiBAcGFyYW0gaG9zdEFkZHIgaXMgYW4gSW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIElQdjQgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBJUCBhZGRyZXNzIGFzIGFuIHtAY29kZSBJbmV0QWRkcmVzc30sIHJldHVybnMgbnVsbCBpZgorICAgICAqIHVuYWJsZSB0byBjb252ZXJ0IG9yIGlmIHRoZSBpbnQgaXMgYW4gaW52YWxpZCBhZGRyZXNzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvb2t1cEhvc3QoU3RyaW5nIGhvc3RuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyBJbmV0QWRkcmVzcyBpbnRUb0luZXRBZGRyZXNzKGludCBob3N0QWRkcmVzcykgewogICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzczsKKyAgICAgICAgYnl0ZVtdIGFkZHJlc3NCeXRlcyA9IHsgKGJ5dGUpKDB4ZmYgJiBob3N0QWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSgweGZmICYgKGhvc3RBZGRyZXNzID4+IDgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKDB4ZmYgJiAoaG9zdEFkZHJlc3MgPj4gMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKDB4ZmYgJiAoaG9zdEFkZHJlc3MgPj4gMjQpKSB9OworCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcmVzc0J5dGVzKTsKKyAgICAgICAgfSBjYXRjaChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBhZGRyQnl0ZXM7Ci0gICAgICAgIGludCBhZGRyOwotICAgICAgICBhZGRyQnl0ZXMgPSBpbmV0QWRkcmVzcy5nZXRBZGRyZXNzKCk7Ci0gICAgICAgIGFkZHIgPSAoKGFkZHJCeXRlc1szXSAmIDB4ZmYpIDw8IDI0KQotICAgICAgICAgICAgICAgIHwgKChhZGRyQnl0ZXNbMl0gJiAweGZmKSA8PCAxNikKLSAgICAgICAgICAgICAgICB8ICgoYWRkckJ5dGVzWzFdICYgMHhmZikgPDwgOCkKLSAgICAgICAgICAgICAgICB8ICAoYWRkckJ5dGVzWzBdICYgMHhmZik7Ci0gICAgICAgIHJldHVybiBhZGRyOworCisgICAgICAgIHJldHVybiBpbmV0QWRkcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkZWZhdWx0IHJvdXRlIHRocm91Z2ggdGhlIHNwZWNpZmllZCBnYXRld2F5LgorICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIGludGVyZmFjZSBvbiB3aGljaCB0aGUgcm91dGUgc2hvdWxkIGJlIGFkZGVkCisgICAgICogQHBhcmFtIGd3IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBnYXRld2F5IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIEluZXRBZGRyZXNzIGd3KSB7CisgICAgICAgIFN0cmluZyBkc3RTdHI7CisgICAgICAgIFN0cmluZyBnd1N0ciA9IGd3LmdldEhvc3RBZGRyZXNzKCk7CisKKyAgICAgICAgaWYgKGd3IGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSB7CisgICAgICAgICAgICBkc3RTdHIgPSAiMC4wLjAuMCI7CisgICAgICAgIH0gZWxzZSBpZiAoZ3cgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIHsKKyAgICAgICAgICAgIGRzdFN0ciA9ICI6OiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJhZGREZWZhdWx0Um91dGUgZmFpbHVyZTogYWRkcmVzcyBpcyBuZWl0aGVyIElQdjQgbm9yIElQdjYiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIigiICsgZ3dTdHIgKyAiKSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRSb3V0ZShpbnRlcmZhY2VOYW1lLCBkc3RTdHIsIDAsIGd3U3RyKSA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGhvc3Qgcm91dGUuCisgICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSByb3V0ZSBzaG91bGQgYmUgYWRkZWQKKyAgICAgKiBAcGFyYW0gZHN0IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAorICAgICAqIHRoaXMgc2hvdWxkIG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBndyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgZ2F0ZXdheSB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpZiBudWxsLCBpbmRpY2F0ZXMgYSBkaXJlY3RseS1jb25uZWN0ZWQgcm91dGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFkZEhvc3RSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgSW5ldEFkZHJlc3MgZHN0LAorICAgICAgICAgIEluZXRBZGRyZXNzIGd3KSB7CisgICAgICAgIGlmIChkc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkSG9zdFJvdXRlOiBkc3Qgc2hvdWxkIG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcHJlZml4TGVuZ3RoOworICAgICAgICBTdHJpbmcgZHN0U3RyID0gZHN0LmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgIFN0cmluZyBnd1N0ciA9IChndyAhPSBudWxsKSA/IGd3LmdldEhvc3RBZGRyZXNzKCkgOiBudWxsOworCisgICAgICAgIGlmIChkc3QgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpIHsKKyAgICAgICAgICAgIHByZWZpeExlbmd0aCA9IDMyOworICAgICAgICB9IGVsc2UgaWYgKGRzdCBpbnN0YW5jZW9mIEluZXQ2QWRkcmVzcykgeworICAgICAgICAgICAgcHJlZml4TGVuZ3RoID0gMTI4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkSG9zdFJvdXRlIGZhaWx1cmU6IGFkZHJlc3MgaXMgbmVpdGhlciBJUHY0IG5vciBJUHY2IiArCisgICAgICAgICAgICAgICAgICAgICAgICIoIiArIGRzdCArICIpIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFJvdXRlKGludGVyZmFjZU5hbWUsIGRzdFN0ciwgcHJlZml4TGVuZ3RoLCBnd1N0cikgPT0gMDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCB2NFN0cmluZ1RvSW50KFN0cmluZyBzdHIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKaW5kZXggNjZlZWZiMi4uYzFmYTViNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKQEAgLTE2LDEyICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS5uZXQuVVJJOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogLyoqCkBAIC0xMjAsNCArMTI0LDczIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgcHJveHkgdG8gYmUgdXNlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgd3JhcHBlcgorICAgICAqIGFyb3VuZCB7QGxpbmsgYW5kcm9pZC5uZXQuUHJveHkjZ2V0SG9zdCgpfS4gQ3VycmVudGx5IG5vIHByb3h5IHdpbGwKKyAgICAgKiBiZSByZXR1cm5lZCBmb3IgbG9jYWxob3N0IG9yIGlmIHRoZSBhY3RpdmUgbmV0d29yayBpcyBXaS1GaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICoge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0KKyAgICAgKiBAcGFyYW0gdXJsIHRoZSB0YXJnZXQgVVJMIGZvciB0aGUgcmVxdWVzdAorICAgICAqIEBub3RlIENhbGxpbmcgdGhpcyBtZXRob2QgcmVxdWlyZXMgcGVybWlzc2lvbgorICAgICAqIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURQorICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMsIG9yIG51bGwgaWYgdGhlcmUKKyAgICAgKiBpcyBubyBwcm94eS4KKyAgICAgKgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgcHVibGljIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKKyAgICAgICAgaWYgKCFpc0xvY2FsSG9zdCh1cmwpICYmICFpc05ldHdvcmtXaWZpKGNvbnRleHQpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChjb250ZXh0KTsKKyAgICAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBQcm94eS5nZXRQb3J0KGNvbnRleHQpLCAiaHR0cCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHVybCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CisgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSW5ldEFkZHJlc3MuaXNMb29wYmFja0FkZHJlc3Mgc2hvdWxkIGJlIHVzZWQgdG8gY2hlY2sKKyAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWxob3N0LiBIb3dldmVyIG5vIHB1YmxpYyBmYWN0b3J5IG1ldGhvZHMgZXhpc3Qgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBjYW4gYmUgdXNlZCB3aXRob3V0IHRyaWdnZXJpbmcgRE5TIGxvb2t1cCBpZiBob3N0IGlzIG5vdCBsb2NhbGhvc3QuCisgICAgICAgICAgICAgICAgaWYgKGhvc3QuZXF1YWxzSWdub3JlQ2FzZSgibG9jYWxob3N0IikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZXF1YWxzKCIxMjcuMC4wLjEiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5lcXVhbHMoIls6OjFdIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWV4KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgKFVSSS5jcmVhdGUpCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb25uZWN0aXZpdHlNYW5hZ2VyIGNvbm5lY3Rpdml0eSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKQorICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAoY29ubmVjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIGluZm8gPSBjb25uZWN0aXZpdHkuZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRUeXBlKCkgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKaW5kZXggMDc1NzI5My4uOGRjMmE4NjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQpAQCAtNzksNiArNzksOSBAQAogICAgIC8vIEd6aXAgb2YgZGF0YSBzaG9ydGVyIHRoYW4gdGhpcyBwcm9iYWJseSB3b24ndCBiZSB3b3J0aHdoaWxlCiAgICAgcHVibGljIHN0YXRpYyBsb25nIERFRkFVTFRfU1lOQ19NSU5fR1pJUF9CWVRFUyA9IDI1NjsKIAorICAgIC8vIERlZmF1bHQgY29ubmVjdGlvbiBhbmQgc29ja2V0IHRpbWVvdXQgb2YgNjAgc2Vjb25kcy4gIFR3ZWFrIHRvIHRhc3RlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfT1BFUkFUSU9OX1RJTUVPVVQgPSA2MCAqIDEwMDA7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFuZHJvaWRIdHRwQ2xpZW50IjsKIAogCkBAIC0xMDcsOSArMTEwLDggQEAKICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IHdvcnRoIGl0IHRvIHBheSB0aGUgcGVuYWx0eSBvZiBjaGVja2luZyBldmVyeSB0aW1lLgogICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTdGFsZUNoZWNraW5nRW5hYmxlZChwYXJhbXMsIGZhbHNlKTsKIAotICAgICAgICAvLyBEZWZhdWx0IGNvbm5lY3Rpb24gYW5kIHNvY2tldCB0aW1lb3V0IG9mIDIwIHNlY29uZHMuICBUd2VhayB0byB0YXN0ZS4KLSAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLCA2MCAqIDEwMDApOwotICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCA2MCAqIDEwMDApOworICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRDb25uZWN0aW9uVGltZW91dChwYXJhbXMsIFNPQ0tFVF9PUEVSQVRJT05fVElNRU9VVCk7CisgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldFNvVGltZW91dChwYXJhbXMsIFNPQ0tFVF9PUEVSQVRJT05fVElNRU9VVCk7CiAgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldFNvY2tldEJ1ZmZlclNpemUocGFyYW1zLCA4MTkyKTsKIAogICAgICAgICAvLyBEb24ndCBoYW5kbGUgcmVkaXJlY3RzIC0tIHJldHVybiB0aGVtIHRvIHRoZSBjYWxsZXIuICBPdXIgY29kZQpAQCAtMTI1LDcgKzEyNyw4IEBACiAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHAiLAogICAgICAgICAgICAgICAgIFBsYWluU29ja2V0RmFjdG9yeS5nZXRTb2NrZXRGYWN0b3J5KCksIDgwKSk7CiAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHBzIiwKLSAgICAgICAgICAgICAgICBTU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnkuZ2V0SHR0cFNvY2tldEZhY3RvcnkoMzAgKiAxMDAwLCBzZXNzaW9uQ2FjaGUpLCA0NDMpKTsKKyAgICAgICAgICAgICAgICBTU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnkuZ2V0SHR0cFNvY2tldEZhY3RvcnkoCisgICAgICAgICAgICAgICAgU09DS0VUX09QRVJBVElPTl9USU1FT1VULCBzZXNzaW9uQ2FjaGUpLCA0NDMpKTsKIAogICAgICAgICBDbGllbnRDb25uZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0KICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkU2FmZUNsaWVudENvbm5NYW5hZ2VyKHBhcmFtcywgc2NoZW1lUmVnaXN0cnkpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVWYWxpZGF0b3JDYWNoZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVWYWxpZGF0b3JDYWNoZS5qYXZhCmluZGV4IDQ3NjYxZDUuLmE4OWY3NWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlVmFsaWRhdG9yQ2FjaGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlLmphdmEKQEAgLTEzNyw4ICsxMzcsOCBAQAogCiAgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCAmJiBkb21haW4ubGVuZ3RoKCkgIT0gMCkgewogICAgICAgICAgICAgaWYgKHNlY3VyZUhhc2ggIT0gbnVsbCAmJiBzZWN1cmVIYXNoLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gKENhY2hlRW50cnkpbUNhY2hlTWFwLmdldCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIobUJpZ1NjcmV3IF4gZG9tYWluLmhhc2hDb2RlKCkpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKG1CaWdTY3JldyBeIGRvbWFpbi5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgICAgICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSBtQ2FjaGVNYXAuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlRW50cnkuZXhwaXJlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBydmFsID0gY2FjaGVFbnRyeS5oYXMoZG9tYWluLCBzZWN1cmVIYXNoKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZGVidWcgb25seSEKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZU1hcC5yZW1vdmUoY2FjaGVFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVNYXAucmVtb3ZlKGtleSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9IZWFkZXJzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9IZWFkZXJzLmphdmEKaW5kZXggMDlmNmY0Zi4uNzRjMGRlOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSGVhZGVycy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0hlYWRlcnMuamF2YQpAQCAtMjYyLDcgKzI2MiwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSEFTSF9DQUNIRV9DT05UUk9MOgogICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKENBQ0hFX0NPTlRST0wpKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWRlcnNbSURYX0NBQ0hFX0NPTlRST0xdID0gdmFsOworICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugd2hlcmUgd2UgcmVjZWl2ZSBtb3JlIHRoYW4gb25lIGhlYWRlciwgY3JlYXRlIGEgJywnIHNlcGFyYXRlZCBsaXN0LgorICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIG9rLCBhY2NvcmRpbmcgdG8gUkZDIDI2MTYgY2hhcHRlciA0LjIKKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlcnNbSURYX0NBQ0hFX0NPTlRST0xdICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNbSURYX0NBQ0hFX0NPTlRST0xdLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtSGVhZGVyc1tJRFhfQ0FDSEVfQ09OVFJPTF0gKz0gKCcsJyArIHZhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNbSURYX0NBQ0hFX0NPTlRST0xdID0gdmFsOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhBU0hfTEFTVF9NT0RJRklFRDoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBzQ29ubmVjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSHR0cHNDb25uZWN0aW9uLmphdmEKaW5kZXggYjM2MWRjYS4uZDc3ZTlkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSHR0cHNDb25uZWN0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSHR0cHNDb25uZWN0aW9uLmphdmEKQEAgLTIwNSwxMCArMjA1LDEzIEBACiAgICAgICAgICAgICAgICAgQmFzaWNIdHRwUmVxdWVzdCBwcm94eVJlcSA9IG5ldyBCYXNpY0h0dHBSZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICgiQ09OTkVDVCIsIG1Ib3N0LnRvSG9zdFN0cmluZygpKTsKIAotICAgICAgICAgICAgICAgIC8vIGFkZCBhbGwgJ3Byb3h5JyBoZWFkZXJzIGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAvLyBhZGQgYWxsICdwcm94eScgaGVhZGVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCB3ZSBhbHNvIG5lZWQKKyAgICAgICAgICAgICAgICAvLyB0byBhZGQgJ2hvc3QnIGhlYWRlciB1bmxlc3Mgd2Ugd2FudCBwcm94eSB0byBhbnN3ZXIgdXMgd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gNDAwIEJhZCBSZXF1ZXN0CiAgICAgICAgICAgICAgICAgZm9yIChIZWFkZXIgaCA6IHJlcS5tSHR0cFJlcXVlc3QuZ2V0QWxsSGVhZGVycygpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gaC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuc3RhcnRzV2l0aCgicHJveHkiKSB8fCBoZWFkZXJOYW1lLmVxdWFscygia2VlcC1hbGl2ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLnN0YXJ0c1dpdGgoInByb3h5IikgfHwgaGVhZGVyTmFtZS5lcXVhbHMoImtlZXAtYWxpdmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGhlYWRlck5hbWUuZXF1YWxzKCJob3N0IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UmVxLmFkZEhlYWRlcihoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL1JlcXVlc3RIYW5kbGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL1JlcXVlc3RIYW5kbGUuamF2YQppbmRleCAxMDNmZDk0Li4yYzQ4YTA0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0SGFuZGxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdEhhbmRsZS5qYXZhCkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICAgICAgU3RyaW5nIEEyID0gbU1ldGhvZCAgKyAiOiIgKyBtVXJsOwogCiAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG8gbm90IHByZWVtcHRpdmVseSBzZW5kIGF1dGhvcml6YXRpb24gaGVhZGVycywgbmMgaXMgYWx3YXlzIDEKLSAgICAgICAgU3RyaW5nIG5jID0gIjAwMDAwMSI7CisgICAgICAgIFN0cmluZyBuYyA9ICIwMDAwMDAwMSI7CiAgICAgICAgIFN0cmluZyBjbm9uY2UgPSBjb21wdXRlQ25vbmNlKCk7CiAgICAgICAgIFN0cmluZyBkaWdlc3QgPSBjb21wdXRlRGlnZXN0KEExLCBBMiwgbm9uY2UsIFFPUCwgbmMsIGNub25jZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0JhdHRlcnlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CYXR0ZXJ5TWFuYWdlci5qYXZhCmluZGV4IDQ0YjczYzUuLmJkNTdiMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0JhdHRlcnlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmF0dGVyeU1hbmFnZXIuamF2YQpAQCAtOTksNiArOTksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfSEVBTFRIX0RFQUQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfSEVBTFRIX09WRVJfVk9MVEFHRSA9IDU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9IRUFMVEhfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9IRUFMVEhfQ09MRCA9IDc7CiAKICAgICAvLyB2YWx1ZXMgb2YgdGhlICJwbHVnZ2VkIiBmaWVsZCBpbiB0aGUgQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCBpbnRlbnQuCiAgICAgLy8gVGhlc2UgbXVzdCBiZSBwb3dlcnMgb2YgMi4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0JpbmRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmluZGVyLmphdmEKaW5kZXggZjgyNjBjYS4uYTQwMmM5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmluZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmluZGVyLmphdmEKQEAgLTMyNCw2ICszMjQsMTAgQEAKICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXBseS53cml0ZUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIHJlcyA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgeworICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiByZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5IiwgZSk7CisgICAgICAgICAgICByZXBseS53cml0ZUV4Y2VwdGlvbihyZSk7CisgICAgICAgICAgICByZXMgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQppbmRleCAyZTE0NjY3Li44NmY5YTZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKQEAgLTk0LDcgKzk0LDggQEAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IHRyYWNlIGZpbGUgcGF0aCBhbmQgZmlsZQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RSQUNFX1BBVEhfUFJFRklYID0gIi9zZGNhcmQvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFDRV9QQVRIX1BSRUZJWCA9CisgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLmdldFBhdGgoKSArICIvIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFDRV9CT0RZID0gImRtdHJhY2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RSQUNFX0VYVEVOU0lPTiA9ICIudHJhY2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RSQUNFX0ZJTEVfUEFUSCA9CkBAIC0xMjcsNyArMTI4LDcgQEAKICAgICAgICAgcHVibGljIGludCBvdGhlclByaXZhdGVEaXJ0eTsKICAgICAgICAgLyoqIFRoZSBzaGFyZWQgZGlydHkgcGFnZXMgdXNlZCBieSBldmVyeXRoaW5nIGVsc2UuICovCiAgICAgICAgIHB1YmxpYyBpbnQgb3RoZXJTaGFyZWREaXJ0eTsKLSAgICAgICAgCisKICAgICAgICAgcHVibGljIE1lbW9yeUluZm8oKSB7CiAgICAgICAgIH0KIApAQCAtMTM3LDIxICsxMzgsMjEgQEAKICAgICAgICAgcHVibGljIGludCBnZXRUb3RhbFBzcygpIHsKICAgICAgICAgICAgIHJldHVybiBkYWx2aWtQc3MgKyBuYXRpdmVQc3MgKyBvdGhlclBzczsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJuIHRvdGFsIHByaXZhdGUgZGlydHkgbWVtb3J5IHVzYWdlIGluIGtCLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRUb3RhbFByaXZhdGVEaXJ0eSgpIHsKICAgICAgICAgICAgIHJldHVybiBkYWx2aWtQcml2YXRlRGlydHkgKyBuYXRpdmVQcml2YXRlRGlydHkgKyBvdGhlclByaXZhdGVEaXJ0eTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJuIHRvdGFsIHNoYXJlZCBkaXJ0eSBtZW1vcnkgdXNhZ2UgaW4ga0IuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGdldFRvdGFsU2hhcmVkRGlydHkoKSB7CiAgICAgICAgICAgICByZXR1cm4gZGFsdmlrU2hhcmVkRGlydHkgKyBuYXRpdmVTaGFyZWREaXJ0eSArIG90aGVyU2hhcmVkRGlydHk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTE3OSw3ICsxODAsNyBAQAogICAgICAgICAgICAgb3RoZXJQcml2YXRlRGlydHkgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICAgICAgb3RoZXJTaGFyZWREaXJ0eSA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPE1lbW9yeUluZm8+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjxNZW1vcnlJbmZvPigpIHsKICAgICAgICAgICAgIHB1YmxpYyBNZW1vcnlJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVtb3J5SW5mbyhzb3VyY2UpOwpAQCAtNDYwLDcgKzQ2MSw3IEBACiAgICAgICogTGlrZSBzdGFydE1ldGhvZFRyYWNpbmcoU3RyaW5nLCBpbnQsIGludCksIGJ1dCB0YWtpbmcgYW4gYWxyZWFkeS1vcGVuZWQKICAgICAgKiBGaWxlRGVzY3JpcHRvciBpbiB3aGljaCB0aGUgdHJhY2UgaXMgd3JpdHRlbi4gIFRoZSBmaWxlIG5hbWUgaXMgYWxzbwogICAgICAqIHN1cHBsaWVkIHNpbXBseSBmb3IgbG9nZ2luZy4gIE1ha2VzIGEgZHVwIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICogCisgICAgICoKICAgICAgKiBOb3QgZXhwb3NlZCBpbiB0aGUgU0RLIHVubGVzcyB3ZSBhcmUgcmVhbGx5IGNvbWZvcnRhYmxlIHdpdGggc3VwcG9ydGluZwogICAgICAqIHRoaXMgYW5kIGZpbmQgaXQgd291bGQgYmUgdXNlZnVsLgogICAgICAqIEBoaWRlCkBAIC0xMDcwLDcgKzEwNzEsNyBAQAogICAgICAqICAgIHN0YXRpYyB7CiAgICAgICogICAgICAgIC8vIFNldHMgYWxsIHRoZSBmaWVsZHMKICAgICAgKiAgICAgICAgRGVidWcuc2V0RmllbGRzT24oTXlEZWJ1Z1ZhcnMuY2xhc3MpOwotICAgICAqIAorICAgICAqCiAgICAgICogICAgICAgIC8vIFNldHMgb25seSB0aGUgZmllbGRzIGFubm90YXRlZCB3aXRoIEBEZWJ1Zy5EZWJ1Z1Byb3BlcnR5CiAgICAgICogICAgICAgIC8vIERlYnVnLnNldEZpZWxkc09uKE15RGVidWdWYXJzLmNsYXNzLCB0cnVlKTsKICAgICAgKiAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Ecm9wQm94TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRHJvcEJveE1hbmFnZXIuamF2YQppbmRleCBhNDdjNjZhLi5lMWMxNjc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Ecm9wQm94TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0Ryb3BCb3hNYW5hZ2VyLmphdmEKQEAgLTU4LDYgKzU4LDMwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU19CWVRFX0FSUkFZID0gODsKIAogICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IFRoaXMgaXMgYnJvYWRjYXN0IHdoZW4gYSBuZXcgZW50cnkgaXMgYWRkZWQgaW4gdGhlIGRyb3Bib3guCisgICAgICogWW91IG11c3QgaG9sZCB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0xPR1N9IHBlcm1pc3Npb24KKyAgICAgKiBpbiBvcmRlciB0byByZWNlaXZlIHRoaXMgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogPHAgY2xhc3M9Im5vdGUiPlRoaXMgaXMgYSBwcm90ZWN0ZWQgaW50ZW50IHRoYXQgY2FuIG9ubHkgYmUgc2VudAorICAgICAqIGJ5IHRoZSBzeXN0ZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RST1BCT1hfRU5UUllfQURERUQgPQorICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRST1BCT1hfRU5UUllfQURERUQiOworCisgICAgLyoqCisgICAgICogRXh0cmEgZm9yIHtAbGluayBhbmRyb2lkLm9zLkRyb3BCb3hNYW5hZ2VyI0FDVElPTl9EUk9QQk9YX0VOVFJZX0FEREVEfToKKyAgICAgKiBzdHJpbmcgY29udGFpbmluZyB0aGUgZHJvcGJveCB0YWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFHID0gInRhZyI7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBmb3Ige0BsaW5rIGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXIjQUNUSU9OX0RST1BCT1hfRU5UUllfQURERUR9OgorICAgICAqIGxvbmcgaW50ZWdlciB2YWx1ZSBjb250YWluaW5nIHRpbWUgKGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgMDA6MDA6MDAgVVRDKQorICAgICAqIHdoZW4gdGhlIGVudHJ5IHdhcyBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RJTUUgPSAidGltZSI7CisKKyAgICAvKioKICAgICAgKiBBIHNpbmdsZSBlbnRyeSByZXRyaWV2ZWQgZnJvbSB0aGUgZHJvcCBib3guCiAgICAgICogVGhpcyBtYXkgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBhIHN0cmVhbSwgc28geW91IG11c3QgY2FsbAogICAgICAqIHtAbGluayAjY2xvc2UoKX0gd2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgaXQuCkBAIC0xNjksNyArMTkzLDEyIEBACiAgICAgICAgICAgICAgICAgaXMgPSBnZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbWF4Qnl0ZXNdOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgTWF0aC5tYXgoMCwgaXMucmVhZChidWYpKSk7CisgICAgICAgICAgICAgICAgaW50IHJlYWRCeXRlcyA9IDA7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChuID49IDAgJiYgKHJlYWRCeXRlcyArPSBuKSA8IG1heEJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpcy5yZWFkKGJ1ZiwgcmVhZEJ5dGVzLCBtYXhCeXRlcyAtIHJlYWRCeXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgcmVhZEJ5dGVzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKaW5kZXggNDliNzJmZS4uN2QxMjhlYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQpAQCAtODUsOSArODUsOSBAQAogICAgIC8vIHNvbWV0aW1lcyB3ZSBzdG9yZSBsaW5rZWQgbGlzdHMgb2YgdGhlc2UgdGhpbmdzCiAgICAgLypwYWNrYWdlKi8gTWVzc2FnZSBuZXh0OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG1Qb29sU3luYyA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlIG1Qb29sOwotICAgIHByaXZhdGUgc3RhdGljIGludCBtUG9vbFNpemUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzUG9vbFN5bmMgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBzUG9vbDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc1Bvb2xTaXplID0gMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gMTA7CiAgICAgCkBAIC05NiwxMSArOTYsMTIgQEAKICAgICAgKiBhdm9pZCBhbGxvY2F0aW5nIG5ldyBvYmplY3RzIGluIG1hbnkgY2FzZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIG9idGFpbigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtUG9vbFN5bmMpIHsKLSAgICAgICAgICAgIGlmIChtUG9vbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gbVBvb2w7Ci0gICAgICAgICAgICAgICAgbVBvb2wgPSBtLm5leHQ7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1Bvb2xTeW5jKSB7CisgICAgICAgICAgICBpZiAoc1Bvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHNQb29sOworICAgICAgICAgICAgICAgIHNQb29sID0gbS5uZXh0OwogICAgICAgICAgICAgICAgIG0ubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgc1Bvb2xTaXplLS07CiAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzNywxMiArMjM4LDEyIEBACiAgICAgICogZnJlZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtUG9vbFN5bmMpIHsKLSAgICAgICAgICAgIGlmIChtUG9vbFNpemUgPCBNQVhfUE9PTF9TSVpFKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1Bvb2xTeW5jKSB7CisgICAgICAgICAgICBpZiAoc1Bvb2xTaXplIDwgTUFYX1BPT0xfU0laRSkgewogICAgICAgICAgICAgICAgIGNsZWFyRm9yUmVjeWNsZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5leHQgPSBtUG9vbDsKLSAgICAgICAgICAgICAgICBtUG9vbCA9IHRoaXM7CisgICAgICAgICAgICAgICAgbmV4dCA9IHNQb29sOworICAgICAgICAgICAgICAgIHNQb29sID0gdGhpczsKKyAgICAgICAgICAgICAgICBzUG9vbFNpemUrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQ1Myw0ICs0NTQsMyBAQAogICAgICAgICByZXBseVRvID0gTWVzc2VuZ2VyLnJlYWRNZXNzZW5nZXJPck51bGxGcm9tUGFyY2VsKHNvdXJjZSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0RpYWxvZ1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvRGlhbG9nUHJlZmVyZW5jZS5qYXZhCmluZGV4IGJiYWQyYjYuLjQ1YzgxNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvRGlhbG9nUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvRGlhbG9nUHJlZmVyZW5jZS5qYXZhCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICBwcml2YXRlIHZvaWQgcmVxdWVzdElucHV0TWV0aG9kKERpYWxvZyBkaWFsb2cpIHsKICAgICAgICAgV2luZG93IHdpbmRvdyA9IGRpYWxvZy5nZXRXaW5kb3coKTsKICAgICAgICAgd2luZG93LnNldFNvZnRJbnB1dE1vZGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfVklTSUJMRSB8Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUkVTSVpFKTsKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU4pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZS5qYXZhCmluZGV4IGY4NDJkNzUuLmY0NGNiZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTGlzdFByZWZlcmVuY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyaWVzOwogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJ5VmFsdWVzOwogICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBtU3VtbWFyeTsKICAgICBwcml2YXRlIGludCBtQ2xpY2tlZERpYWxvZ0VudHJ5SW5kZXg7CiAgICAgCiAgICAgcHVibGljIExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CkBAIC00OSw4ICs1MCwxNiBAQAogICAgICAgICBtRW50cmllcyA9IGEuZ2V0VGV4dEFycmF5KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RQcmVmZXJlbmNlX2VudHJpZXMpOwogICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcyk7CiAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8qIFJldHJpZXZlIHRoZSBQcmVmZXJlbmNlIHN1bW1hcnkgYXR0cmlidXRlIHNpbmNlIGl0J3MgcHJpdmF0ZQorICAgICAgICAgKiBpbiB0aGUgUHJlZmVyZW5jZSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZSwgMCwgMCk7CisgICAgICAgIG1TdW1tYXJ5ID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZV9zdW1tYXJ5KTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTEyNyw2ICsxMzYsNDMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdW1tYXJ5IG9mIHRoaXMgTGlzdFByZWZlcmVuY2UuIElmIHRoZSBzdW1tYXJ5CisgICAgICogaGFzIGEge0BsaW5rcGxhaW4gamF2YS5sYW5nLlN0cmluZyNmb3JtYXQgU3RyaW5nIGZvcm1hdHRpbmd9CisgICAgICogbWFya2VyIGluIGl0IChpLmUuICIlcyIgb3IgIiUxJHMiKSwgdGhlbiB0aGUgY3VycmVudCBlbnRyeQorICAgICAqIHZhbHVlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4gaXRzIHBsYWNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3VtbWFyeSB3aXRoIGFwcHJvcHJpYXRlIHN0cmluZyBzdWJzdGl0dXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1bW1hcnkoKSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBlbnRyeSA9IGdldEVudHJ5KCk7CisgICAgICAgIGlmIChtU3VtbWFyeSA9PSBudWxsIHx8IGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChtU3VtbWFyeSwgZW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3VtbWFyeSBmb3IgdGhpcyBQcmVmZXJlbmNlIHdpdGggYSBDaGFyU2VxdWVuY2UuCisgICAgICogSWYgdGhlIHN1bW1hcnkgaGFzIGEKKyAgICAgKiB7QGxpbmtwbGFpbiBqYXZhLmxhbmcuU3RyaW5nI2Zvcm1hdCBTdHJpbmcgZm9ybWF0dGluZ30KKyAgICAgKiBtYXJrZXIgaW4gaXQgKGkuZS4gIiVzIiBvciAiJTEkcyIpLCB0aGVuIHRoZSBjdXJyZW50IGVudHJ5CisgICAgICogdmFsdWUgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbiBpdHMgcGxhY2Ugd2hlbiBpdCdzIHJldHJpZXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBzdW1tYXJ5IGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KENoYXJTZXF1ZW5jZSBzdW1tYXJ5KSB7CisgICAgICAgIHN1cGVyLnNldFN1bW1hcnkoc3VtbWFyeSk7CisgICAgICAgIGlmIChzdW1tYXJ5ID09IG51bGwgJiYgbVN1bW1hcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1bW1hcnkgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnkgIT0gbnVsbCAmJiAhc3VtbWFyeS5lcXVhbHMobVN1bW1hcnkpKSB7CisgICAgICAgICAgICBtU3VtbWFyeSA9IHN1bW1hcnkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIHRvIHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSBlbnRyeSB2YWx1ZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgdG8gc2V0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQppbmRleCA5NWU1NDMyNC4uZmFlNWYxYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKQEAgLTgwLDYgKzgwLDggQEAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1Sb290QWRhcHRlcjsKICAgICAKICAgICBwcml2YXRlIERpYWxvZyBtRGlhbG9nOworCisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7CiAgICAgCiAgICAgLyoqCiAgICAgICogRG8gTk9UIHVzZSB0aGlzIGNvbnN0cnVjdG9yLCB1c2Uge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI2NyZWF0ZVByZWZlcmVuY2VTY3JlZW4oQ29udGV4dCl9LgpAQCAtMTQ1LDE1ICsxNDcsMTggQEAKICAgICAKICAgICBwcml2YXRlIHZvaWQgc2hvd0RpYWxvZyhCdW5kbGUgc3RhdGUpIHsKICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IG5ldyBMaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgYmluZChsaXN0Vmlldyk7CisgICAgICAgIGlmIChtTGlzdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RWaWV3LnNldEFkYXB0ZXIobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RWaWV3ID0gbmV3IExpc3RWaWV3KGNvbnRleHQpOworICAgICAgICBiaW5kKG1MaXN0Vmlldyk7CiAKICAgICAgICAgLy8gU2V0IHRoZSB0aXRsZSBiYXIgaWYgdGl0bGUgaXMgYXZhaWxhYmxlLCBlbHNlIG5vIHRpdGxlIGJhcgogICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGl0bGUgPSBnZXRUaXRsZSgpOwogICAgICAgICBEaWFsb2cgZGlhbG9nID0gbURpYWxvZyA9IG5ldyBEaWFsb2coY29udGV4dCwgVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpCiAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX05vVGl0bGVCYXIKICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWUpOwotICAgICAgICBkaWFsb2cuc2V0Q29udGVudFZpZXcobGlzdFZpZXcpOworICAgICAgICBkaWFsb2cuc2V0Q29udGVudFZpZXcobUxpc3RWaWV3KTsKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSkpIHsKICAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSh0aXRsZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCmluZGV4IDBmZjE5NzYuLjM4YzVkYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQpAQCAtMzY0MCw3ICszNjQwLDcgQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoaW50ZW50ID09IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlbnRVUkkgPSBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4T3JUaHJvdyhJTlRFTlQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCA9IEludGVudC5nZXRJbnRlbnQoaW50ZW50VVJJKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCA9IEludGVudC5wYXJzZVVyaShpbnRlbnRVUkksIDApOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3JlZCBVUkwgaXMgYmFkLi4uICBpZ25vcmUgaXQuCiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CkBAIC0zNjk4LDcgKzM2OTgsNyBAQAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHZhbHVlcy5wdXQoVElUTEUsIHRpdGxlKTsKICAgICAgICAgICAgIGlmIChmb2xkZXIgIT0gbnVsbCkgdmFsdWVzLnB1dChGT0xERVIsIGZvbGRlcik7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KElOVEVOVCwgaW50ZW50LnRvVVJJKCkpOworICAgICAgICAgICAgdmFsdWVzLnB1dChJTlRFTlQsIGludGVudC50b1VyaSgwKSk7CiAgICAgICAgICAgICBpZiAoc2hvcnRjdXQgIT0gMCkgdmFsdWVzLnB1dChTSE9SVENVVCwgKGludCkgc2hvcnRjdXQpOwogICAgICAgICAgICAgdmFsdWVzLnB1dChPUkRFUklORywgb3JkZXJpbmcpOwogICAgICAgICAgICAgcmV0dXJuIGNyLmluc2VydChDT05URU5UX1VSSSwgdmFsdWVzKTsKQEAgLTM3NTAsNyArMzc1MCw3IEBACiAKICAgICAgICAgICAgIEludGVudCBpbnRlbnQ7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludGVudCA9IEludGVudC5nZXRJbnRlbnQoaW50ZW50VXJpKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQucGFyc2VVcmkoaW50ZW50VXJpLCAwKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQppbmRleCBmMGYyZWNiLi42MmY2NmI2IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNxbGl0ZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CkBAIC01NjEsMTUgKzU2MiwyNCBAQAogICAgICAgICAgICAgICogdmFsdWVzOjwvcD4KICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAgICAgKiAgIDxsaT48ZW0+dHJhbnNhY3Rpb25JZCAoSW50ZWdlcik8L2VtPiAtIFRoZSBXQVAgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAqICAgIElEPC9saT4KKyAgICAgICAgICAgICAqICAgPGxpPjxlbT50cmFuc2FjdGlvbklkIChJbnRlZ2VyKTwvZW0+IC0gVGhlIFdBUCB0cmFuc2FjdGlvbiBJRDwvbGk+CiAgICAgICAgICAgICAgKiAgIDxsaT48ZW0+cGR1VHlwZSAoSW50ZWdlcik8L2VtPiAtIFRoZSBXQVAgUERVIHR5cGU8L2xpPgogICAgICAgICAgICAgICogICA8bGk+PGVtPmhlYWRlciAoYnl0ZVtdKTwvZW0+IC0gVGhlIGhlYWRlciBvZiB0aGUgbWVzc2FnZTwvbGk+CiAgICAgICAgICAgICAgKiAgIDxsaT48ZW0+ZGF0YSAoYnl0ZVtdKTwvZW0+IC0gVGhlIGRhdGEgcGF5bG9hZCBvZiB0aGUgbWVzc2FnZTwvbGk+CisgICAgICAgICAgICAgKiAgIDxsaT48ZW0+Y29udGVudFR5cGVQYXJhbWV0ZXJzIChIYXNoTWFwJmx0O1N0cmluZyxTdHJpbmcmZ3Q7KTwvZW0+CisgICAgICAgICAgICAgKiAgIC0gQW55IHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IHR5cGUKKyAgICAgICAgICAgICAqICAgKGRlY29kZWQgZnJvbSB0aGUgV1NQIENvbnRlbnQtVHlwZSBoZWFkZXIpPC9saT4KICAgICAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogPHA+SWYgYSBCcm9hZGNhc3RSZWNlaXZlciBlbmNvdW50ZXJzIGFuIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcKICAgICAgICAgICAgICAqIHRoaXMgaW50ZW50IGl0IHNob3VsZCBzZXQgdGhlIHJlc3VsdCBjb2RlIGFwcHJvcHJpYXRlbHkuPC9wPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPlRoZSBjb250ZW50VHlwZVBhcmFtZXRlcnMgZXh0cmEgdmFsdWUgaXMgbWFwIG9mIGNvbnRlbnQgcGFyYW1ldGVycyBrZXllZCBieQorICAgICAgICAgICAgICogdGhlaXIgbmFtZXMuPC9wPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPklmIGFueSB1bmFzc2lnbmVkIHdlbGwta25vd24gcGFyYW1ldGVycyBhcmUgZW5jb3VudGVyZWQsIHRoZSBrZXkgb2YgdGhlIG1hcCB3aWxsCisgICAgICAgICAgICAgKiBiZSAndW5hc3NpZ25lZC8weC4uLicsIHdoZXJlICcuLi4nIGlzIHRoZSBoZXggdmFsdWUgb2YgdGhlIHVuYXNzaWduZWQgcGFyYW1ldGVyLiAgSWYKKyAgICAgICAgICAgICAqIGEgcGFyYW1ldGVyIGhhcyBOby1WYWx1ZSB0aGUgdmFsdWUgaW4gdGhlIG1hcCB3aWxsIGJlIG51bGwuPC9wPgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FQX1BVU0hfUkVDRUlWRURfQUNUSU9OID0KQEAgLTU4Miw3ICs1OTIsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNX0ZVTExfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU0lNX0ZVTEwiOworICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU0lNX0ZVTEwiOwogCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IEFuIGluY29taW5nIFNNUyBoYXMgYmVlbiByZWplY3RlZCBieSB0aGUKQEAgLTE1MjUsNyArMTUzNSw4IEBACiAgICAgICAgICAgICAgKiB3aGljaCBzdHJlYW1zIHRoZSBjYXB0dXJlZCBpbWFnZSB0byB0aGUgdXJpLiBJbnRlcm5hbGx5IHdlIHdyaXRlIHRoZSBtZWRpYSBjb250ZW50CiAgICAgICAgICAgICAgKiB0byB0aGlzIGZpbGUuIEl0J3MgbmFtZWQgJy50ZW1wLmpwZycgc28gR2FsbGVyeSB3b24ndCBwaWNrIGl0IHVwLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JBUF9GSUxFX1BBVEggPSAiL3NkY2FyZC9tbXMvc2NyYXBTcGFjZS8udGVtcC5qcGciOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSQVBfRklMRV9QQVRIID0KKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyAiL21tcy9zY3JhcFNwYWNlLy50ZW1wLmpwZyI7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEludGVudHMgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCmluZGV4IGM4NzdjNWMuLjU2OGQ0NjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKQEAgLTMwLDYgKzMwLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CisKIAogLyoqCiAgKiBUT0RPOiBNb3ZlIHRoaXMgdG8KQEAgLTUxLDYgKzUzLDkgQEAKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFNlcnZpY2UgbUJsdWV0b290aFNlcnZpY2U7CiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAvLyBUaGUgV2FrZUxvY2sgaXMgdXNlZCBmb3IgYnJpbmdpbmcgdXAgdGhlIExDRCBkdXJpbmcgYSBwYWlyaW5nIHJlcXVlc3QKKyAgICAvLyBmcm9tIHJlbW90ZSBkZXZpY2Ugd2hlbiBBbmRyb2lkIGlzIGluIFN1c3BlbmQgc3RhdGUuCisgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFU1RBUlRfQkxVRVRPT1RIID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEFJUklOR19DT05TRU5UX0RFTEFZRURfQUNDRVBUID0gMjsKQEAgLTEwNSw2ICsxMTAsMTEgQEAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtUGFzc2tleUFnZW50UmVxdWVzdERhdGEgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIC8vV2FrZUxvY2sgaW5zdGFudGlhdGlvbiBpbiBCbHVldG9vdGhFdmVudExvb3AgY2xhc3MKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLkZVTExfV0FLRV9MT0NLIHwgUG93ZXJNYW5hZ2VyLkFDUVVJUkVfQ0FVU0VTX1dBS0VVUAorICAgICAgICAgICAgICAgIHwgUG93ZXJNYW5hZ2VyLk9OX0FGVEVSX1JFTEVBU0UsIFRBRyk7CisgICAgICAgIG1XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKICAgICAgICAgaW5pdGlhbGl6ZU5hdGl2ZURhdGFOYXRpdmUoKTsKICAgICB9CiAKQEAgLTM5OCwzNyArNDA4LDQ2IEBACiAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobWVzc2FnZSwgMTUwMCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQorICAgICAgICAvLyBBY3F1aXJlIHdha2Vsb2NrIGR1cmluZyBQSU4gY29kZSByZXF1ZXN0IHRvIGJyaW5nIHVwIExDRCBkaXNwbGF5CisgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNUKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfUEFJUklOR19WQVJJQU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9DT05TRU5UKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9BRE1JTl9QRVJNKTsKKyAgICAgICAgLy8gUmVsZWFzZSB3YWtlbG9jayB0byBhbGxvdyB0aGUgTENEIHRvIGdvIG9mZiBhZnRlciB0aGUgUElOIHBvcHVwIG5vdGlmY2F0aW9uLgorICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uUmVxdWVzdFBhc3NrZXlDb25maXJtYXRpb24oU3RyaW5nIG9iamVjdFBhdGgsIGludCBwYXNza2V5LCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKG9iamVjdFBhdGgsIG5hdGl2ZURhdGEpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm47Ci0KKyAgICAgICAgLy8gQWNxdWlyZSB3YWtlbG9jayBkdXJpbmcgUElOIGNvZGUgcmVxdWVzdCB0byBicmluZyB1cCBMQ0QgZGlzcGxheQorICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcykpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBU1NLRVksIHBhc3NrZXkpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwKICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BBU1NLRVlfQ09ORklSTUFUSU9OKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9BRE1JTl9QRVJNKTsKKyAgICAgICAgLy8gUmVsZWFzZSB3YWtlbG9jayB0byBhbGxvdyB0aGUgTENEIHRvIGdvIG9mZiBhZnRlciB0aGUgUElOIHBvcHVwIG5vdGlmY2F0aW9uLgorICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uUmVxdWVzdFBhc3NrZXkoU3RyaW5nIG9iamVjdFBhdGgsIGludCBuYXRpdmVEYXRhKSB7CiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gY2hlY2tQYWlyaW5nUmVxdWVzdEFuZEdldEFkZHJlc3Mob2JqZWN0UGF0aCwgbmF0aXZlRGF0YSk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKLQorICAgICAgICAvLyBBY3F1aXJlIHdha2Vsb2NrIGR1cmluZyBQSU4gY29kZSByZXF1ZXN0IHRvIGJyaW5nIHVwIExDRCBkaXNwbGF5CisgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNUKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfUEFJUklOR19WQVJJQU5ULAogICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfUEFTU0tFWSk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQURNSU5fUEVSTSk7CisgICAgICAgIC8vIFJlbGVhc2Ugd2FrZWxvY2sgdG8gYWxsb3cgdGhlIExDRCB0byBnbyBvZmYgYWZ0ZXIgdGhlIFBJTiBwb3B1cCBub3RpZmNhdGlvbi4KKyAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDYxLDEwICs0ODAsMTQgQEAKICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuYXR0ZW1wdEF1dG9QYWlyKGFkZHJlc3MpKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBBY3F1aXJlIHdha2Vsb2NrIGR1cmluZyBQSU4gY29kZSByZXF1ZXN0IHRvIGJyaW5nIHVwIExDRCBkaXNwbGF5CisgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNUKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfUEFJUklOR19WQVJJQU5ULCBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BJTik7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQURNSU5fUEVSTSk7CisgICAgICAgIC8vIFJlbGVhc2Ugd2FrZWxvY2sgdG8gYWxsb3cgdGhlIExDRCB0byBnbyBvZmYgYWZ0ZXIgdGhlIFBJTiBwb3B1cCBub3RpZmNhdGlvbi4KKyAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDcyLDEyICs0OTUsMTYgQEAKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBjaGVja1BhaXJpbmdSZXF1ZXN0QW5kR2V0QWRkcmVzcyhvYmplY3RQYXRoLCBuYXRpdmVEYXRhKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOwogCisgICAgICAgIC8vIEFjcXVpcmUgd2FrZWxvY2sgZHVyaW5nIFBJTiBjb2RlIHJlcXVlc3QgdG8gYnJpbmcgdXAgTENEIGRpc3BsYXkKKyAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9QQUlSSU5HX1JFUVVFU1QpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQVNTS0VZLCBwYXNza2V5KTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQUlSSU5HX1ZBUklBTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX0RJU1BMQVlfUEFTU0tFWSk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQURNSU5fUEVSTSk7CisgICAgICAgIC8vUmVsZWFzZSB3YWtlbG9jayB0byBhbGxvdyB0aGUgTENEIHRvIGdvIG9mZiBhZnRlciB0aGUgUElOIHBvcHVwIG5vdGlmY2F0aW9uLgorICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvblJlcXVlc3RPb2JEYXRhKFN0cmluZyBvYmplY3RQYXRoICwgaW50IG5hdGl2ZURhdGEpIHsKQEAgLTU2Niw2ICs1OTMsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG9uRGlzY292ZXJTZXJ2aWNlc1Jlc3VsdChTdHJpbmcgZGV2aWNlT2JqZWN0UGF0aCwgYm9vbGVhbiByZXN1bHQpIHsKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKwogICAgICAgICAvLyBXZSBkb24ndCBwYXJzZSB0aGUgeG1sIGhlcmUsIGluc3RlYWQganVzdCBxdWVyeSBCbHVleiBmb3IgdGhlIHByb3BlcnRpZXMuCiAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLnVwZGF0ZVJlbW90ZURldmljZVByb3BlcnRpZXNDYWNoZShhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQppbmRleCAyNjM0NmQyLi45ZjM2MmQzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCkBAIC01MTQsOCArNTE0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTGF5b3V0LndpbmRvd0FuaW1hdGlvbnMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9XYWxscGFwZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsID0gbmV3IElucHV0Q2hhbm5lbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uYWRkKG1XaW5kb3csIG1MYXlvdXQsIFZpZXcuVklTSUJMRSwgbUNvbnRlbnRJbnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dENoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uLmFkZChtV2luZG93LCBtTGF5b3V0LCBWaWV3LlZJU0lCTEUsIG1Db250ZW50SW5zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gYWRkIHdpbmRvdyB3aGlsZSB1cGRhdGluZyB3YWxscGFwZXIgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZCA9IHRydWU7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0UXVldWUucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCwgbUlucHV0SGFuZGxlciwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSW5wdXRGaWx0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSW5wdXRGaWx0ZXIuamF2YQppbmRleCAyZjU1Njc3Li44ZDRiMDhlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lucHV0RmlsdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JbnB1dEZpbHRlci5qYXZhCkBAIC04OCw3ICs4OCwxNCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChrZWVwID49IGVuZCAtIHN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGtlZXAgb3JpZ2luYWwKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJTZXF1ZW5jZShzdGFydCwgc3RhcnQgKyBrZWVwKTsKKyAgICAgICAgICAgICAgICBrZWVwICs9IHN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKHNvdXJjZS5jaGFyQXQoa2VlcCAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAtLWtlZXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZWVwID09IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJTZXF1ZW5jZShzdGFydCwga2VlcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzOGFjOWI3Li40ZTE5N2NkCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQpAQCAtNzQ5LDYgKzc0OSw5IEBACiAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKICAgICAgICAgICAgIG1heCsrOwogCisgICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKKyAgICAgICAgICAgIG1heCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGdldExpbmVFbmQobGluZSkpOworCiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCkBAIC04OTMsNyArODk2LDcgQEAKICAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKICAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07CisgICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBlbmQpOwogCiAgICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKIApAQCAtOTkzLDcgKzk5Niw3IEBACiAgICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCiAgICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZC0tOworICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZW5kKTsKIAogICAgICAgICBmbG9hdCBob3JpeiA9IGdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCk7CiAKQEAgLTE1NjQsNyArMTU2Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCB0YWJzKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKSByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiArIDIsIG51bGwpOwpAQCAtMTk1OCw0ICsxOTYyLDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmMDJhZDJhLi5kMGQyNDgyCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpAQCAtMzEzLDcgKzMxMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0dWFsTnVtID0gcGFpbnQuZ2V0VGV4dFdpZHRocyhzdWIsIGksIG5leHQsIHdpZHRocyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzdWIsIGksIG5leHQsIGFjdHVhbE51bSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMzIxLDkgKzMyMywxMSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgZm0pOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0dWFsTnVtID0gU3R5bGVkLmdldFRleHRXaWR0aHMocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZCwgaSwgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIGZtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgLSBpID4gYWN0dWFsTnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0VGV4dFdpZHRocyh3aWR0aHMsIHNwYW5uZWQsIGksIG5leHQsIGFjdHVhbE51bSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwogCkBAIC05NjYsNiArOTcwLDIyIEBACiAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0VGV4dFdpZHRocyhmbG9hdFtdIHdpZHRocywgQ2hhclNlcXVlbmNlIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyUG9zLCBpbnQgbmV4dFBvcywgaW50IGFjdHVhbE51bSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRzdEluZGV4ID0gbmV4dFBvcyAtIGN1clBvcyAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBzcmNJbmRleCA9IGFjdHVhbE51bSAtIDE7IHNyY0luZGV4ID49IDA7IHNyY0luZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB0ZXh0LmNoYXJBdChkc3RJbmRleCArIGN1clBvcyk7CisgICAgICAgICAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IDAuMGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IHdpZHRoc1tzcmNJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInRleHQiLCAiYWRqdXN0IHRleHQgd2lkdGhzIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgb3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3ZlLCBpbnQgYmVsb3csIGludCB0b3AsIGludCBib3R0b20sIGludCB2LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwYWNpbmdtdWx0LCBmbG9hdCBzcGFjaW5nYWRkLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1MTNiMmNkLi4xM2NjNDJjCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQpAQCAtMjAzLDkgKzIwMywxMCBAQAogCQkJfQogCQl9CiAJCisgICAgICAgIGludCByZXN1bHQ7CiAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7CisgICAgICAgICAgICByZXN1bHQgPSB3b3JrUGFpbnQuZ2V0VGV4dFdpZHRocyh0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IHdpZCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBmbWkpOwogCkBAIC0yMTQsOCArMjE1LDkgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmQgLSBzdGFydDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvZm9ybWF0L0RhdGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvRGF0ZVV0aWxzLmphdmEKaW5kZXggNGUyYzNjMy4uMzUzYjYyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvRGF0ZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvRGF0ZVV0aWxzLmphdmEKQEAgLTUwMiw3ICs1MDIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA8IFdFRUtfSU5fTUlMTElTICYmIG1pblJlc29sdXRpb24gPCBXRUVLX0lOX01JTExJUykgewotICAgICAgICAgICAgY291bnQgPSBkdXJhdGlvbiAvIERBWV9JTl9NSUxMSVM7CisgICAgICAgICAgICBjb3VudCA9IGdldE51bWJlck9mRGF5c1Bhc3NlZCh0aW1lLCBub3cpOwogICAgICAgICAgICAgaWYgKHBhc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoYWJicmV2UmVsYXRpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgcmVzSWQgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMuYWJicmV2X251bV9kYXlzX2FnbzsKQEAgLTUyNyw2ICs1MjcsMjQgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgcGFzc2VkIGJldHdlZW4gdHdvIGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGUxIGZpcnN0IGRhdGUKKyAgICAgKiBAcGFyYW0gZGF0ZTIgc2Vjb25kIGRhdGUKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBkYXlzIHBhc3NlZCBiZXR3ZWVuIHRvIGRhdGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBsb25nIGdldE51bWJlck9mRGF5c1Bhc3NlZChsb25nIGRhdGUxLCBsb25nIGRhdGUyKSB7CisgICAgICAgIGlmIChzVGhlblRpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc1RoZW5UaW1lID0gbmV3IFRpbWUoKTsKKyAgICAgICAgfQorICAgICAgICBzVGhlblRpbWUuc2V0KGRhdGUxKTsKKyAgICAgICAgaW50IGRheTEgPSBUaW1lLmdldEp1bGlhbkRheShkYXRlMSwgc1RoZW5UaW1lLmdtdG9mZik7CisgICAgICAgIHNUaGVuVGltZS5zZXQoZGF0ZTIpOworICAgICAgICBpbnQgZGF5MiA9IFRpbWUuZ2V0SnVsaWFuRGF5KGRhdGUyLCBzVGhlblRpbWUuZ210b2ZmKTsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKGRheTIgLSBkYXkxKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSBzdGFydFRpbWUgZm9ybWF0dGVkIGxpa2UKICAgICAgKiAiW3JlbGF0aXZlIHRpbWUvZGF0ZV0sIFt0aW1lXSIuCiAgICAgICogPHA+CkBAIC02MjQsMTQgKzY0MiwxOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0Rm9ybWF0U3RyaW5ncygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIGNmZyA9IHIuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKHNMYXN0Q29uZmlnID09IG51bGwgfHwgIXNMYXN0Q29uZmlnLmVxdWFscyhjZmcpKSB7Ci0gICAgICAgICAgICAgICAgc0xhc3RDb25maWcgPSBjZmc7Ci0gICAgICAgICAgICAgICAgc1N0YXR1c1RpbWVGb3JtYXQgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoamF2YS50ZXh0LkRhdGVGb3JtYXQuU0hPUlQpOwotICAgICAgICAgICAgICAgIHNFbGFwc2VkRm9ybWF0TU1TUyA9IHIuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MpOwotICAgICAgICAgICAgICAgIHNFbGFwc2VkRm9ybWF0SE1NU1MgPSByLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5lbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5pdEZvcm1hdFN0cmluZ3NMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEZvcm1hdFN0cmluZ3NMb2NrZWQoKSB7CisgICAgICAgIFJlc291cmNlcyByID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpOworICAgICAgICBDb25maWd1cmF0aW9uIGNmZyA9IHIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoc0xhc3RDb25maWcgPT0gbnVsbCB8fCAhc0xhc3RDb25maWcuZXF1YWxzKGNmZykpIHsKKyAgICAgICAgICAgIHNMYXN0Q29uZmlnID0gY2ZnOworICAgICAgICAgICAgc1N0YXR1c1RpbWVGb3JtYXQgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoamF2YS50ZXh0LkRhdGVGb3JtYXQuU0hPUlQpOworICAgICAgICAgICAgc0VsYXBzZWRGb3JtYXRNTVNTID0gci5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyk7CisgICAgICAgICAgICBzRWxhcHNlZEZvcm1hdEhNTVNTID0gci5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjQxLDggKzY2MywxMCBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyU2VxdWVuY2UgdGltZVN0cmluZyhsb25nIG1pbGxpcykgewotICAgICAgICBpbml0Rm9ybWF0U3RyaW5ncygpOwotICAgICAgICByZXR1cm4gc1N0YXR1c1RpbWVGb3JtYXQuZm9ybWF0KG1pbGxpcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGluaXRGb3JtYXRTdHJpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICByZXR1cm4gc1N0YXR1c1RpbWVGb3JtYXQuZm9ybWF0KG1pbGxpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1OTUsNDAgKzE2MTksNDUgQEAKICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXRSZWxhdGl2ZVRpbWVTcGFuU3RyaW5nKENvbnRleHQgYywgbG9uZyBtaWxsaXMsCiAgICAgICAgICAgICBib29sZWFuIHdpdGhQcmVwb3NpdGlvbikgewogCisgICAgICAgIFN0cmluZyByZXN1bHQ7CiAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIGxvbmcgc3BhbiA9IG5vdyAtIG1pbGxpczsKIAotICAgICAgICBpZiAoc05vd1RpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgc05vd1RpbWUgPSBuZXcgVGltZSgpOwotICAgICAgICAgICAgc1RoZW5UaW1lID0gbmV3IFRpbWUoKTsKLSAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKERhdGVVdGlscy5jbGFzcykgeworICAgICAgICAgICAgaWYgKHNOb3dUaW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzTm93VGltZSA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgc05vd1RpbWUuc2V0KG5vdyk7Ci0gICAgICAgIHNUaGVuVGltZS5zZXQobWlsbGlzKTsKKyAgICAgICAgICAgIGlmIChzVGhlblRpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNUaGVuVGltZSA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgaW50IHByZXBvc2l0aW9uSWQ7Ci0gICAgICAgIGlmIChzcGFuIDwgREFZX0lOX01JTExJUyAmJiBzTm93VGltZS53ZWVrRGF5ID09IHNUaGVuVGltZS53ZWVrRGF5KSB7Ci0gICAgICAgICAgICAvLyBTYW1lIGRheQotICAgICAgICAgICAgaW50IGZsYWdzID0gRk9STUFUX1NIT1dfVElNRTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdERhdGVSYW5nZShjLCBtaWxsaXMsIG1pbGxpcywgZmxhZ3MpOwotICAgICAgICAgICAgcHJlcG9zaXRpb25JZCA9IFIuc3RyaW5nLnByZXBvc2l0aW9uX2Zvcl90aW1lOwotICAgICAgICB9IGVsc2UgaWYgKHNOb3dUaW1lLnllYXIgIT0gc1RoZW5UaW1lLnllYXIpIHsKLSAgICAgICAgICAgIC8vIERpZmZlcmVudCB5ZWFycwotICAgICAgICAgICAgaW50IGZsYWdzID0gRk9STUFUX1NIT1dfREFURSB8IEZPUk1BVF9TSE9XX1lFQVIgfCBGT1JNQVRfTlVNRVJJQ19EQVRFOwotICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0RGF0ZVJhbmdlKGMsIG1pbGxpcywgbWlsbGlzLCBmbGFncyk7CisgICAgICAgICAgICBzTm93VGltZS5zZXQobm93KTsKKyAgICAgICAgICAgIHNUaGVuVGltZS5zZXQobWlsbGlzKTsKIAotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRhdGUgKGxpa2UgIjEwLzMxLzIwMDgiIHNvIHVzZSB0aGUgZGF0ZSBwcmVwb3NpdGlvbikKLSAgICAgICAgICAgIHByZXBvc2l0aW9uSWQgPSBSLnN0cmluZy5wcmVwb3NpdGlvbl9mb3JfZGF0ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQKLSAgICAgICAgICAgIGludCBmbGFncyA9IEZPUk1BVF9TSE9XX0RBVEUgfCBGT1JNQVRfQUJCUkVWX01PTlRIOwotICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0RGF0ZVJhbmdlKGMsIG1pbGxpcywgbWlsbGlzLCBmbGFncyk7Ci0gICAgICAgICAgICBwcmVwb3NpdGlvbklkID0gUi5zdHJpbmcucHJlcG9zaXRpb25fZm9yX2RhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdpdGhQcmVwb3NpdGlvbikgewotICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGMuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXMuZ2V0U3RyaW5nKHByZXBvc2l0aW9uSWQsIHJlc3VsdCk7CisgICAgICAgICAgICBpbnQgcHJlcG9zaXRpb25JZDsKKyAgICAgICAgICAgIGlmIChzcGFuIDwgREFZX0lOX01JTExJUyAmJiBzTm93VGltZS53ZWVrRGF5ID09IHNUaGVuVGltZS53ZWVrRGF5KSB7CisgICAgICAgICAgICAgICAgLy8gU2FtZSBkYXkKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBGT1JNQVRfU0hPV19USU1FOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdERhdGVSYW5nZShjLCBtaWxsaXMsIG1pbGxpcywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHByZXBvc2l0aW9uSWQgPSBSLnN0cmluZy5wcmVwb3NpdGlvbl9mb3JfdGltZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc05vd1RpbWUueWVhciAhPSBzVGhlblRpbWUueWVhcikgeworICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCB5ZWFycworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IEZPUk1BVF9TSE9XX0RBVEUgfCBGT1JNQVRfU0hPV19ZRUFSIHwgRk9STUFUX05VTUVSSUNfREFURTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXREYXRlUmFuZ2UoYywgbWlsbGlzLCBtaWxsaXMsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkYXRlIChsaWtlICIxMC8zMS8yMDA4IiBzbyB1c2UgdGhlIGRhdGUgcHJlcG9zaXRpb24pCisgICAgICAgICAgICAgICAgcHJlcG9zaXRpb25JZCA9IFIuc3RyaW5nLnByZXBvc2l0aW9uX2Zvcl9kYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEZWZhdWx0CisgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gRk9STUFUX1NIT1dfREFURSB8IEZPUk1BVF9BQkJSRVZfTU9OVEg7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0RGF0ZVJhbmdlKGMsIG1pbGxpcywgbWlsbGlzLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcHJlcG9zaXRpb25JZCA9IFIuc3RyaW5nLnByZXBvc2l0aW9uX2Zvcl9kYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpdGhQcmVwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBjLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlcy5nZXRTdHJpbmcocHJlcG9zaXRpb25JZCwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvZm9ybWF0L1RpbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvZm9ybWF0L1RpbWUuamF2YQppbmRleCA4ZWFlMTExLi5jMDVhOGZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9UaW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvVGltZS5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlfTV9EX1RfSF9NX1NfMDAwID0gIiVZLSVtLSVkVCVIOiVNOiVTLjAwMCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlfTV9EX1RfSF9NX1NfMDAwX1ogPSAiJVktJW0tJWRUJUg6JU06JVMuMDAwWiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlfTV9EID0gIiVZLSVtLSVkIjsKLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVaT05FX1VUQyA9ICJVVEMiOwogCiAgICAgLyoqCkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogICAgIHB1YmxpYyBUaW1lKCkgewogICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKS5nZXRJRCgpKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBIGNvcHkgY29uc3RydWN0b3IuICBDb25zdHJ1Y3QgYSBUaW1lIG9iamVjdCBieSBjb3B5aW5nIHRoZSBnaXZlbgogICAgICAqIFRpbWUgb2JqZWN0LiAgTm8gbm9ybWFsaXphdGlvbiBvY2N1cnMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gb3RoZXIKICAgICAgKi8KICAgICBwdWJsaWMgVGltZShUaW1lIG90aGVyKSB7CkBAIC0xODUsMTcgKzE4NSwxNyBAQAogICAgICAqIEVuc3VyZXMgdGhlIHZhbHVlcyBpbiBlYWNoIGZpZWxkIGFyZSBpbiByYW5nZS4gRm9yIGV4YW1wbGUgaWYgdGhlCiAgICAgICogY3VycmVudCB2YWx1ZSBvZiB0aGlzIGNhbGVuZGFyIGlzIE1hcmNoIDMyLCBub3JtYWxpemUoKSB3aWxsIGNvbnZlcnQgaXQKICAgICAgKiB0byBBcHJpbCAxLiBJdCBhbHNvIGZpbGxzIGluIHdlZWtEYXksIHllYXJEYXksIGlzRHN0IGFuZCBnbXRvZmYuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJZiAiaWdub3JlRHN0IiBpcyB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHNldHMgdGhlICJpc0RzdCIgZmllbGQgdG8gLTEKICAgICAgKiAodGhlICJ1bmtub3duIiB2YWx1ZSkgYmVmb3JlIG5vcm1hbGl6aW5nLiAgSXQgdGhlbiBjb21wdXRlcyB0aGUKICAgICAgKiBjb3JyZWN0IHZhbHVlIGZvciAiaXNEc3QiLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogU2VlIHtAbGluayAjdG9NaWxsaXMoYm9vbGVhbil9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gdG8KICAgICAgKiB1c2UgPHR0PnRydWU8L3R0PiBvciA8dHQ+ZmFsc2U8L3R0PiBmb3IgImlnbm9yZURzdCIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVVRDIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBVVEMgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgbG9uZyBub3JtYWxpemUoYm9vbGVhbiBpZ25vcmVEc3QpOwogCkBAIC0zNzksMTMgKzM3OSwxMyBAQAogICAgICAqIFBhcnNlcyBhIGRhdGUtdGltZSBzdHJpbmcgaW4gZWl0aGVyIHRoZSBSRkMgMjQ0NSBmb3JtYXQgb3IgYW4gYWJicmV2aWF0ZWQKICAgICAgKiBmb3JtYXQgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSAidGltZSIgZmllbGQuICBGb3IgZXhhbXBsZSwgYWxsIG9mIHRoZQogICAgICAqIGZvbGxvd2luZyBzdHJpbmdzIGFyZSB2YWxpZDoKLSAgICAgKiAKKyAgICAgKgogICAgICAqIDx1bD4KICAgICAgKiAgIDxsaT4iMjAwODEwMTNUMTYwMDAwWiI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4MTAxM1QxNjAwMDAiPC9saT4KICAgICAgKiAgIDxsaT4iMjAwODEwMTMiPC9saT4KICAgICAgKiA8L3VsPgotICAgICAqIAorICAgICAqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZSBpcyBpbiBVVEMgKGVuZHMgd2l0aCBaKS4gIElmIHRoZSBzdHJpbmcKICAgICAgKiBlbmRzIHdpdGggIloiIHRoZW4gdGhlIHRpbWV6b25lIGlzIHNldCB0byBVVEMuICBJZiB0aGUgZGF0ZS10aW1lIHN0cmluZwogICAgICAqIGluY2x1ZGVkIG9ubHkgYSBkYXRlIGFuZCBubyB0aW1lIGZpZWxkLCB0aGVuIHRoZSA8Y29kZT5hbGxEYXk8L2NvZGU+CkBAIC0zOTYsMTAgKzM5NiwxMCBAQAogICAgICAqIDxjb2RlPnllYXJEYXk8L2NvZGU+LCBhbmQgPGNvZGU+Z210b2ZmPC9jb2RlPiBhcmUgYWx3YXlzIHNldCB0byB6ZXJvLAogICAgICAqIGFuZCB0aGUgZmllbGQgPGNvZGU+aXNEc3Q8L2NvZGU+IGlzIHNldCB0byAtMSAodW5rbm93bikuICBUbyBzZXQgdGhvc2UKICAgICAgKiBmaWVsZHMsIGNhbGwge0BsaW5rICNub3JtYWxpemUoYm9vbGVhbil9IGFmdGVyIHBhcnNpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBUbyBwYXJzZSBhIGRhdGUtdGltZSBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gVVRDIG1pbGxpc2Vjb25kcywgZG8KICAgICAgKiBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgICAqIAorICAgICAqCiAgICAgICogPHByZT4KICAgICAgKiAgIFRpbWUgdGltZSA9IG5ldyBUaW1lKCk7CiAgICAgICogICBTdHJpbmcgZGF0ZSA9ICIyMDA4MTAxM1QxNjAwMDBaIjsKQEAgLTQyOCwyNSArNDI4LDI1IEBACiAgICAgICogUGFyc2UgYSB0aW1lIGluIFJGQyAzMzM5IGZvcm1hdC4gIFRoaXMgbWV0aG9kIGFsc28gcGFyc2VzIHNpbXBsZSBkYXRlcwogICAgICAqICh0aGF0IGlzLCBzdHJpbmdzIHRoYXQgY29udGFpbiBubyB0aW1lIG9yIHRpbWUgb2Zmc2V0KS4gIEZvciBleGFtcGxlLAogICAgICAqIGFsbCBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIHZhbGlkOgotICAgICAqIAorICAgICAqCiAgICAgICogPHVsPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzVDE2OjAwOjAwLjAwMFoiPC9saT4KICAgICAgKiAgIDxsaT4iMjAwOC0xMC0xM1QxNjowMDowMC4wMDArMDc6MDAiPC9saT4KICAgICAgKiAgIDxsaT4iMjAwOC0xMC0xM1QxNjowMDowMC4wMDAtMDc6MDAiPC9saT4KICAgICAgKiAgIDxsaT4iMjAwOC0xMC0xMyI8L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgdGltZSBhbmQgdGltZSBvZmZzZXQsIHRoZW4gdGhlIHRpbWUgb2Zmc2V0IHdpbGwKICAgICAgKiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIHRpbWUgdmFsdWUgdG8gVVRDLgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSBnaXZlbiBzdHJpbmcgY29udGFpbnMganVzdCBhIGRhdGUgKHdpdGggbm8gdGltZSBmaWVsZCksIHRoZW4KICAgICAgKiB0aGUge0BsaW5rICNhbGxEYXl9IGZpZWxkIGlzIHNldCB0byB0cnVlIGFuZCB0aGUge0BsaW5rICNob3VyfSwKICAgICAgKiB7QGxpbmsgI21pbnV0ZX0sIGFuZCAge0BsaW5rICNzZWNvbmR9IGZpZWxkcyBhcmUgc2V0IHRvIHplcm8uCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHRpbmcgdGltZSB2YWx1ZSBpcyBpbiBVVEMgdGltZS4KICAgICAgKiA8L3A+CkBAIC00NjIsNyArNDYyLDcgQEAKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQotICAgICAKKwogICAgICBuYXRpdmUgcHJpdmF0ZSBib29sZWFuIG5hdGl2ZVBhcnNlMzMzOShTdHJpbmcgcyk7CiAKICAgICAvKioKQEAgLTQ4NCwxMyArNDg0LDEzIEBACiAgICAgICogPGVtPm5vdDwvZW0+IGNoYW5nZSBhbnkgb2YgdGhlIGZpZWxkcyBpbiB0aGlzIFRpbWUgb2JqZWN0LiAgSWYgeW91IHdhbnQKICAgICAgKiB0byBub3JtYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIFRpbWUgb2JqZWN0IGFuZCBhbHNvIGdldCB0aGUgbWlsbGlzZWNvbmRzCiAgICAgICogdGhlbiB1c2Uge0BsaW5rICNub3JtYWxpemUoYm9vbGVhbil9LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSWYgImlnbm9yZURzdCIgaXMgZmFsc2UsIHRoZW4gdGhpcyBtZXRob2QgdXNlcyB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZQogICAgICAqICJpc0RzdCIgZmllbGQgYW5kIHdpbGwgYWRqdXN0IHRoZSByZXR1cm5lZCB0aW1lIGlmIHRoZSAiaXNEc3QiIGZpZWxkIGlzCiAgICAgICogd3JvbmcgZm9yIHRoZSBnaXZlbiB0aW1lLiAgU2VlIHRoZSBzYW1wbGUgY29kZSBiZWxvdyBmb3IgYW4gZXhhbXBsZSBvZgogICAgICAqIHRoaXMuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJZiAiaWdub3JlRHN0IiBpcyB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIGlnbm9yZXMgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgogICAgICAqIHRoZSAiaXNEc3QiIGZpZWxkIGluIHRoaXMgVGltZSBvYmplY3QgYW5kIHdpbGwgaW5zdGVhZCBmaWd1cmUgb3V0IHRoZQpAQCAtNDk5LDI3ICs0OTksMjcgQEAKICAgICAgKiBjb3JyZWN0IHZhbHVlIG9mIHRoZSAiaXNEc3QiIGZpZWxkIGlzIHdoZW4gdGhlIHRpbWUgaXMgaW5oZXJlbnRseQogICAgICAqIGFtYmlndW91cyBiZWNhdXNlIGl0IGZhbGxzIGluIHRoZSBob3VyIHRoYXQgaXMgcmVwZWF0ZWQgd2hlbiBzd2l0Y2hpbmcKICAgICAgKiBmcm9tIERheWxpZ2h0LVNhdmluZyBUaW1lIHRvIFN0YW5kYXJkIFRpbWUuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgd2hlcmUgPHR0PnRvTWlsbGlzKHRydWUpPC90dD4gYWRqdXN0cyB0aGUgdGltZSwKICAgICAgKiBhc3N1bWluZyB0aGF0IERTVCBjaGFuZ2VzIGF0IDJhbSBvbiBTdW5kYXksIE5vdiA0LCAyMDA3LgotICAgICAqIAorICAgICAqCiAgICAgICogPHByZT4KICAgICAgKiBUaW1lIHRpbWUgPSBuZXcgVGltZSgpOwotICAgICAqIHRpbWUuc2V0KDIwMDcsIDEwLCA0KTsgIC8vIHNldCB0aGUgZGF0ZSB0byBOb3YgNCwgMjAwNywgMTJhbQorICAgICAqIHRpbWUuc2V0KDQsIDEwLCAyMDA3KTsgIC8vIHNldCB0aGUgZGF0ZSB0byBOb3YgNCwgMjAwNywgMTJhbQogICAgICAqIHRpbWUubm9ybWFsaXplKCk7ICAgICAgIC8vIHRoaXMgc2V0cyBpc0RzdCA9IDEKICAgICAgKiB0aW1lLm1vbnRoRGF5ICs9IDE7ICAgICAvLyBjaGFuZ2VzIHRoZSBkYXRlIHRvIE5vdiA1LCAyMDA3LCAxMmFtCiAgICAgICogbWlsbGlzID0gdGltZS50b01pbGxpcyhmYWxzZSk7ICAgLy8gbWlsbGlzIGlzIE5vdiA0LCAyMDA3LCAxMXBtCiAgICAgICogbWlsbGlzID0gdGltZS50b01pbGxpcyh0cnVlKTsgICAgLy8gbWlsbGlzIGlzIE5vdiA1LCAyMDA3LCAxMmFtCiAgICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHVzZSA8dHQ+dG9NaWxsaXModHJ1ZSk8L3R0PgogICAgICAqIGFmdGVyIGFkZGluZyBvciBzdWJ0cmFjdGluZyBkYXlzIG9yIGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgIm1vbnRoRGF5IgogICAgICAqIGZpZWxkLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBhcmUgYWRkaW5nCiAgICAgICogb3Igc3VidHJhY3RpbmcgaG91cnMgb3IgbWludXRlcywgdGhlbiB5b3Ugc2hvdWxkIHVzZQogICAgICAqIDx0dD50b01pbGxpcyhmYWxzZSk8L3R0Pi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFlvdSBzaG91bGQgYWxzbyB1c2UgPHR0PnRvTWlsbGlzKGZhbHNlKTwvdHQ+IGlmIHlvdSB3YW50CiAgICAgICogdG8gcmVhZCBiYWNrIHRoZSBzYW1lIG1pbGxpc2Vjb25kcyB0aGF0IHlvdSBzZXQgd2l0aCB7QGxpbmsgI3NldChsb25nKX0KQEAgLTUzMSwxNCArNTMxLDE0IEBACiAgICAgICogU2V0cyB0aGUgZmllbGRzIGluIHRoaXMgVGltZSBvYmplY3QgZ2l2ZW4gdGhlIFVUQyBtaWxsaXNlY29uZHMuICBBZnRlcgogICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMsIGFsbCB0aGUgZmllbGRzIGFyZSBub3JtYWxpemVkLgogICAgICAqIFRoaXMgYWxzbyBzZXRzIHRoZSAiaXNEc3QiIGZpZWxkIHRvIHRoZSBjb3JyZWN0IHZhbHVlLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KICAgICAgKi8KICAgICBuYXRpdmUgcHVibGljIHZvaWQgc2V0KGxvbmcgbWlsbGlzKTsKIAogICAgIC8qKgogICAgICAqIEZvcm1hdCBhY2NvcmRpbmcgdG8gUkZDIDI0NDUgREFURVRJTUUgdHlwZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRoZSBzYW1lIGFzIGZvcm1hdCgiJVklbSVkVCVIJU0lUyIpLgogICAgICAqLwpAQCAtNTg0LDcgKzU4NCw3IEBACiAgICAgICogU2V0cyB0aGUgZGF0ZSBmcm9tIHRoZSBnaXZlbiBmaWVsZHMuICBBbHNvIHNldHMgYWxsRGF5IHRvIHRydWUuCiAgICAgICogU2V0cyB3ZWVrRGF5LCB5ZWFyRGF5IGFuZCBnbXRvZmYgdG8gMCwgYW5kIGlzRHN0IHRvIC0xLgogICAgICAqIENhbGwge0BsaW5rICNub3JtYWxpemUoYm9vbGVhbil9IGlmIHlvdSBuZWVkIHRob3NlLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIG1vbnRoRGF5IHRoZSBkYXkgb2YgdGhlIG1vbnRoIChpbiB0aGUgcmFuZ2UgWzEsMzFdKQogICAgICAqIEBwYXJhbSBtb250aCB0aGUgemVyby1iYXNlZCBtb250aCBudW1iZXIgKGluIHRoZSByYW5nZSBbMCwxMV0pCiAgICAgICogQHBhcmFtIHllYXIgdGhlIHllYXIKQEAgLTYwNiw3ICs2MDYsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGltZSByZXByZXNlbnRlZCBieSB0aGlzIFRpbWUgb2JqZWN0IG9jY3VycyBiZWZvcmUKICAgICAgKiB0aGUgZ2l2ZW4gdGltZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB0aGF0IGEgZ2l2ZW4gVGltZSBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0CiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGltZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIHRpbWUKICAgICAgKi8KQEAgLTYxOCw3ICs2MTgsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGltZSByZXByZXNlbnRlZCBieSB0aGlzIFRpbWUgb2JqZWN0IG9jY3VycyBhZnRlcgogICAgICAqIHRoZSBnaXZlbiB0aW1lLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRoYXQgYSBnaXZlbiBUaW1lIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZQogICAgICAqLwpAQCAtNjMyLDEyICs2MzIsMTIgQEAKICAgICAgKiBjbG9zZXN0IFRodXJzZGF5IHllYXJEYXkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc1RodXJzZGF5T2Zmc2V0ID0geyAtMywgMywgMiwgMSwgMCwgLTEsIC0yIH07Ci0gICAgICAgIAorCiAgICAgLyoqCiAgICAgICogQ29tcHV0ZXMgdGhlIHdlZWsgbnVtYmVyIGFjY29yZGluZyB0byBJU08gODYwMS4gIFRoZSBjdXJyZW50IFRpbWUKICAgICAgKiBvYmplY3QgbXVzdCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQgYmVjYXVzZSB0aGlzIG1ldGhvZCB1c2VzIHRoZQogICAgICAqIHllYXJEYXkgYW5kIHdlZWtEYXkgZmllbGRzLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSW4gSVMwIDg2MDEsIHdlZWtzIHN0YXJ0IG9uIE1vbmRheS4KICAgICAgKiBUaGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciAod2VlayAxKSBpcyBkZWZpbmVkIGJ5IElTTyA4NjAxIGFzIHRoZQpAQCAtNjQ1LDEyICs2NDUsMTIgQEAKICAgICAgKiBPciBlcXVpdmFsZW50bHksIHRoZSB3ZWVrIGNvbnRhaW5pbmcgSmFudWFyeSA0LiAgT3IgZXF1aXZhbGVudGx5LAogICAgICAqIHRoZSB3ZWVrIHdpdGggdGhlIHllYXIncyBmaXJzdCBUaHVyc2RheSBpbiBpdC4KICAgICAgKiA8L3A+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBUaGUgd2VlayBudW1iZXIgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgY291bnRpbmcgVGh1cnNkYXlzLiAgV2VlayBOCiAgICAgICogY29udGFpbnMgdGhlIE50aCBUaHVyc2RheSBvZiB0aGUgeWVhci4KICAgICAgKiA8L3A+Ci0gICAgICogICAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIElTTyB3ZWVrIG51bWJlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdlZWtOdW1iZXIoKSB7CkBAIC02NjEsNyArNjYxLDcgQEAKICAgICAgICAgaWYgKGNsb3Nlc3RUaHVyc2RheSA+PSAwICYmIGNsb3Nlc3RUaHVyc2RheSA8PSAzNjQpIHsKICAgICAgICAgICAgIHJldHVybiBjbG9zZXN0VGh1cnNkYXkgLyA3ICsgMTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBUaGUgd2VlayBjcm9zc2VzIGEgeWVhciBib3VuZGFyeS4KICAgICAgICAgVGltZSB0ZW1wID0gbmV3IFRpbWUodGhpcyk7CiAgICAgICAgIHRlbXAubW9udGhEYXkgKz0gc1RodXJzZGF5T2Zmc2V0W3dlZWtEYXldOwpAQCAtNjcwLDcgKzY3MCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIGluIHRoZSBSRkMgMzMzOSBmb3JtYXQuIAorICAgICAqIFJldHVybiBhIHN0cmluZyBpbiB0aGUgUkZDIDMzMzkgZm9ybWF0LgogICAgICAqIDxwPgogICAgICAqIElmIGFsbERheSBpcyB0cnVlLCBleHByZXNzZXMgdGhlIHRpbWUgYXMgWS1NLUQ8L3A+CiAgICAgICogPHA+CkBAIC02OTEsMTMgKzY5MSwxMyBAQAogICAgICAgICAgICAgaW50IG9mZnNldCA9IChpbnQpTWF0aC5hYnMoZ210b2ZmKTsKICAgICAgICAgICAgIGludCBtaW51dGVzID0gKG9mZnNldCAlIDM2MDApIC8gNjA7CiAgICAgICAgICAgICBpbnQgaG91cnMgPSBvZmZzZXQgLyAzNjAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyVzJTAyZDolMDJkIiwgYmFzZSwgc2lnbiwgaG91cnMsIG1pbnV0ZXMpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkYXkgb2YgdGhlIGdpdmVuIHRpbWUgaXMgdGhlIGVwb2NoIG9uIHRoZSBKdWxpYW4gQ2FsZW5kYXIgCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkYXkgb2YgdGhlIGdpdmVuIHRpbWUgaXMgdGhlIGVwb2NoIG9uIHRoZSBKdWxpYW4gQ2FsZW5kYXIKICAgICAgKiAoSmFudWFyeSAxLCAxOTcwIG9uIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIpLgogICAgICAqCiAgICAgICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgdG8gdGVzdApAQCAtNzA3LDcgKzcwNyw3IEBACiAgICAgICAgIGxvbmcgbWlsbGlzID0gdGltZS50b01pbGxpcyh0cnVlKTsKICAgICAgICAgcmV0dXJuIGdldEp1bGlhbkRheShtaWxsaXMsIDApID09IEVQT0NIX0pVTElBTl9EQVk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29tcHV0ZXMgdGhlIEp1bGlhbiBkYXkgbnVtYmVyLCBnaXZlbiB0aGUgVVRDIG1pbGxpc2Vjb25kcwogICAgICAqIGFuZCB0aGUgb2Zmc2V0IChpbiBzZWNvbmRzKSBmcm9tIFVUQy4gIFRoZSBKdWxpYW4gZGF5IGZvciBhIGdpdmVuCkBAIC03MTYsMTAgKzcxNiwxMCBAQAogICAgICAqIHdoYXQgdGltZXpvbmUgaXMgYmVpbmcgdXNlZC4gIFRoZSBKdWxpYW4gZGF5IGlzIHVzZWZ1bCBmb3IgdGVzdGluZwogICAgICAqIGlmIHR3byBldmVudHMgb2NjdXIgb24gdGhlIHNhbWUgZGF5IGFuZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHJlbGF0aXZlCiAgICAgICogdGltZSBvZiBhbiBldmVudCBmcm9tIHRoZSBwcmVzZW50ICgieWVzdGVyZGF5IiwgIjMgZGF5cyBhZ28iLCBldGMuKS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFVzZSB7QGxpbmsgI3RvTWlsbGlzKGJvb2xlYW4pfSB0byBnZXQgdGhlIG1pbGxpc2Vjb25kcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBtaWxsaXMgdGhlIHRpbWUgaW4gVVRDIG1pbGxpc2Vjb25kcwogICAgICAqIEBwYXJhbSBnbXRvZmYgdGhlIG9mZnNldCBmcm9tIFVUQyBpbiBzZWNvbmRzCiAgICAgICogQHJldHVybiB0aGUgSnVsaWFuIGRheQpAQCAtNzI5LDcgKzcyOSw3IEBACiAgICAgICAgIGxvbmcganVsaWFuRGF5ID0gKG1pbGxpcyArIG9mZnNldE1pbGxpcykgLyBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKICAgICAgICAgcmV0dXJuIChpbnQpIGp1bGlhbkRheSArIEVQT0NIX0pVTElBTl9EQVk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogPHA+U2V0cyB0aGUgdGltZSBmcm9tIHRoZSBnaXZlbiBKdWxpYW4gZGF5IG51bWJlciwgd2hpY2ggbXVzdCBiZSBiYXNlZCBvbgogICAgICAqIHRoZSBzYW1lIHRpbWV6b25lIHRoYXQgaXMgc2V0IGluIHRoaXMgVGltZSBvYmplY3QuICBUaGUgImdtdG9mZiIgZmllbGQKQEAgLTczOCw3ICs3MzgsNyBAQAogICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHRoZSBmaWVsZHMgd2lsbCBiZSBub3JtYWxpemVkIGFuZCB0aGUgdGltZQogICAgICAqIHdpbGwgYmUgc2V0IHRvIDEyYW0gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4gSnVsaWFuIGRheS4KICAgICAgKiA8L3A+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBpZiAxMmFtIGRvZXMgbm90IGV4aXN0IGZvciB0aGF0IGRheSBiZWNhdXNlCiAgICAgICogb2YgZGF5bGlnaHQgc2F2aW5nIHRpbWUuICBGb3IgZXhhbXBsZSwgQ2Fpcm8sIEVxeXB0IG1vdmVzIHRpbWUgYWhlYWQgb25lCkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICAgKiBhbHNvIGNoYW5nZSBkYXlsaWdodCBzYXZpbmcgdGltZSBhdCAxMmFtLiAgSW4gdGhvc2UgY2FzZXMsIHRoZSB0aW1lCiAgICAgICogd2lsbCBiZSBzZXQgdG8gMWFtLgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBqdWxpYW5EYXkgdGhlIEp1bGlhbiBkYXkgaW4gdGhlIHRpbWV6b25lIGZvciB0aGlzIFRpbWUgb2JqZWN0CiAgICAgICogQHJldHVybiB0aGUgVVRDIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgSnVsaWFuIGRheQogICAgICAqLwpAQCAtNzU2LDEzICs3NTYsMTMgQEAKICAgICAgICAgLy8gdGhlIGRheS4KICAgICAgICAgbG9uZyBtaWxsaXMgPSAoanVsaWFuRGF5IC0gRVBPQ0hfSlVMSUFOX0RBWSkgKiBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKICAgICAgICAgc2V0KG1pbGxpcyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgcmVxdWVzdGVkIEp1bGlhbiBkYXkuCiAgICAgICAgIC8vIFdlIGNhbid0IGJlIG9mZiBieSBtb3JlIHRoYW4gYSBkYXkuCiAgICAgICAgIGludCBhcHByb3hpbWF0ZURheSA9IGdldEp1bGlhbkRheShtaWxsaXMsIGdtdG9mZik7CiAgICAgICAgIGludCBkaWZmID0ganVsaWFuRGF5IC0gYXBwcm94aW1hdGVEYXk7CiAgICAgICAgIG1vbnRoRGF5ICs9IGRpZmY7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFNldCB0aGUgdGltZSB0byAxMmFtIGFuZCByZS1ub3JtYWxpemUuCiAgICAgICAgIGhvdXIgPSAwOwogICAgICAgICBtaW51dGUgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5LmphdmEKaW5kZXggOTg2MDU4ODhjLi5lMjI5M2U0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L3V0aWwvTGlua2lmeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5LmphdmEKQEAgLTQ5OCwxMCArNDk4LDYgQEAKIAogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH07CiAKICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaW5rcywgYyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1lVXRpbHMuamF2YQppbmRleCA4NWNlNWUxLi41YzI4MWNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWVVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltZVV0aWxzLmphdmEKQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgICAgICAgICAgaW50IHBvcyA9IDA7CiAgICAgICAgICAgICBmaWVsZExlbiAtPSAxOwogICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGZpZWxkTGVuKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0U3RyW3Bvc10gPSAnICc7CisgICAgICAgICAgICAgICAgZm9ybWF0U3RyW3BvcysrXSA9ICcgJzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvcm1hdFN0cltwb3NdID0gJzAnOwogICAgICAgICAgICAgcmV0dXJuIHBvcysxOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Gb2N1c0ZpbmRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Gb2N1c0ZpbmRlci5qYXZhCmluZGV4IDE1ZmI4MzkuLjhhZDlhNjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRm9jdXNGaW5kZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyLmphdmEKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiAKICAgICAvKioKLSAgICAgKiBEbyB0aGUgImJlYW1zIiB3LnIudCB0aGUgZ2l2ZW4gZGlyZWNpdGlvbidzIGF4b3Mgb2YgcmVjdDEgYW5kIHJlY3QyIG92ZXJsYXA/CisgICAgICogRG8gdGhlICJiZWFtcyIgdy5yLnQgdGhlIGdpdmVuIGRpcmVjaXRpb24ncyBheGlzIG9mIHJlY3QxIGFuZCByZWN0MiBvdmVybGFwPwogICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gdGhlIGRpcmVjdGlvbiAodXAsIGRvd24sIGxlZnQsIHJpZ2h0KQogICAgICAqIEBwYXJhbSByZWN0MSBUaGUgZmlyc3QgcmVjdGFuZ2xlCiAgICAgICogQHBhcmFtIHJlY3QyIFRoZSBzZWNvbmQgcmVjdGFuZ2xlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggMTk0YzAxMy4uZDVlNDExYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICogZm9yIHRoZSBkZXZpY2UgeW91IGFyZSBydW5uaW5nIG9uLiAgRm9yIGV4YW1wbGU6CiAgKgogICogPHByZT5MYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UKLSAqICAgICAgQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7PC9wcmU+CisgKiAgICAgIChDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTs8L3ByZT4KICAqIAogICogPHA+CiAgKiBUbyBjcmVhdGUgYSBuZXcgTGF5b3V0SW5mbGF0ZXIgd2l0aCBhbiBhZGRpdGlvbmFsIHtAbGluayBGYWN0b3J5fSBmb3IgeW91cgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCmluZGV4IGMyZmVjOTYuLjk1MmZhY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKQEAgLTYyMCw3ICs2MjAsNyBAQAogICAgICAgICBldi5tRWRnZUZsYWdzID0gby5tRWRnZUZsYWdzOwogICAgICAgICBldi5tRG93blRpbWVOYW5vID0gby5tRG93blRpbWVOYW5vOwogICAgICAgICBldi5tQWN0aW9uID0gby5tQWN0aW9uOwotICAgICAgICBvLm1GbGFncyA9IG8ubUZsYWdzOworICAgICAgICBldi5tRmxhZ3MgPSBvLm1GbGFnczsKICAgICAgICAgZXYubU1ldGFTdGF0ZSA9IG8ubU1ldGFTdGF0ZTsKICAgICAgICAgZXYubVhPZmZzZXQgPSBvLm1YT2Zmc2V0OwogICAgICAgICBldi5tWU9mZnNldCA9IG8ubVlPZmZzZXQ7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDE3NjYzNDUuLjIzMmRkNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0zOTQ0LDYgKzM5NDQsNyBAQAogICAgICAgICAgICAgICAgIGltbS5mb2N1c091dCh0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlbW92ZUxvbmdQcmVzc0NhbGxiYWNrKCk7CisgICAgICAgICAgICByZW1vdmVUYXBDYWxsYmFjaygpOwogICAgICAgICAgICAgb25Gb2N1c0xvc3QoKTsKICAgICAgICAgfSBlbHNlIGlmIChpbW0gIT0gbnVsbCAmJiAobVByaXZhdGVGbGFncyAmIEZPQ1VTRUQpICE9IDApIHsKICAgICAgICAgICAgIGltbS5mb2N1c0luKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCmluZGV4IGM1ODIwN2UuLmNjYWVmNDAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKQEAgLTEwNjUsMTAgKzEwNjUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlci5tU3VyZmFjZUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmZhY2UgaW52YWxpZC4KLSAgICAgICAgICAgICAgICAgICAgLy9tU3VyZmFjZUhvbGRlci5tU3VyZmFjZS5jb3B5RnJvbShtU3VyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlID0gbmV3IFN1cmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2UgPSBuZXcgU3VyZmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCmluZGV4IDA5MTg0NGUuLmQ2ZGNkNGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCkBAIC0xMDUwLDE0ICsxMDUwLDYgQEAKICAgICAgICAgICAgICAgICBncmF2aXR5ID0gby5ncmF2aXR5OwogICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gTEFZT1VUX0NIQU5HRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaG9yaXpvbnRhbE1hcmdpbiAhPSBvLmhvcml6b250YWxNYXJnaW4pIHsKLSAgICAgICAgICAgICAgICBob3Jpem9udGFsTWFyZ2luID0gby5ob3Jpem9udGFsTWFyZ2luOwotICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gTEFZT1VUX0NIQU5HRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmVydGljYWxNYXJnaW4gIT0gby52ZXJ0aWNhbE1hcmdpbikgewotICAgICAgICAgICAgICAgIHZlcnRpY2FsTWFyZ2luID0gby52ZXJ0aWNhbE1hcmdpbjsKLSAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IExBWU9VVF9DSEFOR0VEOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBvLmZvcm1hdCkgewogICAgICAgICAgICAgICAgIGZvcm1hdCA9IG8uZm9ybWF0OwogICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gRk9STUFUX0NIQU5HRUQ7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRnJhbWVMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCmluZGV4IDdmZDk5M2EuLjAyMWI1M2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkV2ZW50SGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RIYW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlci5DYWNoZVJlc3VsdDsKIApAQCAtMzUsNiArMzYsNyBAQAogICAgIHByaXZhdGUgaW50IG1DYWNoZU1vZGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyOwogICAgIHByaXZhdGUgU3RyaW5nIG1Db250ZW50VHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVWFwcm9mSGVhZGVyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVSSV9QUk9UT0NPTCA9IDB4MTAwOwogCkBAIC01Nyw2ICs1OSw4IEBACiAgICAgICAgIG1NZXRob2QgPSBtZXRob2Q7CiAgICAgICAgIG1DYWNoZU1vZGUgPSBXZWJTZXR0aW5ncy5MT0FEX05PUk1BTDsKICAgICAgICAgbVNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgICAgIG1VYXByb2ZIZWFkZXIgPSBtTGlzdGVuZXIuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfdXNlcmFnZW50cHJvZmlsZV91cmwsIEJ1aWxkLk1PREVMKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcnJlcihTdHJpbmcgcmVmKSB7CkBAIC0zNTYsNiArMzYwLDExIEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1IZWFkZXJzLnB1dCgiVXNlci1BZ2VudCIsIG1TZXR0aW5ncy5nZXRVc2VyQWdlbnRTdHJpbmcoKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSB4LXdhcC1wcm9maWxlIGhlYWRlcgorICAgICAgICBpZiAobVVhcHJvZkhlYWRlciAhPSBudWxsICYmIG1VYXByb2ZIZWFkZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtSGVhZGVycy5wdXQoIngtd2FwLXByb2ZpbGUiLCBtVWFwcm9mSGVhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjYTlhZDUzLi5jMWFjMTgwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMzY5LDEwICszNjksMTMgQEAKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGZpZyIsICJmaWciKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJ4aHRtbCIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vM2dwcCIsICIzZ3BwIik7CisgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9hbXIiLCAiYW1yIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgIm1pZGkiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAia2FyIik7CisgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgInhtZiIpOworICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbW9iaWxlLXhtZiIsICJteG1mIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wZ2EiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBlZ2EiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAyIik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCAxOTE1NDI1Li43ZjdhMjVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTMxMyw2ICszMTMsMTAgQEAKICAgICAvLyB0cnVlIG1lYW5zIHJlZHJhdyB0aGUgc2NyZWVuIGFsbC10aGUtdGltZS4gT25seSB3aXRoIEFVVE9fUkVEUkFXX0hBQ0sKICAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9SZWRyYXc7CiAKKyAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIEFsZXJ0RGlhbG9nIGRpc3BsYXllZCBieSBJbnZva2VMaXN0Qm94LgorICAgIC8vIEl0J3MgdXNlZCB0byBkaXNtaXNzIHRoZSBkaWFsb2cgaW4gZGVzdHJveSBpZiBub3QgZG9uZSBiZWZvcmUuCisgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtTGlzdEJveERpYWxvZyA9IG51bGw7CisKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewpAQCAtMTMwMSw2ICsxMzA1LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgY2xlYXJIZWxwZXJzKCk7CisgICAgICAgIGlmIChtTGlzdEJveERpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdEJveERpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICBtTGlzdEJveERpYWxvZyA9IG51bGw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBTZXQgdGhlIGhhbmRsZXJzIHRvIG51bGwgYmVmb3JlIGRlc3Ryb3lpbmcgV2ViVmlld0NvcmUgc28gbm8KICAgICAgICAgICAgIC8vIG1vcmUgbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQuCkBAIC00MTczLDYgKzQxODEsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfUEFHRV9VUCkgeworICAgICAgICAgICAgcGFnZVVwKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QQUdFX0RPV04pIHsKKyAgICAgICAgICAgIHBhZ2VEb3duKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7CkBAIC03NTQwLDcgKzc1NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIC0yLCAwKTsKICAgICAgICAgICAgICAgICB9fSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBiLmNyZWF0ZSgpOworICAgICAgICAgICAgbUxpc3RCb3hEaWFsb2cgPSBiLmNyZWF0ZSgpOwogICAgICAgICAgICAgbGlzdFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKICAgICAgICAgICAgIGxpc3RWaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwogICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBidWcgKDEyNTAxMDMpIHdoZXJlIHRoZSBjaGVja3MgaW4gYSBMaXN0VmlldyB3aXRoCkBAIC03NTYyLDcgKzc1ODAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIChpbnQpaWQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uICE9IC0xKSB7CkBAIC03NTc0LDEzICs3NTkzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLnNldE9uQ2FuY2VsTGlzdGVuZXIobmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIC0yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RCb3hEaWFsb2cgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLnNob3coKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQppbmRleCBmNTRiMjA3Li5lMzY2MDJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtNTgsNyArNTgsMTEgQEAKICAgICAgICAgLy8gTG9hZCBsaWJ3ZWJjb3JlIGR1cmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24uIFRoaXMgaGFwcGVucyBpbiB0aGUKICAgICAgICAgLy8genlnb3RlIHByb2Nlc3Mgc28gaXQgd2lsbCBiZSBzaGFyZWQgcmVhZC1vbmx5IGFjcm9zcyBhbGwgYXBwCiAgICAgICAgIC8vIHByb2Nlc3Nlcy4KLSAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ3ZWJjb3JlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIndlYmNvcmUiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiVW5hYmxlIHRvIGxvYWQgd2ViY29yZSBsaWJyYXJ5Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic29sdXRlTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQuamF2YQppbmRleCBiODI5NjU1Li45NzBjYmUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQuamF2YQpAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjIHRoZSBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudAotICAgICAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGZvbSB3aGljaCB0byBleHRyYWN0IHRoZSBsYXlvdXQKKyAgICAgICAgICogQHBhcmFtIGF0dHJzIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIGxheW91dAogICAgICAgICAgKiAgICAgICAgICAgICAgcGFyYW1ldGVycyB2YWx1ZXMKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMoQ29udGV4dCBjLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQppbmRleCAzMmU1NTA0Li4wM2FkYTk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtODMsNyArODQsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZ5T25DaGFuZ2UgPSB0cnVlOwogCi0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIEFycmF5TGlzdDxUPiBtT3JpZ2luYWxWYWx1ZXM7CiAgICAgcHJpdmF0ZSBBcnJheUZpbHRlciBtRmlsdGVyOwpAQCAtMTgxLDYgKzE4Miw0NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIENvbGxlY3Rpb24gdG8gYWRkIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIGlmIChtT3JpZ2luYWxWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIG1PcmlnaW5hbFZhbHVlcy5hZGRBbGwoY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlPbkNoYW5nZSkgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PYmplY3RzLmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChtTm90aWZ5T25DaGFuZ2UpIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgaXRlbXMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGFkZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoVCAuLi4gaXRlbXMpIHsKKyAgICAgICAgaWYgKG1PcmlnaW5hbFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgZm9yIChUIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxWYWx1ZXMuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobU5vdGlmeU9uQ2hhbmdlKSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChUIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgICAgIG1PYmplY3RzLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTm90aWZ5T25DaGFuZ2UpIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGFycmF5LgogICAgICAqCiAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc2VydCBpbnRvIHRoZSBhcnJheS4KQEAgLTIzNiw3ICsyNzUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNvcnQoQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtT2JqZWN0cywgY29tcGFyYXRvcik7Ci0gICAgICAgIGlmIChtTm90aWZ5T25DaGFuZ2UpIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7ICAgICAgICAKKyAgICAgICAgaWYgKG1Ob3RpZnlPbkNoYW5nZSkgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEKaW5kZXggNDE2YmU4Ni4uYTExZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEKQEAgLTMxNyw2ICszMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWSA9IG1FZGdlU2NhbGVZU3RhcnQgKwogICAgICAgICAgICAgICAgICAgICAgICAgKG1FZGdlU2NhbGVZRmluaXNoIC0gbUVkZ2VTY2FsZVlTdGFydCkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycCAqIGZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVDRURFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1JFQ0VERToKICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GYXN0U2Nyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GYXN0U2Nyb2xsZXIuamF2YQppbmRleCA1NGM0YjM2Li5hYTY4YTc0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRmFzdFNjcm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Zhc3RTY3JvbGxlci5qYXZhCkBAIC0xNTQsNiArMTU0LDExIEBACiAgICAgICAgIGludCB0ZXh0Q29sb3JOb3JtYWwgPSB0ZXh0Q29sb3IuZ2V0RGVmYXVsdENvbG9yKCk7CiAgICAgICAgIG1QYWludC5zZXRDb2xvcih0ZXh0Q29sb3JOb3JtYWwpOwogICAgICAgICBtUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKKworICAgICAgICAvLyB0byBzaG93IG1PdmVybGF5RHJhd2FibGUgcHJvcGVybHkKKyAgICAgICAgaWYgKG1MaXN0LmdldFdpZHRoKCkgPiAwICYmIG1MaXN0LmdldEhlaWdodCgpID4gMCkgeworICAgICAgICAgICAgb25TaXplQ2hhbmdlZChtTGlzdC5nZXRXaWR0aCgpLCBtTGlzdC5nZXRIZWlnaHQoKSwgMCwgMCk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX05PTkU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlci5qYXZhCmluZGV4IDQ0ODJiNWIuLjEwZTc2MzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9OdW1iZXJQaWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTnVtYmVyUGlja2VyLmphdmEKQEAgLTY2LDcgKzY2LDggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE51bWJlclBpY2tlci5Gb3JtYXR0ZXIgVFdPX0RJR0lUX0ZPUk1BVFRFUiA9CiAgICAgICAgICAgICBuZXcgTnVtYmVyUGlja2VyLkZvcm1hdHRlcigpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyIG1GbXQgPSBuZXcgamF2YS51dGlsLkZvcm1hdHRlcihtQnVpbGRlcik7CisgICAgICAgICAgICAgICAgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlciBtRm10ID0gbmV3IGphdmEudXRpbC5Gb3JtYXR0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlciwgamF2YS51dGlsLkxvY2FsZS5VUyk7CiAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gbUFyZ3MgPSBuZXcgT2JqZWN0WzFdOwogICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BcmdzWzBdID0gdmFsdWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTnVtYmVyUGlja2VyQnV0dG9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTnVtYmVyUGlja2VyQnV0dG9uLmphdmEKaW5kZXggMWM4NTc5Yy4uMjkyYjY2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlckJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9OdW1iZXJQaWNrZXJCdXR0b24uamF2YQpAQCAtODUsNCArODUsMTIgQEAKICAgICAgICAgICAgIG1OdW1iZXJQaWNrZXIuY2FuY2VsRGVjcmVtZW50KCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc1dpbmRvd0ZvY3VzKSB7CisgICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc1dpbmRvd0ZvY3VzKTsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cykgeworICAgICAgICAgICAgY2FuY2VsTG9uZ3ByZXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEKaW5kZXggZWM3ZDkyNy4uMmE2OTVlNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEKQEAgLTY2Niw4ICs2NjYsOCBAQAogCiAgICAgICAgICAgICBpZiAobVByb2dyZXNzID4gbWF4KSB7CiAgICAgICAgICAgICAgICAgbVByb2dyZXNzID0gbWF4OwotICAgICAgICAgICAgICAgIHJlZnJlc2hQcm9ncmVzcyhSLmlkLnByb2dyZXNzLCBtUHJvZ3Jlc3MsIGZhbHNlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZnJlc2hQcm9ncmVzcyhSLmlkLnByb2dyZXNzLCBtUHJvZ3Jlc3MsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQuamF2YQppbmRleCBhZmFlN2VmLi5iNGIzNTVhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFiV2lkZ2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYldpZGdldC5qYXZhCkBAIC0xMDksNyArMTA5LDYgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdFRhYldpZGdldCgpIHsKLSAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LkhPUklaT05UQUwpOwogICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX1VTRV9DSElMRF9EUkFXSU5HX09SREVSOwogCiAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQppbmRleCA1NzJiZDhjLi42ODYwMGNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQpAQCAtOTgyLDYgKzk4MiwyMiBAQAogICAgICAgICBzZXRUeXBlZmFjZSh0Ziwgc3R5bGVJbmRleCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgPT0gaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgLy8gSGlkZSB0aGUgc29mdCBpbnB1dCBpZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBUZXh0VmlldyBpcyBkaXNhYmxlZAorICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB0eXBlZmFjZSBhbmQgc3R5bGUgaW4gd2hpY2ggdGhlIHRleHQgc2hvdWxkIGJlIGRpc3BsYXllZCwKICAgICAgKiBhbmQgdHVybnMgb24gdGhlIGZha2UgYm9sZCBhbmQgaXRhbGljIGJpdHMgaW4gdGhlIFBhaW50IGlmIHRoZQpAQCAtNDU5Miw3ICs0NjA4LDcgQEAKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlIHB1YmxpYyBJbnB1dENvbm5lY3Rpb24gb25DcmVhdGVJbnB1dENvbm5lY3Rpb24oRWRpdG9ySW5mbyBvdXRBdHRycykgewotICAgICAgICBpZiAob25DaGVja0lzVGV4dEVkaXRvcigpKSB7CisgICAgICAgIGlmIChvbkNoZWNrSXNUZXh0RWRpdG9yKCkgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGlmIChtSW5wdXRNZXRob2RTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUlucHV0TWV0aG9kU3RhdGUgPSBuZXcgSW5wdXRNZXRob2RTdGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNDY2Niw2ICs0NjgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFN0YXJ0T2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVuZE9mZnNldCA9IE47CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHVzZSB0aGUgZGVsdGEgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgYW1vdW50IG9mIHRleHQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZC4KKyAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVuZE9mZnNldCArPSBkZWx0YTsKICAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IG9mZnNldHMgdG8gZW5zdXJlIHdlIGNvbnRhaW4gZnVsbCBzcGFucy4KICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCljb250ZW50OwpAQCAtNDY4MSwxMCArNDcwMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgb3V0VGV4dC5wYXJ0aWFsU3RhcnRPZmZzZXQgPSBwYXJ0aWFsU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG91dFRleHQucGFydGlhbEVuZE9mZnNldCA9IHBhcnRpYWxFbmRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB1c2UgdGhlIGRlbHRhIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGFtb3VudCBvZiB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQuCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbmRPZmZzZXQgKz0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgIG91dFRleHQucGFydGlhbEVuZE9mZnNldCA9IHBhcnRpYWxFbmRPZmZzZXQgLSBkZWx0YTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAocGFydGlhbFN0YXJ0T2Zmc2V0ID4gTikgewogICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFN0YXJ0T2Zmc2V0ID0gTjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0aWFsU3RhcnRPZmZzZXQgPCAwKSB7CkBAIC00NzQ4LDYgKzQ3NjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIGltcy5tVG1wRXh0cmFjdGVkLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbS51cGRhdGVFeHRyYWN0ZWRUZXh0KHRoaXMsIHJlcS50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1ldGhvZFN0YXRlLm1UbXBFeHRyYWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcy5tQ2hhbmdlZFN0YXJ0ID0gRVhUUkFDVF9VTktOT1dOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcy5tQ2hhbmdlZEVuZCA9IEVYVFJBQ1RfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXMubUNoYW5nZWREZWx0YSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zLm1Db250ZW50Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC02MzQ4LDggKzYzNjksOCBAQAogICAgICAgICAgICAgICAgIGltcy5tQ2hhbmdlZFN0YXJ0ID0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkRW5kID0gc3RhcnQrYmVmb3JlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaW1zLm1DaGFuZ2VkU3RhcnQgPiBzdGFydCkgaW1zLm1DaGFuZ2VkU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICBpZiAoaW1zLm1DaGFuZ2VkRW5kIDwgKHN0YXJ0K2JlZm9yZSkpIGltcy5tQ2hhbmdlZEVuZCA9IHN0YXJ0K2JlZm9yZTsKKyAgICAgICAgICAgICAgICBpbXMubUNoYW5nZWRTdGFydCA9IE1hdGgubWluKGltcy5tQ2hhbmdlZFN0YXJ0LCBzdGFydCk7CisgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkRW5kID0gTWF0aC5tYXgoaW1zLm1DaGFuZ2VkRW5kLCBzdGFydCArIGJlZm9yZSAtIGltcy5tQ2hhbmdlZERlbHRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGltcy5tQ2hhbmdlZERlbHRhICs9IGFmdGVyLWJlZm9yZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyLmphdmEKaW5kZXggODFjYTkxMi4uZmVmZGNlYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlci5qYXZhCkBAIC00MzQsNiArNDM0LDcgQEAKICAgICAgICAgICAgICAgICBWaWV3IHRpdGxlVGVtcGxhdGUgPSBtV2luZG93LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX3RlbXBsYXRlKTsKICAgICAgICAgICAgICAgICB0aXRsZVRlbXBsYXRlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIHRvcFBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBoYXNUaXRsZSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL05ldEluaXRpYXRlZEFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL05ldEluaXRpYXRlZEFjdGl2aXR5LmphdmEKaW5kZXggMzZmNDViMi4uNjAzOWNjMiAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9OZXRJbml0aWF0ZWRBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTmV0SW5pdGlhdGVkQWN0aXZpdHkuamF2YQpAQCAtMjYsNiArMjYsOCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc05ldEluaXRpYXRlZEhhbmRsZXI7CiAKIC8qKgpAQCAtNDIsMTAgKzQ0LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJVkVfQlVUVE9OID0gQWxlcnREaWFsb2cuQlVUVE9OX1BPU0lUSVZFOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORUdBVElWRV9CVVRUT04gPSBBbGVydERpYWxvZy5CVVRUT05fTkVHQVRJVkU7CiAKLSAgICAvLyBEaWFsb2cgYnV0dG9uIHRleHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT05fVEVYVF9BQ0NFUFQgPSAiQWNjZXB0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT05fVEVYVF9ERU5ZID0gIkRlbnkiOwotCiAgICAgLy8gUmVjZWl2ZWQgSUQgZnJvbSBpbnRlbnQsIC0xIHdoZW4gbm8gbm90aWZpY2F0aW9uIGlzIGluIHByb2dyZXNzCiAgICAgcHJpdmF0ZSBpbnQgbm90aWZpY2F0aW9uSWQgPSAtMTsKIApAQCAtNjcsMTIgKzY1LDEzIEBACiAgICAgICAgIC8vIFNldCB1cCB0aGUgImRpYWxvZyIKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOwogICAgICAgICBmaW5hbCBBbGVydENvbnRyb2xsZXIuQWxlcnRQYXJhbXMgcCA9IG1BbGVydFBhcmFtczsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CiAgICAgICAgIHAubUljb25JZCA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfZGlhbG9nX3VzYjsKICAgICAgICAgcC5tVGl0bGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoR3BzTmV0SW5pdGlhdGVkSGFuZGxlci5OSV9JTlRFTlRfS0VZX1RJVExFKTsKICAgICAgICAgcC5tTWVzc2FnZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShHcHNOZXRJbml0aWF0ZWRIYW5kbGVyLk5JX0lOVEVOVF9LRVlfTUVTU0FHRSk7Ci0gICAgICAgIHAubVBvc2l0aXZlQnV0dG9uVGV4dCA9IEJVVFRPTl9URVhUX0FDQ0VQVDsKKyAgICAgICAgcC5tUG9zaXRpdmVCdXR0b25UZXh0ID0gU3RyaW5nLmZvcm1hdChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ncHNWZXJpZlllcykpOwogICAgICAgICBwLm1Qb3NpdGl2ZUJ1dHRvbkxpc3RlbmVyID0gdGhpczsKLSAgICAgICAgcC5tTmVnYXRpdmVCdXR0b25UZXh0ID0gQlVUVE9OX1RFWFRfREVOWTsKKyAgICAgICAgcC5tTmVnYXRpdmVCdXR0b25UZXh0ID0gU3RyaW5nLmZvcm1hdChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ncHNWZXJpZk5vKSk7CiAgICAgICAgIHAubU5lZ2F0aXZlQnV0dG9uTGlzdGVuZXIgPSB0aGlzOwogCiAgICAgICAgIG5vdGlmaWNhdGlvbklkID0gaW50ZW50LmdldEludEV4dHJhKEdwc05ldEluaXRpYXRlZEhhbmRsZXIuTklfSU5URU5UX0tFWV9OT1RJRl9JRCwgLTEpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TaHV0ZG93blRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TaHV0ZG93blRocmVhZC5qYXZhCmluZGV4IGI3MjU1YmIuLmNkMWI1NjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU2h1dGRvd25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1NodXRkb3duVGhyZWFkLmphdmEKQEAgLTcxLDcgKzcxLDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGlvbkRvbmU7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrOworICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1DcHVXYWtlTG9jazsKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU2NyZWVuV2FrZUxvY2s7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwogICAgIAogICAgIHByaXZhdGUgU2h1dGRvd25UaHJlYWQoKSB7CkBAIC0xMzgsNyArMTM5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJlZ2luU2h1dGRvd25TZXF1ZW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzSXNTdGFydGVkR3VhcmQpIHsKICAgICAgICAgICAgIGlmIChzSXNTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdCB0byBzaHV0ZG93biBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybmluZy4iKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTaHV0ZG93biBzZXF1ZW5jZSBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybmluZy4iKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzSXNTdGFydGVkID0gdHJ1ZTsKQEAgLTE1OSwyMCArMTYwLDM2IEBACiAKICAgICAgICAgcGQuc2hvdygpOwogCi0gICAgICAgIC8vIHN0YXJ0IHRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZXMgc2h1dGRvd24KICAgICAgICAgc0luc3RhbmNlLm1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgc0luc3RhbmNlLm1Qb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBzSW5zdGFuY2UubVdha2VMb2NrID0gbnVsbDsKKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgbmV2ZXIgZmFsbCBhc2xlZXAgYWdhaW4KKyAgICAgICAgc0luc3RhbmNlLm1DcHVXYWtlTG9jayA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzSW5zdGFuY2UubUNwdVdha2VMb2NrID0gc0luc3RhbmNlLm1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soCisgICAgICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHICsgIi1jcHUiKTsKKyAgICAgICAgICAgIHNJbnN0YW5jZS5tQ3B1V2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgICAgICBzSW5zdGFuY2UubUNwdVdha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiTm8gcGVybWlzc2lvbiB0byBhY3F1aXJlIHdha2UgbG9jayIsIGUpOworICAgICAgICAgICAgc0luc3RhbmNlLm1DcHVXYWtlTG9jayA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHNvIG1ha2Ugc3VyZSB0aGUgc2NyZWVuIHN0YXlzIG9uIGZvciBiZXR0ZXIgdXNlciBleHBlcmllbmNlCisgICAgICAgIHNJbnN0YW5jZS5tU2NyZWVuV2FrZUxvY2sgPSBudWxsOwogICAgICAgICBpZiAoc0luc3RhbmNlLm1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tV2FrZUxvY2sgPSBzSW5zdGFuY2UubVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jaygKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywgIlNodXRkb3duIik7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlLm1XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlLm1TY3JlZW5XYWtlTG9jayA9IHNJbnN0YW5jZS5tUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLkZVTExfV0FLRV9MT0NLLCBUQUcgKyAiLXNjcmVlbiIpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tU2NyZWVuV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlLm1TY3JlZW5XYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTm8gcGVybWlzc2lvbiB0byBhY3F1aXJlIHdha2UgbG9jayIsIGUpOwotICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tV2FrZUxvY2sgPSBudWxsOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tU2NyZWVuV2FrZUxvY2sgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gc3RhcnQgdGhlIHRocmVhZCB0aGF0IGluaXRpYXRlcyBzaHV0ZG93bgogICAgICAgICBzSW5zdGFuY2UubUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgfTsKICAgICAgICAgc0luc3RhbmNlLnN0YXJ0KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQppbmRleCA1MDAwNTE3Li4xMzM5YjQ0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKQEAgLTk4NCw3ICs5ODQsNyBAQAogICAgIAogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgS2VybmVsV2FrZWxvY2tTdGF0cz4gcmVhZEtlcm5lbFdha2Vsb2NrU3RhdHMoKSB7CiAgICAgICAgIAotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKICAgICAgICAgaW50IGxlbjsKICAgICAgICAgCiAgICAgICAgIHRyeSB7CkBAIC0xMDMxLDkgKzEwMzEsMTEgQEAKICAgICAgICAgICAgICAgICBmb3IgKGVuZEluZGV4PXN0YXJ0SW5kZXg7IAogICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPCBsZW4gJiYgd2xCdWZmZXJbZW5kSW5kZXhdICE9ICdcbicgJiYgd2xCdWZmZXJbZW5kSW5kZXhdICE9ICdcMCc7IAogICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ28gb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXgrKzsgLy8gZW5kSW5kZXggaXMgYW4gZXhjbHVzaXZlIHVwcGVyIGJvdW5kLgorICAgICAgICAgICAgICAgIGVuZEluZGV4Kys7IC8vIGVuZEluZGV4IGlzIGFuIGV4Y2x1c2l2ZSB1cHBlciBib3VuZC4KKyAgICAgICAgICAgICAgICAvLyBEb24ndCBnbyBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgUHJvY2Vzcy5wYXJzZVByb2NMaW5lIG1pZ2h0CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgdG8gd2xCdWZmZXJbZW5kSW5kZXhdCisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IChsZW4gLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZVN0cmluZ0FycmF5ID0gbVByb2NXYWtlbG9ja3NOYW1lOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCmluZGV4IGEzZWZiYzguLmVhMjc4YTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKQEAgLTk2LDcgKzk2LDggQEAKICAgICAgICAgICAgIHBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyID0gIi9zZGNhcmQvc25hcHNob3RzIjsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9CisgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyAiL3NuYXBzaG90cyI7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGlyTWFkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShkaXIpLmlzRGlyZWN0b3J5KCkpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3BkdS9QZHVQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3BkdS9QZHVQYXJzZXIuamF2YQppbmRleCA2ZGY0YzYzLi4zZjE4NWFhIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFyc2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9tbXMvcGR1L1BkdVBhcnNlci5qYXZhCkBAIC0xNjUsNiArMTY1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIG9yICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5yZWxhdGVkIgogICAgICAgICAgICAgICAgICAgICAvLyBvciAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuYWx0ZXJuYXRpdmUiCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZUNvbmY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdFR5cGVTdHIuZXF1YWxzKENvbnRlbnRUeXBlLk1VTFRJUEFSVF9BTFRFUk5BVElWRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmFsdGVybmF0aXZlIgorICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgdGFrZSBvbmx5IHRoZSBmaXJzdCBwYXJ0LgorICAgICAgICAgICAgICAgICAgICBQZHVQYXJ0IGZpcnN0UGFydCA9IG1Cb2R5LmdldFBhcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIG1Cb2R5LnJlbW92ZUFsbCgpOworICAgICAgICAgICAgICAgICAgICBtQm9keS5hZGRQYXJ0KDAsIGZpcnN0UGFydCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZUNvbmY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgY2FzZSBQZHVIZWFkZXJzLk1FU1NBR0VfVFlQRV9ERUxJVkVSWV9JTkQ6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL1BkdUNhY2hlLmphdmEgYi9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL1BkdUNhY2hlLmphdmEKaW5kZXggN2MzZmFkNy4uODY2Y2ExZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9tbXMvdXRpbC9QZHVDYWNoZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3V0aWwvUGR1Q2FjaGUuamF2YQpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21NZXNzYWdlQm94ZXMoVXJpIGtleSwgUGR1Q2FjaGVFbnRyeSBlbnRyeSkgewotICAgICAgICBIYXNoU2V0PFVyaT4gbXNnQm94ID0gbVRocmVhZHMuZ2V0KGVudHJ5LmdldE1lc3NhZ2VCb3goKSk7CisgICAgICAgIEhhc2hTZXQ8VXJpPiBtc2dCb3ggPSBtVGhyZWFkcy5nZXQoTG9uZy52YWx1ZU9mKGVudHJ5LmdldE1lc3NhZ2VCb3goKSkpOwogICAgICAgICBpZiAobXNnQm94ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1zZ0JveC5yZW1vdmUoa2V5KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCmluZGV4IGZlMTUxY2QuLjRkOWJiM2IgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKQEAgLTI1LDkgKzI1LDggQEAKIGV4dGVybiAiQyIgewogaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKIGludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpOwotaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHVpbnQzMl90IGFkZHIpOworaW50IGlmY19hZGRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBjaGFyICpkZXN0U3RyLCB1aW50MzJfdCBwcmVmaXhMZW4sIGNvbnN0IGNoYXIgKmd3U3RyKTsKIGludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3NldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgdWludDMyX3QgZ2F0ZXdheSk7CiBpbnQgaWZjX2dldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CiBpbnQgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CiBpbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSk7CkBAIC05NiwxMyArOTUsMjMgQEAKICAgICByZXR1cm4gKGppbnQpcmVzdWx0OwogfQogCi1zdGF0aWMgamludCBhbmRyb2lkX25ldF91dGlsc19hZGRIb3N0Um91dGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpzdHJpbmcgaWZuYW1lLCBqaW50IGFkZHIpCitzdGF0aWMgamludCBhbmRyb2lkX25ldF91dGlsc19hZGRSb3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBpZm5hbWUsCisgICAgICAgICAganN0cmluZyBkc3QsIGppbnQgcHJlZml4TGVuZ3RoLCBqc3RyaW5nIGd3KQogewogICAgIGludCByZXN1bHQ7CiAKICAgICBjb25zdCBjaGFyICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhpZm5hbWUsIE5VTEwpOwotICAgIHJlc3VsdCA9IDo6aWZjX2FkZF9ob3N0X3JvdXRlKG5hbWVTdHIsIGFkZHIpOworICAgIGNvbnN0IGNoYXIgKmRzdFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZHN0LCBOVUxMKTsKKyAgICBjb25zdCBjaGFyICpnd1N0ciA9IE5VTEw7CisgICAgaWYgKGd3ICE9IE5VTEwpIHsKKyAgICAgICAgZ3dTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGd3LCBOVUxMKTsKKyAgICB9CisgICAgcmVzdWx0ID0gOjppZmNfYWRkX3JvdXRlKG5hbWVTdHIsIGRzdFN0ciwgcHJlZml4TGVuZ3RoLCBnd1N0cik7CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoaWZuYW1lLCBuYW1lU3RyKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkc3QsIGRzdFN0cik7CisgICAgaWYgKGd3ICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZ3csIGd3U3RyKTsKKyAgICB9CiAgICAgcmV0dXJuIChqaW50KXJlc3VsdDsKIH0KIApAQCAtMTE2LDE2ICsxMjUsNiBAQAogICAgIHJldHVybiAoamludClyZXN1bHQ7CiB9CiAKLXN0YXRpYyBqaW50IGFuZHJvaWRfbmV0X3V0aWxzX3NldERlZmF1bHRSb3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBpZm5hbWUsIGppbnQgZ2F0ZXdheSkKLXsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgY29uc3QgY2hhciAqbmFtZVN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaWZuYW1lLCBOVUxMKTsKLSAgICByZXN1bHQgPSA6OmlmY19zZXRfZGVmYXVsdF9yb3V0ZShuYW1lU3RyLCBnYXRld2F5KTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhpZm5hbWUsIG5hbWVTdHIpOwotICAgIHJldHVybiAoamludClyZXN1bHQ7Ci19Ci0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbmV0X3V0aWxzX2dldERlZmF1bHRSb3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBpZm5hbWUpCiB7CiAgICAgaW50IHJlc3VsdDsKQEAgLTI1Myw5ICsyNTIsOSBAQAogCiAgICAgeyAiZW5hYmxlSW50ZXJmYWNlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2VuYWJsZUludGVyZmFjZSB9LAogICAgIHsgImRpc2FibGVJbnRlcmZhY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZGlzYWJsZUludGVyZmFjZSB9LAotICAgIHsgImFkZEhvc3RSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfYWRkSG9zdFJvdXRlIH0sCisgICAgeyAiYWRkUm91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lMamF2YS9sYW5nL1N0cmluZzspSSIsCisgICAgICAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19hZGRSb3V0ZSB9LAogICAgIHsgInJlbW92ZUhvc3RSb3V0ZXMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVtb3ZlSG9zdFJvdXRlcyB9LAotICAgIHsgInNldERlZmF1bHRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfc2V0RGVmYXVsdFJvdXRlIH0sCiAgICAgeyAiZ2V0RGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2dldERlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlbW92ZURlZmF1bHRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVEZWZhdWx0Um91dGUgfSwKICAgICB7ICJyZXNldENvbm5lY3Rpb25zIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3Jlc2V0Q29ubmVjdGlvbnMgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3RleHRfQW5kcm9pZEJpZGkuY3BwCmluZGV4IDc2OTZiYjMuLjUzMDI4YzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcApAQCAtMTcsNyArMTcsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIkFuZHJvaWRVbmljb2RlIgogCi0jaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgInV0aWxzL21pc2MuaCIKICNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKQEAgLTI1LDE0ICsyNSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKICAgICAKLXN0YXRpYyB2b2lkIGpuaVRocm93RXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBleGMsIGNvbnN0IGNoYXIqIG1zZyA9IE5VTEwpCi17Ci0gICAgamNsYXNzIGV4Y0NsYXp6ID0gZW52LT5GaW5kQ2xhc3MoZXhjKTsKLSAgICBMT0dfQVNTRVJUKGV4Y0NsYXp6LCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgJXMiLCBleGMpOwotCi0gICAgZW52LT5UaHJvd05ldyhleGNDbGF6eiwgbXNnKTsKLX0KLQogc3RhdGljIGppbnQgcnVuQmlkaShKTklFbnYqIGVudiwgam9iamVjdCBvYmosIGppbnQgZGlyLCBqY2hhckFycmF5IGNoc0FycmF5LCAKICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBpbmZvQXJyYXksIGludCBuLCBqYm9vbGVhbiBoYXZlSW5mbykKIHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcAppbmRleCA1ZDhkNDE5Li42YjkwNTQxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRDaGFyYWN0ZXIuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQW5kcm9pZFVuaWNvZGUiCiAKLSNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgogI2luY2x1ZGUgInV0aWxzL0xvZy5oIgpAQCAtNTAsMTQgKzUwLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogICAgIAotc3RhdGljIHZvaWQgam5pVGhyb3dFeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGV4YywgY29uc3QgY2hhciogbXNnID0gTlVMTCkKLXsKLSAgICBqY2xhc3MgZXhjQ2xhenogPSBlbnYtPkZpbmRDbGFzcyhleGMpOwotICAgIExPR19BU1NFUlQoZXhjQ2xhenosICJVbmFibGUgdG8gZmluZCBjbGFzcyAlcyIsIGV4Yyk7Ci0KLSAgICBlbnYtPlRocm93TmV3KGV4Y0NsYXp6LCBtc2cpOwotfQotCiBzdGF0aWMgdm9pZCBnZXREaXJlY3Rpb25hbGl0aWVzKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgamNoYXJBcnJheSBzcmNBcnJheSwgamJ5dGVBcnJheSBkZXN0QXJyYXksIGludCBjb3VudCkKIHsKICAgICBqY2hhciogc3JjID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhzcmNBcnJheSwgTlVMTCk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3V0aWxfU3RyaW5nQmxvY2suY3BwIGIvY29yZS9qbmkvYW5kcm9pZF91dGlsX1N0cmluZ0Jsb2NrLmNwcAppbmRleCA2NDFmYmNlLi5hMDIxZWZkIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3V0aWxfU3RyaW5nQmxvY2suY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9TdHJpbmdCbG9jay5jcHAKQEAgLTE0NywyNSArMTQ3LDYgQEAKICAgICByZXR1cm4gYXJyYXk7CiB9CiAKLXN0YXRpYyBqaW50IGFuZHJvaWRfY29udGVudF9TdHJpbmdCbG9ja19uYXRpdmVJbmRleE9mU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCB0b2tlbiwganN0cmluZyBzdHIpCi17Ci0gICAgUmVzU3RyaW5nUG9vbCogb3NiID0gKFJlc1N0cmluZ1Bvb2wqKXRva2VuOwotICAgIGlmIChvc2IgPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkgewotICAgICAgICBkb1Rocm93KGVudiwgImphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyMTZfdCogc3RyMTYgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHN0ciwgTlVMTCk7Ci0gICAganNpemUgc3RyTGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3RyKTsKLQotICAgIHNzaXplX3QgaWR4ID0gb3NiLT5pbmRleE9mU3RyaW5nKHN0cjE2LCBzdHJMZW4pOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3RyLCBzdHIxNik7Ci0KLSAgICByZXR1cm4gaWR4OwotfQotCiBzdGF0aWMgdm9pZCBhbmRyb2lkX2NvbnRlbnRfU3RyaW5nQmxvY2tfbmF0aXZlRGVzdHJveShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgdG9rZW4pCiB7CkBAIC0xOTMsOCArMTc0LDYgQEAKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9jb250ZW50X1N0cmluZ0Jsb2NrX25hdGl2ZUdldFN0cmluZyB9LAogICAgIHsgIm5hdGl2ZUdldFN0eWxlIiwgICAgIihJSSlbSSIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfY29udGVudF9TdHJpbmdCbG9ja19uYXRpdmVHZXRTdHlsZSB9LAotICAgIHsgIm5hdGl2ZUluZGV4T2ZTdHJpbmciLCIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKLSAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9jb250ZW50X1N0cmluZ0Jsb2NrX25hdGl2ZUluZGV4T2ZTdHJpbmcgfSwKICAgICB7ICJuYXRpdmVEZXN0cm95IiwgICAgICAiKEkpViIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfY29udGVudF9TdHJpbmdCbG9ja19uYXRpdmVEZXN0cm95IH0sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hbHdheXNfdXNlX2NoZWNrYm94LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWx3YXlzX3VzZV9jaGVja2JveC54bWwKaW5kZXggYmFhNGJlZS4uYTk1NTM1MiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hbHdheXNfdXNlX2NoZWNrYm94LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2Fsd2F5c191c2VfY2hlY2tib3gueG1sCkBAIC0yNiwxNCArMjYsMTQgQEAKICAgICAKICAgICA8Q2hlY2tCb3gKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbHdheXNVc2UiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIC8+CiAgICAgCiAgICAgPFRleHRWaWV3IAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NsZWFyRGVmYXVsdEhpbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjM2ZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC90YWJfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3RhYl9jb250ZW50LnhtbAppbmRleCAwZWU4N2NlLi43OTE0N2ZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3RhYl9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3RhYl9jb250ZW50LnhtbApAQCAtMjIsOCArMjIsOSBAQAogCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAk8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIAlhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Ci0gICAgICAgIDxUYWJXaWRnZXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGFicyIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgCWFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CisgICAgPFRhYldpZGdldCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90YWJzIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiAvPgogICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGFiY29udGVudCIKICAgICAgICAgCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1hci9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctYXIvbG9hZGVycm9yLmh0bWwKaW5kZXggZWRjZDYzYS4uYWE5ODA1YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3Jhdy1hci9sb2FkZXJyb3IuaHRtbAorKysgYi9jb3JlL3Jlcy9yZXMvcmF3LWFyL2xvYWRlcnJvci5odG1sCkBAIC0yLDcgKzIsNyBAQAogICAgIDxoZWFkPgogICAgICAgICA8dGl0bGU+2LXZgdit2Kkg2KfZhNmI2YrYqCDYutmK2LEg2YXYqtmI2YHYsdipPC90aXRsZT4KICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IGRpcmVjdGlvbjogcnRsOyB9CiAgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CiAgICAgICAgIDwvc3R5bGU+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9yYXctYXIvbm9kb21haW4uaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctYXIvbm9kb21haW4uaHRtbAppbmRleCBiYzA3MGY2Li4yZTU4NDlmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvcmF3LWFyL25vZG9tYWluLmh0bWwKKysrIGIvY29yZS9yZXMvcmVzL3Jhdy1hci9ub2RvbWFpbi5odG1sCkBAIC0yLDcgKzIsNyBAQAogICAgIDxoZWFkPgogICAgICAgICA8dGl0bGU+2LXZgdit2Kkg2KfZhNmI2YrYqCDYutmK2LEg2YXYqtmI2YHYsdipPC90aXRsZT4KICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IGRpcmVjdGlvbjogcnRsOyB9CiAgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CiAgICAgICAgIDwvc3R5bGU+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9yYXctaXcvbG9hZGVycm9yLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LWl3L2xvYWRlcnJvci5odG1sCmluZGV4IDgxNTU0MzIuLjhkNWE1M2YgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9yYXctaXcvbG9hZGVycm9yLmh0bWwKKysrIGIvY29yZS9yZXMvcmVzL3Jhdy1pdy9sb2FkZXJyb3IuaHRtbApAQCAtMiw3ICsyLDcgQEAKICAgICA8aGVhZD4KICAgICAgICAgPHRpdGxlPteT16Mg15DXmdeg15jXqNeg15gg15zXkCDXltee15nXnzwvdGl0bGU+CiAgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyBkaXJlY3Rpb246IHJ0bDsgfQogICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQogICAgICAgICA8L3N0eWxlPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LWl3L25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LWl3L25vZG9tYWluLmh0bWwKaW5kZXggZjdiOWY0Mi4uMGRjZDdmOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3Jhdy1pdy9ub2RvbWFpbi5odG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctaXcvbm9kb21haW4uaHRtbApAQCAtMiw3ICsyLDcgQEAKICAgICA8aGVhZD4KICAgICAgICAgPHRpdGxlPteT16Mg15DXmdeg15jXqNeg15gg15zXkCDXltee15nXnzwvdGl0bGU+CiAgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyBkaXJlY3Rpb246IHJ0bDsgfQogICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQogICAgICAgICA8L3N0eWxlPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggNWE5NTUxZS4uY2JiNTg1MiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjczLDYgKzI3MywyMSBAQAogICAgIDwhLS0gRGVmYXVsdCBMRUQgb2ZmIHRpbWUgZm9yIG5vdGlmaWNhdGlvbiBMRUQgaW4gbWlsbGlzZWNvbmRzLiAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGVmYXVsdE5vdGlmaWNhdGlvbkxlZE9mZiI+MjAwMDwvaW50ZWdlcj4KIAorICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgbGVkIGNvbG9yIHdoZW4gYmF0dGVyeSBpcyBsb3cgb24gY2hhcmdlIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19ub3RpZmljYXRpb25zQmF0dGVyeUxvd0FSR0IiPjB4RkZGRjAwMDA8L2ludGVnZXI+CisKKyAgICA8IS0tIERlZmF1bHQgdmFsdWUgZm9yIGxlZCBjb2xvciB3aGVuIGJhdHRlcnkgaXMgbWVkaXVtIGNoYXJnZWQgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TWVkaXVtQVJHQiI+MHhGRkZGRkYwMDwvaW50ZWdlcj4KKworICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgbGVkIGNvbG9yIHdoZW4gYmF0dGVyeSBpcyBmdWxseSBjaGFyZ2VkIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19ub3RpZmljYXRpb25zQmF0dGVyeUZ1bGxBUkdCIj4weEZGMDBGRjAwPC9pbnRlZ2VyPgorCisgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciBMRUQgb24gdGltZSB3aGVuIHRoZSBiYXR0ZXJ5IGlzIGxvdyBvbiBjaGFyZ2UgaW4gbWlsaXNlY29uZHMgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TGVkT24iPjEyNTwvaW50ZWdlcj4KKworICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgTEVEIG9mZiB0aW1lIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IG9uIGNoYXJnZSBpbiBtaWxpc2Vjb25kcyAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlMZWRPZmYiPjI4NzU8L2ludGVnZXI+CisKICAgICA8IS0tIEFsbG93IHRoZSBtZW51IGhhcmQga2V5IHRvIGJlIGRpc2FibGVkIGluIExvY2tTY3JlZW4gb24gc29tZSBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19kaXNhYmxlTWVudUtleUluTG9ja1NjcmVlbiI+ZmFsc2U8L2Jvb2w+CiAKQEAgLTM3NCw2ICszODksMTMgQEAKICAgICA8IS0tIFRoZSByZXN0b3JpbmcgaXMgaGFuZGxlZCBieSBtb2RlbSBpZiBpdCBpcyB0cnVlLS0+CiAgICAgPGJvb2wgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0ic2tpcF9yZXN0b3JpbmdfbmV0d29ya19zZWxlY3Rpb24iPmZhbHNlPC9ib29sPgogCisgICAgPCEtLSBUaGUgVVJMIHRoYXQgc2hvdWxkIGJlIHNlbnQgaW4gYW4geC13YXAtcHJvZmlsZSBoZWFkZXIgd2l0aCBhbiBIVFRQIHJlcXVlc3QsCisgICAgICAgICBhcyBkZWZpbmVkIGluIHRoZSBPcGVuIE1vYmlsZSBBbGxpYW5jZSBVc2VyIEFnZW50IFByb2ZpbGUgc3BlY2lmaWNhdGlvbgorICAgICAgICAgT01BLVRTLVVBUHJvZi1WMl8wLTIwMDYwMjA2LUEgU2VjdGlvbiA4LjEuMS4xLiBJZiB0aGUgVVJMIGNvbnRhaW5zIGEgJyVzJworICAgICAgICAgZm9ybWF0IHN0cmluZyB0aGVuIHRoYXQgc3Vic3RyaW5nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgb2YKKyAgICAgICAgIEJ1aWxkLk1PREVMLiBUaGUgZm9ybWF0IHN0cmluZyBzaGFsbCBub3QgYmUgZXNjYXBlZC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfdXNlcmFnZW50cHJvZmlsZV91cmwiPjwvc3RyaW5nPgorCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiBEZWZpbmVzIHRoZSBzbG90cyBpcyBUd28gRGlnaXQgTnVtYmVyIGZvciBkaWFsaW5nIG5vcm1hbGx5IG5vdCBVU1NEIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iY29uZmlnX3R3b0RpZ2l0TnVtYmVyUGF0dGVybiI+CiAgICAgPC9zdHJpbmctYXJyYXk+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA2MTNlNjExLi5hZTNjZDAyIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTIzNjIsNCArMjM2MiwxOSBAQAogICAgIDwhLS0gVGV4dCBmb3IgbWVzc2FnZSBmb3IgYW4gdW5rbm93biBleHRlcm5hbCBtZWRpYSBzdGF0ZSBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im1lZGlhX3Vua25vd25fc3RhdGUiPkV4dGVybmFsIG1lZGlhIGluIHVua25vd24gc3RhdGUuPC9zdHJpbmc+CiAKKyAgICA8IS0tIE5ldHdvcmsgcG9zaXRpb25pbmcgbm90aWZpY2F0aW9uIHRpY2tlci4gVGhlIG5hbWUgb2YgdGhlIHVzZXIgKGUuZy4gSm9obiBEb2UpIHdobyBzZW50CisgICAgICAgICB0aGUgcmVxdWVzdCBpcyBzaG93biBhcyBhIGR5bmFtaWMgc3RyaW5nLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Imdwc05vdGlmVGlja2VyIj5Mb2NhdGlvbiByZXF1ZXN0IGZyb20gPHhsaWZmOmcgaWQ9Im5hbWUiPiVzPC94bGlmZjpnPjwvc3RyaW5nPgorICAgIDwhLS0gTmV0d29yayBwb3NpdGlvbmluZyBub3RpZmljYXRpb24gYW5kIHZlcmlmaWNhdGlvbiB0aXRsZSB0byBpbmZvcm0gdGhlIHVzZXIgYWJvdXQKKyAgICAgICAgIGFuIGluY29taW5nIGxvY2F0aW9uIHJlcXVlc3QuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzTm90aWZUaXRsZSI+TG9jYXRpb24gcmVxdWVzdDwvc3RyaW5nPgorICAgIDwhLS0gTmV0d29yayBwb3NpdGlvbmluZyBub3RpZmljYXRpb24gbWVzc2FnZS4gVGhlIG5hbWUgb2YgdGhlIHVzZXIgKGUuZy4gSm9obiBEb2UpIGFuZAorICAgICAgICAgc2VydmljZSAoU1VQTC1zZXJ2aWNlKSB3aG8gc2VudCB0aGUgcmVxdWVzdCBpcyBzaG93biBhcyBkeW5hbWljIHN0cmluZ3MuCisgICAgICAgICBUcmFuc2xhdGlvbiBzaG91bGQgbm90IGJlIGxvbmdlciB0aGFuIG1hc3RlciB0ZXh0LiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Imdwc05vdGlmTWVzc2FnZSI+UmVxdWVzdGVkIGJ5IDx4bGlmZjpnIGlkPSJuYW1lIj4lMSRzPC94bGlmZjpnPiAoPHhsaWZmOmcgaWQ9InNlcnZpY2UiIGV4YW1wbGU9IlNVUEwtc2VydmljZSI+JTIkczwveGxpZmY6Zz4pPC9zdHJpbmc+CisgICAgPCEtLSBOZXR3b3JrIHBvc2l0aW9uaW5nIHZlcmlmaWNhdGlvbiBZZXMuIEJ1dHRvbiB0byBwdXNoIHRvIHNoYXJlIGxvY2F0aW9uIGluZm9ybWF0aW9uLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Imdwc1ZlcmlmWWVzIj5ZZXM8L3N0cmluZz4KKyAgICA8IS0tIE5ldHdvcmsgcG9zaXRpb25pbmcgdmVyaWZpY2F0aW9uIE5vLiBCdXR0b24gdG8gcHVzaCB0byBkZW55IHNoYXJpbmcgb2YgbG9jYXRpb24KKyAgICAgICAgIGluZm9ybWF0aW9uLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Imdwc1ZlcmlmTm8iPk5vPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ZGVlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworCitwdWJsaWMgY2xhc3MgQ29udGVudFJlc29sdmVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1cnNvckZpbmFsaXplcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiBXYW50IGEgdGVzdCBjYXNlIHRoYXQgbW9yZSBwcmVkaWN0YWJseSByZXByb2R1Y2UgdGhpcyBpc3N1ZS4gU2VsZWN0ZWQKKyAgICAgICAgLy8gNjAwIGFzIHRoaXMgY2F1c2VzIHRoZSBwcm9ibGVtIDEwMCUgb2YgdGhlIHJ1bnMgb24gY3VycmVudCBodywgaXQgbWlnaHQgbm90CisgICAgICAgIC8vIGRvIHNvIG9uIHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbiB0aG91Z2guCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKKyAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIucXVlcnkoQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY4ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIExpc3RQcmVmZXJlbmNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RQcmVmZXJlbmNlU3VtbWFyeUZyb21FbnRyaWVzKCkgeworICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0geyAib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKyAgICAgICAgU3RyaW5nW10gZW50cnlWYWx1ZXMgPSB7ICIxIiAsICIyIiwgIjMiIH07CisgICAgICAgIExpc3RQcmVmZXJlbmNlIGxwID0gbmV3IExpc3RQcmVmZXJlbmNlKGdldENvbnRleHQoKSk7CisgICAgICAgIGxwLnNldEVudHJpZXMoZW50cmllcyk7CisgICAgICAgIGxwLnNldEVudHJ5VmFsdWVzKGVudHJ5VmFsdWVzKTsKKworICAgICAgICBscC5zZXRWYWx1ZShlbnRyeVZhbHVlc1sxXSk7CisgICAgICAgIGFzc2VydFRydWUobHAuZ2V0U3VtbWFyeSgpID09IG51bGwpOworCisgICAgICAgIGxwLnNldFN1bW1hcnkoIiUxJHMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudHJpZXNbMV0sIGxwLmdldFN1bW1hcnkoKSk7CisKKyAgICAgICAgbHAuc2V0VmFsdWUoZW50cnlWYWx1ZXNbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc1syXSwgbHAuZ2V0U3VtbWFyeSgpKTsKKworICAgICAgICBscC5zZXRTdW1tYXJ5KG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKGxwLmdldFN1bW1hcnkoKSA9PSBudWxsKTsKKworICAgICAgICBscC5zZXRTdW1tYXJ5KCJUaGUgY29sb3IgaXMgJTEkcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBjb2xvciBpcyAiICsgZW50cmllc1syXSwgbHAuZ2V0U3VtbWFyeSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9BbmRyb2lkLm1rIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvQW5kcm9pZC5tawppbmRleCAwMDAxMjAxLi4wN2Q5OWNiIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL0FuZHJvaWQubWsKQEAgLTIzLDcgKzIzLDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IEZyYW1ld29ya0NvcmVIb3N0VGVzdHMKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gaG9zdHRlc3RsaWIgZGRtbGliIGp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBob3N0dGVzdGxpYiBkZG1saWItcHJlYnVpbHQganVuaXQKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCBmZWQzOWM5Li5lYmUxM2UxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTE2LDI0ICsxNiwyNCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkluc3RhbGxFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTXVsdGlMaW5lUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLklTeW5jUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5TeW5jUmVzdWx0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLklUZXN0UnVuTGlzdGVuZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdENhc2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdFN1aXRlOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiBpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CiBpbXBvcnQgamF2YS5sYW5nLlByb2Nlc3M7CkBAIC00NCw3ICs0NCw2IEBACiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmhvc3R0ZXN0LkRldmljZVRlc3RDYXNlOwogCiAvKioKICAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBob3N0IHNpZGUgaW5zdGFsbCBjYXNlcwpAQCAtMTI4LDExICsxMjcsMTYgQEAKICAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAob3B0aW9uYWwpIFRoZSBtZXRob2QgaW4gdGhlIGNsYXNzIG9mIHdoaWNoIHRvIHRlc3QKICAgICAgKiBAcGFyYW0gcnVubmVyTmFtZSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBUZXN0UnVubmVyIG9mIHRoZSB0ZXN0IG9uIHRoZSBkZXZpY2UgdG8gYmUgcnVuCiAgICAgICogQHBhcmFtIHBhcmFtcyAob3B0aW9uYWwpIEFueSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyBpbnRvIHRoZSBUZXN0IFJ1bm5lcgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyfQogICAgICAqLwotICAgIHByaXZhdGUgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBkb1J1blRlc3RzKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcKLSAgICAgICAgICAgIG1ldGhvZE5hbWUsIFN0cmluZyBydW5uZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQorICAgIHByaXZhdGUgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBkb1J1blRlc3RzKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBydW5uZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKHBrZ05hbWUsIHJ1bm5lck5hbWUsCiAgICAgICAgICAgICAgICAgbURldmljZSk7CiAKQEAgLTE2Myw3ICsxNjcsOCBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0ZXN0IHBhc3NlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJ1bkRldmljZVRlc3RzRGlkQWxsVGVzdHNQYXNzKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBydW5uZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgcnVubmVyTmFtZSwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IGRvUnVuVGVzdHMocGtnTmFtZSwgY2xhc3NOYW1lLCBtZXRob2ROYW1lLAogICAgICAgICAgICAgICAgIHJ1bm5lck5hbWUsIHBhcmFtcyk7CiAgICAgICAgIHJldHVybiBsaXN0ZW5lci5kaWRBbGxUZXN0c1Bhc3MoKTsKQEAgLTE3Myw5ICsxNzgsMTUgQEAKICAgICAgKiBSdW5zIHRoZSBzcGVjaWZpZWQgcGFja2FnZXMgdGVzdHMsIGFuZCByZXR1cm5zIHdoZXRoZXIgYWxsIHRlc3RzIHBhc3NlZCBvciBub3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGtnTmFtZSBBbmRyb2lkIGFwcGxpY2F0aW9uIHBhY2thZ2UgZm9yIHRlc3RzCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5IHRlc3QgcGFzc2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcnVuRGV2aWNlVGVzdHNEaWRBbGxUZXN0c1Bhc3MoU3RyaW5nIHBrZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gcnVuRGV2aWNlVGVzdHNEaWRBbGxUZXN0c1Bhc3MoU3RyaW5nIHBrZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IGRvUnVuVGVzdHMocGtnTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgIHJldHVybiBsaXN0ZW5lci5kaWRBbGxUZXN0c1Bhc3MoKTsKICAgICB9CkBAIC0xODMsMjIgKzE5NCwyNiBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgdG8gcHVzaCBhIGZpbGUgdG8gZGV2aWNlCiAgICAgICogQHBhcmFtIGFwa0FwcFByaXZhdGVQYXRoCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHVzaEZpbGUoZmluYWwgU3RyaW5nIGxvY2FsRmlsZVBhdGgsIGZpbmFsIFN0cmluZyBkZXN0RmlsZVBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IG1EZXZpY2UuZ2V0U3luY1NlcnZpY2UoKS5wdXNoRmlsZSgKLSAgICAgICAgICAgICAgICBsb2NhbEZpbGVQYXRoLCBkZXN0RmlsZVBhdGgsIG5ldyBOdWxsU3luY1Byb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN5bmNTZXJ2aWNlLlJFU1VMVF9PSywgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2UuZ2V0U3luY1NlcnZpY2UoKS5wdXNoRmlsZShsb2NhbEZpbGVQYXRoLAorICAgICAgICAgICAgICAgIGRlc3RGaWxlUGF0aCwgbmV3IE51bGxTeW5jUHJvZ3Jlc3NNb25pdG9yKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgdG8gaW5zdGFsbCBhIGZpbGUKICAgICAgKiBAcGFyYW0gbG9jYWxGaWxlUGF0aCB0aGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBmaWxlIG9uIGxvY2FsIGhvc3QgdG8gaW5zdGFsbAogICAgICAqIEBwYXJhbSByZWluc3RhbGwgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlLWluc3RhbGwgb2YgYXBwIHNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zdGFsbEZpbGUoZmluYWwgU3RyaW5nIGxvY2FsRmlsZVBhdGgsIGZpbmFsIGJvb2xlYW4gcmVwbGFjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsRmlsZShmaW5hbCBTdHJpbmcgbG9jYWxGaWxlUGF0aCwgZmluYWwgYm9vbGVhbiByZXBsYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1EZXZpY2UuaW5zdGFsbFBhY2thZ2UobG9jYWxGaWxlUGF0aCwgcmVwbGFjZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXN1bHQpOwogICAgIH0KQEAgLTIwOCwxMCArMjIzLDExIEBACiAgICAgICogQHBhcmFtIGxvY2FsRmlsZVBhdGggdGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIHBhdGggdG8gZmlsZSBvbiBsb2NhbCBob3N0IHRvIGluc3RhbGwKICAgICAgKiBAcGFyYW0gcmVpbnN0YWxsIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiByZS1pbnN0YWxsIG9mIGFwcCBzaG91bGQgYmUgcGVyZm9ybWVkCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIG91dHB1dCBvZiB0aGUgZmFpbGVkIGluc3RhbGwgYXR0ZW1wdAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGluc3RhbGxGaWxlRmFpbChmaW5hbCBTdHJpbmcgbG9jYWxGaWxlUGF0aCwgZmluYWwgYm9vbGVhbiByZXBsYWNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBtRGV2aWNlLmluc3RhbGxQYWNrYWdlKGxvY2FsRmlsZVBhdGgsIHJlcGxhY2UpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0yMjEsMTAgKzIzNywxNyBAQAogICAgICAqIEhlbHBlciBtZXRob2QgdG8gaW5zdGFsbCBhIGZpbGUgdG8gZGV2aWNlIGFzIGZvcndhcmQgbG9ja2VkCiAgICAgICogQHBhcmFtIGxvY2FsRmlsZVBhdGggdGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIHBhdGggdG8gZmlsZSBvbiBsb2NhbCBob3N0IHRvIGluc3RhbGwKICAgICAgKiBAcGFyYW0gcmVpbnN0YWxsIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiByZS1pbnN0YWxsIG9mIGFwcCBzaG91bGQgYmUgcGVyZm9ybWVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgU3luY0V4Y2VwdGlvbiBpZiB0aGUgc3luYyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBpbnN0YWxsRmlsZUZvcndhcmRMb2NrZWQoZmluYWwgU3RyaW5nIGxvY2FsRmlsZVBhdGgsIGZpbmFsIGJvb2xlYW4gcmVwbGFjZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyByZW1vdGVGaWxlUGF0aCA9IG1EZXZpY2Uuc3luY1BhY2thZ2VUb0RldmljZShsb2NhbEZpbGVQYXRoKTsKICAgICAgICAgSW5zdGFsbFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEluc3RhbGxSZWNlaXZlcigpOwogICAgICAgICBTdHJpbmcgY21kID0gU3RyaW5nLmZvcm1hdChyZXBsYWNlID8gInBtIGluc3RhbGwgLXIgLWwgXCIlMSRzXCIiIDoKQEAgLTIzOSw5ICsyNjIsMTQgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBkZXN0UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiBmaWxlIG9uIGRldmljZSB0byBjaGVjawogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZSBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUmVtb3RlRmlsZUV4aXN0KFN0cmluZyBkZXN0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUmVtb3RlRmlsZUV4aXN0KFN0cmluZyBkZXN0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbHNHcmVwID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJscyAlcyIsIGRlc3RQYXRoKSk7CiAgICAgICAgIHJldHVybiAhbHNHcmVwLmNvbnRhaW5zKCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7CiAgICAgfQpAQCAtMjUyLDEwICsyODAsMTUgQEAKICAgICAgKiBAcGFyYW0gZGVzdFBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGUgZXhpc3RzIGNvbnRhaW5pbmcgZ2l2ZW4gc3RyaW5nLAogICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRvZXNSZW1vdGVGaWxlRXhpc3RDb250YWluaW5nU3RyaW5nKFN0cmluZyBkZXN0UGF0aCwgU3RyaW5nIHNlYXJjaFN0cmluZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBsc1Jlc3VsdCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgibHMgJXMiLCBkZXN0UGF0aCkpOwogICAgICAgICByZXR1cm4gbHNSZXN1bHQuY29udGFpbnMoc2VhcmNoU3RyaW5nKTsKICAgICB9CkBAIC0yNjUsOSArMjk4LDE0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIEFuZHJvaWQgbWFuaWZlc3QgcGFja2FnZSB0byBjaGVjay4KICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhY2thZ2UgZXhpc3RzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUGFja2FnZUV4aXN0KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUGFja2FnZUV4aXN0KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcGtnR3JlcCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgicG0gcGF0aCAlcyIsIHBhY2thZ2VOYW1lKSk7CiAgICAgICAgIHJldHVybiBwa2dHcmVwLmNvbnRhaW5zKCJwYWNrYWdlOiIpOwogICAgIH0KQEAgLTI3Nyw5ICszMTUsMTQgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG5hbWUgdG8gY2hlY2sgZm9yCiAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlIGV4aXN0cywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvZXNBcHBFeGlzdE9uRGV2aWNlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBkb2VzQXBwRXhpc3RPbkRldmljZShTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGRvZXNSZW1vdGVGaWxlRXhpc3RDb250YWluaW5nU3RyaW5nKERFVklDRV9BUFBfUEFUSCwgcGFja2FnZU5hbWUpOwogICAgIH0KIApAQCAtMjg4LDkgKzMzMSwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2UgbmFtZSB0byBjaGVjayBmb3IKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGUgZXhpc3RzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZG9lc0FwcEV4aXN0T25TRENhcmQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGRvZXNBcHBFeGlzdE9uU0RDYXJkKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZG9lc1JlbW90ZUZpbGVFeGlzdENvbnRhaW5pbmdTdHJpbmcoU0RDQVJEX0FQUF9QQVRILCBwYWNrYWdlTmFtZSk7CiAgICAgfQogCkBAIC0yOTksOSArMzQ3LDE0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBuYW1lIHRvIGNoZWNrIGZvcgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZSBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzQXBwRXhpc3RBc0ZvcndhcmRMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGRvZXNBcHBFeGlzdEFzRm9yd2FyZExvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGRvZXNSZW1vdGVGaWxlRXhpc3RDb250YWluaW5nU3RyaW5nKEFQUF9QUklWQVRFX1BBVEgsIHBhY2thZ2VOYW1lKTsKICAgICB9CiAKQEAgLTMwOSw5ICszNjIsMTQgQEAKICAgICAgKiBXYWl0cyBmb3IgZGV2aWNlJ3MgcGFja2FnZSBtYW5hZ2VyIHRvIHJlc3BvbmQuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JQYWNrYWdlTWFuYWdlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JQYWNrYWdlTWFuYWdlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJ3YWl0aW5nIGZvciBkZXZpY2UiKTsKICAgICAgICAgaW50IGN1cnJlbnRXYWl0VGltZSA9IDA7CiAgICAgICAgIC8vIHBvbGwgdGhlIHBhY2thZ2UgbWFuYWdlciB1bnRpbCBpdCByZXR1cm5zIHNvbWV0aGluZyBmb3IgYW5kcm9pZApAQCAtMzc3LDkgKzQzNSwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgdG8gbG9hZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdEZvckFwcChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JBcHAoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAid2FpdGluZyBmb3IgYXBwIHRvIGxhdW5jaCIpOwogICAgICAgICBpbnQgY3VycmVudFdhaXRUaW1lID0gMDsKICAgICAgICAgLy8gcG9sbCB0aGUgcGFja2FnZSBtYW5hZ2VyIHVudGlsIGl0IHJldHVybnMgc29tZXRoaW5nIGZvciB0aGUgcGFja2FnZSB3ZSdyZSBsb29raW5nIGZvcgpAQCAtMzk2LDkgKzQ1OSwxNCBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggZXhlY3V0ZXMgYSBhZGIgc2hlbGwgY29tbWFuZCBhbmQgcmV0dXJucyBvdXRwdXQgYXMgYSB7QGxpbmsgU3RyaW5nfQogICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFN0cmluZyBleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsIFN0cmluZy5mb3JtYXQoImFkYiBzaGVsbCAlcyIsIGNvbW1hbmQpKTsKICAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwogICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCwgcmVjZWl2ZXIpOwpAQCAtNDEwLDkgKzQ3OCwxNCBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgZW5zdXJlcyB3ZSBhcmUgaW4gcm9vdCBtb2RlIG9uIHRoZSBob3N0IHNpZGUuIEl0IHJldHVybnMgb25seSBhZnRlcgogICAgICAqIFBhY2thZ2VNYW5hZ2VyIGlzIGFjdHVhbGx5IHVwIGFuZCBydW5uaW5nLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5BZGJSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgcnVuQWRiUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJhZGIgcm9vdCIpOwogICAgICAgICBSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKICAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gcnVudGltZS5leGVjKCJhZGIgcm9vdCIpOyAvLyBhZGIgc2hvdWxkIGJlIGluIHRoZSBwYXRoCkBAIC00MzAsMTAgKzUwMywxNSBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggcmVib290cyB0aGUgZGV2aWNlIGFuZCByZXR1cm5zIG9uY2UgdGhlIGRldmljZSBpcyBvbmxpbmUgYWdhaW4KICAgICAgKiBhbmQgcGFja2FnZSBtYW5hZ2VyIGlzIHVwIGFuZCBydW5uaW5nIChub3RlIHRoaXMgZnVuY3Rpb24gaXMgc3luY2hyb25vdXMgdG8gY2FsbGVycykuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWJvb3REZXZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCByZWJvb3REZXZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJyZWJvb3QiOyAvLyBubyBuZWVkIGZvciAtcyBzaW5jZSBtRGV2aWNlIGlzIGFscmVhZHkgdGllZCB0byBhIGRldmljZQogICAgICAgICBMb2cuaShMT0dfVEFHLCBjb21tYW5kKTsKICAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwpAQCAtNDk4LDcgKzU3Niw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsVGVzdHNQYXNzZWQgPSB0cnVlOwogICAgICAgICBwcml2YXRlIFN0cmluZyBtVGVzdFJ1bkVycm9yTWVzc2FnZSA9IG51bGw7CiAKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEVuZGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEVuZGVkKFRlc3RJZGVudGlmaWVyIHRlc3QsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0cmljcykgewogICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgIH0KIApAQCAtNTA5LDcgKzU4Nyw3IEBACiAgICAgICAgICAgICBtQWxsVGVzdHNQYXNzZWQgPSBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdEJ1bmRsZSkgewogICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgIH0KIApAQCAtNTE5LDcgKzU5Nyw3IEBACiAgICAgICAgICAgICBtVGVzdFJ1bkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKGludCB0ZXN0Q291bnQpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoU3RyaW5nIHJ1bk5hbWUsIGludCB0ZXN0Q291bnQpIHsKICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICB9CiAKQEAgLTU4NiwxNyArNjY0LDIzIEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCBmb3IgaW5zdGFsbGluZyBhbiBhcHAgdG8gd2hlcmV2ZXIgaXMgc3BlY2lmaWVkIGluIGl0cyBtYW5pZmVzdCwgYW5kCiAgICAgICogdGhlbiB2ZXJpZnlpbmcgdGhlIGFwcCB3YXMgaW5zdGFsbGVkIG9udG8gU0QgQ2FyZC4KKyAgICAgKiA8cC8+CisgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqCiAgICAgICogQHBhcmFtIHRoZSBwYXRoIG9mIHRoZSBhcGsgdG8gaW5zdGFsbAogICAgICAqIEBwYXJhbSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZQogICAgICAqIEBwYXJhbSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXBwIHNob3VsZCBiZSBvdmVyd3JpdHRlbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAotICAgICAqIDxwLz4KLSAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnN0YWxsQXBwQW5kVmVyaWZ5RXhpc3RzT25TRENhcmQoU3RyaW5nIGFwa1BhdGgsIFN0cmluZyBwa2dOYW1lLCBib29sZWFuIG92ZXJ3cml0ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlIGlmIHdlJ3JlIG5vdCBvdmVyd3JpdGluZwogICAgICAgICBpZiAoIW92ZXJ3cml0ZSkgewogICAgICAgICAgICAgLy8gY2xlYW51cCB0ZXN0IGFwcCBqdXN0IGluIGNhc2UgaXQgYWxyZWFkeSBleGlzdHMKQEAgLTYxNywxNyArNzAxLDIzIEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCBmb3IgaW5zdGFsbGluZyBhbiBhcHAgdG8gd2hlcmV2ZXIgaXMgc3BlY2lmaWVkIGluIGl0cyBtYW5pZmVzdCwgYW5kCiAgICAgICogdGhlbiB2ZXJpZnlpbmcgdGhlIGFwcCB3YXMgaW5zdGFsbGVkIG9udG8gZGV2aWNlLgorICAgICAqIDxwLz4KKyAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGhlIHBhdGggb2YgdGhlIGFwayB0byBpbnN0YWxsCiAgICAgICogQHBhcmFtIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCiAgICAgICogQHBhcmFtIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcHAgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCi0gICAgICogPHAvPgotICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc3RhbGxBcHBBbmRWZXJpZnlFeGlzdHNPbkRldmljZShTdHJpbmcgYXBrUGF0aCwgU3RyaW5nIHBrZ05hbWUsIGJvb2xlYW4gb3ZlcndyaXRlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUgaWYgd2UncmUgbm90IG92ZXJ3cml0aW5nCiAgICAgICAgIGlmICghb3ZlcndyaXRlKSB7CiAgICAgICAgICAgICAvLyBjbGVhbnVwIHRlc3QgYXBwIGp1c3QgaW4gY2FzZSBpdCBhbHJlYWR5IGV4aXN0cwpAQCAtNjQ4LDE3ICs3MzgsMjQgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbnN0YWxsaW5nIGFuIGFwcCBhcyBmb3J3YXJkLWxvY2tlZCwgYW5kCiAgICAgICogdGhlbiB2ZXJpZnlpbmcgdGhlIGFwcCB3YXMgaW5zdGFsbGVkIGluIHRoZSBwcm9wZXIgZm9yd2FyZC1sb2NrZWQgbG9jYXRpb24uCisgICAgICogPHAvPgorICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKgogICAgICAqIEBwYXJhbSB0aGUgcGF0aCBvZiB0aGUgYXBrIHRvIGluc3RhbGwKICAgICAgKiBAcGFyYW0gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKICAgICAgKiBAcGFyYW0gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFwcCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKLSAgICAgKiA8cC8+Ci0gICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbEZ3ZExvY2tlZEFwcEFuZFZlcmlmeUV4aXN0cyhTdHJpbmcgYXBrUGF0aCwKLSAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lLCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgcGtnTmFtZSwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBTeW5jRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUgaWYgd2UncmUgbm90IG92ZXJ3cml0aW5nCiAgICAgICAgIGlmICghb3ZlcndyaXRlKSB7CiAgICAgICAgICAgICAvLyBjbGVhbnVwIHRlc3QgYXBwIGp1c3QgaW4gY2FzZSBpdCBhbHJlYWR5IGV4aXN0cwpAQCAtNjc5LDE0ICs3NzYsMjEgQEAKIAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgZm9yIHVuaW5zdGFsbGluZyBhbiBhcHAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGtnTmFtZSBwYWNrYWdlIG5hbWUgdG8gdW5pbnN0YWxsCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwa2dOYW1lIHBhY2thZ2UgbmFtZSB0byB1bmluc3RhbGwKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSB1bmluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuaW5zdGFsbEFwcChTdHJpbmcgcGtnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdW5pbnN0YWxsQXBwKFN0cmluZyBwa2dOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgbURldmljZS51bmluc3RhbGxQYWNrYWdlKHBrZ05hbWUpOwogICAgICAgICAvLyBtYWtlIHN1cmUgaXRzIG5vdCBpbnN0YWxsZWQgYW55bW9yZQogICAgICAgICBhc3NlcnRGYWxzZShkb2VzUGFja2FnZUV4aXN0KHBrZ05hbWUpKTsKQEAgLTY5NiwxMiArODAwLDE4IEBACiAgICAgICogSGVscGVyIG1ldGhvZCBmb3IgY2xlYXJpbmcgYW55IGluc3RhbGxlZCBub24tc3lzdGVtIGFwcHMuCiAgICAgICogVXNlZnVsIGVuc3VyaW5nIG5vIG5vbi1zeXN0ZW0gYXBwcyBhcmUgaW5zdGFsbGVkLCBhbmQgZm9yIGNsZWFuaW5nIHVwIHN0YWxlIGZpbGVzIHRoYXQKICAgICAgKiBtYXkgYmUgbGluZ2VyaW5nIG9uIHRoZSBzeXN0ZW0gZm9yIHdoYXRldmVyIHJlYXNvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgdW5pbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aXBlTm9uU3lzdGVtQXBwcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd2lwZU5vblN5c3RlbUFwcHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7CiAgICAgICBTdHJpbmcgYWxsSW5zdGFsbGVkUGFja2FnZXMgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJwbSBsaXN0IHBhY2thZ2VzIC1mIik7CiAgICAgICBCdWZmZXJlZFJlYWRlciBvdXRwdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihhbGxJbnN0YWxsZWRQYWNrYWdlcykpOwogCkBAIC03MjYsOCArODM2LDE0IEBACiAgICAgICoKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldmljZVByZWZlcnJlZEluc3RhbGxMb2NhdGlvbihJbnN0YWxsTG9jUHJlZmVyZW5jZSBwcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldERldmljZVByZWZlcnJlZEluc3RhbGxMb2NhdGlvbihJbnN0YWxsTG9jUHJlZmVyZW5jZSBwcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjb21tYW5kID0gInBtIHNldEluc3RhbGxMb2NhdGlvbiAlZCI7CiAgICAgICAgIGludCBsb2NWYWx1ZSA9IDA7CiAgICAgICAgIHN3aXRjaCAocHJlZikgewpAQCAtNzQ5LDggKzg2NSwxNCBAQAogICAgICAqCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5zdGFsbExvY1ByZWZlcmVuY2UgZ2V0RGV2aWNlUHJlZmVycmVkSW5zdGFsbExvY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgSW5zdGFsbExvY1ByZWZlcmVuY2UgZ2V0RGV2aWNlUHJlZmVycmVkSW5zdGFsbExvY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gZ2V0SW5zdGFsbExvY2F0aW9uIik7CiAgICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZignMCcpICE9IC0xKSB7CiAgICAgICAgICAgICByZXR1cm4gSW5zdGFsbExvY1ByZWZlcmVuY2UuQVVUTzsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdHMuamF2YQppbmRleCAxYjc5N2Q1Li4yMmEyYmU2IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RzLmphdmEKKysrIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0cy5qYXZhCkBAIC0xNiwxMyArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07CiAKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5NdWx0aUxpbmVSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLklTeW5jUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5TeW5jUmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdFN1aXRlOwogCkBAIC0xNTYsMTAgKzE1NSwxOCBAQAogICAgICAqIHRoZSBhcHAsIGFuZCBvdGhlcndpc2UgY2F1c2UgdGhlIHN5c3RlbSB0byBibG93IHVwLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEFwcFByaXZhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEFwcFByaXZhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sCisgICAgICAgICAgICBTeW5jRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlc3RpbmcgcHVzaGluZyBhbiBhcGsgdG8gL2RhdGEvYXBwLXByaXZhdGUiKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGFwa0FwcFByaXZhdGVQYXRoID0gIGFwcFByaXZhdGVQYXRoICsgU0lNUExFX0FQSzsKIApAQCAtMTg3LDEyICsxOTQsMTggQEAKICAgICAgKiBAcGFyYW0gYXBrTmFtZSB0aGUgZmlsZSBuYW1lIG9mIHRoZSB0ZXN0IGFwcCBhcGsKICAgICAgKiBAcGFyYW0gcGtnTmFtZSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSB0ZXN0IGFwcCBhcGsKICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRMb2NhdGlvbiB0aGUgZmlsZSBuYW1lIG9mIHRoZSB0ZXN0IGFwcCBhcGsKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBkb1N0YW5kYXJkSW5zdGFsbChTdHJpbmcgYXBrTmFtZSwgU3RyaW5nIHBrZ05hbWUsCiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uIGV4cGVjdGVkTG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKGV4cGVjdGVkTG9jYXRpb24gPT0gUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpIHsKICAgICAgICAgICAgIG1QTUhvc3RVdGlscy5pbnN0YWxsQXBwQW5kVmVyaWZ5RXhpc3RzT25EZXZpY2UoCkBAIC0yMTEsMTIgKzIyNCwxOCBAQAogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZSB0aGUgZGV2aWNlJ3MgcHJlZmVycmVkIGxvY2F0aW9uIG9mIHdoZXJlIHRvIGluc3RhbGwgYXBwcwogICAgICAqIEBwYXJhbSBleHBlY3RlZExvY2F0aW9uIHRoZSBleHBlY3RlZCBsb2NhdGlvbiBvZiB3aGVyZSB0aGUgYXBrIHdhcyBpbnN0YWxsZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc3RhbGxBcHBBdXRvTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBwcmVmZXJlbmNlLAogICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbiBleHBlY3RlZExvY2F0aW9uKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24gewogCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBzYXZlZFByZWYgPQogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPOwpAQCAtMjM5LDEwICsyNTgsMTYgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgZGV2aWNlIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBhdXRvLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEF1dG9Mb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBBdXRvTG9jUHJlZklzQXV0bygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxMb2NhdGlvbj1hdXRvLCBwcmVmZXI9YXV0byBnZXRzIGluc3RhbGxlZCBvbiBkZXZpY2UiKTsKICAgICAgICAgaW5zdGFsbEFwcEF1dG9Mb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLkFVVE8sCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpOwpAQCAtMjUzLDEwICsyNzgsMTcgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgZGV2aWNlIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBpbnRlcm5hbC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBBdXRvTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEF1dG9Mb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249YXV0bywgcHJlZmVyPWludGVybmFsIGdldHMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogICAgICAgICBpbnN0YWxsQXBwQXV0b0xvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuSU5URVJOQUwsCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpOwpAQCAtMjY3LDEwICsyOTksMTcgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgU0QgY2FyZCB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgZXh0ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwQXV0b0xvY1ByZWZJc0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBBdXRvTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWF1dG8sIHByZWZlcj1leHRlcm5hbCBnZXRzIGluc3RhbGxlZCBvbiBkZXZpY2UiKTsKICAgICAgICAgaW5zdGFsbEFwcEF1dG9Mb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLkVYVEVSTkFMLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uREVWSUNFKTsKQEAgLTI4MywxMiArMzIyLDE4IEBACiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlIHRoZSBkZXZpY2UncyBwcmVmZXJyZWQgbG9jYXRpb24gb2Ygd2hlcmUgdG8gaW5zdGFsbCBhcHBzCiAgICAgICogQHBhcmFtIGV4cGVjdGVkTG9jYXRpb24gdGhlIGV4cGVjdGVkIGxvY2F0aW9uIG9mIHdoZXJlIHRoZSBhcGsgd2FzIGluc3RhbGxlZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgKHVuKWluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc3RhbGxBcHBJbnRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UgcHJlZmVyZW5jZSwKICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24gZXhwZWN0ZWRMb2NhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKIAogICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2Ugc2F2ZWRQcmVmID0KICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPOwpAQCAtMzExLDEwICszNTYsMTcgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgZGV2aWNlIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBhdXRvLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEludGVybmFsTG9jUHJlZklzQXV0bygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxMb2NhdGlvbj1pbnRlcm5hbCwgcHJlZmVyPWF1dG8gZ2V0cyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAgICAgICAgIGluc3RhbGxBcHBJbnRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuQVVUTywKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLkRFVklDRSk7CkBAIC0zMjUsMTAgKzM3NywxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGludGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEludGVybmFsTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEludGVybmFsTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWludGVybmFsLCBwcmVmZXI9aW50ZXJuYWwgaXMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogICAgICAgICBpbnN0YWxsQXBwSW50ZXJuYWxMb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLklOVEVSTkFMLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uREVWSUNFKTsKQEAgLTMzOSwxMCArMzk4LDE3IEBACiAgICAgICogd2lsbCBpbnN0YWxsIHRoZSBhcHAgdG8gdGhlIGRldmljZSB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgZXh0ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249aW50ZXJuYWwsIHByZWZlcj1leHRlcm5hbCBpcyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAgICAgICAgIGluc3RhbGxBcHBJbnRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuRVhURVJOQUwsCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpOwpAQCAtMzU1LDEyICs0MjEsMTggQEAKICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2UgdGhlIGRldmljZSdzIHByZWZlcnJlZCBsb2NhdGlvbiBvZiB3aGVyZSB0byBpbnN0YWxsIGFwcHMKICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRMb2NhdGlvbiB0aGUgZXhwZWN0ZWQgbG9jYXRpb24gb2Ygd2hlcmUgdGhlIGFwayB3YXMgaW5zdGFsbGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnN0YWxsQXBwRXh0ZXJuYWxMb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHByZWZlcmVuY2UsCiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uIGV4cGVjdGVkTG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7CiAKICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHNhdmVkUHJlZiA9CiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuQVVUTzsKQEAgLTM4NCwxMCArNDU2LDE3IEBACiAgICAgICogd2lsbCBpbnN0YWxsIHRoZSBhcHAgdG8gdGhlIGRldmljZSB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgYXV0by4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBFeHRlcm5hbExvY1ByZWZJc0F1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzQXV0bygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249ZXh0ZXJuYWwsIHByZWY9YXV0byBnZXRzIGluc3RhbGxlZCBvbiBTRCBDYXJkIik7CiAgICAgICAgIGluc3RhbGxBcHBFeHRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuQVVUTywKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLlNEQ0FSRCk7CkBAIC0zOTgsMTAgKzQ3NywxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGludGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWV4dGVybmFsLCBwcmVmPWludGVybmFsIGdldHMgaW5zdGFsbGVkIG9uIFNEIENhcmQiKTsKICAgICAgICAgaW5zdGFsbEFwcEV4dGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5JTlRFUk5BTCwKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLlNEQ0FSRCk7CkBAIC00MTIsMTAgKzQ5OCwxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGV4dGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWV4dGVybmFsLCBwcmVmPWV4dGVybmFsIGdldHMgaW5zdGFsbGVkIG9uIFNEIENhcmQiKTsKICAgICAgICAgaW5zdGFsbEFwcEV4dGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5FWFRFUk5BTCwKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLlNEQ0FSRCk7CkBAIC00MjcsMTAgKzUyMCwxNyBAQAogICAgICAqIHN5c3RlbSBkZWNpZGUuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwTm9Mb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBOb0xvY1ByZWZJc0F1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggbm8gaW5zdGFsbExvY2F0aW9uIGdldHMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBzYXZlZFByZWYgPQpAQCAtNDU2LDEwICs1NTYsMTcgQEAKICAgICAgKiBleHRlcm5hbC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBOb0xvY1ByZWZJc0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBOb0xvY1ByZWZJc0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGFuIGFwcCB3aXRoIG5vIGluc3RhbGxMb2NhdGlvbiBnZXRzIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHNhdmVkUHJlZiA9CkBAIC00ODUsMTAgKzU5MiwxNyBAQAogICAgICAqIGludGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcE5vTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcE5vTG9jUHJlZklzSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggbm8gaW5zdGFsbExvY2F0aW9uIGdldHMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBzYXZlZFByZWYgPQpAQCAtNTEzLDEwICs2MjcsMTggQEAKICAgICAgKiBmb3J3YXJkLWxvY2tlZCB3aWxsIGdldCBpbnN0YWxsZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRndkTG9ja2VkQXBwSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGFuIGFwcCB3aXRoIGluc3RhbGxMb2Mgc2V0IHRvIEludGVybmFsIGdldHMgaW5zdGFsbGVkIHRvIGFwcC1wcml2YXRlIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTUzNCwxMCArNjU2LDE4IEBACiAgICAgICogZm9yd2FyZC1sb2NrZWQgd2lsbCBnZXQgaW5zdGFsbGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcEV4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxGd2RMb2NrZWRBcHBFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBTeW5jRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBhbiBhcHAgd2l0aCBpbnN0YWxsTG9jIHNldCB0byBJbnRlcm5hbCBnZXRzIGluc3RhbGxlZCB0byBhcHAtcHJpdmF0ZSIpOwogCiAgICAgICAgIHRyeSB7CkBAIC01NTUsMTAgKzY4NSwxOCBAQAogICAgICAqIGZvcndhcmQtbG9ja2VkIHdpbGwgZ2V0IGluc3RhbGxlZCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgU3luY0V4Y2VwdGlvbiBpZiB0aGUgc3luYyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxGd2RMb2NrZWRBcHBBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxGd2RMb2NrZWRBcHBBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGFuIGFwcCB3aXRoIGluc3RhbGxMb2Mgc2V0IHRvIEF1dG8gZ2V0cyBpbnN0YWxsZWQgdG8gYXBwLXByaXZhdGUiKTsKIAogICAgICAgICB0cnkgewpAQCAtNTc2LDEwICs3MTQsMTggQEAKICAgICAgKiBmb3J3YXJkLWxvY2tlZCBpbnN0YWxsZWQgd2lsbCBnZXQgaW5zdGFsbGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcE5vbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcE5vbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggbm8gaW5zdGFsbExvYyBzZXQgZ2V0cyBpbnN0YWxsZWQgdG8gYXBwLXByaXZhdGUiKTsKIAogICAgICAgICB0cnkgewpAQCAtNTk3LDE0ICs3NDMsMjEgQEAKICAgICAgKiB1bmluc3RhbGwgaXQsIGFuZCByZWluc3RhbGwgaXQgb250byB0aGUgU0QgY2FyZC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgLy8gVE9ETzogVGhpcyBjdXJyZW50bHkgcmVsaWVzIG9uIHRoZSBhcHAncyBtYW5pZmVzdCB0byBzd2l0Y2ggZnJvbSBkZXZpY2UgdG8KICAgICAvLyBTRCBjYXJkIGluc3RhbGwgbG9jYXRpb25zLiBXZSBtaWdodCB3YW50IHRvIG1ha2UgRGV2aWNlJ3MgaW5zdGFsbFBhY2thZ2UoKQogICAgIC8vIGFjY2VwdCBhIGluc3RhbGxMb2NhdGlvbiBmbGFnIHNvIHdlIGNhbiBpbnN0YWxsIGEgcGFja2FnZSB0byB0aGUKICAgICAvLyBkZXN0aW5hdGlvbiBvZiBvdXIgY2hvb3NpbmcuCi0gICAgcHVibGljIHZvaWQgdGVzdFJlaW5zdGFsbEludGVybmFsVG9FeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWluc3RhbGxJbnRlcm5hbFRvRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbGluZyBhbiBhcHAgZmlyc3QgdG8gdGhlIGRldmljZSwgdGhlbiB0byB0aGUgU0QgQ2FyZCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC02MjUsMTQgKzc3OCwyMSBAQAogICAgICAqIHVuaW5zdGFsbCBpdCwgYW5kIHJlaW5zdGFsbCBpdCBvbnRvIHRoZSBkZXZpY2UuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIC8vIFRPRE86IFRoaXMgY3VycmVudGx5IHJlbGllcyBvbiB0aGUgYXBwJ3MgbWFuaWZlc3QgdG8gc3dpdGNoIGZyb20gZGV2aWNlIHRvCiAgICAgLy8gU0QgY2FyZCBpbnN0YWxsIGxvY2F0aW9ucy4gV2UgbWlnaHQgd2FudCB0byBtYWtlIERldmljZSdzIGluc3RhbGxQYWNrYWdlKCkKICAgICAvLyBhY2NlcHQgYSBpbnN0YWxsTG9jYXRpb24gZmxhZyBzbyB3ZSBjYW4gaW5zdGFsbCBhIHBhY2thZ2UgdG8gdGhlCiAgICAgLy8gZGVzdGluYXRpb24gb2Ygb3VyIGNob29zaW5nLgotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWluc3RhbGxFeHRlcm5hbFRvSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVpbnN0YWxsRXh0ZXJuYWxUb0ludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxpbmcgYW4gYXBwIGZpcnN0IHRvIHRoZSBTRCBDYXJlLCB0aGVuIHRvIHRoZSBkZXZpY2UiKTsKIAogICAgICAgICB0cnkgewpAQCAtNjU1LDEwICs4MTUsMTYgQEAKICAgICAgKiB0aGUgdXBkYXRlIG9udG8gdGhlIFNEIGNhcmQgYXMgd2VsbCB3aGVuIGxvY2F0aW9uIGlzIHNldCB0byBleHRlcm5hbCBmb3IgYm90aCB2ZXJzaW9ucwogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQm90aEV4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUJvdGhFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IHVwZGF0aW5nIGFuIGFwcCBvbiB0aGUgU0QgY2FyZCBzdGF5cyBvbiB0aGUgU0QgY2FyZCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC02ODEsMTAgKzg0NywxNiBAQAogICAgICAqIHVwZGF0ZWQgYXBwcycgbWFuaWZlc3QgZmlsZS4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRvU0RDYXJkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRvU0RDYXJkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYW4gYXBwIG9uIHRoZSBTRCBjYXJkIHN0YXlzIG9uIHRoZSBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTcwNiwxMCArODc4LDE3IEBACiAgICAgICogdGhlIHVwZGF0ZSBvbnRvIHRoZSBkZXZpY2UgaWYgdGhlIG1hbmlmZXN0IGhhcyBjaGFuZ2VkIHRvIGluc3RhbGxMb2NhdGlvbj1pbnRlcm5hbE9ubHkKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNEQ2FyZFRvRGV2aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNEQ2FyZFRvRGV2aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IHVwZGF0aW5nIGFuIGFwcCBvbiB0aGUgU0QgY2FyZCB0byB0aGUgRGV2aWNlIHRocm91Z2ggbWFuaWZlc3QgY2hhbmdlIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTczMSwxMSArOTEwLDE4IEBACiAgICAgICogdGhlIHVwZGF0ZSBvbnRvIHRoZSBkZXZpY2UncyBmb3J3YXJkLWxvY2tlZCBsb2NhdGlvbgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZFVwZGF0ZUV4dGVybmFsTG9jRm9yd2FyZExvY2tlZEFwcCgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IHVwZGF0aW5nIGEgZm9yd2FyZC1sb2NrZWQgYXBwIG1hcmtlZCBwcmVmZXJFeHRlcm5hbCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC03NTcsMTEgKzk0MywxOCBAQAogICAgICAqIHRoZSB1cGRhdGUgb250byB0aGUgZGV2aWNlJ3MgZm9yd2FyZC1sb2NrZWQgbG9jYXRpb24KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgU3luY0V4Y2VwdGlvbiBpZiB0aGUgc3luYyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRVcGRhdGVOb0xvY0ZvcndhcmRMb2NrZWRBcHAoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBTeW5jRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCB1cGRhdGluZyBhIGZvcndhcmQtbG9ja2VkIGFwcCB3aXRoIG5vIGluc3RhbGxMb2NhdGlvbiBwcmVmIHNldCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC03ODMsMTEgKzk3NiwxOCBAQAogICAgICAqIGFuZCB0aGVuIGxhdW5jaGVkIHdpdGhvdXQgY3Jhc2hpbmcuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQW5kTGF1bmNoQWxsUGVybXNBcHBPblNEKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIGFsbCBwZXJtcyBzZXQsIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTgwOCwxMSArMTAwOCwxNyBAQAogICAgICAqIHJ1biB3aXRob3V0IHBlcm1pc3Npb25zIGVycm9ycy4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hGTFBlcm1zQXBwT25TRCgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGxhdW5jaGluZyBhbiBhcHAgd2l0aCBsb2NhdGlvbiBwZXJtcyBzZXQsIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTgzMywxMSArMTAzOSwxNyBAQAogICAgICAqIHJ1biB3aXRob3V0IHBlcm1pc3Npb25zIGVycm9ycy4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hCVFBlcm1zQXBwT25TRCgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGxhdW5jaGluZyBhbiBhcHAgd2l0aCBibHVldG9vdGggcGVybXMgc2V0LCBpbnN0YWxsZWQgb24gU0QgY2FyZCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC04NTgsMTEgKzEwNzAsMTcgQEAKICAgICAgKiBTZWN1cml0eUV4Y2VwdGlvbiB3aGVuIGxhdW5jaGVkIGlmIGl0cyBvdGhlciBzaGFyZWQgYXBwcyBhcmUgbm90IGluc3RhbGxlZC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hTaGFyZWRQZXJtc0FwcE9uU0RfTm9QZXJtcygpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGxhdW5jaGluZyBhbiBhcHAgd2l0aCBubyBleHBsaWNpdCBwZXJtcyBzZXQsIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTg4OCwxMSArMTEwNiwxNyBAQAogICAgICAqIHNoYXJlZCBhcHBzIGFyZSBpbnN0YWxsZWQuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQW5kTGF1bmNoU2hhcmVkUGVybXNBcHBPblNEX0dyYW50ZWRQZXJtcygpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGxhdW5jaGluZyBhbiBhcHAgd2l0aCBubyBleHBsaWNpdCBwZXJtcyBzZXQsIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTkyMSwxMSArMTE0NSwxNyBAQAogICAgICAqIHJ1biB3aXRob3V0IHBlcm1pc3Npb25zIGVycm9ycyBldmVuIGFmdGVyIGEgcmVib290CiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQW5kTGF1bmNoRkxQZXJtc0FwcE9uU0RfUmVib290KCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIGxvY2F0aW9uIHBlcm1zIHNldCwgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtOTUxLDExICsxMTgxLDE3IEBACiAgICAgICogc2hhcmVkIGFwcHMgYXJlIGluc3RhbGxlZCwgZXZlbiBhZnRlciBhIHJlYm9vdC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hTaGFyZWRQZXJtc0FwcE9uU0RfUmVib290KCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCBvbiBTRCwgd2l0aCBubyBleHBsaWNpdCBwZXJtcyBzZXQgYWZ0ZXIgcmVib290Iik7CiAKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJTdHJlc3NIb3N0VGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJTdHJlc3NIb3N0VGVzdHMuamF2YQppbmRleCA3MTVjNTViLi5hMmE1ZGQzIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyU3RyZXNzSG9zdFRlc3RzLmphdmEKKysrIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlclN0cmVzc0hvc3RUZXN0cy5qYXZhCkBAIC0xNiw4ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkluc3RhbGxFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmhvc3R0ZXN0LkRldmljZVRlc3RDYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmhvc3R0ZXN0LkRldmljZVRlc3RTdWl0ZTsKIApAQCAtMTM4LDcgKzE0MSw5IEBACiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXBwTWFueVRpbWVzT25TRCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBcHBNYW55VGltZXNPblNEKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IHVwZGF0aW5nIGFuIGFwcCBvbiBTRCBudW1lcm91cyB0aW1lcyIpOwogCiAgICAgICAgIC8vIGNsZWFudXAgdGVzdCBhcHAganVzdCBpbiBjYXNlIGl0IGFscmVhZHkgZXhpc3RzCkBAIC0xNzMsNyArMTc4LDkgQEAKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxSZWluc3RhbGxBcHBPblNETWFueVRpbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbFJlaW5zdGFsbEFwcE9uU0RNYW55VGltZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYW4gYXBwIG9uIHRoZSBTRCBjYXJkIHN0YXlzIG9uIHRoZSBTRCBjYXJkIik7CiAKICAgICAgICAgLy8gY2xlYW51cCB0ZXN0IGFwcCBqdXN0IGluIGNhc2UgaXQgd2FzIGFscmVhZHkgZXhpc3RzCkBAIC0yMDcsNyArMjE0LDkgQEAKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTWFueUxhcmdlQXBwc09uU0QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE1hbnlMYXJnZUFwcHNPblNEKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxpbmcgMjAgbGFyZ2UgYXBwcyBvbnRvIHRoZSBzZCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTI1MSw3ICsyNjAsOSBAQAogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxNYW55QXBwc09uU0QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE1hbnlBcHBzT25TRCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsaW5nIDUwMCBzbWFsbCBhcHBzIG9udG8gU0QiKTsKIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvbmV0L0Rvd25sb2FkTWFuYWdlckhvc3RUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvbmV0L0Rvd25sb2FkTWFuYWdlckhvc3RUZXN0cy5qYXZhCmluZGV4IGRmNzgxYmYuLmE5NDU1NWMgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXJIb3N0VGVzdHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VySG9zdFRlc3RzLmphdmEKQEAgLTE3LDIwICsxNywxMiBAQAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5Db2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklTaGVsbE91dHB1dFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk11bHRpTGluZVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuSVN5bmNQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLlN5bmNSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdFN1aXRlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwpkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvQVZSQ1Aua2wgYi9kYXRhL2tleWJvYXJkcy9BVlJDUC5rbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWIzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvQVZSQ1Aua2wKQEAgLTAsMCArMSw3IEBACitrZXkgMjAwICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCitrZXkgMjAxICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCitrZXkgMTY2ICAgTUVESUFfU1RPUCAgICAgICAgICBXQUtFCitrZXkgMTYzICAgTUVESUFfTkVYVCAgICAgICAgICBXQUtFCitrZXkgMTY1ICAgTUVESUFfUFJFVklPVVMgICAgICBXQUtFCitrZXkgMTY4ICAgTUVESUFfUkVXSU5EICAgICAgICBXQUtFCitrZXkgMjA4ICAgTUVESUFfRkFTVF9GT1JXQVJEICBXQUtFCmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9BbmRyb2lkLm1rIGIvZGF0YS9rZXlib2FyZHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFjNTMwCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IHF3ZXJ0eS5rY20KK2luY2x1ZGUgJChCVUlMRF9LRVlfQ0hBUl9NQVApCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IHF3ZXJ0eTIua2NtCitpbmNsdWRlICQoQlVJTERfS0VZX0NIQVJfTUFQKQorCitmaWxlIDo9ICQoVEFSR0VUX09VVF9LRVlMQVlPVVQpL3F3ZXJ0eS5rbAorQUxMX1BSRUJVSUxUICs9ICQoZmlsZSkKKyQoZmlsZSk6ICQoTE9DQUxfUEFUSCkvcXdlcnR5LmtsIHwgJChBQ1ApCisJJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQorCitmaWxlIDo9ICQoVEFSR0VUX09VVF9LRVlMQVlPVVQpL0FWUkNQLmtsCitBTExfUFJFQlVJTFQgKz0gJChmaWxlKQorJChmaWxlKSA6ICQoTE9DQUxfUEFUSCkvQVZSQ1Aua2wgfCAkKEFDUCkKKwkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9xd2VydHkua2NtIGIvZGF0YS9rZXlib2FyZHMvcXdlcnR5LmtjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU2MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvcXdlcnR5LmtjbQpAQCAtMCwwICsxLDY0IEBACitbdHlwZT1RV0VSVFldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMga2V5Y29kZSAgICAgICBkaXNwbGF5IG51bWJlciAgYmFzZSAgICBjYXBzICAgIGZuICAgICAgY2Fwc19mbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0EgICAgICAgICAgICAgICAnQScgICAgICcyJyAgICAgJ2EnICAgICAnQScgICAgICcjJyAgICAgMHgwMAorQiAgICAgICAgICAgICAgICdCJyAgICAgJzInICAgICAnYicgICAgICdCJyAgICAgJzwnICAgICAweDAwCitDICAgICAgICAgICAgICAgJ0MnICAgICAnMicgICAgICdjJyAgICAgJ0MnICAgICAnOScgICAgIDB4MDBFNworRCAgICAgICAgICAgICAgICdEJyAgICAgJzMnICAgICAnZCcgICAgICdEJyAgICAgJzUnICAgICAweDAwCitFICAgICAgICAgICAgICAgJ0UnICAgICAnMycgICAgICdlJyAgICAgJ0UnICAgICAnMicgICAgIDB4MDMwMQorRiAgICAgICAgICAgICAgICdGJyAgICAgJzMnICAgICAnZicgICAgICdGJyAgICAgJzYnICAgICAweDAwQTUKK0cgICAgICAgICAgICAgICAnRycgICAgICc0JyAgICAgJ2cnICAgICAnRycgICAgICctJyAgICAgJ18nCitIICAgICAgICAgICAgICAgJ0gnICAgICAnNCcgICAgICdoJyAgICAgJ0gnICAgICAnWycgICAgICd7JworSSAgICAgICAgICAgICAgICdJJyAgICAgJzQnICAgICAnaScgICAgICdJJyAgICAgJyQnICAgICAweDAzMDIKK0ogICAgICAgICAgICAgICAnSicgICAgICc1JyAgICAgJ2onICAgICAnSicgICAgICddJyAgICAgJ30nCitLICAgICAgICAgICAgICAgJ0snICAgICAnNScgICAgICdrJyAgICAgJ0snICAgICAnIicgICAgICd+JworTCAgICAgICAgICAgICAgICdMJyAgICAgJzUnICAgICAnbCcgICAgICdMJyAgICAgJycnICAgICAnYCcKK00gICAgICAgICAgICAgICAnTScgICAgICc2JyAgICAgJ20nICAgICAnTScgICAgICchJyAgICAgMHgwMAorTiAgICAgICAgICAgICAgICdOJyAgICAgJzYnICAgICAnbicgICAgICdOJyAgICAgJz4nICAgICAweDAzMDMKK08gICAgICAgICAgICAgICAnTycgICAgICc2JyAgICAgJ28nICAgICAnTycgICAgICcoJyAgICAgMHgwMAorUCAgICAgICAgICAgICAgICdQJyAgICAgJzcnICAgICAncCcgICAgICdQJyAgICAgJyknICAgICAweDAwCitRICAgICAgICAgICAgICAgJ1EnICAgICAnNycgICAgICdxJyAgICAgJ1EnICAgICAnKicgICAgIDB4MDMwMAorUiAgICAgICAgICAgICAgICdSJyAgICAgJzcnICAgICAncicgICAgICdSJyAgICAgJzMnICAgICAweDIwQUMKK1MgICAgICAgICAgICAgICAnUycgICAgICc3JyAgICAgJ3MnICAgICAnUycgICAgICc0JyAgICAgMHgwMERGCitUICAgICAgICAgICAgICAgJ1QnICAgICAnOCcgICAgICd0JyAgICAgJ1QnICAgICAnKycgICAgIDB4MDBBMworVSAgICAgICAgICAgICAgICdVJyAgICAgJzgnICAgICAndScgICAgICdVJyAgICAgJyYnICAgICAweDAzMDgKK1YgICAgICAgICAgICAgICAnVicgICAgICc4JyAgICAgJ3YnICAgICAnVicgICAgICc9JyAgICAgJ14nCitXICAgICAgICAgICAgICAgJ1cnICAgICAnOScgICAgICd3JyAgICAgJ1cnICAgICAnMScgICAgIDB4MDAKK1ggICAgICAgICAgICAgICAnWCcgICAgICc5JyAgICAgJ3gnICAgICAnWCcgICAgICc4JyAgICAgMHhFRjAwCitZICAgICAgICAgICAgICAgJ1knICAgICAnOScgICAgICd5JyAgICAgJ1knICAgICAnJScgICAgIDB4MDBBMQorWiAgICAgICAgICAgICAgICdaJyAgICAgJzknICAgICAneicgICAgICdaJyAgICAgJzcnICAgICAweDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyBvbiBwYyBrZXlib2FyZHMKK0NPTU1BICAgICAgICAgICAnLCcgICAgICcsJyAgICAgJywnICAgICAnOycgICAgICc7JyAgICAgJ3wnCitQRVJJT0QgICAgICAgICAgJy4nICAgICAnLicgICAgICcuJyAgICAgJzonICAgICAnOicgICAgIDB4MjAyNgorQVQgICAgICAgICAgICAgICdAJyAgICAgJzAnICAgICAnQCcgICAgICcwJyAgICAgJzAnICAgICAweDIwMjIKK1NMQVNIICAgICAgICAgICAnLycgICAgICcvJyAgICAgJy8nICAgICAnPycgICAgICc/JyAgICAgJ1wnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorU1BBQ0UgICAgICAgICAgIDB4MjAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHhFRjAxICAweEVGMDEKK0VOVEVSICAgICAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK1RBQiAgICAgICAgICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5CiswICAgICAgICAgICAgICAgJzAnICAgICAnMCcgICAgICcwJyAgICAgJyknICAgICAnKScgICAgICcpJworMSAgICAgICAgICAgICAgICcxJyAgICAgJzEnICAgICAnMScgICAgICchJyAgICAgJyEnICAgICAnIScKKzIgICAgICAgICAgICAgICAnMicgICAgICcyJyAgICAgJzInICAgICAnQCcgICAgICdAJyAgICAgJ0AnCiszICAgICAgICAgICAgICAgJzMnICAgICAnMycgICAgICczJyAgICAgJyMnICAgICAnIycgICAgICcjJworNCAgICAgICAgICAgICAgICc0JyAgICAgJzQnICAgICAnNCcgICAgICckJyAgICAgJyQnICAgICAnJCcKKzUgICAgICAgICAgICAgICAnNScgICAgICc1JyAgICAgJzUnICAgICAnJScgICAgICclJyAgICAgJyUnCis2ICAgICAgICAgICAgICAgJzYnICAgICAnNicgICAgICc2JyAgICAgJ14nICAgICAnXicgICAgICdeJworNyAgICAgICAgICAgICAgICc3JyAgICAgJzcnICAgICAnNycgICAgICcmJyAgICAgJyYnICAgICAnJicKKzggICAgICAgICAgICAgICAnOCcgICAgICc4JyAgICAgJzgnICAgICAnKicgICAgICcqJyAgICAgJyonCis5ICAgICAgICAgICAgICAgJzknICAgICAnOScgICAgICc5JyAgICAgJygnICAgICAnKCcgICAgICcoJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0dSQVZFICAgICAgICAgICAnYCcgICAgICdgJyAgICAgJ2AnICAgICAnficgICAgICdgJyAgICAgJ34nCitNSU5VUyAgICAgICAgICAgJy0nICAgICAnLScgICAgICctJyAgICAgJ18nICAgICAnLScgICAgICdfJworRVFVQUxTICAgICAgICAgICc9JyAgICAgJz0nICAgICAnPScgICAgICcrJyAgICAgJz0nICAgICAnKycKK0xFRlRfQlJBQ0tFVCAgICAnWycgICAgICdbJyAgICAgJ1snICAgICAneycgICAgICdbJyAgICAgJ3snCitSSUdIVF9CUkFDS0VUICAgJ10nICAgICAnXScgICAgICddJyAgICAgJ30nICAgICAnXScgICAgICd9JworQkFDS1NMQVNIICAgICAgICdcJyAgICAgJ1wnICAgICAnXCcgICAgICd8JyAgICAgJ1wnICAgICAnfCcKK1NFTUlDT0xPTiAgICAgICAnOycgICAgICc7JyAgICAgJzsnICAgICAnOicgICAgICc7JyAgICAgJzonCitBUE9TVFJPUEhFICAgICAgJycnICAgICAnJycgICAgICcnJyAgICAgJyInICAgICAnJycgICAgICciJworU1RBUiAgICAgICAgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicKK1BPVU5EICAgICAgICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnCitQTFVTICAgICAgICAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL3F3ZXJ0eS5rbCBiL2RhdGEva2V5Ym9hcmRzL3F3ZXJ0eS5rbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFjNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvcXdlcnR5LmtsCkBAIC0wLDAgKzEsOTEgQEAKK2tleSAzOTkgICBHUkFWRQora2V5IDIgICAgIDEKK2tleSAzICAgICAyCitrZXkgNCAgICAgMwora2V5IDUgICAgIDQKK2tleSA2ICAgICA1CitrZXkgNyAgICAgNgora2V5IDggICAgIDcKK2tleSA5ICAgICA4CitrZXkgMTAgICAgOQora2V5IDExICAgIDAKK2tleSAxNTggICBCQUNLICAgICAgICAgICAgICBXQUtFX0RST1BQRUQKK2tleSAyMzAgICBTT0ZUX1JJR0hUICAgICAgICBXQUtFCitrZXkgNjAgICAgU09GVF9SSUdIVCAgICAgICAgV0FLRQora2V5IDEwNyAgIEVORENBTEwgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDYyICAgIEVORENBTEwgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDIyOSAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEzOSAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDU5ICAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEyNyAgIFNFQVJDSCAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDIxNyAgIFNFQVJDSCAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDIyOCAgIFBPVU5ECitrZXkgMjI3ICAgU1RBUgora2V5IDIzMSAgIENBTEwgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDYxICAgIENBTEwgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDIzMiAgIERQQURfQ0VOVEVSICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEwOCAgIERQQURfRE9XTiAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEwMyAgIERQQURfVVAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEwMiAgIEhPTUUgICAgICAgICAgICAgIFdBS0UKK2tleSAxMDUgICBEUEFEX0xFRlQgICAgICAgICBXQUtFX0RST1BQRUQKK2tleSAxMDYgICBEUEFEX1JJR0hUICAgICAgICBXQUtFX0RST1BQRUQKK2tleSAxMTUgICBWT0xVTUVfVVAgICAgICAgICBXQUtFCitrZXkgMTE0ICAgVk9MVU1FX0RPV04gICAgICAgV0FLRQora2V5IDExNiAgIFBPV0VSICAgICAgICAgICAgIFdBS0UKK2tleSAyMTIgICBDQU1FUkEKKwora2V5IDE2ICAgIFEKK2tleSAxNyAgICBXCitrZXkgMTggICAgRQora2V5IDE5ICAgIFIKK2tleSAyMCAgICBUCitrZXkgMjEgICAgWQora2V5IDIyICAgIFUKK2tleSAyMyAgICBJCitrZXkgMjQgICAgTwora2V5IDI1ICAgIFAKK2tleSAyNiAgICBMRUZUX0JSQUNLRVQKK2tleSAyNyAgICBSSUdIVF9CUkFDS0VUCitrZXkgNDMgICAgQkFDS1NMQVNICisKK2tleSAzMCAgICBBCitrZXkgMzEgICAgUwora2V5IDMyICAgIEQKK2tleSAzMyAgICBGCitrZXkgMzQgICAgRwora2V5IDM1ICAgIEgKK2tleSAzNiAgICBKCitrZXkgMzcgICAgSwora2V5IDM4ICAgIEwKK2tleSAzOSAgICBTRU1JQ09MT04KK2tleSA0MCAgICBBUE9TVFJPUEhFCitrZXkgMTQgICAgREVMCisgICAgICAgIAora2V5IDQ0ICAgIFoKK2tleSA0NSAgICBYCitrZXkgNDYgICAgQwora2V5IDQ3ICAgIFYKK2tleSA0OCAgICBCCitrZXkgNDkgICAgTgora2V5IDUwICAgIE0KK2tleSA1MSAgICBDT01NQQora2V5IDUyICAgIFBFUklPRAora2V5IDUzICAgIFNMQVNICitrZXkgMjggICAgRU5URVIKKyAgICAgICAgCitrZXkgNTYgICAgQUxUX0xFRlQKK2tleSAxMDAgICBBTFRfUklHSFQKK2tleSA0MiAgICBTSElGVF9MRUZUCitrZXkgNTQgICAgU0hJRlRfUklHSFQKK2tleSAxNSAgICBUQUIKK2tleSA1NyAgICBTUEFDRQora2V5IDE1MCAgIEVYUExPUkVSCitrZXkgMTU1ICAgRU5WRUxPUEUgICAgICAgIAorCitrZXkgMTIgICAgTUlOVVMKK2tleSAxMyAgICBFUVVBTFMKK2tleSAyMTUgICBBVAorCisjIE9uIGFuIEFUIGtleWJvYXJkOiBFU0MsIEYxMAora2V5IDEgICAgIEJBQ0sgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDY4ICAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRApkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvcXdlcnR5Mi5rY20gYi9kYXRhL2tleWJvYXJkcy9xd2VydHkyLmtjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDg3ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvcXdlcnR5Mi5rY20KQEAgLTAsMCArMSw4MSBAQAorW3R5cGU9UVdFUlRZXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIHRoaXMga2V5bWFwIGlzIHRvIGJlIHVzZWQgaW4gdGhlIGVtdWxhdG9yIG9ubHkuIG5vdGUKKyMgdGhhdCBJIGhhdmUgbGliZXJhbGx5IG1vZGlmaWVkIGNlcnRhaW4ga2V5IHN0cm9rZXMgdG8KKyMgbWFrZSBpdCBtb3JlIHVzYWJsZSBpbiB0aGlzIGNvbnRleHQuIHRoZSBtYWluIGRpZmZlcmVuY2VzCisjIHdpdGggdGhlIHJlZmVyZW5jZSBrZXlib2FyZCBpbWFnZSBhcmU6CisjCisjICAtIGNhcC0yIHByb2R1Y2VzICdAJywgYW5kIG5vdCAnIicsIHdpdGhvdXQgdGhhdCwgdHlwaW5nCisjICAgIGVtYWlsIGFkZHJlc3NlcyBiZWNvbWVzIGEgbWFqb3IgcGFpbiB3aXRoIGEgcXdlcnR5CisjICAgIGtleWJvYXJkLiBub3RlIHRoYXQgeW91IGNhbiB0eXBlICciJyB3aXRoIGZuLUUgYW55d2F5LgorIworIyAgLSBjYXAtQ09NTUEgYW5kIGNhcC1QRVJJT0QgcmV0dXJuICc8JyBhbmQgJz4nLCBpbnN0ZWFkCisjICAgIG9mIG5vdGhpbmcuCisjCisjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyBrZXljb2RlICAgICAgIGRpc3BsYXkgIG51bWJlciBiYXNlICAgIGNhcHMgICAgZm4gICAgICBjYXBzX2ZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQSAgICAgICAgICAgICAgICdBJyAgICAgJzInICAgICAnYScgICAgICdBJyAgICAgJ2EnICAgICAnQScKK0IgICAgICAgICAgICAgICAnQicgICAgICcyJyAgICAgJ2InICAgICAnQicgICAgICdiJyAgICAgJ0InCitDICAgICAgICAgICAgICAgJ0MnICAgICAnMicgICAgICdjJyAgICAgJ0MnICAgICAweDAwZTcgIDB4MDBFNworRCAgICAgICAgICAgICAgICdEJyAgICAgJzMnICAgICAnZCcgICAgICdEJyAgICAgJycnICAgICAnJycKK0UgICAgICAgICAgICAgICAnRScgICAgICczJyAgICAgJ2UnICAgICAnRScgICAgICciJyAgICAgMHgwMzAxCitGICAgICAgICAgICAgICAgJ0YnICAgICAnMycgICAgICdmJyAgICAgJ0YnICAgICAnWycgICAgICdbJworRyAgICAgICAgICAgICAgICdHJyAgICAgJzQnICAgICAnZycgICAgICdHJyAgICAgJ10nICAgICAnXScKK0ggICAgICAgICAgICAgICAnSCcgICAgICc0JyAgICAgJ2gnICAgICAnSCcgICAgICc8JyAgICAgJzwnCitJICAgICAgICAgICAgICAgJ0knICAgICAnNCcgICAgICdpJyAgICAgJ0knICAgICAnLScgICAgIDB4MDMwMgorSiAgICAgICAgICAgICAgICdKJyAgICAgJzUnICAgICAnaicgICAgICdKJyAgICAgJz4nICAgICAnPicKK0sgICAgICAgICAgICAgICAnSycgICAgICc1JyAgICAgJ2snICAgICAnSycgICAgICc7JyAgICAgJ34nCitMICAgICAgICAgICAgICAgJ0wnICAgICAnNScgICAgICdsJyAgICAgJ0wnICAgICAnOicgICAgICdgJworTSAgICAgICAgICAgICAgICdNJyAgICAgJzYnICAgICAnbScgICAgICdNJyAgICAgJyUnICAgICAweDAwCitOICAgICAgICAgICAgICAgJ04nICAgICAnNicgICAgICduJyAgICAgJ04nICAgICAweDAwICAgIDB4MDMwMworTyAgICAgICAgICAgICAgICdPJyAgICAgJzYnICAgICAnbycgICAgICdPJyAgICAgJysnICAgICAnKycKK1AgICAgICAgICAgICAgICAnUCcgICAgICc3JyAgICAgJ3AnICAgICAnUCcgICAgICc9JyAgICAgMHgwMEE1CitRICAgICAgICAgICAgICAgJ1EnICAgICAnNycgICAgICdxJyAgICAgJ1EnICAgICAnfCcgICAgIDB4MDMwMAorUiAgICAgICAgICAgICAgICdSJyAgICAgJzcnICAgICAncicgICAgICdSJyAgICAgJ2AnICAgICAweDIwQUMKK1MgICAgICAgICAgICAgICAnUycgICAgICc3JyAgICAgJ3MnICAgICAnUycgICAgICdcJyAgICAgMHgwMERGCitUICAgICAgICAgICAgICAgJ1QnICAgICAnOCcgICAgICd0JyAgICAgJ1QnICAgICAneycgICAgIDB4MDBBMworVSAgICAgICAgICAgICAgICdVJyAgICAgJzgnICAgICAndScgICAgICdVJyAgICAgJ18nICAgICAweDAzMDgKK1YgICAgICAgICAgICAgICAnVicgICAgICc4JyAgICAgJ3YnICAgICAnVicgICAgICd2JyAgICAgJ1YnCitXICAgICAgICAgICAgICAgJ1cnICAgICAnOScgICAgICd3JyAgICAgJ1cnICAgICAnficgICAgICd+JworWCAgICAgICAgICAgICAgICdYJyAgICAgJzknICAgICAneCcgICAgICdYJyAgICAgJ3gnICAgICAweEVGMDAKK1kgICAgICAgICAgICAgICAnWScgICAgICc5JyAgICAgJ3knICAgICAnWScgICAgICd9JyAgICAgMHgwMEExCitaICAgICAgICAgICAgICAgJ1onICAgICAnOScgICAgICd6JyAgICAgJ1onICAgICAneicgICAgICdaJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0NPTU1BICAgICAgICAgICAnLCcgICAgICcsJyAgICAgJywnICAgICAnPCcgICAgICcsJyAgICAgJywnCitQRVJJT0QgICAgICAgICAgJy4nICAgICAnLicgICAgICcuJyAgICAgJz4nICAgICAnLicgICAgIDB4MjAyNgorQVQgICAgICAgICAgICAgICdAJyAgICAgJ0AnICAgICAnQCcgICAgICdAJyAgICAgJ0AnICAgICAweDIwMjIKK1NMQVNIICAgICAgICAgICAnLycgICAgICcvJyAgICAgJy8nICAgICAnPycgICAgICc/JyAgICAgJz8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorU1BBQ0UgICAgICAgICAgIDB4MjAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHhFRjAxICAweEVGMDEKK0VOVEVSICAgICAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzAgICAgICAgICAgICAgICAnMCcgICAgICcwJyAgICAgJzAnICAgICAnKScgICAgICcpJyAgICAgJyknCisxICAgICAgICAgICAgICAgJzEnICAgICAnMScgICAgICcxJyAgICAgJyEnICAgICAnIScgICAgICchJworMiAgICAgICAgICAgICAgICcyJyAgICAgJzInICAgICAnMicgICAgICdAJyAgICAgJ0AnICAgICAnQCcKKzMgICAgICAgICAgICAgICAnMycgICAgICczJyAgICAgJzMnICAgICAnIycgICAgICcjJyAgICAgJyMnCis0ICAgICAgICAgICAgICAgJzQnICAgICAnNCcgICAgICc0JyAgICAgJyQnICAgICAnJCcgICAgICckJworNSAgICAgICAgICAgICAgICc1JyAgICAgJzUnICAgICAnNScgICAgICclJyAgICAgJyUnICAgICAnJScKKzYgICAgICAgICAgICAgICAnNicgICAgICc2JyAgICAgJzYnICAgICAnXicgICAgICdeJyAgICAgJ14nCis3ICAgICAgICAgICAgICAgJzcnICAgICAnNycgICAgICc3JyAgICAgJyYnICAgICAnJicgICAgICcmJworOCAgICAgICAgICAgICAgICc4JyAgICAgJzgnICAgICAnOCcgICAgICcqJyAgICAgJyonICAgICAnKicKKzkgICAgICAgICAgICAgICAnOScgICAgICc5JyAgICAgJzknICAgICAnKCcgICAgICcoJyAgICAgJygnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyB0aGUgcmVzdCBpcyBmb3IgYSBxd2VydHkga2V5Ym9hcmQKKyMKK1RBQiAgICAgICAgICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5CitHUkFWRSAgICAgICAgICAgJ2AnICAgICAnYCcgICAgICdgJyAgICAgJ34nICAgICAnYCcgICAgICd+JworTUlOVVMgICAgICAgICAgICctJyAgICAgJy0nICAgICAnLScgICAgICdfJyAgICAgJy0nICAgICAnXycKK0VRVUFMUyAgICAgICAgICAnPScgICAgICc9JyAgICAgJz0nICAgICAnKycgICAgICc9JyAgICAgJysnCitMRUZUX0JSQUNLRVQgICAgJ1snICAgICAnWycgICAgICdbJyAgICAgJ3snICAgICAnWycgICAgICd7JworUklHSFRfQlJBQ0tFVCAgICddJyAgICAgJ10nICAgICAnXScgICAgICd9JyAgICAgJ10nICAgICAnfScKK0JBQ0tTTEFTSCAgICAgICAnXCcgICAgICdcJyAgICAgJ1wnICAgICAnfCcgICAgICdcJyAgICAgJ3wnCitTRU1JQ09MT04gICAgICAgJzsnICAgICAnOycgICAgICc7JyAgICAgJzonICAgICAnOycgICAgICc6JworQVBPU1RST1BIRSAgICAgICcnJyAgICAgJycnICAgICAnJycgICAgICciJyAgICAgJycnICAgICAnIicKK1NUQVIgICAgICAgICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonCitQT1VORCAgICAgICAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJworUExVUyAgICAgICAgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2RhdGEvc291bmRzL0FsbEF1ZGlvLm1rIGIvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3YTQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEvc291bmRzL0FsbEF1ZGlvLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9PcmlnaW5hbEF1ZGlvLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL0F1ZGlvUGFja2FnZTIubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvQXVkaW9QYWNrYWdlMy5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9BdWRpb1BhY2thZ2U0Lm1rKQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2NvbW11bml0eS9pbmRleC5qZCBiL2RvY3MvaHRtbC9jb21tdW5pdHkvaW5kZXguamQKaW5kZXggM2U2OWRlNC4uMjMyMDNjMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2NvbW11bml0eS9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvY29tbXVuaXR5L2luZGV4LmpkCkBAIC00LDEwICs0LDEwIEBACiAKIAk8ZGl2IGlkPSJtYWluQm9keUZsdWlkIj4KIDxoMT5Db21tdW5pdHk8L2gxPgotPHA+V2VsY29tZSB0byB0aGUgQW5kcm9pZCBkZXZlbG9wZXJzIGNvbW11bml0eSEgV2UncmUgZ2xhZCB5b3UncmUgaGVyZSBhbmQgaW52aXRlIHlvdSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGVzZSBkaXNjdXNzaW9ucy4gQmVmb3JlIHBvc3RpbmcsIHBsZWFzZSByZWFkIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj5Hcm91cHMgQ2hhcnRlcjwvYT4gdGhhdCBjb3ZlcnMgdGhlIGNvbW11bml0eSBndWlkZWxpbmVzLjwvcD4KKzxwPldlbGNvbWUgdG8gdGhlIEFuZHJvaWQgZGV2ZWxvcGVycyBjb21tdW5pdHkhIFdlJ3JlIGdsYWQgeW91J3JlIGhlcmUgYW5kIGludml0ZSB5b3UgdG8gcGFydGljaXBhdGUgaW4gdGhlc2UgZGlzY3Vzc2lvbnMuIEJlZm9yZSBwb3N0aW5nLCBwbGVhc2UgcmVhZCB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuaHRtbCI+R3JvdXBzIENoYXJ0ZXI8L2E+IHRoYXQgY292ZXJzIHRoZSBjb21tdW5pdHkgZ3VpZGVsaW5lcy48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBhcmUgc2Vla2luZyBkaXNjdXNzaW9uIGFib3V0IEFuZHJvaWQgc291cmNlIGNvZGUgKG5vdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCksCi10aGVuIHBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzIj5PcGVuIFNvdXJjZSBQcm9qZWN0IE1haWxpbmcgbGlzdHM8L2E+LjwvcD4KK3RoZW4gcGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eSI+T3BlbiBTb3VyY2UgUHJvamVjdCBNYWlsaW5nIGxpc3RzPC9hPi48L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOi41ZW0iPjxzdHJvbmc+Q29udGVudHM8L3N0cm9uZz48L3A+CiA8b2wgY2xhc3M9InRvYyI+CkBAIC0zMSw3ICszMSw3IEBACiBBcyB5b3Ugd3JpdGUgeW91ciBwb3N0LCBwbGVhc2UgZG8gdGhlIGZvbGxvd2luZzoKIDxvbD4KIDxsaT48Yj5SZWFkCi10aGUgPGEgaHJlZj0iaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vYS9hbmRyb2lkLmNvbS9vcGVuc291cmNlL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj5tYWlsaW5nIGxpc3QgY2hhcnRlcjwvYT48L2I+IHRoYXQgY292ZXJzIHRoZSBjb21tdW5pdHkgZ3VpZGVsaW5lcy4gCit0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuaHRtbCI+bWFpbGluZyBsaXN0IGNoYXJ0ZXI8L2E+PC9iPiB0aGF0IGNvdmVycyB0aGUgY29tbXVuaXR5IGd1aWRlbGluZXMuIAogPC9saT4KIDxsaT48Yj5TZWxlY3QgdGhlIG1vc3QgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0IGZvciB5b3VyIHF1ZXN0aW9uPC9iPi4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IGxpc3RzIGZvciAKIGRldmVsb3BlcnMsIGRlc2NyaWJlZCBiZWxvdy48L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvYW5pbWF0aW9uLXJlc291cmNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvYW5pbWF0aW9uLXJlc291cmNlLmpkCmluZGV4IGUwY2UwNTEuLjk3MmRkNzIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2FuaW1hdGlvbi1yZXNvdXJjZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuamQKQEAgLTY1LDEwICs2NSwxMCBAQAogICAgICAgICBhbmRyb2lkOnBpdm90WD0iPGVtPmZsb2F0PC9lbT4iCiAgICAgICAgIGFuZHJvaWQ6cGl2b3RZPSI8ZW0+ZmxvYXQ8L2VtPiIgLyZndDsKICAgICAmbHQ7PGEgaHJlZj0iI3RyYW5zbGF0ZS1lbGVtZW50Ij50cmFuc2xhdGU8L2E+Ci0gICAgICAgIGFuZHJvaWQ6ZnJvbVg9IjxlbT5mbG9hdDwvZW0+IgotICAgICAgICBhbmRyb2lkOnRvWD0iPGVtPmZsb2F0PC9lbT4iCi0gICAgICAgIGFuZHJvaWQ6ZnJvbVk9IjxlbT5mbG9hdDwvZW0+IgotICAgICAgICBhbmRyb2lkOnRvWT0iPGVtPmZsb2F0PC9lbT4iIC8mZ3Q7CisgICAgICAgIGFuZHJvaWQ6ZnJvbVhEZWx0YT0iPGVtPmZsb2F0PC9lbT4iCisgICAgICAgIGFuZHJvaWQ6dG9YRGVsdGE9IjxlbT5mbG9hdDwvZW0+IgorICAgICAgICBhbmRyb2lkOmZyb21ZRGVsdGE9IjxlbT5mbG9hdDwvZW0+IgorICAgICAgICBhbmRyb2lkOnRvWURlbHRhPSI8ZW0+ZmxvYXQ8L2VtPiIgLyZndDsKICAgICAmbHQ7PGEgaHJlZj0iI3JvdGF0ZS1lbGVtZW50Ij5yb3RhdGU8L2E+CiAgICAgICAgIGFuZHJvaWQ6ZnJvbURlZ3JlZXM9IjxlbT5mbG9hdDwvZW0+IgogICAgICAgICBhbmRyb2lkOnRvRGVncmVlcz0iPGVtPmZsb2F0PC9lbT4iCkBAIC0yMTIsMTAgKzIxMiwxMCBAQAogICAgIGFuZHJvaWQ6c2hhcmVJbnRlcnBvbGF0b3I9ImZhbHNlIj4KICAgICAmbHQ7c2NhbGUKICAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmRyb2lkOmFuaW0vYWNjZWxlcmF0ZV9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKLSAgICAgICAgYW5kcm9pZDpmcm9tWFNjYWxlPSIxLjAiIAotICAgICAgICBhbmRyb2lkOnRvWFNjYWxlPSIxLjQiIAotICAgICAgICBhbmRyb2lkOmZyb21ZU2NhbGU9IjEuMCIgCi0gICAgICAgIGFuZHJvaWQ6dG9ZU2NhbGU9IjAuNiIgCisgICAgICAgIGFuZHJvaWQ6ZnJvbVhTY2FsZT0iMS4wIgorICAgICAgICBhbmRyb2lkOnRvWFNjYWxlPSIxLjQiCisgICAgICAgIGFuZHJvaWQ6ZnJvbVlTY2FsZT0iMS4wIgorICAgICAgICBhbmRyb2lkOnRvWVNjYWxlPSIwLjYiCiAgICAgICAgIGFuZHJvaWQ6cGl2b3RYPSI1MCUiCiAgICAgICAgIGFuZHJvaWQ6cGl2b3RZPSI1MCUiCiAgICAgICAgIGFuZHJvaWQ6ZmlsbEFmdGVyPSJmYWxzZSIKQEAgLTIyNCwxOCArMjI0LDE4IEBACiAgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5kcm9pZDphbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgogICAgICAgICBhbmRyb2lkOnN0YXJ0T2Zmc2V0PSI3MDAiPgogICAgICAgICAmbHQ7c2NhbGUKLSAgICAgICAgICAgIGFuZHJvaWQ6ZnJvbVhTY2FsZT0iMS40IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6ZnJvbVhTY2FsZT0iMS40IgogICAgICAgICAgICAgYW5kcm9pZDp0b1hTY2FsZT0iMC4wIgogICAgICAgICAgICAgYW5kcm9pZDpmcm9tWVNjYWxlPSIwLjYiCi0gICAgICAgICAgICBhbmRyb2lkOnRvWVNjYWxlPSIwLjAiIAotICAgICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjUwJSIgCi0gICAgICAgICAgICBhbmRyb2lkOnBpdm90WT0iNTAlIiAKKyAgICAgICAgICAgIGFuZHJvaWQ6dG9ZU2NhbGU9IjAuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RYPSI1MCUiCisgICAgICAgICAgICBhbmRyb2lkOnBpdm90WT0iNTAlIgogICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNDAwIiAvPgogICAgICAgICAmbHQ7cm90YXRlCi0gICAgICAgICAgICBhbmRyb2lkOmZyb21EZWdyZWVzPSIwIiAKKyAgICAgICAgICAgIGFuZHJvaWQ6ZnJvbURlZ3JlZXM9IjAiCiAgICAgICAgICAgICBhbmRyb2lkOnRvRGVncmVlcz0iLTQ1IgotICAgICAgICAgICAgYW5kcm9pZDp0b1lTY2FsZT0iMC4wIiAKLSAgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RYPSI1MCUiIAorICAgICAgICAgICAgYW5kcm9pZDp0b1lTY2FsZT0iMC4wIgorICAgICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjUwJSIKICAgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RZPSI1MCUiCiAgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI0MDAiIC8+CiAgICAgJmx0Oy9zZXQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZAppbmRleCA1ZDAwZGIxLi42MDAzMGYwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKQEAgLTQ5NCw2ICs0OTQsNyBAQAogICAgICAgPHRkPktleWJvYXJkIGF2YWlsYWJpbGl0eTwvdGQ+CiAgICAgICA8dGQ+CiAgICAgICAgIDxjb2RlPmtleXNleHBvc2VkPC9jb2RlPjxici8+CisgICAgICAgIDxjb2RlPmtleXNoaWRkZW48L2NvZGU+PGJyLz4KICAgICAgICAgPGNvZGU+a2V5c3NvZnQ8L2NvZGU+CiAgICAgICA8L3RkPgogICAgICAgPHRkPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkIGIvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkCmluZGV4IDY1OWFlZTcuLjQ5MGIyM2YgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQKQEAgLTQsOSArNCw5IEBACiAKIAk8ZGl2IGlkPSJtYWluQm9keUZsdWlkIj4KIAkJCTxoMT7jgrPjg5/jg6Xjg4vjg4bjgqM8L2gxPgotCQkJPHA+QW5kcm9pZCDjg4fjg5njg63jg4Pjg5Hjg7wg44Kz44Of44Ol44OL44OG44Kj44G444KI44GG44GT44Gd44CC44Kz44Of44Ol44OL44OG44Kj44Gn44Gu44OH44Kj44K544Kr44OD44K344On44Oz44Gr44Gc44Gy5Y+C5Yqg44GX44Gm44GP44Gg44GV44GE44CC5oqV56i/44GZ44KL5YmN44Gr44CB44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3Vzcy9hbmRyb2lkLWRpc2N1c3Npb24tZ3JvdXBzLWNoYXJ0ZXIiPuOCsOODq+ODvOODl+OBrui2o+aEjzwvYT7jgpLjgYroqq3jgb/jgY/jgaDjgZXjgYTjgII8L3A+CisJCQk8cD5BbmRyb2lkIOODh+ODmeODreODg+ODkeODvCDjgrPjg5/jg6Xjg4vjg4bjgqPjgbjjgojjgYbjgZPjgZ3jgILjgrPjg5/jg6Xjg4vjg4bjgqPjgafjga7jg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7PjgavjgZzjgbLlj4LliqDjgZfjgabjgY/jgaDjgZXjgYTjgILmipXnqL/jgZnjgovliY3jgavjgIHjgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuaHRtbCI+44Kw44Or44O844OX44Gu6Laj5oSPPC9hPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+5rOoOjwvc3Ryb25nPiBBbmRyb2lkIOOCveODvOOCuSDjgrPjg7zjg4nvvIjjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pplovnmbrjgafjga/jgarjgY/vvInjgavplqLjgZnjgovjg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7Pjga/jgIE8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MiPuOCquODvOODl+ODs+OCveODvOOCuSDjg5fjg63jgrjjgqfjgq/jg4jjga7jg6Hjg7zjg6rjg7PjgrAg44Oq44K544OIPC9hPu+8iOiLseiqnu+8ieOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAgjwvcD4KKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPuazqDo8L3N0cm9uZz4gQW5kcm9pZCDjgr3jg7zjgrkg44Kz44O844OJ77yI44Ki44OX44Oq44Kx44O844K344On44Oz6ZaL55m644Gn44Gv44Gq44GP77yJ44Gr6Zai44GZ44KL44OH44Kj44K544Kr44OD44K344On44Oz44Gv44CBPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkiPuOCquODvOODl+ODs+OCveODvOOCuSDjg5fjg63jgrjjgqfjgq/jg4jjga7jg6Hjg7zjg6rjg7PjgrAg44Oq44K544OIPC9hPu+8iOiLseiqnu+8ieOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAgjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206LjVlbSI+PHN0cm9uZz7nm67mrKE8L3N0cm9uZz48L3A+CiA8b2wgY2xhc3M9InRvYyI+CkBAIC0yOCw3ICsyOCw3IEBACiAKIDxwPuizquWVj+OBuOOBruetlOOBiOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOAgeOCs+ODn+ODpeODi+ODhuOCo+OBp+izquWVj+OBmeOCi+OBk+OBqOOCkuOBiuOBmeOBmeOCgeOBl+OBvuOBmeOAguaKleeov+OBmeOCi+mam+OBr+OAgeasoeOBruaJi+mghuOBq+W+k+OBo+OBpuOBj+OBoOOBleOBhOOAggogPG9sPgotPGxpPuOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8Yj48YSBocmVmPSJodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9hL2FuZHJvaWQuY29tL29wZW5zb3VyY2UvZGlzY3Vzcy9hbmRyb2lkLWRpc2N1c3Npb24tZ3JvdXBzLWNoYXJ0ZXIiPkFuZHJvaWQg44Oh44O844Oq44Oz44Kw44Oq44K544OI44Gu6Laj5oSPPC9hPjwvYj7jgpLjgYroqq3jgb/jgY/jgaDjgZXjgYTjgIIgCis8bGk+44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxiPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmh0bWwiPkFuZHJvaWQg44Oh44O844Oq44Oz44Kw44Oq44K544OI44Gu6Laj5oSPPC9hPjwvYj7jgpLjgYroqq3jgb/jgY/jgaDjgZXjgYTjgIIgCiA8L2xpPgogPGxpPjxiPuizquWVj+OBq+acgOmBqeOBquODoeODvOODquODs+OCsCDjg6rjgrnjg4jjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYQ8L2I+44CC5b6M6L+w44GZ44KL44KI44GG44Gr44CB44OH44OZ44Ot44OD44OR44O85ZCR44GR44Gu44Oh44O844Oq44Oz44KwIOODquOCueODiOOBr+S9leeorumhnuOBi+OBq+WIhuOBi+OCjOOBpuOBhOOBvuOBmeOAgjwvbGk+CiA8bGk+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW50bC9qYS9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZCBiL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCmluZGV4IGM5OWIxZjguLmVjZWRkZTEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCisrKyBiL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCkBAIC00LDkgKzQsOSBAQAogCiAJPGRpdiBpZD0ibWFpbkJvZHlGbHVpZCI+CiAJCQk8aDE+44Kz44Of44Ol44OL44OG44KjPC9oMT4KLQkJCTxwPkFuZHJvaWQg44OH44OZ44Ot44OD44OR44O8IOOCs+ODn+ODpeODi+ODhuOCo+OBuOOCiOOBhuOBk+OBneOAguOCs+ODn+ODpeODi+ODhuOCo+OBp+OBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBq+OBnOOBsuWPguWKoOOBl+OBpuOBj+OBoOOBleOBhOOAguaKleeov+OBmeOCi+WJjeOBq+OAgeOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj7jgrDjg6vjg7zjg5fjga7otqPmhI88L2E+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCPC9wPgorCQkJPHA+QW5kcm9pZCDjg4fjg5njg63jg4Pjg5Hjg7wg44Kz44Of44Ol44OL44OG44Kj44G444KI44GG44GT44Gd44CC44Kz44Of44Ol44OL44OG44Kj44Gn44Gu44OH44Kj44K544Kr44OD44K344On44Oz44Gr44Gc44Gy5Y+C5Yqg44GX44Gm44GP44Gg44GV44GE44CC5oqV56i/44GZ44KL5YmN44Gr44CB44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmh0bWwiPuOCsOODq+ODvOODl+OBrui2o+aEjzwvYT7jgpLjgYroqq3jgb/jgY/jgaDjgZXjgYTjgII8L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPuazqDo8L3N0cm9uZz4gQW5kcm9pZCDjgr3jg7zjgrkg44Kz44O844OJ77yI44Ki44OX44Oq44Kx44O844K344On44Oz6ZaL55m644Gn44Gv44Gq44GP77yJ44Gr6Zai44GZ44KL44OH44Kj44K544Kr44OD44K344On44Oz44Gv44CBPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzIj7jgqrjg7zjg5fjg7Pjgr3jg7zjgrkg44OX44Ot44K444Kn44Kv44OI44Gu44Oh44O844Oq44Oz44KwIOODquOCueODiDwvYT7vvIjoi7Hoqp7vvInjgpLlj4LnhafjgZfjgabjgY/jgaDjgZXjgYTjgII8L3A+Cis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz7ms6g6PC9zdHJvbmc+IEFuZHJvaWQg44K944O844K5IOOCs+ODvOODie+8iOOCouODl+ODquOCseODvOOCt+ODp+ODs+mWi+eZuuOBp+OBr+OBquOBj++8ieOBq+mWouOBmeOCi+ODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBr+OAgTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5Ij7jgqrjg7zjg5fjg7Pjgr3jg7zjgrkg44OX44Ot44K444Kn44Kv44OI44Gu44Oh44O844Oq44Oz44KwIOODquOCueODiDwvYT7vvIjoi7Hoqp7vvInjgpLlj4LnhafjgZfjgabjgY/jgaDjgZXjgYTjgII8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOi41ZW0iPjxzdHJvbmc+55uu5qyhPC9zdHJvbmc+PC9wPgogPG9sIGNsYXNzPSJ0b2MiPgpAQCAtMjgsNyArMjgsNyBAQAogCiA8cD7os6rllY/jgbjjga7nrZTjgYjjgYzopovjgaTjgYvjgonjgarjgYTloLTlkIjjgIHjgrPjg5/jg6Xjg4vjg4bjgqPjgafos6rllY/jgZnjgovjgZPjgajjgpLjgYrjgZnjgZnjgoHjgZfjgb7jgZnjgILmipXnqL/jgZnjgovpmpvjga/jgIHmrKHjga7miYvpoIbjgavlvpPjgaPjgabjgY/jgaDjgZXjgYTjgIIKIDxvbD4KLTxsaT7jgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGI+PGEgaHJlZj0iaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vYS9hbmRyb2lkLmNvbS9vcGVuc291cmNlL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj5BbmRyb2lkIOODoeODvOODquODs+OCsOODquOCueODiOOBrui2o+aEjzwvYT48L2I+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCIAorPGxpPuOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8Yj48YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj5BbmRyb2lkIOODoeODvOODquODs+OCsOODquOCueODiOOBrui2o+aEjzwvYT48L2I+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCIAogPC9saT4KIDxsaT48Yj7os6rllY/jgavmnIDpganjgarjg6Hjg7zjg6rjg7PjgrAg44Oq44K544OI44KS6YG45oqe44GX44Gm44GP44Gg44GV44GEPC9iPuOAguW+jOi/sOOBmeOCi+OCiOOBhuOBq+OAgeODh+ODmeODreODg+ODkeODvOWQkeOBkeOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4jjga/kvZXnqK7poZ7jgYvjgavliIbjgYvjgozjgabjgYTjgb7jgZnjgII8L2xpPgogPGxpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5qZAppbmRleCA5MjFmNGRmLi4xN2NlYzM1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5qZApAQCAtMTA4LDcgKzEwOCw3IEBACiAgIG5ldyBEb3dubG9hZEltYWdlVGFzaygpLmV4ZWN1dGUoImh0dHA6Ly9leGFtcGxlLmNvbS9pbWFnZS5wbmciKTsKIH0KIAotcHJpdmF0ZSBjbGFzcyBEb3dubG9hZEltYWdlVGFzayBleHRlbmRzIEFzeW5jVGFzayZsdDtzdHJpbmcsIHZvaWQsPSIiIGJpdG1hcD0iIiZndDsgeworcHJpdmF0ZSBjbGFzcyBEb3dubG9hZEltYWdlVGFzayBleHRlbmRzIEFzeW5jVGFzayZsdDtTdHJpbmcsIFZvaWQsIEJpdG1hcCZndDsgewogICAgICBwcm90ZWN0ZWQgQml0bWFwIGRvSW5CYWNrZ3JvdW5kKFN0cmluZy4uLiB1cmxzKSB7CiAgICAgICAgICByZXR1cm4gbG9hZEltYWdlRnJvbU5ldHdvcmsodXJsc1swXSk7CiAgICAgIH0KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZAppbmRleCBlZjE5NjBiLi41OTljNGFlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCkBAIC0yMiw3ICsyMiw3IEBACiAKIDxwPldlbGNvbWUgdG8gdGhlIEFuZHJvaWQgZGV2ZWxvcGVycyBjb21tdW5pdHkhIFdlJ3JlIGdsYWQgeW91J3JlIGhlcmUgYW5kIGludml0ZSB5b3UgdG8gcGFydGljaXBhdGUgaW4gZGlzY3Vzc2lvbnMgd2l0aCBvdGhlciBBbmRyb2lkIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgb24gdG9waWNzIHRoYXQgaW50ZXJlc3QgeW91LjwvcD4KIAotPHA+VGhlIGxpc3RzIG9uIHRoaXMgcGFnZSBhcmUgcHJpbWFyaWx5IGZvciBkaXNjdXNzaW9uIGFib3V0IEFuZHJvaWQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuIElmIHlvdSBhcmUgc2Vla2luZyBkaXNjdXNzaW9uIGFib3V0IEFuZHJvaWQgc291cmNlIGNvZGUgKG5vdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCksIHRoZW4gcGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MiPk9wZW4gU291cmNlIFByb2plY3QgTWFpbGluZyBsaXN0czwvYT4uPC9wPgorPHA+VGhlIGxpc3RzIG9uIHRoaXMgcGFnZSBhcmUgcHJpbWFyaWx5IGZvciBkaXNjdXNzaW9uIGFib3V0IEFuZHJvaWQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuIElmIHlvdSBhcmUgc2Vla2luZyBkaXNjdXNzaW9uIGFib3V0IEFuZHJvaWQgc291cmNlIGNvZGUgKG5vdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCksIHRoZW4gcGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eSI+T3BlbiBTb3VyY2UgUHJvamVjdCBNYWlsaW5nIGxpc3RzPC9hPi48L3A+CiAKIDxoMiBpZD0iU3RhY2tPdmVyZmxvdyI+U3RhY2sgT3ZlcmZsb3c8L2gyPgogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0FuZHJvaWQubWsgYi9kcm0vY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5YTkxYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIERybUNvbnN0cmFpbnRzLmNwcCBcCisgICAgRHJtTWV0YWRhdGEuY3BwIFwKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMuY3BwIFwKKyAgICBEcm1FbmdpbmVCYXNlLmNwcCBcCisgICAgRHJtSW5mby5jcHAgXAorICAgIERybUluZm9SZXF1ZXN0LmNwcCBcCisgICAgRHJtSW5mb1N0YXR1cy5jcHAgXAorICAgIERybVJpZ2h0cy5jcHAgXAorICAgIERybVN1cHBvcnRJbmZvLmNwcCBcCisgICAgSURybUlPU2VydmljZS5jcHAgXAorICAgIElEcm1NYW5hZ2VyU2VydmljZS5jcHAgXAorICAgIElEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwIFwKKyAgICBEcm1JbmZvRXZlbnQuY3BwIFwKKyAgICBSZWFkV3JpdGVVdGlscy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtQ29uc3RyYWludHMuY3BwIGIvZHJtL2NvbW1vbi9Ecm1Db25zdHJhaW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0ZDc5OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtQ29uc3RyYWludHMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGRybS9Ecm1Db25zdHJhaW50cy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TUFYX1JFUEVBVF9DT1VOVCgibWF4X3JlcGVhdF9jb3VudCIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6UkVNQUlOSU5HX1JFUEVBVF9DT1VOVCgicmVtYWluaW5nX3JlcGVhdF9jb3VudCIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TElDRU5TRV9TVEFSVF9USU1FKCJsaWNlbnNlX3N0YXJ0X3RpbWUiKTsKK2NvbnN0IFN0cmluZzggRHJtQ29uc3RyYWludHM6OkxJQ0VOU0VfRVhQSVJZX1RJTUUoImxpY2Vuc2VfZXhwaXJ5X3RpbWUiKTsKK2NvbnN0IFN0cmluZzggRHJtQ29uc3RyYWludHM6OkxJQ0VOU0VfQVZBSUxBQkxFX1RJTUUoImxpY2Vuc2VfYXZhaWxhYmxlX3RpbWUiKTsKK2NvbnN0IFN0cmluZzggRHJtQ29uc3RyYWludHM6OkVYVEVOREVEX01FVEFEQVRBKCJleHRlbmRlZF9tZXRhZGF0YSIpOworCitpbnQgRHJtQ29uc3RyYWludHM6OmdldENvdW50KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbnN0cmFpbnRNYXAuc2l6ZSgpOworfQorCitzdGF0dXNfdCBEcm1Db25zdHJhaW50czo6cHV0KGNvbnN0IFN0cmluZzgqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKKyAgICBjaGFyKiBjaGFyVmFsdWUgPSBuZXcgY2hhcltsZW5ndGggKyAxXTsKKyAgICBpZiAoTlVMTCAhPSBjaGFyVmFsdWUpIHsKKyAgICAgICAgc3RybmNweShjaGFyVmFsdWUsIHZhbHVlLCBsZW5ndGgpOworICAgICAgICBjaGFyVmFsdWVbbGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIG1Db25zdHJhaW50TWFwLmFkZCgqa2V5LCBjaGFyVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7CisgICAgaWYgKE5VTEwgIT0gZ2V0VmFsdWUoJmtleSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoZ2V0VmFsdWUoJmtleSkpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOCgiIik7Cit9CisKK2NvbnN0IGNoYXIqIERybUNvbnN0cmFpbnRzOjpnZXRWYWx1ZShjb25zdCBTdHJpbmc4KiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gbUNvbnN0cmFpbnRNYXAuaW5kZXhPZktleSgqa2V5KSkgeworICAgICAgICByZXR1cm4gbUNvbnN0cmFpbnRNYXAudmFsdWVGb3IoKmtleSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBEcm1Db25zdHJhaW50czo6Z2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlKGtleSk7Cit9CisKK2Jvb2wgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtQ29uc3RyYWludHMtPm1Db25zdHJhaW50TWFwLnNpemUoKTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIGNvbnN0IFN0cmluZzgmIGtleSA9IG1Ecm1Db25zdHJhaW50cy0+bUNvbnN0cmFpbnRNYXAua2V5QXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4ga2V5OworfQorCitEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3IgRHJtQ29uc3RyYWludHM6OmtleUl0ZXJhdG9yKCkgeworICAgIHJldHVybiBLZXlJdGVyYXRvcih0aGlzKTsKK30KKworRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yOjpLZXlJdGVyYXRvcihjb25zdCBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKQorICAgIDogbURybUNvbnN0cmFpbnRzKGtleUl0ZXJhdG9yLm1Ecm1Db25zdHJhaW50cyksCisgICAgICBtSW5kZXgoa2V5SXRlcmF0b3IubUluZGV4KSB7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciYgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgeworICAgIG1Ecm1Db25zdHJhaW50cyA9IGtleUl0ZXJhdG9yLm1Ecm1Db25zdHJhaW50czsKKyAgICBtSW5kZXggPSBrZXlJdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK0RybUNvbnN0cmFpbnRzOjpJdGVyYXRvciBEcm1Db25zdHJhaW50czo6aXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1Db25zdHJhaW50czo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IERybUNvbnN0cmFpbnRzOjpJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtRHJtQ29uc3RyYWludHMoaXRlcmF0b3IubURybUNvbnN0cmFpbnRzKSwKKyAgICBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpJdGVyYXRvciYgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1Db25zdHJhaW50cyA9IGl0ZXJhdG9yLm1Ecm1Db25zdHJhaW50czsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybUNvbnN0cmFpbnRzOjpJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbUluZGV4IDwgbURybUNvbnN0cmFpbnRzLT5tQ29uc3RyYWludE1hcC5zaXplKCk7Cit9CisKK1N0cmluZzggRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzggdmFsdWUgPSBTdHJpbmc4KG1Ecm1Db25zdHJhaW50cy0+bUNvbnN0cmFpbnRNYXAuZWRpdFZhbHVlQXQobUluZGV4KSk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YSBiL2RybS9jb21tb24vRHJtQ29udmVydGVkU3RhdHVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKY29weSB0byBkcm0vY29tbW9uL0RybUNvbnZlcnRlZFN0YXR1cy5jcHAKaW5kZXggODZkZTM2Ni4uNWQwMzVmNSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKKysrIGIvZHJtL2NvbW1vbi9Ecm1Db252ZXJ0ZWRTdGF0dXMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KIAotaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKK0RybUNvbnZlcnRlZFN0YXR1czo6RHJtQ29udmVydGVkU3RhdHVzKAorICAgIGludCBfc3RhdHVzQ29kZSwgY29uc3QgRHJtQnVmZmVyKiBfY29udmVydGVkRGF0YSwgaW50IF9vZmZzZXQpIDoKKyAgICBzdGF0dXNDb2RlKF9zdGF0dXNDb2RlKSwKKyAgICBjb252ZXJ0ZWREYXRhKF9jb252ZXJ0ZWREYXRhKSwKKyAgICBvZmZzZXQoX29mZnNldCkgewogCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgZXhjZXB0aW9ucyBpbiBTVEsgc2VydmljZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWNsYXNzIFN0a0V4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBTdGtFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQogfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM2MGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJEcm1FbmdpbmVCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1FbmdpbmVCYXNlOjpEcm1FbmdpbmVCYXNlKCkgeworCit9CisKK0RybUVuZ2luZUJhc2U6On5Ecm1FbmdpbmVCYXNlKCkgeworCit9CisKK0RybUNvbnN0cmFpbnRzKiBEcm1FbmdpbmVCYXNlOjpnZXRDb25zdHJhaW50cygKKyAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gb25HZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKK30KKworRHJtTWV0YWRhdGEqIERybUVuZ2luZUJhc2U6OmdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIHJldHVybiBvbkdldE1ldGFkYXRhKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6aW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gb25Jbml0aWFsaXplKHVuaXF1ZUlkKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6c2V0T25JbmZvTGlzdGVuZXIoCisgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciogaW5mb0xpc3RlbmVyKSB7CisgICAgcmV0dXJuIG9uU2V0T25JbmZvTGlzdGVuZXIodW5pcXVlSWQsIGluZm9MaXN0ZW5lcik7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gb25UZXJtaW5hdGUodW5pcXVlSWQpOworfQorCitib29sIERybUVuZ2luZUJhc2U6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICByZXR1cm4gb25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpOworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1FbmdpbmVCYXNlOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICByZXR1cm4gb25Qcm9jZXNzRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mbyk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICByZXR1cm4gb25TYXZlUmlnaHRzKHVuaXF1ZUlkLCBkcm1SaWdodHMsIHJpZ2h0c1BhdGgsIGNvbnRlbnRQYXRoKTsKK30KKworRHJtSW5mbyogRHJtRW5naW5lQmFzZTo6YWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICByZXR1cm4gb25BY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworfQorCitTdHJpbmc4IERybUVuZ2luZUJhc2U6OmdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgcmV0dXJuIG9uR2V0T3JpZ2luYWxNaW1lVHlwZSh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK2ludCBEcm1FbmdpbmVCYXNlOjpnZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gb25HZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK2ludCBEcm1FbmdpbmVCYXNlOjpjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gb25DaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y29uc3VtZVJpZ2h0cygKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIHJldHVybiBvbkNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnNldFBsYXliYWNrU3RhdHVzKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gb25TZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKK30KKworYm9vbCBEcm1FbmdpbmVCYXNlOjp2YWxpZGF0ZUFjdGlvbigKKyAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgcmV0dXJuIG9uVmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpyZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgcmV0dXJuIG9uUmVtb3ZlUmlnaHRzKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBvblJlbW92ZUFsbFJpZ2h0cyh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICByZXR1cm4gb25PcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtRW5naW5lQmFzZTo6Y29udmVydERhdGEoCisgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIHJldHVybiBvbkNvbnZlcnREYXRhKHVuaXF1ZUlkLCBjb252ZXJ0SWQsIGlucHV0RGF0YSk7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtRW5naW5lQmFzZTo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICByZXR1cm4gb25DbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOworfQorCitEcm1TdXBwb3J0SW5mbyogRHJtRW5naW5lQmFzZTo6Z2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSB7CisgICAgcmV0dXJuIG9uR2V0U3VwcG9ydEluZm8odW5pcXVlSWQpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICByZXR1cm4gb25DbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIHJldHVybiBvbkluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmRlY3J5cHQoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgcmV0dXJuIG9uRGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgcmV0dXJuIG9uRmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7Cit9CisKK3NzaXplX3QgRHJtRW5naW5lQmFzZTo6cHJlYWQoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIHJldHVybiBvblByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUluZm8uY3BwIGIvZHJtL2NvbW1vbi9Ecm1JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNhYjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1JbmZvLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworRHJtSW5mbzo6RHJtSW5mbyhpbnQgaW5mb1R5cGUsIGNvbnN0IERybUJ1ZmZlciYgZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgOgorICAgIG1JbmZvVHlwZShpbmZvVHlwZSksCisgICAgbURhdGEoZHJtQnVmZmVyKSwKKyAgICBtTWltZVR5cGUobWltZVR5cGUpIHsKKworfQorCitpbnQgRHJtSW5mbzo6Z2V0SW5mb1R5cGUodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtSW5mb1R5cGU7Cit9CisKK1N0cmluZzggRHJtSW5mbzo6Z2V0TWltZVR5cGUodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtTWltZVR5cGU7Cit9CisKK2NvbnN0IERybUJ1ZmZlciYgRHJtSW5mbzo6Z2V0RGF0YSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitpbnQgRHJtSW5mbzo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtQXR0cmlidXRlcy5zaXplKCk7Cit9CisKK3N0YXR1c190IERybUluZm86OnB1dChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7CisgICAgbUF0dHJpYnV0ZXMuYWRkKGtleSwgdmFsdWUpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtSW5mbzo6Z2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3QgeworICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBtQXR0cmlidXRlcy5pbmRleE9mS2V5KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRyaWJ1dGVzLnZhbHVlRm9yKGtleSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KCIiKTsKK30KKworaW50IERybUluZm86OmluZGV4T2ZLZXkoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIG1BdHRyaWJ1dGVzLmluZGV4T2ZLZXkoa2V5KTsKK30KKworRHJtSW5mbzo6S2V5SXRlcmF0b3IgRHJtSW5mbzo6a2V5SXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEtleUl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1JbmZvOjpJdGVyYXRvciBEcm1JbmZvOjppdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKKy8vIEtleUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uCitEcm1JbmZvOjpLZXlJdGVyYXRvcjo6S2V5SXRlcmF0b3IoY29uc3QgRHJtSW5mbzo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKSA6CisgICAgbURybUluZm8oa2V5SXRlcmF0b3IubURybUluZm8pLCBtSW5kZXgoa2V5SXRlcmF0b3IubUluZGV4KSB7CisKK30KKworYm9vbCBEcm1JbmZvOjpLZXlJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gKG1JbmRleCA8IG1Ecm1JbmZvLT5tQXR0cmlidXRlcy5zaXplKCkpOworfQorCitjb25zdCBTdHJpbmc4JiBEcm1JbmZvOjpLZXlJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBjb25zdCBTdHJpbmc4JiBrZXkgPSBtRHJtSW5mby0+bUF0dHJpYnV0ZXMua2V5QXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4ga2V5OworfQorCitEcm1JbmZvOjpLZXlJdGVyYXRvciYgRHJtSW5mbzo6S2V5SXRlcmF0b3I6Om9wZXJhdG9yPShjb25zdCBEcm1JbmZvOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpIHsKKyAgICBtRHJtSW5mbyA9IGtleUl0ZXJhdG9yLm1Ecm1JbmZvOworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uCitEcm1JbmZvOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtSW5mbzo6SXRlcmF0b3ImIGl0ZXJhdG9yKQorICAgIDogbURybUluZm8oaXRlcmF0b3IubURybUluZm8pLCBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7CisKK30KKworRHJtSW5mbzo6SXRlcmF0b3ImIERybUluZm86Okl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtSW5mbzo6SXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybUluZm8gPSBpdGVyYXRvci5tRHJtSW5mbzsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybUluZm86Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtSW5mby0+bUF0dHJpYnV0ZXMuc2l6ZSgpOworfQorCitTdHJpbmc4JiBEcm1JbmZvOjpJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBTdHJpbmc4JiB2YWx1ZSA9IG1Ecm1JbmZvLT5tQXR0cmlidXRlcy5lZGl0VmFsdWVBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwIGIvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTE1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybUluZm9FdmVudC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9FdmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworRHJtSW5mb0V2ZW50OjpEcm1JbmZvRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgaW5mb1R5cGUsIGNvbnN0IFN0cmluZzgmIG1lc3NhZ2UpCisgICAgOiBtVW5pcXVlSWQodW5pcXVlSWQpLAorICAgICAgbUluZm9UeXBlKGluZm9UeXBlKSwKKyAgICAgIG1NZXNzYWdlKG1lc3NhZ2UpIHsKKworfQorCitpbnQgRHJtSW5mb0V2ZW50OjpnZXRVbmlxdWVJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVuaXF1ZUlkOworfQorCitpbnQgRHJtSW5mb0V2ZW50OjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBtSW5mb1R5cGU7Cit9CisKK2NvbnN0IFN0cmluZzgmIERybUluZm9FdmVudDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1lc3NhZ2U7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtSW5mb1JlcXVlc3QuY3BwIGIvZHJtL2NvbW1vbi9Ecm1JbmZvUmVxdWVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0Njg1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtSW5mb1JlcXVlc3QuY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGRybS9Ecm1JbmZvUmVxdWVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgU3RyaW5nOCBEcm1JbmZvUmVxdWVzdDo6QUNDT1VOVF9JRCgiYWNjb3VudF9pZCIpOworY29uc3QgU3RyaW5nOCBEcm1JbmZvUmVxdWVzdDo6U1VCU0NSSVBUSU9OX0lEKCJzdWJzY3JpcHRpb25faWQiKTsKKworRHJtSW5mb1JlcXVlc3Q6OkRybUluZm9SZXF1ZXN0KGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIDoKKyAgICBtSW5mb1R5cGUoaW5mb1R5cGUpLCBtTWltZVR5cGUobWltZVR5cGUpIHsKKworfQorCitTdHJpbmc4IERybUluZm9SZXF1ZXN0OjpnZXRNaW1lVHlwZSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1NaW1lVHlwZTsKK30KKworaW50IERybUluZm9SZXF1ZXN0OjpnZXRJbmZvVHlwZSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmZvVHlwZTsKK30KKworaW50IERybUluZm9SZXF1ZXN0OjpnZXRDb3VudCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuc2l6ZSgpOworfQorCitzdGF0dXNfdCBEcm1JbmZvUmVxdWVzdDo6cHV0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpIHsKKyAgICBtUmVxdWVzdEluZm9ybWF0aW9uTWFwLmFkZChrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitTdHJpbmc4IERybUluZm9SZXF1ZXN0OjpnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7CisgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IG1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuaW5kZXhPZktleShrZXkpKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdEluZm9ybWF0aW9uTWFwLnZhbHVlRm9yKGtleSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KCIiKTsKK30KKworRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yIERybUluZm9SZXF1ZXN0OjprZXlJdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gS2V5SXRlcmF0b3IodGhpcyk7Cit9CisKK0RybUluZm9SZXF1ZXN0OjpJdGVyYXRvciBEcm1JbmZvUmVxdWVzdDo6aXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKHRoaXMpOworfQorCisvLyBLZXlJdGVyYXRvciBpbXBsZW1lbnRhdGlvbgorRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yOjpLZXlJdGVyYXRvcihjb25zdCBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKQorICAgIDogbURybUluZm9SZXF1ZXN0KGtleUl0ZXJhdG9yLm1Ecm1JbmZvUmVxdWVzdCksCisgICAgICBtSW5kZXgoa2V5SXRlcmF0b3IubUluZGV4KSB7CisKK30KKworYm9vbCBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIChtSW5kZXggPCBtRHJtSW5mb1JlcXVlc3QtPm1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuc2l6ZSgpKTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIGNvbnN0IFN0cmluZzgmIGtleSA9IG1Ecm1JbmZvUmVxdWVzdC0+bVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5rZXlBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiBrZXk7Cit9CisKK0RybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciYgRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgeworICAgIG1Ecm1JbmZvUmVxdWVzdCA9IGtleUl0ZXJhdG9yLm1Ecm1JbmZvUmVxdWVzdDsKKyAgICBtSW5kZXggPSBrZXlJdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCisvLyBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbgorRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3ImIGl0ZXJhdG9yKSA6CisgICAgbURybUluZm9SZXF1ZXN0KGl0ZXJhdG9yLm1Ecm1JbmZvUmVxdWVzdCksIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKK30KKworRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yJiBEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybUluZm9SZXF1ZXN0ID0gaXRlcmF0b3IubURybUluZm9SZXF1ZXN0OworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtSW5mb1JlcXVlc3QtPm1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuc2l6ZSgpOworfQorCitTdHJpbmc4JiBEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCYgdmFsdWUgPSBtRHJtSW5mb1JlcXVlc3QtPm1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuZWRpdFZhbHVlQXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3NyYy9jb20vYW5kcm9pZC90ZXN0cGx1Z2luL1Rlc3RQbHVnaW4uamF2YSBiL2RybS9jb21tb24vRHJtSW5mb1N0YXR1cy5jcHAKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3Rlc3RwbHVnaW4vVGVzdFBsdWdpbi5qYXZhCnJlbmFtZSB0byBkcm0vY29tbW9uL0RybUluZm9TdGF0dXMuY3BwCmluZGV4IDdiYjRjMzUuLjhlYzczMTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3NyYy9jb20vYW5kcm9pZC90ZXN0cGx1Z2luL1Rlc3RQbHVnaW4uamF2YQorKysgYi9kcm0vY29tbW9uL0RybUluZm9TdGF0dXMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RwbHVnaW47CisjaW5jbHVkZSA8ZHJtL0RybUluZm9TdGF0dXMuaD4KIAotaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotcHVibGljIGNsYXNzIFRlc3RQbHVnaW4gZXh0ZW5kcyBTZXJ2aWNlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorRHJtSW5mb1N0YXR1czo6RHJtSW5mb1N0YXR1cygKKyAgICBpbnQgX3N0YXR1c0NvZGUsIGludCBfaW5mb1R5cGUsIGNvbnN0IERybUJ1ZmZlciogX2RybUJ1ZmZlciwgY29uc3QgU3RyaW5nOCYgX21pbWVUeXBlKSA6CisgICAgc3RhdHVzQ29kZShfc3RhdHVzQ29kZSksCisgICAgaW5mb1R5cGUoX2luZm9UeXBlKSwKKyAgICBkcm1CdWZmZXIoX2RybUJ1ZmZlciksCisgICAgbWltZVR5cGUoX21pbWVUeXBlKSB7CiAKIH0KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1NZXRhZGF0YS5jcHAgYi9kcm0vY29tbW9uL0RybU1ldGFkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M1ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1NZXRhZGF0YS5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybU1ldGFkYXRhLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitpbnQgRHJtTWV0YWRhdGE6OmdldENvdW50KHZvaWQpIGNvbnN0IHsKKwlyZXR1cm4gbU1ldGFkYXRhTWFwLnNpemUoKTsKK30KKworc3RhdHVzX3QgRHJtTWV0YWRhdGE6OnB1dChjb25zdCBTdHJpbmc4KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgaWYoKHZhbHVlICE9IE5VTEwpICYmIChrZXkgIT0gTlVMTCkpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHN0cmxlbih2YWx1ZSk7CisgICAgICAgIGNoYXIqIGNoYXJWYWx1ZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdOworCisgICAgICAgIG1lbWNweShjaGFyVmFsdWUsIHZhbHVlLCBsZW5ndGgpOworICAgICAgICBjaGFyVmFsdWVbbGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIG1NZXRhZGF0YU1hcC5hZGQoKmtleSwgY2hhclZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitTdHJpbmc4IERybU1ldGFkYXRhOjpnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7CisgICAgaWYgKE5VTEwgIT0gZ2V0VmFsdWUoJmtleSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoZ2V0VmFsdWUoJmtleSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOworICAgIH0KK30KKworY29uc3QgY2hhciogRHJtTWV0YWRhdGE6OmdldFZhbHVlKGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3QgeworICAgIGlmKGtleSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBtTWV0YWRhdGFNYXAuaW5kZXhPZktleSgqa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YU1hcC52YWx1ZUZvcigqa2V5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBEcm1NZXRhZGF0YTo6Z2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlKGtleSk7Cit9CisKK2Jvb2wgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtTWV0YWRhdGEtPm1NZXRhZGF0YU1hcC5zaXplKCk7Cit9CisKK2NvbnN0IFN0cmluZzgmIERybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBjb25zdCBTdHJpbmc4JiBrZXkgPSBtRHJtTWV0YWRhdGEtPm1NZXRhZGF0YU1hcC5rZXlBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiBrZXk7Cit9CisKK0RybU1ldGFkYXRhOjpLZXlJdGVyYXRvciBEcm1NZXRhZGF0YTo6a2V5SXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEtleUl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yKGNvbnN0IERybU1ldGFkYXRhOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpIDoKKyAgICBtRHJtTWV0YWRhdGEoa2V5SXRlcmF0b3IubURybU1ldGFkYXRhKSwKKyAgICBtSW5kZXgoa2V5SXRlcmF0b3IubUluZGV4KSB7CisgICAgTE9HVigiRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpLZXlJdGVyYXRvciIpOworfQorCitEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3ImIERybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6b3BlcmF0b3I9KGNvbnN0IERybU1ldGFkYXRhOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6Om9wZXJhdG9yPSIpOworICAgIG1Ecm1NZXRhZGF0YSA9IGtleUl0ZXJhdG9yLm1Ecm1NZXRhZGF0YTsKKyAgICBtSW5kZXggPSBrZXlJdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK0RybU1ldGFkYXRhOjpJdGVyYXRvciBEcm1NZXRhZGF0YTo6aXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1NZXRhZGF0YTo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IERybU1ldGFkYXRhOjpJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtRHJtTWV0YWRhdGEoaXRlcmF0b3IubURybU1ldGFkYXRhKSwKKyAgICBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7CisgICAgTE9HVigiRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpJdGVyYXRvciIpOworfQorCitEcm1NZXRhZGF0YTo6SXRlcmF0b3ImIERybU1ldGFkYXRhOjpJdGVyYXRvcjo6b3BlcmF0b3I9KGNvbnN0IERybU1ldGFkYXRhOjpJdGVyYXRvciYgaXRlcmF0b3IpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6SXRlcmF0b3I6Om9wZXJhdG9yPSIpOworICAgIG1Ecm1NZXRhZGF0YSA9IGl0ZXJhdG9yLm1Ecm1NZXRhZGF0YTsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybU1ldGFkYXRhOjpJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbUluZGV4IDwgbURybU1ldGFkYXRhLT5tTWV0YWRhdGFNYXAuc2l6ZSgpOworfQorCitTdHJpbmc4IERybU1ldGFkYXRhOjpJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBTdHJpbmc4IHZhbHVlID0gU3RyaW5nOChtRHJtTWV0YWRhdGEtPm1NZXRhZGF0YU1hcC5lZGl0VmFsdWVBdChtSW5kZXgpKTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVJpZ2h0cy5jcHAgYi9kcm0vY29tbW9uL0RybVJpZ2h0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlY2IzZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtUmlnaHRzLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxSZWFkV3JpdGVVdGlscy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworRHJtUmlnaHRzOjpEcm1SaWdodHMoY29uc3QgU3RyaW5nOCYgcmlnaHRzRmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWNjb3VudElkLCBjb25zdCBTdHJpbmc4JiBzdWJzY3JpcHRpb25JZCkgOgorICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgbUFjY291bnRJZChhY2NvdW50SWQpLAorICAgIG1TdWJzY3JpcHRpb25JZChzdWJzY3JpcHRpb25JZCksCisgICAgbVJpZ2h0c0Zyb21GaWxlKE5VTEwpIHsKKyAgICBpbnQgcmlnaHRzTGVuZ3RoID0gMDsKKyAgICBpZiAoU3RyaW5nOCgiIikgIT0gcmlnaHRzRmlsZVBhdGgpIHsKKyAgICAgICAgcmlnaHRzTGVuZ3RoID0gUmVhZFdyaXRlVXRpbHM6OnJlYWRCeXRlcyhyaWdodHNGaWxlUGF0aCwgJm1SaWdodHNGcm9tRmlsZSk7CisgICAgfQorICAgIG1EYXRhID0gRHJtQnVmZmVyKG1SaWdodHNGcm9tRmlsZSwgcmlnaHRzTGVuZ3RoKTsKK30KKworRHJtUmlnaHRzOjpEcm1SaWdodHMoY29uc3QgRHJtQnVmZmVyJiByaWdodHNEYXRhLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFjY291bnRJZCwgY29uc3QgU3RyaW5nOCYgc3Vic2NyaXB0aW9uSWQpIDoKKyAgICBtRGF0YShyaWdodHNEYXRhKSwKKyAgICBtTWltZVR5cGUobWltZVR5cGUpLAorICAgIG1BY2NvdW50SWQoYWNjb3VudElkKSwKKyAgICBtU3Vic2NyaXB0aW9uSWQoc3Vic2NyaXB0aW9uSWQpLAorICAgIG1SaWdodHNGcm9tRmlsZShOVUxMKSB7Cit9CisKK0RybVJpZ2h0czo6fkRybVJpZ2h0cygpIHsKKyAgICBkZWxldGVbXSBtUmlnaHRzRnJvbUZpbGU7IG1SaWdodHNGcm9tRmlsZSA9IE5VTEw7Cit9CisKK2NvbnN0IERybUJ1ZmZlciYgRHJtUmlnaHRzOjpnZXREYXRhKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK1N0cmluZzggRHJtUmlnaHRzOjpnZXRNaW1lVHlwZSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1NaW1lVHlwZTsKK30KKworU3RyaW5nOCBEcm1SaWdodHM6OmdldEFjY291bnRJZCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1BY2NvdW50SWQ7Cit9CisKK1N0cmluZzggRHJtUmlnaHRzOjpnZXRTdWJzY3JpcHRpb25JZCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdWJzY3JpcHRpb25JZDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAgYi9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmM4OTUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybVN1cHBvcnRJbmZvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1TdXBwb3J0SW5mbzo6RHJtU3VwcG9ydEluZm8oKSB7CisKK30KKworRHJtU3VwcG9ydEluZm86OkRybVN1cHBvcnRJbmZvKGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbyk6CisgICAgbU1pbWVUeXBlVmVjdG9yKGRybVN1cHBvcnRJbmZvLm1NaW1lVHlwZVZlY3RvciksCisgICAgbUZpbGVTdWZmaXhWZWN0b3IoZHJtU3VwcG9ydEluZm8ubUZpbGVTdWZmaXhWZWN0b3IpLAorICAgIG1EZXNjcmlwdGlvbihkcm1TdXBwb3J0SW5mby5tRGVzY3JpcHRpb24pIHsKKworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpvcGVyYXRvcjwoY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSBjb25zdCB7CisgICAgLy8gRG8gd2UgbmVlZCB0byBjaGVjayBtTWltZVR5cGVWZWN0b3IgJiBtRmlsZVN1ZmZpeFZlY3RvciA/CisgICAgLy8gTm90ZSBWZWN0b3IgZG9lc24ndCBvdmVycmlkZXMgIjwiIG9wZXJhdG9yCisgICAgcmV0dXJuIG1EZXNjcmlwdGlvbiA8IGRybVN1cHBvcnRJbmZvLm1EZXNjcmlwdGlvbjsKK30KKworYm9vbCBEcm1TdXBwb3J0SW5mbzo6b3BlcmF0b3I9PShjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pIGNvbnN0IHsKKyAgICAvLyBEbyB3ZSBuZWVkIHRvIGNoZWNrIG1NaW1lVHlwZVZlY3RvciAmIG1GaWxlU3VmZml4VmVjdG9yID8KKyAgICAvLyBOb3RlIFZlY3RvciBkb2Vzbid0IG92ZXJyaWRlcyAiPT0iIG9wZXJhdG9yCisgICAgcmV0dXJuIChtRGVzY3JpcHRpb24gPT0gZHJtU3VwcG9ydEluZm8ubURlc2NyaXB0aW9uKTsKK30KKworYm9vbCBEcm1TdXBwb3J0SW5mbzo6aXNTdXBwb3J0ZWRNaW1lVHlwZShjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1NaW1lVHlwZVZlY3Rvci5pdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKFN0cmluZzgoIiIpICE9IG1pbWVUeXBlICYmIGl0ZW0uZmluZChtaW1lVHlwZSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBEcm1TdXBwb3J0SW5mbzo6aXNTdXBwb3J0ZWRGaWxlU3VmZml4KGNvbnN0IFN0cmluZzgmIGZpbGVUeXBlKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtRmlsZVN1ZmZpeFZlY3Rvci5pdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKFN0cmluZzgoIiIpICE9IGZpbGVUeXBlICYmIGl0ZW0uZmluZChmaWxlVHlwZSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRHJtU3VwcG9ydEluZm8mIERybVN1cHBvcnRJbmZvOjpvcGVyYXRvcj0oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSB7CisgICAgbU1pbWVUeXBlVmVjdG9yID0gZHJtU3VwcG9ydEluZm8ubU1pbWVUeXBlVmVjdG9yOworICAgIG1GaWxlU3VmZml4VmVjdG9yID0gZHJtU3VwcG9ydEluZm8ubUZpbGVTdWZmaXhWZWN0b3I7CisgICAgbURlc2NyaXB0aW9uID0gZHJtU3VwcG9ydEluZm8ubURlc2NyaXB0aW9uOworICAgIHJldHVybiAqdGhpczsKK30KKworaW50IERybVN1cHBvcnRJbmZvOjpnZXRNaW1lVHlwZUNvdW50KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsKK30KKworaW50IERybVN1cHBvcnRJbmZvOjpnZXRGaWxlU3VmZml4Q291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7Cit9CisKK3N0YXR1c190IERybVN1cHBvcnRJbmZvOjphZGRNaW1lVHlwZShjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIG1NaW1lVHlwZVZlY3Rvci5wdXNoKG1pbWVUeXBlKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1TdXBwb3J0SW5mbzo6YWRkRmlsZVN1ZmZpeChjb25zdCBTdHJpbmc4JiBmaWxlU3VmZml4KSB7CisgICAgbUZpbGVTdWZmaXhWZWN0b3IucHVzaChmaWxlU3VmZml4KTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1TdXBwb3J0SW5mbzo6c2V0RGVzY3JpcHRpb24oY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24pIHsKKyAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitTdHJpbmc4IERybVN1cHBvcnRJbmZvOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURlc2NyaXB0aW9uOworfQorCitEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yIERybVN1cHBvcnRJbmZvOjpnZXRGaWxlU3VmZml4SXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEZpbGVTdWZmaXhJdGVyYXRvcih0aGlzKTsKK30KKworRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3IgRHJtU3VwcG9ydEluZm86OmdldE1pbWVUeXBlSXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIE1pbWVUeXBlSXRlcmF0b3IodGhpcyk7Cit9CisKK0RybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3I6OkZpbGVTdWZmaXhJdGVyYXRvcigKKyAgICBjb25zdCBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1TdXBwb3J0SW5mbyhpdGVyYXRvci5tRHJtU3VwcG9ydEluZm8pLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKKworfQorCitEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yJiBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtU3VwcG9ydEluZm86OkZpbGVTdWZmaXhJdGVyYXRvciYgaXRlcmF0b3IpIHsKKyAgICBtRHJtU3VwcG9ydEluZm8gPSBpdGVyYXRvci5tRHJtU3VwcG9ydEluZm87CisgICAgbUluZGV4ID0gaXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtU3VwcG9ydEluZm8tPm1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsKK30KKworU3RyaW5nOCYgRHJtU3VwcG9ydEluZm86OkZpbGVTdWZmaXhJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBTdHJpbmc4JiB2YWx1ZSA9IG1Ecm1TdXBwb3J0SW5mby0+bUZpbGVTdWZmaXhWZWN0b3IuZWRpdEl0ZW1BdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KKworRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3I6Ok1pbWVUeXBlSXRlcmF0b3IoCisgICAgY29uc3QgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3ImIGl0ZXJhdG9yKSA6CisgICAgbURybVN1cHBvcnRJbmZvKGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbyksCisgICAgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK0RybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yJiBEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvcjo6b3BlcmF0b3I9KAorICAgIGNvbnN0IERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1TdXBwb3J0SW5mbyA9IGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbzsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtU3VwcG9ydEluZm8tPm1NaW1lVHlwZVZlY3Rvci5zaXplKCk7Cit9CisKK1N0cmluZzgmIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbURybVN1cHBvcnRJbmZvLT5tTWltZVR5cGVWZWN0b3IuZWRpdEl0ZW1BdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtSU9TZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybUlPU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0Y2E1NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vSURybUlPU2VydmljZS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSAiSURybUlPU2VydmljZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordm9pZCBCcERybUlPU2VydmljZTo6d3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGFCdWZmZXIpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybUlPU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChmaWxlUGF0aCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGF0YUJ1ZmZlcik7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoV1JJVEVfVE9fRklMRSwgZGF0YSwgJnJlcGx5KTsKK30KKworU3RyaW5nOCBCcERybUlPU2VydmljZTo6cmVhZEZyb21GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoKSB7CisKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybUlPU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChmaWxlUGF0aCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVBRF9GUk9NX0ZJTEUsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJpbmc4KCk7Cit9CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEcm1JT1NlcnZpY2UsICJkcm0uSURybUlPU2VydmljZSIpOworCitzdGF0dXNfdCBCbkRybUlPU2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIFdSSVRFX1RPX0ZJTEU6CisgICAgeworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybUlPU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIHdyaXRlVG9GaWxlKGRhdGEucmVhZFN0cmluZzgoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFQURfRlJPTV9GSUxFOgorICAgIHsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1JT1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBTdHJpbmc4IGRhdGFCdWZmZXIgPSByZWFkRnJvbUZpbGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2I1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTAsMCArMSwxNTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJRHJtTWFuYWdlclNlcnZpY2UoTmF0aXZlKSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorCisjaW5jbHVkZSA8ZHJtL0RybUluZm8uaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkcm0vRHJtUmlnaHRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8ZHJtL0RybVN1cHBvcnRJbmZvLmg+CisKKyNpbmNsdWRlICJJRHJtTWFuYWdlclNlcnZpY2UuaCIKKworI2RlZmluZSBJTlZBTElEX0JVRkZFUl9MRU5HVEggLTEKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBCcERybU1hbmFnZXJTZXJ2aWNlOjphZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dWKCJhZGQgdW5pcXVlaWQiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChBRERfVU5JUVVFSUQsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCit2b2lkIEJwRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoInJlbW92ZSB1bmlxdWVpZCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9VTklRVUVJRCwgZGF0YSwgJnJlcGx5KTsKK30KKwordm9pZCBCcERybU1hbmFnZXJTZXJ2aWNlOjphZGRDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUREX0NMSUVOVCwgZGF0YSwgJnJlcGx5KTsKK30KKwordm9pZCBCcERybU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0NMSUVOVCwgZGF0YSwgJnJlcGx5KTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2V0RHJtU2VydmljZUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgZHJtU2VydmljZUxpc3RlbmVyKSB7CisgICAgTE9HVigic2V0RHJtU2VydmljZUxpc3RlbmVyIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZHJtU2VydmljZUxpc3RlbmVyLT5hc0JpbmRlcigpKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpIHsKKyAgICBMT0dWKCJJbnN0YWxsIERSTSBFbmdpbmUiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZHJtRW5naW5lRmlsZSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU5TVEFMTF9EUk1fRU5HSU5FLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworRHJtQ29uc3RyYWludHMqIEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldENvbnN0cmFpbnRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CisgICAgTE9HVigiR2V0IENvbnN0cmFpbnRzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KCpwYXRoKTsKKyAgICBkYXRhLndyaXRlSW50MzIoYWN0aW9uKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09OU1RSQUlOVFNfRlJPTV9DT05URU5ULCBkYXRhLCAmcmVwbHkpOworCisgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRHJtIENvbnN0cmFpbnRzCisgICAgICAgIGRybUNvbnN0cmFpbnRzID0gbmV3IERybUNvbnN0cmFpbnRzKCk7CisKKyAgICAgICAgY29uc3QgaW50IHNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcm1Db25zdHJhaW50cy0+cHV0KCZrZXksIGRhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkcm1Db25zdHJhaW50czsKK30KKworRHJtTWV0YWRhdGEqIEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIExPR1YoIkdldCBNZXRhZGF0YSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBEcm1NZXRhZGF0YSogZHJtTWV0YWRhdGEgPSBOVUxMOworICAgIGRhdGEud3JpdGVTdHJpbmc4KCpwYXRoKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01FVEFEQVRBX0ZST01fQ09OVEVOVCwgZGF0YSwgJnJlcGx5KTsKKworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEcm0gTWV0YWRhdGEKKyAgICAgICAgZHJtTWV0YWRhdGEgPSBuZXcgRHJtTWV0YWRhdGEoKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybU1ldGFkYXRhLT5wdXQoJmtleSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRybU1ldGFkYXRhOworfQorCitib29sIEJwRHJtTWFuYWdlclNlcnZpY2U6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiQ2FuIEhhbmRsZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KG1pbWVUeXBlKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQU5fSEFORExFLCBkYXRhLCAmcmVwbHkpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKK30KKworRHJtSW5mb1N0YXR1cyogQnBEcm1NYW5hZ2VyU2VydmljZTo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgTE9HVigiUHJvY2VzcyBEUk0gSW5mbyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIC8vRmlsbGluZyBEUk0gaW5mbworICAgIGRhdGEud3JpdGVJbnQzMihkcm1JbmZvLT5nZXRJbmZvVHlwZSgpKTsKKyAgICBjb25zdCBEcm1CdWZmZXIgZGF0YUJ1ZmZlciA9IGRybUluZm8tPmdldERhdGEoKTsKKyAgICBjb25zdCBpbnQgZGF0YUJ1ZmZlclNpemUgPSBkYXRhQnVmZmVyLmxlbmd0aDsKKyAgICBkYXRhLndyaXRlSW50MzIoZGF0YUJ1ZmZlclNpemUpOworICAgIGlmICgwIDwgZGF0YUJ1ZmZlclNpemUpIHsKKyAgICAgICAgZGF0YS53cml0ZShkYXRhQnVmZmVyLmRhdGEsIGRhdGFCdWZmZXJTaXplKTsKKyAgICB9CisgICAgZGF0YS53cml0ZVN0cmluZzgoZHJtSW5mby0+Z2V0TWltZVR5cGUoKSk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZHJtSW5mby0+Z2V0Q291bnQoKSk7CisgICAgRHJtSW5mbzo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1JbmZvLT5rZXlJdGVyYXRvcigpOworCisgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZSA9IGRybUluZm8tPmdldChrZXkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOCgodmFsdWUgPT0gU3RyaW5nOCgiIikpID8gU3RyaW5nOCgiTlVMTCIpIDogdmFsdWUpOworICAgIH0KKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChQUk9DRVNTX0RSTV9JTkZPLCBkYXRhLCAmcmVwbHkpOworCisgICAgRHJtSW5mb1N0YXR1cyogZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERSTSBJbmZvIFN0YXR1cworICAgICAgICBjb25zdCBpbnQgc3RhdHVzQ29kZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgaW5mb1R5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisKKyAgICAgICAgRHJtQnVmZmVyKiBkcm1CdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcm1CdWZmZXIgPSBuZXcgRHJtQnVmZmVyKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cyhzdGF0dXNDb2RlLCBpbmZvVHlwZSwgZHJtQnVmZmVyLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOworfQorCitEcm1JbmZvKiBCcERybU1hbmFnZXJTZXJ2aWNlOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvcmVxdWVzdCkgeworICAgIExPR1YoIkFjcXVpcmUgRFJNIEluZm8iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICAvL0ZpbGxpbmcgRFJNIEluZm8gUmVxdWVzdAorICAgIGRhdGEud3JpdGVJbnQzMihkcm1JbmZvcmVxdWVzdC0+Z2V0SW5mb1R5cGUoKSk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZHJtSW5mb3JlcXVlc3QtPmdldE1pbWVUeXBlKCkpOworCisgICAgZGF0YS53cml0ZUludDMyKGRybUluZm9yZXF1ZXN0LT5nZXRDb3VudCgpKTsKKyAgICBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1JbmZvcmVxdWVzdC0+a2V5SXRlcmF0b3IoKTsKKworICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGtleSk7CisgICAgICAgIGNvbnN0IFN0cmluZzggdmFsdWUgPSBkcm1JbmZvcmVxdWVzdC0+Z2V0KGtleSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KCh2YWx1ZSA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiB2YWx1ZSk7CisgICAgfQorCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfRFJNX0lORk8sIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRFJNIEluZm8KKyAgICAgICAgY29uc3QgaW50IGluZm9UeXBlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworCisgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBkcm1JbmZvID0gbmV3IERybUluZm8oaW5mb1R5cGUsIERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKSwgcmVwbHkucmVhZFN0cmluZzgoKSk7CisKKyAgICAgICAgY29uc3QgaW50IHNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZShyZXBseS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGRybUluZm8tPnB1dChrZXksICh2YWx1ZSA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRybUluZm87Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICBMT0dWKCJTYXZlIFJpZ2h0cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIC8vRmlsbGluZyBEcm0gUmlnaHRzCisgICAgY29uc3QgRHJtQnVmZmVyIGRhdGFCdWZmZXIgPSBkcm1SaWdodHMuZ2V0RGF0YSgpOworICAgIGRhdGEud3JpdGVJbnQzMihkYXRhQnVmZmVyLmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShkYXRhQnVmZmVyLmRhdGEsIGRhdGFCdWZmZXIubGVuZ3RoKTsKKworICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUgPSBkcm1SaWdodHMuZ2V0TWltZVR5cGUoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOCgobWltZVR5cGUgPT0gU3RyaW5nOCgiIikpID8gU3RyaW5nOCgiTlVMTCIpIDogbWltZVR5cGUpOworCisgICAgY29uc3QgU3RyaW5nOCBhY2NvdW50SWQgPSBkcm1SaWdodHMuZ2V0QWNjb3VudElkKCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKGFjY291bnRJZCA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBhY2NvdW50SWQpOworCisgICAgY29uc3QgU3RyaW5nOCBzdWJzY3JpcHRpb25JZCA9IGRybVJpZ2h0cy5nZXRTdWJzY3JpcHRpb25JZCgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KChzdWJzY3JpcHRpb25JZCA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBzdWJzY3JpcHRpb25JZCk7CisKKyAgICBkYXRhLndyaXRlU3RyaW5nOCgocmlnaHRzUGF0aCA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiByaWdodHNQYXRoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOCgoY29udGVudFBhdGggPT0gU3RyaW5nOCgiIikpID8gU3RyaW5nOCgiTlVMTCIpIDogY29udGVudFBhdGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNBVkVfUklHSFRTLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworU3RyaW5nOCBCcERybU1hbmFnZXJTZXJ2aWNlOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR1YoIkdldCBPcmlnaW5hbCBNaW1lVHlwZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1JJR0lOQUxfTUlNRVRZUEUsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJpbmc4KCk7Cit9CisKK2ludCBCcERybU1hbmFnZXJTZXJ2aWNlOjpnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIkdldCBEcm0gb2JqZWN0IHR5cGUiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgocGF0aCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9EUk1fT0JKRUNUX1RZUEUsIGRhdGEsICZyZXBseSk7CisKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK2ludCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJjaGVja1JpZ2h0c1N0YXR1cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKyAgICBkYXRhLndyaXRlSW50MzIoYWN0aW9uKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDSEVDS19SSUdIVFNfU1RBVFVTLCBkYXRhLCAmcmVwbHkpOworCisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBMT0dWKCJjb25zdW1lUmlnaHRzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDwgaW50PihyZXNlcnZlKSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OU1VNRV9SSUdIVFMsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICBMT0dWKCJzZXRQbGF5YmFja1N0YXR1cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisKKyAgICBkYXRhLndyaXRlSW50MzIocGxheWJhY2tTdGF0dXMpOworICAgIGRhdGEud3JpdGVJbnQzMihwb3NpdGlvbik7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BMQVlCQUNLX1NUQVRVUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK2Jvb2wgQnBEcm1NYW5hZ2VyU2VydmljZTo6dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBMT0dWKCJ2YWxpZGF0ZUFjdGlvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKyAgICBkYXRhLndyaXRlSW50MzIoYWN0aW9uKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVzY3JpcHRpb24ub3V0cHV0VHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlc2NyaXB0aW9uLmNvbmZpZ3VyYXRpb24pOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KFZBTElEQVRFX0FDVElPTiwgZGF0YSwgJnJlcGx5KTsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihyZXBseS5yZWFkSW50MzIoKSk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dWKCJyZW1vdmVSaWdodHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgocGF0aCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1JJR0hUUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dWKCJyZW1vdmVBbGxSaWdodHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0FMTF9SSUdIVFMsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitpbnQgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJvcGVuQ29udmVydFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fQ09OVkVSVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICBMT0dWKCJjb252ZXJ0RGF0YSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlSW50MzIoY29udmVydElkKTsKKyAgICBkYXRhLndyaXRlSW50MzIoaW5wdXREYXRhLT5sZW5ndGgpOworICAgIGRhdGEud3JpdGUoaW5wdXREYXRhLT5kYXRhLCBpbnB1dERhdGEtPmxlbmd0aCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OVkVSVF9EQVRBLCBkYXRhLCAmcmVwbHkpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERSTSBDb252ZXJ0ZWQgU3RhdHVzCisgICAgICAgIGNvbnN0IGludCBzdGF0dXNDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb252ZXJ0ZWREYXRhID0gbmV3IERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBuZXcgRHJtQ29udmVydGVkU3RhdHVzKHN0YXR1c0NvZGUsIGNvbnZlcnRlZERhdGEsIG9mZnNldCk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICBMT0dWKCJjbG9zZUNvbnZlcnRTZXNzaW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVJbnQzMihjb252ZXJ0SWQpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX0NPTlZFUlRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEUk0gQ29udmVydGVkIFN0YXR1cworICAgICAgICBjb25zdCBpbnQgc3RhdHVzQ29kZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgRHJtQnVmZmVyKiBjb252ZXJ0ZWREYXRhID0gTlVMTDsKKyAgICAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udmVydGVkRGF0YSA9IG5ldyBEcm1CdWZmZXIoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gbmV3IERybUNvbnZlcnRlZFN0YXR1cyhzdGF0dXNDb2RlLCBjb252ZXJ0ZWREYXRhLCBvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gZHJtQ29udmVydGVkU3RhdHVzOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpnZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgeworICAgIExPR1YoIkdldCBBbGwgU3VwcG9ydCBJbmZvIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BTExfU1VQUE9SVF9JTkZPLCBkYXRhLCAmcmVwbHkpOworCisgICAgLy9GaWxsaW5nIERSTSBTdXBwb3J0IEluZm8KKyAgICBjb25zdCBpbnQgYXJyYXlTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgaWYgKDAgPCBhcnJheVNpemUpIHsKKyAgICAgICAgKmRybVN1cHBvcnRJbmZvQXJyYXkgPSBuZXcgRHJtU3VwcG9ydEluZm9bYXJyYXlTaXplXTsKKworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlTaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbyBkcm1TdXBwb3J0SW5mbzsKKworICAgICAgICAgICAgY29uc3QgaW50IGZpbGVTdWZmaXhWZWN0b3JTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTdWZmaXhWZWN0b3JTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBkcm1TdXBwb3J0SW5mby5hZGRGaWxlU3VmZml4KHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpbnQgbWltZVR5cGVWZWN0b3JTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbWVUeXBlVmVjdG9yU2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgZHJtU3VwcG9ydEluZm8uYWRkTWltZVR5cGUocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRybVN1cHBvcnRJbmZvLnNldERlc2NyaXB0aW9uKHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgKCpkcm1TdXBwb3J0SW5mb0FycmF5KVtpbmRleF0gPSBkcm1TdXBwb3J0SW5mbzsKKyAgICAgICAgfQorICAgIH0KKyAgICAqbGVuZ3RoID0gYXJyYXlTaXplOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKKyAgICBkYXRhLndyaXRlSW50MzIob2Zmc2V0KTsKKyAgICBkYXRhLndyaXRlSW50MzIobGVuZ3RoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKworICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5taW1lVHlwZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5zdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJubyBkZWNyeXB0SGFuZGxlIGlzIGdlbmVyYXRlZCBpbiBzZXJ2aWNlIHNpZGUiKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CisgICAgTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KFN0cmluZzgodXJpKSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkksIGRhdGEsICZyZXBseSk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+bWltZVR5cGUgPSByZXBseS5yZWFkU3RyaW5nOCgpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRBcGlUeXBlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+c3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgibm8gZGVjcnlwdEhhbmRsZSBpcyBnZW5lcmF0ZWQgaW4gc2VydmljZSBzaWRlIik7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgTE9HVigiY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgTE9HVigiZGVsZXRpbmcgZGVjcnlwdEluZm8iKTsKKyAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOyBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgfQorICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOyBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBMT0dWKCJpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0VW5pdElkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihoZWFkZXJJbmZvLT5sZW5ndGgpOworICAgIGRhdGEud3JpdGUoaGVhZGVySW5mby0+ZGF0YSwgaGVhZGVySW5mby0+bGVuZ3RoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIExPR1YoImRlY3J5cHQiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRVbml0SWQpOworICAgIGRhdGEud3JpdGVJbnQzMigoKmRlY0J1ZmZlciktPmxlbmd0aCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZW5jQnVmZmVyLT5sZW5ndGgpOworICAgIGRhdGEud3JpdGUoZW5jQnVmZmVyLT5kYXRhLCBlbmNCdWZmZXItPmxlbmd0aCk7CisKKyAgICBpZiAoTlVMTCAhPSBJVikgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSVYtPmxlbmd0aCk7CisgICAgICAgIGRhdGEud3JpdGUoSVYtPmRhdGEsIElWLT5sZW5ndGgpOworICAgIH0KKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChERUNSWVBULCBkYXRhLCAmcmVwbHkpOworCisgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgTE9HVigiUmV0dXJuIHZhbHVlIG9mIGRlY3J5cHQoKSBpcyAlZCIsIHN0YXR1cyk7CisKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICgqZGVjQnVmZmVyKS0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZXBseS5yZWFkKCh2b2lkICopKCpkZWNCdWZmZXIpLT5kYXRhLCBzaXplKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HVigiZmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdFVuaXRJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoRklOQUxJWkVfREVDUllQVF9VTklULCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3NpemVfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgTE9HVigicmVhZCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICBpbnQgcmVzdWx0OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihudW1CeXRlcyk7CisgICAgZGF0YS53cml0ZUludDMyKG9mZnNldCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUFJFQUQsIGRhdGEsICZyZXBseSk7CisgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgaWYgKDAgPCByZXN1bHQpIHsKKyAgICAgICAgcmVwbHkucmVhZChidWZmZXIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEcm1NYW5hZ2VyU2VydmljZSwgImRybS5JRHJtTWFuYWdlclNlcnZpY2UiKTsKKworc3RhdHVzX3QgQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTE9HVigiRW50ZXJpbmcgQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCB3aXRoIGNvZGUgJWQiLCBjb2RlKTsKKworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgQUREX1VOSVFVRUlEOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6QUREX1VOSVFVRUlEIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgaW50IHVuaXF1ZUlkID0gYWRkVW5pcXVlSWQoZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFTU9WRV9VTklRVUVJRDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFTU9WRV9VTklRVUVJRCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgIHJlbW92ZVVuaXF1ZUlkKGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQUREX0NMSUVOVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkFERF9DTElFTlQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICBhZGRDbGllbnQoZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBSRU1PVkVfQ0xJRU5UOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX0NMSUVOVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgIHJlbW92ZUNsaWVudChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFNFVF9EUk1fU0VSVklDRV9MSVNURU5FUjoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlNFVF9EUk1fU0VSVklDRV9MSVNURU5FUiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4gZHJtU2VydmljZUxpc3RlbmVyCisgICAgICAgICAgICA9IGludGVyZmFjZV9jYXN0PElEcm1TZXJ2aWNlTGlzdGVuZXI+IChkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RHJtU2VydmljZUxpc3RlbmVyKHVuaXF1ZUlkLCBkcm1TZXJ2aWNlTGlzdGVuZXIpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBJTlNUQUxMX0RSTV9FTkdJTkU6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpJTlNUQUxMX0RSTV9FTkdJTkUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxEcm1FbmdpbmUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX0NPTlNUUkFJTlRTX0ZST01fQ09OVEVOVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9DT05TVFJBSU5UU19GUk9NX0NPTlRFTlQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBnZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgJnBhdGgsIGRhdGEucmVhZEludDMyKCkpOworCisgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICAvL0ZpbGxpbmcgRFJNIENvbnN0cmFpbnRzIGNvbnRlbnRzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db25zdHJhaW50cy0+Z2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBrZXlJdCA9IGRybUNvbnN0cmFpbnRzLT5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSA9IGRybUNvbnN0cmFpbnRzLT5nZXRBc0J5dGVBcnJheSgma2V5KTsKKyAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IHN0cmxlbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUgKyAxKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUodmFsdWUsIGJ1ZmZlclNpemUgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZHJtQ29uc3RyYWludHM7IGRybUNvbnN0cmFpbnRzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEdFVF9NRVRBREFUQV9GUk9NX0NPTlRFTlQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpHRVRfTUVUQURBVEFfRlJPTV9DT05URU5UIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IHBhdGggPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisKKyAgICAgICAgRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhID0gZ2V0TWV0YWRhdGEodW5pcXVlSWQsICZwYXRoKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtTWV0YWRhdGEpIHsKKyAgICAgICAgICAgIC8vRmlsbGluZyBEUk0gTWV0YWRhdGEgY29udGVudHMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybU1ldGFkYXRhLT5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIGtleUl0ID0gZHJtTWV0YWRhdGEtPmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChrZXkpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gZHJtTWV0YWRhdGEtPmdldEFzQnl0ZUFycmF5KCZrZXkpOworICAgICAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gc3RybGVuKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUodmFsdWUsIGJ1ZmZlclNpemUgKyAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGRybU1ldGFkYXRhOyBkcm1NZXRhZGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIENBTl9IQU5ETEU6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDQU5fSEFORExFIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IHBhdGggPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisKKyAgICAgICAgYm9vbCByZXN1bHQgPSBjYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUFJPQ0VTU19EUk1fSU5GTzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlBST0NFU1NfRFJNX0lORk8iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgLy9GaWxsaW5nIERSTSBpbmZvCisgICAgICAgIGNvbnN0IGludCBpbmZvVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRHJtQnVmZmVyIGRybUJ1ZmZlcihidWZmZXIsIGJ1ZmZlclNpemUpOworICAgICAgICBEcm1JbmZvKiBkcm1JbmZvID0gbmV3IERybUluZm8oaW5mb1R5cGUsIGRybUJ1ZmZlciwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZShkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgZHJtSW5mby0+cHV0KGtleSwgKHZhbHVlID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIERybUluZm9TdGF0dXMqIGRybUluZm9TdGF0dXMgPSBwcm9jZXNzRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mbyk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtSW5mb1N0YXR1cykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBJbmZvIFN0YXR1cyBjb250ZW50cworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtSW5mb1N0YXR1cy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1JbmZvU3RhdHVzLT5pbmZvVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGRybUluZm9TdGF0dXMtPm1pbWVUeXBlKTsKKworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBkcm1CdWZmZXIgPSBkcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBkcm1CdWZmZXItPmxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGRybUJ1ZmZlci0+ZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBkcm1CdWZmZXItPmRhdGE7CisgICAgICAgICAgICAgICAgZGVsZXRlIGRybUJ1ZmZlcjsgZHJtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZHJtSW5mbzsgZHJtSW5mbyA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBkcm1JbmZvU3RhdHVzOyBkcm1JbmZvU3RhdHVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEFDUVVJUkVfRFJNX0lORk86CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpBQ1FVSVJFX0RSTV9JTkZPIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBEUk0gaW5mbyBSZXF1ZXN0CisgICAgICAgIERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCA9IG5ldyBEcm1JbmZvUmVxdWVzdChkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBkcm1JbmZvUmVxdWVzdC0+cHV0KGtleSwgKHZhbHVlID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIERybUluZm8qIGRybUluZm8gPSBhY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworCisgICAgICAgIGlmIChOVUxMICE9IGRybUluZm8pIHsKKyAgICAgICAgICAgIC8vRmlsbGluZyBEUk0gSW5mbworICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyIGRybUJ1ZmZlciA9IGRybUluZm8tPmdldERhdGEoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUluZm8tPmdldEluZm9UeXBlKCkpOworCisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRybUJ1ZmZlci5sZW5ndGg7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShkcm1CdWZmZXIuZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGRybUluZm8tPmdldE1pbWVUeXBlKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtSW5mby0+Z2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIERybUluZm86OktleUl0ZXJhdG9yIGtleUl0ID0gZHJtSW5mby0+a2V5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGtleSk7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZSA9IGRybUluZm8tPmdldChrZXkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoKHZhbHVlID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBbXSBkcm1CdWZmZXIuZGF0YTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZHJtSW5mb1JlcXVlc3Q7IGRybUluZm9SZXF1ZXN0ID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGRybUluZm87IGRybUluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgU0FWRV9SSUdIVFM6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpTQVZFX1JJR0hUUyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAvL0ZpbGxpbmcgRFJNIFJpZ2h0cworICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IERybUJ1ZmZlciBkcm1CdWZmZXIoKGNoYXIgKilkYXRhLnJlYWRJbnBsYWNlKGJ1ZmZlclNpemUpLCBidWZmZXJTaXplKTsKKworICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IFN0cmluZzggYWNjb3VudElkKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IFN0cmluZzggc3Vic2NyaXB0aW9uSWQoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCByaWdodHNQYXRoKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IFN0cmluZzggY29udGVudFBhdGgoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICBEcm1SaWdodHMgZHJtUmlnaHRzKGRybUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1pbWVUeXBlID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IG1pbWVUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFjY291bnRJZCA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiBhY2NvdW50SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3Vic2NyaXB0aW9uSWQgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogc3Vic2NyaXB0aW9uSWQpKTsKKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBzYXZlUmlnaHRzKHVuaXF1ZUlkLCBkcm1SaWdodHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyaWdodHNQYXRoID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IHJpZ2h0c1BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29udGVudFBhdGggPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogY29udGVudFBhdGgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX09SSUdJTkFMX01JTUVUWVBFOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX09SSUdJTkFMX01JTUVUWVBFIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBTdHJpbmc4IG9yaWdpbmFsTWltZVR5cGUgPSBnZXRPcmlnaW5hbE1pbWVUeXBlKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChvcmlnaW5hbE1pbWVUeXBlKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEdFVF9EUk1fT0JKRUNUX1RZUEU6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpHRVRfRFJNX09CSkVDVF9UWVBFIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgZHJtT2JqZWN0VHlwZQorICAgICAgICAgICAgPSBnZXREcm1PYmplY3RUeXBlKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1PYmplY3RUeXBlKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIENIRUNLX1JJR0hUU19TVEFUVVM6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDSEVDS19SSUdIVFNfU1RBVFVTIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgcmVzdWx0CisgICAgICAgICAgICA9IGNoZWNrUmlnaHRzU3RhdHVzKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIENPTlNVTUVfUklHSFRTOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q09OU1VNRV9SSUdIVFMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgZGVsZXRlIGhhbmRsZS5kZWNyeXB0SW5mbzsgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFNFVF9QTEFZQkFDS19TVEFUVVM6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpTRVRfUExBWUJBQ0tfU1RBVFVTIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOworICAgICAgICBoYW5kbGUuZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLm1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEFwaVR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKworICAgICAgICBjb25zdCBpbnQgYnVmZmVyTGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKElOVkFMSURfQlVGRkVSX0xFTkdUSCAhPSBidWZmZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgVkFMSURBVEVfQUNUSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6VkFMSURBVEVfQUNUSU9OIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBib29sIHJlc3VsdCA9IHZhbGlkYXRlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkRlc2NyaXB0aW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUkVNT1ZFX1JJR0hUUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFTU9WRV9SSUdIVFMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVJpZ2h0cyhkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBSRU1PVkVfQUxMX1JJR0hUUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFTU9WRV9BTExfUklHSFRTIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdmVBbGxSaWdodHMoZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIE9QRU5fQ09OVkVSVF9TRVNTSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6T1BFTl9DT05WRVJUX1NFU1NJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCBjb252ZXJ0SWQgPSBvcGVuQ29udmVydFNlc3Npb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb252ZXJ0SWQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ09OVkVSVF9EQVRBOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q09OVkVSVF9EQVRBIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgY29udmVydElkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAvL0ZpbGxpbmcgaW5wdXQgZGF0YQorICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIERybUJ1ZmZlciogaW5wdXREYXRhID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOworCisgICAgICAgIERybUNvbnZlcnRlZFN0YXR1cyogICAgZHJtQ29udmVydGVkU3RhdHVzID0gY29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBkcm1Db252ZXJ0ZWRTdGF0dXMpIHsKKyAgICAgICAgICAgIC8vRmlsbGluZyBEcm0gQ29udmVydGVkIFN0c3R1cworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtQ29udmVydGVkU3RhdHVzLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUNvbnZlcnRlZFN0YXR1cy0+b2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhKSB7CisgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBjb252ZXJ0ZWREYXRhID0gZHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gY29udmVydGVkRGF0YS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoY29udmVydGVkRGF0YS0+ZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBjb252ZXJ0ZWREYXRhLT5kYXRhOworICAgICAgICAgICAgICAgIGRlbGV0ZSBjb252ZXJ0ZWREYXRhOyBjb252ZXJ0ZWREYXRhID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgaW5wdXREYXRhOyBpbnB1dERhdGEgPSBOVUxMOworICAgICAgICBkZWxldGUgZHJtQ29udmVydGVkU3RhdHVzOyBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0xPU0VfQ09OVkVSVF9TRVNTSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q0xPU0VfQ09OVkVSVF9TRVNTSU9OIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqICAgIGRybUNvbnZlcnRlZFN0YXR1cworICAgICAgICAgICAgPSBjbG9zZUNvbnZlcnRTZXNzaW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpOworCisgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERybSBDb252ZXJ0ZWQgU3RzdHVzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db252ZXJ0ZWRTdGF0dXMtPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtQ29udmVydGVkU3RhdHVzLT5vZmZzZXQpOworCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBjb252ZXJ0ZWREYXRhLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShjb252ZXJ0ZWREYXRhLT5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGNvbnZlcnRlZERhdGEtPmRhdGE7CisgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnZlcnRlZERhdGE7IGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1Db252ZXJ0ZWRTdGF0dXM7IGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBHRVRfQUxMX1NVUFBPUlRfSU5GTzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9BTExfU1VQUE9SVF9JTkZPIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvQXJyYXkgPSBOVUxMOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCAmbGVuZ3RoLCAmZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgRHJtU3VwcG9ydEluZm8gZHJtU3VwcG9ydEluZm8gPSBkcm1TdXBwb3J0SW5mb0FycmF5W2ldOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1TdXBwb3J0SW5mby5nZXRGaWxlU3VmZml4Q291bnQoKSk7CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yIGZpbGVTdWZmaXhJdAorICAgICAgICAgICAgICAgID0gZHJtU3VwcG9ydEluZm8uZ2V0RmlsZVN1ZmZpeEl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoZmlsZVN1ZmZpeEl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZmlsZVN1ZmZpeEl0Lm5leHQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybVN1cHBvcnRJbmZvLmdldE1pbWVUeXBlQ291bnQoKSk7CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciBtaW1lVHlwZUl0ID0gZHJtU3VwcG9ydEluZm8uZ2V0TWltZVR5cGVJdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKG1pbWVUeXBlSXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChtaW1lVHlwZUl0Lm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGRybVN1cHBvcnRJbmZvLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBkcm1TdXBwb3J0SW5mb0FycmF5OyBkcm1TdXBwb3J0SW5mb0FycmF5ID0gTlVMTDsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIE9QRU5fREVDUllQVF9TRVNTSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6T1BFTl9ERUNSWVBUX1NFU1NJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBmZCA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCisgICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpOworCisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChoYW5kbGUtPm1pbWVUeXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5zdGF0dXMpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGUtPmRlY3J5cHRJbmZvOyBoYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOk9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IHVyaSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZS0+ZGVjcnlwdEluZm87IGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIENMT1NFX0RFQ1JZUFRfU0VTU0lPTjoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNMT1NFX0RFQ1JZUFRfU0VTU0lPTiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+bWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPnN0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOklOSVRJQUxJWkVfREVDUllQVF9VTklUIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOworICAgICAgICBoYW5kbGUuZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLm1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEFwaVR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKworICAgICAgICBjb25zdCBpbnQgYnVmZmVyTGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKElOVkFMSURfQlVGRkVSX0xFTkdUSCAhPSBidWZmZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAvL0ZpbGxpbmcgSGVhZGVyIGluZm8KKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBEcm1CdWZmZXIqIGhlYWRlckluZm8gPSBOVUxMOworICAgICAgICBoZWFkZXJJbmZvID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cworICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBoZWFkZXJJbmZvOyBoZWFkZXJJbmZvID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIERFQ1JZUFQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpERUNSWVBUIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOworICAgICAgICBoYW5kbGUuZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLm1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEFwaVR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKworICAgICAgICBjb25zdCBpbnQgYnVmZmVyTGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKElOVkFMSURfQlVGRkVSX0xFTkdUSCAhPSBidWZmZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGRlY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIGNvbnN0IGludCBlbmNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgRHJtQnVmZmVyKiBlbmNCdWZmZXIKKyAgICAgICAgICAgID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoZW5jQnVmZmVyU2l6ZSksIGVuY0J1ZmZlclNpemUpOworCisgICAgICAgIGNoYXIqIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2RlY0J1ZmZlclNpemVdOworICAgICAgICBEcm1CdWZmZXIqIGRlY0J1ZmZlciA9IG5ldyBEcm1CdWZmZXIoYnVmZmVyLCBkZWNCdWZmZXJTaXplKTsKKworICAgICAgICBEcm1CdWZmZXIqIElWID0gTlVMTDsKKyAgICAgICAgaWYgKDAgIT0gZGF0YS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGl2QnVmZmVybGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIElWID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoaXZCdWZmZXJsZW5ndGgpLCBpdkJ1ZmZlcmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKKyAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCAmZGVjQnVmZmVyLCBJVik7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IGRlY0J1ZmZlci0+bGVuZ3RoOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgcmVwbHktPndyaXRlKGRlY0J1ZmZlci0+ZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgZGVsZXRlIGhhbmRsZS5kZWNyeXB0SW5mbzsgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGVuY0J1ZmZlcjsgZW5jQnVmZmVyID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGRlY0J1ZmZlcjsgZGVjQnVmZmVyID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlcjsgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIElWOyBJViA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBGSU5BTElaRV9ERUNSWVBUX1VOSVQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpGSU5BTElaRV9ERUNSWVBUX1VOSVQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUFJFQUQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpSRUFEIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOworICAgICAgICBoYW5kbGUuZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLm1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEFwaVR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKworICAgICAgICBjb25zdCBpbnQgYnVmZmVyTGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKElOVkFMSURfQlVGRkVSX0xFTkdUSCAhPSBidWZmZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IG5ldyBEZWNyeXB0SW5mbygpOworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50IG51bUJ5dGVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbbnVtQnl0ZXNdOworCisgICAgICAgIGNvbnN0IG9mZl90IG9mZnNldCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgJmhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgaWYgKDAgPCByZXN1bHQpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZShidWZmZXIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICBkZWxldGUgW10gYnVmZmVyLCBidWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwIGIvZHJtL2NvbW1vbi9JRHJtU2VydmljZUxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVlYTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9JRHJtU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb0V2ZW50Lmg+CisjaW5jbHVkZSAiSURybVNlcnZpY2VMaXN0ZW5lci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdHVzX3QgQnBEcm1TZXJ2aWNlTGlzdGVuZXI6Om5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSB7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1TZXJ2aWNlTGlzdGVuZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKGV2ZW50LmdldFVuaXF1ZUlkKCkpOworICAgIGRhdGEud3JpdGVJbnQzMihldmVudC5nZXRUeXBlKCkpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGV2ZW50LmdldE1lc3NhZ2UoKSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoTk9USUZZLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERybVNlcnZpY2VMaXN0ZW5lciwgImRybS5JRHJtU2VydmljZUxpc3RlbmVyIik7CisKK3N0YXR1c190IEJuRHJtU2VydmljZUxpc3RlbmVyOjpvblRyYW5zYWN0KAorICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIE5PVElGWToKKyAgICB7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtU2VydmljZUxpc3RlbmVyLCBkYXRhLCByZXBseSk7CisgICAgICAgIGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGludCB0eXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBub3RpZnkoRHJtSW5mb0V2ZW50KHVuaXF1ZUlkLCB0eXBlLCBtZXNzYWdlKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vUmVhZFdyaXRlVXRpbHMuY3BwIGIvZHJtL2NvbW1vbi9SZWFkV3JpdGVVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjNGZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vUmVhZFdyaXRlVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZWFkV3JpdGVVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFJlYWRXcml0ZVV0aWxzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIEZBSUxVUkUgLTEKKworU3RyaW5nOCBSZWFkV3JpdGVVdGlsczo6cmVhZEJ5dGVzKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoKSB7CisgICAgRklMRSogZmlsZSA9IE5VTEw7CisgICAgZmlsZSA9IGZvcGVuKGZpbGVQYXRoLnN0cmluZygpLCAiciIpOworCisgICAgU3RyaW5nOCBzdHJpbmcoIiIpOworICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKGZpbGUpOworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZzYikgPT0gMCAmJiBzYi5zdF9zaXplID4gMCkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHNiLnN0X3NpemU7CisgICAgICAgICAgICBjaGFyKiBieXRlcyA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IHJlYWQoZmQsICh2b2lkKikgYnl0ZXMsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGJ5dGVzLCBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIGJ5dGVzOworICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZzsKK30KKworaW50IFJlYWRXcml0ZVV0aWxzOjpyZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNoYXIqKiBidWZmZXIpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJyIik7CisgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAoTlVMTCAhPSBmaWxlKSB7CisgICAgICAgIGludCBmZCA9IGZpbGVubyhmaWxlKTsKKyAgICAgICAgc3RydWN0IHN0YXQgc2I7CisKKyAgICAgICAgaWYgKGZzdGF0KGZkLCAmc2IpID09IDAgJiYgc2Iuc3Rfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IHNiLnN0X3NpemU7CisgICAgICAgICAgICAqYnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggIT0gcmVhZChmZCwgKHZvaWQqKSAqYnVmZmVyLCBsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3ZvaWQgUmVhZFdyaXRlVXRpbHM6OndyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhKSB7CisgICAgRklMRSogZmlsZSA9IE5VTEw7CisgICAgZmlsZSA9IGZvcGVuKGZpbGVQYXRoLnN0cmluZygpLCAidysiKTsKKworICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKGZpbGUpOworCisgICAgICAgIGludCBzaXplID0gZGF0YS5zaXplKCk7CisgICAgICAgIGlmIChGQUlMVVJFICE9IGZ0cnVuY2F0ZShmZCwgc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmIChzaXplICE9IHdyaXRlKGZkLCBkYXRhLnN0cmluZygpLCBzaXplKSkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byB3cml0ZSB0aGUgZGF0YSB0bzogJXMiLCBmaWxlUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KK30KKwordm9pZCBSZWFkV3JpdGVVdGlsczo6YXBwZW5kVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhKSB7CisgICAgRklMRSogZmlsZSA9IE5VTEw7CisgICAgZmlsZSA9IGZvcGVuKGZpbGVQYXRoLnN0cmluZygpLCAiYSsiKTsKKworICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKGZpbGUpOworCisgICAgICAgIGludCBzaXplID0gZGF0YS5zaXplKCk7CisgICAgICAgIGlmIChzaXplICE9IHdyaXRlKGZkLCBkYXRhLnN0cmluZygpLCBzaXplKSkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHdyaXRlIHRoZSBkYXRhIHRvOiAlcyIsIGZpbGVQYXRoLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtaW9zZXJ2ZXIvQW5kcm9pZC5tayBiL2RybS9kcm1pb3NlcnZlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTcxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIG1haW5fZHJtaW9zZXJ2ZXIuY3BwIFwKKyAgICBEcm1JT1NlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJiaW5kZXIKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorIExPQ0FMX0xETElCUyArPSAtbGRsCitlbHNlCisgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJkcm1mcmFtZXdvcmtjb21tb24KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBkcm1pb3NlcnZlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1pb3NlcnZlci9Ecm1JT1NlcnZpY2UuY3BwIGIvZHJtL2RybWlvc2VydmVyL0RybUlPU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlNmU3MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1pb3NlcnZlci9Ecm1JT1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybUlPU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlICJEcm1JT1NlcnZpY2UuaCIKKyNpbmNsdWRlICJSZWFkV3JpdGVVdGlscy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordm9pZCBEcm1JT1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIExPR1YoImluc3RhbnRpYXRlIik7CisgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1JT1NlcnZpY2UiKSwgbmV3IERybUlPU2VydmljZSgpKTsKK30KKworRHJtSU9TZXJ2aWNlOjpEcm1JT1NlcnZpY2UoKSB7CisgICAgTE9HVigiY3JlYXRlZCIpOworfQorCitEcm1JT1NlcnZpY2U6On5Ecm1JT1NlcnZpY2UoKSB7CisgICAgTE9HVigiRGVzdHJveWVkIik7Cit9CisKK3ZvaWQgRHJtSU9TZXJ2aWNlOjp3cml0ZVRvRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgZGF0YUJ1ZmZlcikgeworICAgIExPR1YoIkVudGVyaW5nIHdyaXRlVG9GaWxlIik7CisgICAgUmVhZFdyaXRlVXRpbHM6OndyaXRlVG9GaWxlKGZpbGVQYXRoLCBkYXRhQnVmZmVyKTsKK30KKworU3RyaW5nOCBEcm1JT1NlcnZpY2U6OnJlYWRGcm9tRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCkgeworICAgIExPR1YoIkVudGVyaW5nIHJlYWRGcm9tRmlsZSIpOworICAgIHJldHVybiBSZWFkV3JpdGVVdGlsczo6cmVhZEJ5dGVzKGZpbGVQYXRoKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2RybWlvc2VydmVyL21haW5fZHJtaW9zZXJ2ZXIuY3BwIGIvZHJtL2RybWlvc2VydmVyL21haW5fZHJtaW9zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDA0OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybWlvc2VydmVyL21haW5fZHJtaW9zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSA8RHJtSU9TZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOworICAgIERybUlPU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjJmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBtYWluX2RybXNlcnZlci5jcHAgXAorICAgIERybU1hbmFnZXIuY3BwIFwKKyAgICBEcm1NYW5hZ2VyU2VydmljZS5jcHAgXAorICAgIFN0cmluZ1Rva2VuaXplci5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmJpbmRlcgorCitpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisgTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKKyBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmRybWZyYW1ld29ya2NvbW1vbgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBkcm1zZXJ2ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRmMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtTWFuYWdlcihOYXRpdmUpIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9FdmVudC5oPgorI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvUmVxdWVzdC5oPgorI2luY2x1ZGUgPGRybS9Ecm1TdXBwb3J0SW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxJRHJtRW5naW5lLmg+CisKKyNpbmNsdWRlICJEcm1NYW5hZ2VyLmgiCisjaW5jbHVkZSAiUmVhZFdyaXRlVXRpbHMuaCIKKworI2RlZmluZSBERUNSWVBUX0ZJTEVfRVJST1IgLTEKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK1ZlY3RvcjxpbnQ+IERybU1hbmFnZXI6Om1VbmlxdWVJZFZlY3RvcjsKK2NvbnN0IFN0cmluZzggRHJtTWFuYWdlcjo6RU1QVFlfU1RSSU5HKCIiKTsKKworRHJtTWFuYWdlcjo6RHJtTWFuYWdlcigpIDoKKyAgICBtRGVjcnlwdFNlc3Npb25JZCgwKSwKKyAgICBtQ29udmVydElkKDApIHsKKworfQorCitEcm1NYW5hZ2VyOjp+RHJtTWFuYWdlcigpIHsKKworfQorCitpbnQgRHJtTWFuYWdlcjo6YWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgaWYgKDAgPT0gdW5pcXVlSWQpIHsKKyAgICAgICAgaW50IHRlbXAgPSAwOworICAgICAgICBib29sIGZvdW5kVW5pcXVlSWQgPSBmYWxzZTsKKyAgICAgICAgc3JhbmQodGltZShOVUxMKSk7CisKKyAgICAgICAgd2hpbGUgKCFmb3VuZFVuaXF1ZUlkKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IG1VbmlxdWVJZFZlY3Rvci5zaXplKCk7CisgICAgICAgICAgICB0ZW1wID0gcmFuZCgpICUgMTAwOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yICg7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChtVW5pcXVlSWRWZWN0b3IuaXRlbUF0KGluZGV4KSA9PSB0ZW1wKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kVW5pcXVlSWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IHNpemUpIHsKKyAgICAgICAgICAgICAgICBmb3VuZFVuaXF1ZUlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1bmlxdWVJZCA9IHRlbXA7CisgICAgfQorICAgIG1VbmlxdWVJZFZlY3Rvci5wdXNoKHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gdW5pcXVlSWQ7Cit9CisKK3ZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtVW5pcXVlSWRWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHVuaXF1ZUlkID09IG1VbmlxdWVJZFZlY3Rvci5pdGVtQXQoaSkpIHsKKyAgICAgICAgICAgIG1VbmlxdWVJZFZlY3Rvci5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucygpIHsKKyAgICBTdHJpbmc4IHBsdWdpbkRpclBhdGgoIi9zeXN0ZW0vbGliL2RybS9wbHVnaW5zL25hdGl2ZSIpOworICAgIHJldHVybiBsb2FkUGx1Z0lucyhwbHVnaW5EaXJQYXRoKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6bG9hZFBsdWdJbnMoY29uc3QgU3RyaW5nOCYgcGx1Z0luRGlyUGF0aCkgeworICAgIGlmIChtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmlzRW1wdHkoKSkgeworICAgICAgICBtUGx1Z0luTWFuYWdlci5sb2FkUGx1Z0lucyhwbHVnSW5EaXJQYXRoKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZzggcGx1Z0luUGF0aCA9IHBsdWdJblBhdGhMaXN0W2ldOworICAgICAgICAgICAgRHJtU3VwcG9ydEluZm8qIGluZm8gPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luUGF0aCkuZ2V0U3VwcG9ydEluZm8oMCk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CisgICAgICAgICAgICAgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIHBsdWdJblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnVubG9hZFBsdWdJbnMoKSB7CisgICAgbUNvbnZlcnRTZXNzaW9uTWFwLmNsZWFyKCk7CisgICAgbURlY3J5cHRTZXNzaW9uTWFwLmNsZWFyKCk7CisgICAgbVBsdWdJbk1hbmFnZXIudW5sb2FkUGx1Z0lucygpOworICAgIG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuY2xlYXIoKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChOVUxMICE9IGRybVNlcnZpY2VMaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtU2VydmljZUxpc3RlbmVycy5hZGQodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcnZpY2VMaXN0ZW5lcnMucmVtb3ZlSXRlbSh1bmlxdWVJZCk7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3ZvaWQgRHJtTWFuYWdlcjo6YWRkQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIGlmICghbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CisgICAgICAgICAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOworICAgICAgICAgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpKTsKKyAgICAgICAgckRybUVuZ2luZS50ZXJtaW5hdGUodW5pcXVlSWQpOworICAgIH0KK30KKworRHJtQ29uc3RyYWludHMqIERybU1hbmFnZXI6OmdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgY29uc3QgaW50IGFjdGlvbikgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCAqcGF0aCk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuZ2V0Q29uc3RyYWludHModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitEcm1NZXRhZGF0YSogRHJtTWFuYWdlcjo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsICpwYXRoKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5nZXRNZXRhZGF0YSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgYWJzb2x1dGVQYXRoKSB7CisgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbihhYnNvbHV0ZVBhdGgpOworCisgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihhYnNvbHV0ZVBhdGgpOworICAgIHJEcm1FbmdpbmUuaW5pdGlhbGl6ZSh1bmlxdWVJZCk7CisgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CisKKyAgICBEcm1TdXBwb3J0SW5mbyogaW5mbyA9IHJEcm1FbmdpbmUuZ2V0U3VwcG9ydEluZm8oMCk7CisgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIGFic29sdXRlUGF0aCk7CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitib29sIERybU1hbmFnZXI6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKG1pbWVUeXBlKTsKKyAgICBib29sIHJlc3VsdCA9IChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpID8gdHJ1ZSA6IGZhbHNlOworCisgICAgaWYgKDAgPCBwYXRoLmxlbmd0aCgpKSB7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5jYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQoZHJtSW5mby0+Z2V0TWltZVR5cGUoKSk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUucHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBEcm1NYW5hZ2VyOjpjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luUGF0aExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoTGlzdFtpXSk7CisgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKKworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcm1JbmZvKiBEcm1NYW5hZ2VyOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChkcm1JbmZvUmVxdWVzdC0+Z2V0TWltZVR5cGUoKSk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuYWNxdWlyZURybUluZm8odW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKGRybVJpZ2h0cy5nZXRNaW1lVHlwZSgpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLnNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IERybU1hbmFnZXI6OmdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsIHBhdGgpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gRU1QVFlfU1RSSU5HOworfQorCitpbnQgRHJtTWFuYWdlcjo6Z2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuZ2V0RHJtT2JqZWN0VHlwZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gRHJtT2JqZWN0VHlwZTo6VU5LTk9XTjsKK30KKworaW50IERybU1hbmFnZXI6OmNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5jaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIFJpZ2h0c1N0YXR1czo6UklHSFRTX0lOVkFMSUQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmNvbnN1bWVSaWdodHMoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5jb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+c2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgRHJtTWFuYWdlcjo6dmFsaWRhdGVBY3Rpb24oCisgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgcGF0aCk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUudmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgcGF0aCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5yZW1vdmVSaWdodHModW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCkpOworICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLnJlbW92ZUFsbFJpZ2h0cyh1bmlxdWVJZCk7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRHJtTWFuYWdlcjo6b3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBpbnQgY29udmVydElkID0gLTE7CisKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQobWltZVR5cGUpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByRHJtRW5naW5lLm9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgbUNvbnZlcnRJZCArIDEpKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvbnZlcnRMb2NrKTsKKyAgICAgICAgICAgICsrbUNvbnZlcnRJZDsKKyAgICAgICAgICAgIGNvbnZlcnRJZCA9IG1Db252ZXJ0SWQ7CisgICAgICAgICAgICBtQ29udmVydFNlc3Npb25NYXAuYWRkKGNvbnZlcnRJZCwgJnJEcm1FbmdpbmUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0SWQ7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlcjo6Y29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgRHJtQ29udmVydGVkU3RhdHVzICpkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKG1Db252ZXJ0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGNvbnZlcnRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbUNvbnZlcnRTZXNzaW9uTWFwLnZhbHVlRm9yKGNvbnZlcnRJZCk7CisgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9IGRybUVuZ2luZS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyOjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIERybUNvbnZlcnRlZFN0YXR1cyAqZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKworICAgIGlmIChtQ29udmVydFNlc3Npb25NYXAuaW5kZXhPZktleShjb252ZXJ0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1Db252ZXJ0U2Vzc2lvbk1hcC52YWx1ZUZvcihjb252ZXJ0SWQpOworICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBkcm1FbmdpbmUtPmNsb3NlQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7CisgICAgICAgIG1Db252ZXJ0U2Vzc2lvbk1hcC5yZW1vdmVJdGVtKGNvbnZlcnRJZCk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpIHsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luUGF0aExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKyAgICBpbnQgc2l6ZSA9IHBsdWdJblBhdGhMaXN0LnNpemUoKTsKKyAgICBpbnQgdmFsaWRQbHVnaW5zID0gMDsKKworICAgIGlmICgwIDwgc2l6ZSkgeworICAgICAgICBWZWN0b3I8RHJtU3VwcG9ydEluZm8+IGRybVN1cHBvcnRJbmZvTGlzdDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbyogZHJtU3VwcG9ydEluZm8KKyAgICAgICAgICAgICAgICA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoKS5nZXRTdXBwb3J0SW5mbygwKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRybVN1cHBvcnRJbmZvKSB7CisgICAgICAgICAgICAgICAgZHJtU3VwcG9ydEluZm9MaXN0LmFkZCgqZHJtU3VwcG9ydEluZm8pOworICAgICAgICAgICAgICAgIGRlbGV0ZSBkcm1TdXBwb3J0SW5mbzsgZHJtU3VwcG9ydEluZm8gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsaWRQbHVnaW5zID0gZHJtU3VwcG9ydEluZm9MaXN0LnNpemUoKTsKKyAgICAgICAgaWYgKDAgPCB2YWxpZFBsdWdpbnMpIHsKKyAgICAgICAgICAgICpkcm1TdXBwb3J0SW5mb0FycmF5ID0gbmV3IERybVN1cHBvcnRJbmZvW3ZhbGlkUGx1Z2luc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkUGx1Z2luczsgKytpKSB7CisgICAgICAgICAgICAgICAgKCpkcm1TdXBwb3J0SW5mb0FycmF5KVtpXSA9IGRybVN1cHBvcnRJbmZvTGlzdFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqbGVuZ3RoID0gdmFsaWRQbHVnaW5zOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKworICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOworCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CisgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgKyttRGVjcnlwdFNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAuYWRkKG1EZWNyeXB0U2Vzc2lvbklkLCAmckRybUVuZ2luZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKKyAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgTE9HRSgiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworCisgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0cmluZzggcGx1Z0luSWQgPSBwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSwgdXJpKTsKKworICAgICAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICArK21EZWNyeXB0U2Vzc2lvbklkOworICAgICAgICAgICAgICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5hZGQobURlY3J5cHRTZXNzaW9uSWQsICZyRHJtRW5naW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgeworICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBMT0dFKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCkgeworICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmRlY3J5cHQoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBzc2l6ZV90IHJlc3VsdCA9IERFQ1JZUFRfRklMRV9FUlJPUjsKKworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPnByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IERybU1hbmFnZXI6OmdldFN1cHBvcnRlZFBsdWdJbklkKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggcGx1Z0luSWQoIiIpOworCisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBtaW1lVHlwZSkgeworICAgICAgICBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKG1pbWVUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcGx1Z0luSWQ7Cit9CisKK1N0cmluZzggRHJtTWFuYWdlcjo6Z2V0U3VwcG9ydGVkUGx1Z0luSWQoY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKKworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8gPSBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmtleUF0KGluZGV4KTsKKworICAgICAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkTWltZVR5cGUobWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcGx1Z0luSWQgPSBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnZhbHVlRm9yKGRybVN1cHBvcnRJbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGx1Z0luSWQ7Cit9CisKK1N0cmluZzggRHJtTWFuYWdlcjo6Z2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aChpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKKyAgICBjb25zdCBTdHJpbmc4IGZpbGVTdWZmaXggPSBwYXRoLmdldFBhdGhFeHRlbnNpb24oKTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8gPSBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmtleUF0KGluZGV4KTsKKworICAgICAgICBpZiAoZHJtU3VwcG9ydEluZm8uaXNTdXBwb3J0ZWRGaWxlU3VmZml4KGZpbGVTdWZmaXgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGtleSA9IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAudmFsdWVGb3IoZHJtU3VwcG9ydEluZm8pOworICAgICAgICAgICAgSURybUVuZ2luZSYgZHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKGtleSk7CisKKyAgICAgICAgICAgIGlmIChkcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKSkgeworICAgICAgICAgICAgICAgIHBsdWdJbklkID0ga2V5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwbHVnSW5JZDsKK30KKwordm9pZCBEcm1NYW5hZ2VyOjpvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TZXJ2aWNlTGlzdGVuZXJzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpbnQgdW5pcXVlSWQgPSBtU2VydmljZUxpc3RlbmVycy5rZXlBdChpbmRleCk7CisKKyAgICAgICAgaWYgKHVuaXF1ZUlkID09IGV2ZW50LmdldFVuaXF1ZUlkKCkpIHsKKyAgICAgICAgICAgIHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+IHNlcnZpY2VMaXN0ZW5lciA9IG1TZXJ2aWNlTGlzdGVuZXJzLnZhbHVlRm9yKHVuaXF1ZUlkKTsKKyAgICAgICAgICAgIHNlcnZpY2VMaXN0ZW5lci0+bm90aWZ5KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGNmYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybU1hbmFnZXJTZXJ2aWNlKE5hdGl2ZSkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgIkRybU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSAiRHJtTWFuYWdlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CisKK3N0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHJ1c3RlZFVpZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHRydXN0ZWRVaWRzW2ldID09IHVpZCkgeworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIExPR1YoImluc3RhbnRpYXRlIik7CisgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIiksIG5ldyBEcm1NYW5hZ2VyU2VydmljZSgpKTsKKworICAgIGlmICgwID49IHRydXN0ZWRVaWRzLnNpemUoKSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgICAgIC8vIEVhY2ggT0VNIG1hbnVmYWN0dXJlciBzaG91bGQgaW1wbGVtZW50L3JlcGxhY2Ugd2l0aCB0aGVpciBvd24gc29sdXRpb25zLgorCisgICAgICAgIC8vIEFkZCB0cnVzdGVkIHVpZHMgaGVyZQorICAgICAgICB0cnVzdGVkVWlkcy5wdXNoKEFJRF9NRURJQSk7CisgICAgfQorfQorCitEcm1NYW5hZ2VyU2VydmljZTo6RHJtTWFuYWdlclNlcnZpY2UoKSA6CisgICAgICAgIG1Ecm1NYW5hZ2VyKE5VTEwpIHsKKyAgICBMT0dWKCJjcmVhdGVkIik7CisgICAgbURybU1hbmFnZXIgPSBuZXcgRHJtTWFuYWdlcigpOworICAgIG1Ecm1NYW5hZ2VyLT5sb2FkUGx1Z0lucygpOworfQorCitEcm1NYW5hZ2VyU2VydmljZTo6fkRybU1hbmFnZXJTZXJ2aWNlKCkgeworICAgIExPR1YoIkRlc3Ryb3llZCIpOworICAgIG1Ecm1NYW5hZ2VyLT51bmxvYWRQbHVnSW5zKCk7CisgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyOyBtRHJtTWFuYWdlciA9IE5VTEw7Cit9CisKK2ludCBEcm1NYW5hZ2VyU2VydmljZTo6YWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5hZGRVbmlxdWVJZCh1bmlxdWVJZCk7Cit9CisKK3ZvaWQgRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIG1Ecm1NYW5hZ2VyLT5yZW1vdmVVbmlxdWVJZCh1bmlxdWVJZCk7Cit9CisKK3ZvaWQgRHJtTWFuYWdlclNlcnZpY2U6OmFkZENsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBtRHJtTWFuYWdlci0+YWRkQ2xpZW50KHVuaXF1ZUlkKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIG1Ecm1NYW5hZ2VyLT5yZW1vdmVDbGllbnQodW5pcXVlSWQpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2V0RHJtU2VydmljZUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgZHJtU2VydmljZUxpc3RlbmVyKSB7CisgICAgTE9HVigiRW50ZXJpbmcgc2V0RHJtU2VydmljZUxpc3RlbmVyIik7CisgICAgbURybU1hbmFnZXItPnNldERybVNlcnZpY2VMaXN0ZW5lcih1bmlxdWVJZCwgZHJtU2VydmljZUxpc3RlbmVyKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBpbnN0YWxsRHJtRW5naW5lIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5pbnN0YWxsRHJtRW5naW5lKHVuaXF1ZUlkLCBkcm1FbmdpbmVGaWxlKTsKK30KKworRHJtQ29uc3RyYWludHMqIERybU1hbmFnZXJTZXJ2aWNlOjpnZXRDb25zdHJhaW50cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgY29uc3QgaW50IGFjdGlvbikgeworICAgIExPR1YoIkVudGVyaW5nIGdldENvbnN0cmFpbnRzIGZyb20gY29udGVudCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0Q29uc3RyYWludHModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZ2V0TWV0YWRhdGEgZnJvbSBjb250ZW50Iik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRNZXRhZGF0YSh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK2Jvb2wgRHJtTWFuYWdlclNlcnZpY2U6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY2FuSGFuZGxlIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKK30KKworRHJtSW5mb1N0YXR1cyogRHJtTWFuYWdlclNlcnZpY2U6OnByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIExPR1YoIkVudGVyaW5nIHByb2Nlc3NEcm1JbmZvIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5wcm9jZXNzRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mbyk7Cit9CisKK0RybUluZm8qIERybU1hbmFnZXJTZXJ2aWNlOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIExPR1YoIkVudGVyaW5nIGFjcXVpcmVEcm1JbmZvIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5hY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIExPR1YoIkVudGVyaW5nIHNhdmVSaWdodHMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworfQorCitTdHJpbmc4IERybU1hbmFnZXJTZXJ2aWNlOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR1YoIkVudGVyaW5nIGdldE9yaWdpbmFsTWltZVR5cGUiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIHBhdGgpOworfQorCitpbnQgRHJtTWFuYWdlclNlcnZpY2U6OmdldERybU9iamVjdFR5cGUoCisgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBnZXREcm1PYmplY3RUeXBlIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK2ludCBEcm1NYW5hZ2VyU2VydmljZTo6Y2hlY2tSaWdodHNTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjaGVja1JpZ2h0c1N0YXR1cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjb25zdW1lUmlnaHRzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSB7CisgICAgTE9HVigiRW50ZXJpbmcgc2V0UGxheWJhY2tTdGF0dXMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworfQorCitib29sIERybU1hbmFnZXJTZXJ2aWNlOjp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIExPR1YoIkVudGVyaW5nIHZhbGlkYXRlQWN0aW9uIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT52YWxpZGF0ZUFjdGlvbih1bmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgcmVtb3ZlUmlnaHRzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5yZW1vdmVSaWdodHModW5pcXVlSWQsIHBhdGgpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoIkVudGVyaW5nIHJlbW92ZUFsbFJpZ2h0cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+cmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKK30KKworaW50IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIkVudGVyaW5nIG9wZW5Db252ZXJ0U2Vzc2lvbiIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+b3BlbkNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBtaW1lVHlwZSk7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlclNlcnZpY2U6OmNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIExPR1YoIkVudGVyaW5nIGNvbnZlcnREYXRhIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jb252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIExPR1YoIkVudGVyaW5nIGNsb3NlQ29udmVydFNlc3Npb24iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNsb3NlQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpnZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgeworICAgIExPR1YoIkVudGVyaW5nIGdldEFsbFN1cHBvcnRJbmZvIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRBbGxTdXBwb3J0SW5mbyh1bmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOworICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIExPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKKyAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBtRHJtTWFuYWdlci0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjbG9zZURlY3J5cHRTZXNzaW9uIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgTE9HVigiRW50ZXJpbmcgaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5pbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBkZWNyeXB0Iik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5kZWNyeXB0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBmaW5hbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKK30KKworc3NpemVfdCBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBwcmVhZCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+cHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvU3RyaW5nVG9rZW5pemVyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvU3RyaW5nVG9rZW5pemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMwYTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybXNlcnZlci9TdHJpbmdUb2tlbml6ZXIuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3RyaW5nVG9rZW5pemVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitTdHJpbmdUb2tlbml6ZXI6OlN0cmluZ1Rva2VuaXplcihjb25zdCBTdHJpbmc4JiBzdHJpbmcsIGNvbnN0IFN0cmluZzgmIGRlbGltaXRlcikgeworICAgIHNwbGl0U3RyaW5nKHN0cmluZywgZGVsaW1pdGVyKTsKK30KKwordm9pZCBTdHJpbmdUb2tlbml6ZXI6OnNwbGl0U3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZywgY29uc3QgU3RyaW5nOCYgZGVsaW1pdGVyKSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgcG9zaXRpb24gPSBzdHJpbmcuZmluZChkZWxpbWl0ZXIuc3RyaW5nKCksIGkpOworICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpICE9IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBTdHJpbmc4IHRva2VuKHN0cmluZy5zdHJpbmcoKStpLCBwb3NpdGlvbi1pKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIG1TdHJpbmdUb2tlbml6ZXJWZWN0b3IucHVzaCh0b2tlbik7CisgICAgICAgICAgICAgICAgaSA9IHBvc2l0aW9uICsgZGVsaW1pdGVyLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJpbmdUb2tlbml6ZXJWZWN0b3IucHVzaChTdHJpbmc4KHN0cmluZy5zdHJpbmcoKStpLCBzdHJpbmcubGVuZ3RoKCktaSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1N0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3IgU3RyaW5nVG9rZW5pemVyOjppdGVyYXRvcigpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKK1N0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IFN0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3ImIGl0ZXJhdG9yKSA6CisgICAgbVN0cmluZ1Rva2VuaXplcihpdGVyYXRvci5tU3RyaW5nVG9rZW5pemVyKSwKKyAgICBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7Cit9CisKK1N0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3ImIFN0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbVN0cmluZ1Rva2VuaXplciA9IGl0ZXJhdG9yLm1TdHJpbmdUb2tlbml6ZXI7CisgICAgbUluZGV4ID0gaXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtU3RyaW5nVG9rZW5pemVyLT5tU3RyaW5nVG9rZW5pemVyVmVjdG9yLnNpemUoKTsKK30KKworU3RyaW5nOCYgU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBTdHJpbmc4JiB2YWx1ZSA9IG1TdHJpbmdUb2tlbml6ZXItPm1TdHJpbmdUb2tlbml6ZXJWZWN0b3IuZWRpdEl0ZW1BdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9tYWluX2RybXNlcnZlci5jcHAgYi9kcm0vZHJtc2VydmVyL21haW5fZHJtc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEwNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybXNlcnZlci9tYWluX2RybXNlcnZlci5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncnAuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxEcm1NYW5hZ2VyU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIExPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKKyAgICBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtQ29udmVydGVkU3RhdHVzLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjAwNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtQ29udmVydGVkU3RhdHVzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIHN0YXR1cyBvZiB0aGUgY29udmVyc2lvbiwgdGhlIGNvbnZlcnRlZAorICogZGF0YS9jaGVja3N1bSBkYXRhIGFuZCB0aGUgb2Zmc2V0LiBPZmZzZXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBjbG9zZQorICogc2Vzc2lvbiB3aGVyZSB0aGUgYWdlbnQgd2lsbCBpbmZvcm0gd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgc2hvdWxkIGJlIGFkZGVkCisgKgorICogQXMgYSByZXN1bHQgb2Yge0BsaW5rIERybU1hbmFnZXJDbGllbnQjY29udmVydERhdGEoaW50LCBieXRlIFtdKX0gYW5kCisgKiB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNjbG9zZUNvbnZlcnRTZXNzaW9uKGludCl9IGFuIGluc3RhbmNlIG9mIERybUNvbnZlcnRlZFN0YXR1cworICogd291bGQgYmUgcmV0dXJuZWQuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtQ29udmVydGVkU3RhdHVzIHsKKyAgICAvLyBTaG91bGQgYmUgaW4gc3luYyB3aXRoIERybUNvbnZlcnRlZFN0YXR1cy5jcHAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfT0sgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTlBVVERBVEFfRVJST1IgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUiA9IDM7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHN0YXR1c0NvZGU7CisgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0ZWREYXRhOworICAgIHB1YmxpYyBmaW5hbCBpbnQgb2Zmc2V0OworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybUNvbnZlcnRlZFN0YXR1cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uCisgICAgICogQHBhcmFtIF9jb252ZXJ0ZWREYXRhIENvbnZlcnRlZCBkYXRhL2NoZWNrc3VtIGRhdGEKKyAgICAgKiBAcGFyYW0gX29mZnNldCBPZmZzZXQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtQ29udmVydGVkU3RhdHVzKGludCBfc3RhdHVzQ29kZSwgYnl0ZVtdIF9jb252ZXJ0ZWREYXRhLCBpbnQgX29mZnNldCkgeworICAgICAgICBzdGF0dXNDb2RlID0gX3N0YXR1c0NvZGU7CisgICAgICAgIGNvbnZlcnRlZERhdGEgPSBfY29udmVydGVkRGF0YTsKKyAgICAgICAgb2Zmc2V0ID0gX29mZnNldDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUVycm9yRXZlbnQuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUVycm9yRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZkOGFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtRXJyb3JFdmVudC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCisvKioKKyAqIFRoaXMgaXMgYW4gZW50aXR5IGNsYXNzIHdoaWNoIHdvdWxkIGJlIHBhc3NlZCB0byBjYWxsZXIgaW4KKyAqIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50Lk9uRXJyb3JMaXN0ZW5lciNvbkVycm9yKERybU1hbmFnZXJDbGllbnQsIERybUVycm9yRXZlbnQpfQorICoKKyAqLworcHVibGljIGNsYXNzIERybUVycm9yRXZlbnQgZXh0ZW5kcyBEcm1FdmVudCB7CisgICAgLyoqCisgICAgICogVFlQRV9SSUdIVFNfTk9UX0lOU1RBTExFRCwgd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbnN0YWxsaW5nIHRoZSByaWdodHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SSUdIVFNfTk9UX0lOU1RBTExFRCA9IDIwMDE7CisgICAgLyoqCisgICAgICogVFlQRV9SSUdIVFNfUkVORVdBTF9OT1RfQUxMT1dFRCwgd2hlbiB0aGUgc2VydmVyIHJlamVjdHMgcmVuZXdhbCBvZiByaWdodHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SSUdIVFNfUkVORVdBTF9OT1RfQUxMT1dFRCA9IDIwMDI7CisgICAgLyoqCisgICAgICogVFlQRV9OT1RfU1VQUE9SVEVELCB3aGVuIGFuc3dlciBmcm9tIHNlcnZlciBjYW4gbm90IGJlIGhhbmRsZWQgYnkgdGhlIG5hdGl2ZSBhZ2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PVF9TVVBQT1JURUQgPSAyMDAzOworICAgIC8qKgorICAgICAqIFRZUEVfT1VUX09GX01FTU9SWSwgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGR1cmluZyByZW5ld2FsLgorICAgICAqIENhbiBpbiB0aGUgZnV0dXJlIHBlcmhhcHMgYmUgdXNlZCB0byB0cmlnZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1VUX09GX01FTU9SWSA9IDIwMDQ7CisgICAgLyoqCisgICAgICogVFlQRV9OT19JTlRFUk5FVF9DT05ORUNUSU9OLCB3aGVuIHRoZSBJbnRlcm5ldCBjb25uZWN0aW9uIGlzIG1pc3NpbmcgYW5kIG5vIGF0dGVtcHQKKyAgICAgKiBjYW4gYmUgbWFkZSB0byByZW5ldyByaWdodHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT19JTlRFUk5FVF9DT05ORUNUSU9OID0gMjAwNTsKKyAgICAvKioKKyAgICAgKiBUWVBFX1BST0NFU1NfRFJNX0lORk9fRkFJTEVELCB3aGVuIGZhaWxlZCB0byBwcm9jZXNzIERybUluZm8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCA9IDIwMDY7CisgICAgLyoqCisgICAgICogVFlQRV9SRU1PVkVfQUxMX1JJR0hUU19GQUlMRUQsIHdoZW4gZmFpbGVkIHRvIHJlbW92ZSBhbGwgdGhlIHJpZ2h0cyBvYmplY3RzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIGFsbCBEUk0gc2NoZW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JFTU9WRV9BTExfUklHSFRTX0ZBSUxFRCA9IDIwMDc7CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtRXJyb3JFdmVudCBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIERybUVycm9yRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIodW5pcXVlSWQsIHR5cGUsIG1lc3NhZ2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtRXZlbnQuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiYzVjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1FdmVudC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgd2hpY2ggd291bGQgYmUgdXNlZCB0byBub3RpZnkgdGhlIGNhbGxlcgorICogYWJvdXQgYW55IGV2ZW50IG9jY3VycmVkIGluIERSTSBmcmFtZXdvcmsuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtRXZlbnQgeworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGFsbCBEUk0gc2NoZW1lcyBhcmUgcmVtb3ZlZCBzdWNjZXNzZnVsbHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FMTF9SSUdIVFNfUkVNT1ZFRCA9IDEwMDE7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgZ2l2ZW4gaW5mb3JtYXRpb24gaXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRFJNX0lORk9fUFJPQ0VTU0VEID0gMTAwMjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSTV9JTkZPX1NUQVRVU19PQkpFQ1QgPSAiZHJtX2luZm9fc3RhdHVzX29iamVjdCI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtVW5pcXVlSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU1lc3NhZ2UgPSAiIjsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIGZvciBEcm1FdmVudCBjbGFzcworICAgICAqCisgICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBEcm1FdmVudChpbnQgdW5pcXVlSWQsIGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICAgICAgbVR5cGUgPSB0eXBlOworCisgICAgICAgIGlmIChudWxsICE9IG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1NZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFVuaXF1ZSBJZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gVW5pcXVlIElkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRVbmlxdWVJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBUeXBlIG9mIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBUeXBlIG9mIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzYWdlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mby5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2ZiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3MgaW4gd2hpY2ggbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHRyYW5zYWN0CisgKiBiZXR3ZWVuIGRldmljZSBhbmQgb25saW5lIERSTSBzZXJ2ZXIgaXMgZGVzY3JpYmVkLiBEUk0gRnJhbWV3b3JrIGFjaGlldmVzCisgKiBzZXJ2ZXIgcmVnaXN0cmF0aW9uLCBsaWNlbnNlIGFjcXVpc2l0aW9uIGFuZCBhbnkgb3RoZXIgc2VydmVyIHJlbGF0ZWQgdHJhbnNhY3Rpb24KKyAqIGJ5IHBhc3NpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0byB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNwcm9jZXNzRHJtSW5mbyhEcm1JbmZvKX0uCisgKgorICogQ2FsbGVyIGNhbiByZXRyaWV2ZSB0aGUge0BsaW5rIERybUluZm99IGluc3RhbmNlIGJ5IHVzaW5nCisgKiB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNhY3F1aXJlRHJtSW5mbyhEcm1JbmZvUmVxdWVzdCl9CisgKiBieSBwYXNzaW5nIHtAbGluayBEcm1JbmZvUmVxdWVzdH0gaW5zdGFuY2UuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtSW5mbyB7CisgICAgcHJpdmF0ZSBieXRlW10gbURhdGE7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1pbWVUeXBlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1JbmZvVHlwZTsKKyAgICAvLyBJdCB3b3VsZCBiZSB1c2VkIHRvIGFkZCBhdHRyaWJ1dGVzIHNwZWNpZmljIHRvCisgICAgLy8gRFJNIHNjaGVtZSBzdWNoIGFzIGFjY291bnQgaWQsIHBhdGggb3IgbXVsdGlwbGUgcGF0aCdzCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybUluZm8gb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHBhcmFtIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gZGF0YSBUcmlnZ2VyIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybUluZm8oaW50IGluZm9UeXBlLCBieXRlW10gZGF0YSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIG1JbmZvVHlwZSA9IGluZm9UeXBlOworICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICAgICAgbURhdGEgPSBkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1JbmZvIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvVHlwZSBUeXBlIG9mIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIHBhdGggVHJpZ2dlciBkYXRhCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBEcm1JbmZvKGludCBpbmZvVHlwZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBtSW5mb1R5cGUgPSBpbmZvVHlwZTsKKyAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YSA9IERybVV0aWxzLnJlYWRCeXRlcyhwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQXMgdGhlIGdpdmVuIHBhdGggaXMgaW52YWxpZCwKKyAgICAgICAgICAgIC8vIHNldCBtRGF0YSA9IG51bGwsIHNvIHRoYXQgZnVydGhlciBwcm9jZXNzRHJtSW5mbygpCisgICAgICAgICAgICAvLyBjYWxsIHdvdWxkIGZhaWwgd2l0aCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYmVjYXVzZSBvZiBtRGF0YSA9IG51bGwKKyAgICAgICAgICAgIG1EYXRhID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgb3B0aW9uYWwgaW5mb3JtYXRpb24gYXMgPGtleSwgdmFsdWU+IHBhaXIgdG8gdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHRvIGFkZAorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQKKyAgICAgKiAgICAgVG8gcHV0IGN1c3RvbSBvYmplY3QgaW50byBEcm1JbmZvLCBjdXN0b20gb2JqZWN0IGhhcyB0bworICAgICAqICAgICBvdmVycmlkZSB0b1N0cmluZygpIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMucHV0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5LCBpZiBub3QgZm91bmQgcmV0dXJucyBudWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvciBudWxsCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGtleUl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRyaWJ1dGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHJpZ2dlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBUcmlnZ2VyIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW1ldHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5mb1R5cGUoKSB7CisgICAgICAgIHJldHVybiBtSW5mb1R5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgdmFsaWQgb3Igbm90CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgdmFsaWQKKyAgICAgKiAgICAgZmFsc2UgaWYgaW52YWxpZAorICAgICAqLworICAgICBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiAobnVsbCAhPSBtTWltZVR5cGUgJiYgIW1NaW1lVHlwZS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgJiYgbnVsbCAhPSBtRGF0YSAmJiBtRGF0YS5sZW5ndGggPiAwICYmIERybUluZm9SZXF1ZXN0LmlzVmFsaWRUeXBlKG1JbmZvVHlwZSkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb0V2ZW50LmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc4ZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb0V2ZW50LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd291bGQgYmUgcGFzc2VkIHRvIGNhbGxlciBpbgorICoge0BsaW5rIERybU1hbmFnZXJDbGllbnQuT25JbmZvTGlzdGVuZXIjb25JbmZvKERybU1hbmFnZXJDbGllbnQsIERybUluZm9FdmVudCl9CisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtSW5mb0V2ZW50IGV4dGVuZHMgRHJtRXZlbnQgeworICAgIC8qKgorICAgICAqIFRZUEVfQUxSRUFEWV9SRUdJU1RFUkVEX0JZX0FOT1RIRVJfQUNDT1VOVCwgd2hlbiByZWdpc3RyYXRpb24gaGFzIGJlZW4gYWxyZWFkeSBkb25lCisgICAgICogYnkgYW5vdGhlciBhY2NvdW50IElELgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUxSRUFEWV9SRUdJU1RFUkVEX0JZX0FOT1RIRVJfQUNDT1VOVCA9IDE7CisgICAgLyoqCisgICAgICogVFlQRV9SRU1PVkVfUklHSFRTLCB3aGVuIHRoZSByaWdodHMgbmVlZHMgdG8gYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVNT1ZFX1JJR0hUUyA9IDI7CisgICAgLyoqCisgICAgICogVFlQRV9SSUdIVFNfSU5TVEFMTEVELCB3aGVuIHRoZSByaWdodHMgYXJlIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZCBvay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19JTlNUQUxMRUQgPSAzOworICAgIC8qKgorICAgICAqIFRZUEVfV0FJVF9GT1JfUklHSFRTLCByaWdodHMgb2JqZWN0IGlzIG9uIGl0J3Mgd2F5IHRvIHBob25lLAorICAgICAqIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2hlY2tSaWdodHMgYWdhaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9XQUlUX0ZPUl9SSUdIVFMgPSA0OworICAgIC8qKgorICAgICAqIFRZUEVfQUNDT1VOVF9BTFJFQURZX1JFR0lTVEVSRUQsIHdoZW4gcmVnaXN0cmF0aW9uIGhhcyBiZWVuCisgICAgICogYWxyZWFkeSBkb25lIGZvciB0aGUgZ2l2ZW4gYWNjb3VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDQ09VTlRfQUxSRUFEWV9SRUdJU1RFUkVEID0gNTsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1JbmZvRXZlbnQgb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEcm1JbmZvRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIodW5pcXVlSWQsIHR5cGUsIG1lc3NhZ2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1JlcXVlc3QuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9SZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhNzk5YwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFRoaXMgaXMgYW4gZW50aXR5IGNsYXNzIHVzZWQgdG8gcGFzcyByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGdldAorICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjb21tdW5pY2F0ZSB3aXRoIG9ubGluZSBEUk0gc2VydmVyCisgKgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBwYXNzZWQgdG8ge0BsaW5rIERybU1hbmFnZXJDbGllbnQjYWNxdWlyZURybUluZm8oRHJtSW5mb1JlcXVlc3QpfQorICogdG8gZ2V0IHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgRHJtSW5mb30KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1JbmZvUmVxdWVzdCB7CisgICAgLy8gQ2hhbmdlcyBpbiBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb1JlcXVlc3QuY3BwCisgICAgLyoqCisgICAgICogQ29uc3RhbnRzIGRlZmluZXMgdGhlIHR5cGUgb2Yge0BsaW5rIERybUluZm9SZXF1ZXN0fQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVHSVNUUkFUSU9OX0lORk8gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fSU5GTyA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fUFJPR1JFU1NfSU5GTyA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBLZXkgdG8gcGFzcyB0aGUgdW5pcXVlIGlkIGZvciB0aGUgYWNjb3VudCBvciB0aGUgdXNlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfSUQgPSAiYWNjb3VudF9pZCI7CisKKyAgICAvKioKKyAgICAgKiBLZXkgdG8gcGFzcyB0aGUgdW5pcXVlIGlkIHVzZWQgZm9yIHN1YnNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlNDUklQVElPTl9JRCA9ICJzdWJzY3JpcHRpb25faWQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUluZm9UeXBlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NaW1lVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1SZXF1ZXN0SW5mb3JtYXRpb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1JbmZvUmVxdWVzdCBvYmplY3Qgd2l0aCB0eXBlIGFuZCBtaW1ldHlwZQorICAgICAqCisgICAgICogQHBhcmFtIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybUluZm9SZXF1ZXN0KGludCBpbmZvVHlwZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIG1JbmZvVHlwZSA9IGluZm9UeXBlOworICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW1ldHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5mb1R5cGUoKSB7CisgICAgICAgIHJldHVybiBtSW5mb1R5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhcyA8a2V5LCB2YWx1ZT4gcGFpciB0byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHRvIGFkZAorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIG1SZXF1ZXN0SW5mb3JtYXRpb24ucHV0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5LCBpZiBub3QgZm91bmQgcmV0dXJucyBudWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvciBudWxsCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RJbmZvcm1hdGlvbi5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4ga2V5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdEluZm9ybWF0aW9uLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdEluZm9ybWF0aW9uLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgdmFsaWQgb3Igbm90CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgdmFsaWQKKyAgICAgKiAgICAgZmFsc2UgaWYgaW52YWxpZAorICAgICAqLworICAgIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIChudWxsICE9IG1NaW1lVHlwZSAmJiAhbU1pbWVUeXBlLmVxdWFscygiIikKKyAgICAgICAgICAgICAgICAmJiBudWxsICE9IG1SZXF1ZXN0SW5mb3JtYXRpb24gJiYgaXNWYWxpZFR5cGUobUluZm9UeXBlKSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVHlwZShpbnQgaW5mb1R5cGUpIHsKKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoIChpbmZvVHlwZSkgeworICAgICAgICBjYXNlIFRZUEVfUkVHSVNUUkFUSU9OX0lORk86CisgICAgICAgIGNhc2UgVFlQRV9VTlJFR0lTVFJBVElPTl9JTkZPOgorICAgICAgICBjYXNlIFRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk86CisgICAgICAgIGNhc2UgVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fUFJPR1JFU1NfSU5GTzoKKyAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvU3RhdHVzLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ZWE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9TdGF0dXMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgcmVzdWx0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBkZXZpY2UKKyAqIGFuZCBvbmxpbmUgRFJNIHNlcnZlci4KKyAqCisgKiBBcyBhIHJlc3VsdCBvZiB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNwcm9jZXNzRHJtSW5mbyhEcm1JbmZvKX0gYW4gaW5zdGFuY2Ugb2YgRHJtSW5mb1N0YXR1cworICogd291bGQgYmUgcmV0dXJuZWQuIFRoaXMgY2xhc3MgaG9sZHMge0BsaW5rIFByb2Nlc3NlZERhdGF9LCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlCisgKiB7QGxpbmsgRHJtUmlnaHRzI0RybVJpZ2h0cyhQcm9jZXNzZWREYXRhLCBTdHJpbmcpfSBpbiBsaWNlbnNlIGFjcXVpc2l0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIERybUluZm9TdGF0dXMgeworICAgIC8vIFNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb1N0YXR1cy5jcHAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfT0sgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUiA9IDI7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHN0YXR1c0NvZGU7CisgICAgcHVibGljIGZpbmFsIGludCBpbmZvVHlwZTsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1pbWVUeXBlOworICAgIHB1YmxpYyBmaW5hbCBQcm9jZXNzZWREYXRhIGRhdGE7CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtSW5mb1N0YXR1cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb21tdW5pY2F0aW9uCisgICAgICogQHBhcmFtIF9pbmZvVHlwZSBUeXBlIG9mIHRoZSBEUk0gaW5mb3JtYXRpb24gcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIF9kYXRhIFRoZSBwcm9jZXNzZWQgZGF0YQorICAgICAqIEBwYXJhbSBfbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybUluZm9TdGF0dXMoaW50IF9zdGF0dXNDb2RlLCBpbnQgX2luZm9UeXBlLCBQcm9jZXNzZWREYXRhIF9kYXRhLCBTdHJpbmcgX21pbWVUeXBlKSB7CisgICAgICAgIHN0YXR1c0NvZGUgPSBfc3RhdHVzQ29kZTsKKyAgICAgICAgaW5mb1R5cGUgPSBfaW5mb1R5cGU7CisgICAgICAgIGRhdGEgPSBfZGF0YTsKKyAgICAgICAgbWltZVR5cGUgPSBfbWltZVR5cGU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhZjY3OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDgxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEludGVyZmFjZSBvZiBEUk0gRnJhbWV3b3JrLgorICogSmF2YSBhcHBsaWNhdGlvbiB3aWxsIGluc3RhbnRpYXRlIHRoaXMgY2xhc3MKKyAqIHRvIGFjY2VzcyBEUk0gYWdlbnQgdGhyb3VnaCBEUk0gRnJhbWV3b3JrLgorICoKKyAqLworcHVibGljIGNsYXNzIERybU1hbmFnZXJDbGllbnQgeworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGUgc3VjY2VzcyBvciBubyBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PTkUgPSAwOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IGVycm9yIG9jY3VycmVkIGFuZCB0aGUgcmVhc29uIGlzIG5vdCBrbm93bgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOS05PV04gPSAtMjAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRHJtTWFuYWdlckNsaWVudCI7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBMb2FkIHRoZSByZXNwZWN0aXZlIGxpYnJhcnkKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJkcm1mcmFtZXdvcmtfam5pIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gb2YgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHRvIGNvbW11bmljYXRlCisgICAgICogc29tZSBpbmZvIGFuZC9vciB3YXJuaW5nIGFib3V0IERybU1hbmFnZXJDbGllbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbkluZm9MaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gaW5kaWNhdGUgYW4gaW5mbyBvciBhIHdhcm5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGllbnQgRHJtTWFuYWdlckNsaWVudCBpbnN0YW5jZQorICAgICAgICAgKiBAcGFyYW0gZXZlbnQgaW5zdGFuY2Ugd2hpY2ggd3JhcHMgcmVhc29uIGFuZCBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhEcm1NYW5hZ2VyQ2xpZW50IGNsaWVudCwgRHJtSW5mb0V2ZW50IGV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBvZiBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgdG8gY29tbXVuaWNhdGUKKyAgICAgKiB0aGUgcmVzdWx0IG9mIHRpbWUgY29uc3VtaW5nIEFQSXMgYXN5bmNocm9ub3VzbHkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhlIHJlc3VsdCBvZiBhc3luY2hyb25vdXMgQVBJcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCBEcm1NYW5hZ2VyQ2xpZW50IGluc3RhbmNlCisgICAgICAgICAqIEBwYXJhbSBldmVudCBpbnN0YW5jZSB3aGljaCB3cmFwcyB0eXBlIGFuZCBtZXNzYWdlCisgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHJlc3VsdGFudCB2YWx1ZXMgaW4ga2V5IGFuZCB2YWx1ZSBwYWlyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChEcm1NYW5hZ2VyQ2xpZW50IGNsaWVudCwgRHJtRXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gb2YgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHRvIGNvbW11bmljYXRlCisgICAgICogdGhlIGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbkVycm9yTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCBEcm1NYW5hZ2VyQ2xpZW50IGluc3RhbmNlCisgICAgICAgICAqIEBwYXJhbSBldmVudCBpbnN0YW5jZSB3aGljaCB3cmFwcyBlcnJvciB0eXBlIGFuZCBtZXNzYWdlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKERybU1hbmFnZXJDbGllbnQgY2xpZW50LCBEcm1FcnJvckV2ZW50IGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFTU9WRV9BTExfUklHSFRTID0gMTAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1BST0NFU1NfRFJNX0lORk8gPSAxMDAyOworCisgICAgcHJpdmF0ZSBpbnQgbVVuaXF1ZUlkOworICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEluZm9IYW5kbGVyIG1JbmZvSGFuZGxlcjsKKyAgICBwcml2YXRlIEV2ZW50SGFuZGxlciBtRXZlbnRIYW5kbGVyOworICAgIHByaXZhdGUgT25JbmZvTGlzdGVuZXIgbU9uSW5mb0xpc3RlbmVyOworICAgIHByaXZhdGUgT25FdmVudExpc3RlbmVyIG1PbkV2ZW50TGlzdGVuZXI7CisgICAgcHJpdmF0ZSBPbkVycm9yTGlzdGVuZXIgbU9uRXJyb3JMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgY2xhc3MgRXZlbnRIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgcHVibGljIEV2ZW50SGFuZGxlcihMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBzdXBlcihsb29wZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgRHJtRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgRHJtRXJyb3JFdmVudCBlcnJvciA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKyAgICAgICAgICAgIHN3aXRjaChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBBQ1RJT05fUFJPQ0VTU19EUk1fSU5GTzogeworICAgICAgICAgICAgICAgIGZpbmFsIERybUluZm8gZHJtSW5mbyA9IChEcm1JbmZvKSBtc2cub2JqOworICAgICAgICAgICAgICAgIERybUluZm9TdGF0dXMgc3RhdHVzID0gX3Byb2Nlc3NEcm1JbmZvKG1VbmlxdWVJZCwgZHJtSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gc3RhdHVzICYmIERybUluZm9TdGF0dXMuU1RBVFVTX09LID09IHN0YXR1cy5zdGF0dXNDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KERybUV2ZW50LkRSTV9JTkZPX1NUQVRVU19PQkpFQ1QsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IERybUV2ZW50KG1VbmlxdWVJZCwgZ2V0RXZlbnRUeXBlKHN0YXR1cy5pbmZvVHlwZSksIG51bGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmZvVHlwZSA9IChudWxsICE9IHN0YXR1cykgPyBzdGF0dXMuaW5mb1R5cGUgOiBkcm1JbmZvLmdldEluZm9UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IERybUVycm9yRXZlbnQobVVuaXF1ZUlkLCBnZXRFcnJvclR5cGUoaW5mb1R5cGUpLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFDVElPTl9SRU1PVkVfQUxMX1JJR0hUUzogeworICAgICAgICAgICAgICAgIGlmIChFUlJPUl9OT05FID09IF9yZW1vdmVBbGxSaWdodHMobVVuaXF1ZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBEcm1FdmVudChtVW5pcXVlSWQsIERybUV2ZW50LlRZUEVfQUxMX1JJR0hUU19SRU1PVkVELCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBEcm1FcnJvckV2ZW50KG1VbmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1FcnJvckV2ZW50LlRZUEVfUkVNT1ZFX0FMTF9SSUdIVFNfRkFJTEVELCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gbWVzc2FnZSB0eXBlICIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bGwgIT0gbU9uRXZlbnRMaXN0ZW5lciAmJiBudWxsICE9IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgbU9uRXZlbnRMaXN0ZW5lci5vbkV2ZW50KERybU1hbmFnZXJDbGllbnQudGhpcywgZXZlbnQsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bGwgIT0gbU9uRXJyb3JMaXN0ZW5lciAmJiBudWxsICE9IGVycm9yKSB7CisgICAgICAgICAgICAgICAgbU9uRXJyb3JMaXN0ZW5lci5vbkVycm9yKERybU1hbmFnZXJDbGllbnQudGhpcywgZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub3RpZnkoCisgICAgICAgICAgICBPYmplY3QgdGhpc1JlZmVyZW5jZSwgaW50IHVuaXF1ZUlkLCBpbnQgaW5mb1R5cGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIERybU1hbmFnZXJDbGllbnQgaW5zdGFuY2UgPSAoRHJtTWFuYWdlckNsaWVudCkoKFdlYWtSZWZlcmVuY2UpdGhpc1JlZmVyZW5jZSkuZ2V0KCk7CisKKyAgICAgICAgaWYgKG51bGwgIT0gaW5zdGFuY2UgJiYgbnVsbCAhPSBpbnN0YW5jZS5tSW5mb0hhbmRsZXIpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IGluc3RhbmNlLm1JbmZvSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgIEluZm9IYW5kbGVyLklORk9fRVZFTlRfVFlQRSwgdW5pcXVlSWQsIGluZm9UeXBlLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIGluc3RhbmNlLm1JbmZvSGFuZGxlci5zZW5kTWVzc2FnZShtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSW5mb0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19FVkVOVF9UWVBFID0gMTsKKworICAgICAgICBwdWJsaWMgSW5mb0hhbmRsZXIoTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIERybUluZm9FdmVudCBldmVudCA9IG51bGw7CisgICAgICAgICAgICBEcm1FcnJvckV2ZW50IGVycm9yID0gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBJbmZvSGFuZGxlci5JTkZPX0VWRU5UX1RZUEU6CisgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgaW50IGluZm9UeXBlID0gbXNnLmFyZzI7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtc2cub2JqLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZm9UeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEcm1JbmZvRXZlbnQuVFlQRV9SRU1PVkVfUklHSFRTOiB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcm1VdGlscy5yZW1vdmVGaWxlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IERybUluZm9FdmVudCh1bmlxdWVJZCwgaW5mb1R5cGUsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBEcm1JbmZvRXZlbnQuVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5UOiB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IERybUluZm9FdmVudCh1bmlxdWVJZCwgaW5mb1R5cGUsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgRHJtRXJyb3JFdmVudCh1bmlxdWVJZCwgaW5mb1R5cGUsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtT25JbmZvTGlzdGVuZXIgJiYgbnVsbCAhPSBldmVudCkgeworICAgICAgICAgICAgICAgICAgICBtT25JbmZvTGlzdGVuZXIub25JbmZvKERybU1hbmFnZXJDbGllbnQudGhpcywgZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtT25FcnJvckxpc3RlbmVyICYmIG51bGwgIT0gZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uRXJyb3JMaXN0ZW5lci5vbkVycm9yKERybU1hbmFnZXJDbGllbnQudGhpcywgZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gbWVzc2FnZSB0eXBlICIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gaW5zdGFudGlhdGUgRHJtTWFuYWdlckNsaWVudAorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBvZiB0aGUgY2FsbGVyCisgICAgICovCisgICAgcHVibGljIERybU1hbmFnZXJDbGllbnQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBIYW5kbGVyVGhyZWFkIGluZm9UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiRHJtTWFuYWdlckNsaWVudC5JbmZvSGFuZGxlciIpOworICAgICAgICBpbmZvVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1JbmZvSGFuZGxlciA9IG5ldyBJbmZvSGFuZGxlcihpbmZvVGhyZWFkLmdldExvb3BlcigpKTsKKworICAgICAgICBIYW5kbGVyVGhyZWFkIGV2ZW50VGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRybU1hbmFnZXJDbGllbnQuRXZlbnRIYW5kbGVyIik7CisgICAgICAgIGV2ZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1FdmVudEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKGV2ZW50VGhyZWFkLmdldExvb3BlcigpKTsKKworICAgICAgICAvLyBzYXZlIHRoZSB1bmlxdWUgaWQKKyAgICAgICAgbVVuaXF1ZUlkID0gaGFzaENvZGUoKTsKKworICAgICAgICBfaW5pdGlhbGl6ZShtVW5pcXVlSWQsIG5ldyBXZWFrUmVmZXJlbmNlPERybU1hbmFnZXJDbGllbnQ+KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgX2ZpbmFsaXplKG1VbmlxdWVJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0byByZWNlaXZlCisgICAgICogc3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T25JbmZvTGlzdGVuZXIoT25JbmZvTGlzdGVuZXIgaW5mb0xpc3RlbmVyKSB7CisgICAgICAgIGlmIChudWxsICE9IGluZm9MaXN0ZW5lcikgeworICAgICAgICAgICAgbU9uSW5mb0xpc3RlbmVyID0gaW5mb0xpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0byByZWNlaXZlCisgICAgICogdGhlIHJlc3VsdCBvZiBhc3luY2hyb25vdXMgQVBJcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudExpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE9uRXZlbnRMaXN0ZW5lcihPbkV2ZW50TGlzdGVuZXIgZXZlbnRMaXN0ZW5lcikgeworICAgICAgICBpZiAobnVsbCAhPSBldmVudExpc3RlbmVyKSB7CisgICAgICAgICAgICBtT25FdmVudExpc3RlbmVyID0gZXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZWQgdG8gcmVjZWl2ZQorICAgICAqIGVycm9yIHJlc3VsdCBvZiBhc3luY2hyb25vdXMgQVBJcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE9uRXJyb3JMaXN0ZW5lcihPbkVycm9yTGlzdGVuZXIgZXJyb3JMaXN0ZW5lcikgeworICAgICAgICBpZiAobnVsbCAhPSBlcnJvckxpc3RlbmVyKSB7CisgICAgICAgICAgICBtT25FcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBpbmZvcm1hdGlvbnMgYWJvdXQgYWxsIHRoZSBwbHVnLWlucyByZWdpc3RlcmVkIHdpdGggRHJtRnJhbWV3b3JrLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiBEcm1FbmdpbmUgcGx1Zy1pbiBzdHJpbmdzCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZURybUVuZ2luZXMoKSB7CisgICAgICAgIERybVN1cHBvcnRJbmZvW10gc3VwcG9ydEluZm9zID0gX2dldEFsbFN1cHBvcnRJbmZvKG1VbmlxdWVJZCk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGRlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwcG9ydEluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZXNjcmlwdGlvbnMuYWRkKHN1cHBvcnRJbmZvc1tpXS5nZXREZXNjcmlwcml0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZHJtRW5naW5lcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRpb25zLnNpemUoKV07CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMudG9BcnJheShkcm1FbmdpbmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uc3RyYWludHMgaW5mb3JtYXRpb24gZXZhbHVhdGVkIGZyb20gRFJNIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRlbnQgcGF0aCBmcm9tIHdoZXJlIERSTSBjb25zdHJhaW50cyB3b3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb25zIGRlZmluZWQgaW4ge0BsaW5rIERybVN0b3JlLkFjdGlvbn0KKyAgICAgKiBAcmV0dXJuIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2UgaW4gd2hpY2ggY29uc3RyYWludHMga2V5LXZhbHVlIHBhaXJzIGFyZSBlbWJlZGRlZAorICAgICAqICAgICAgICAgb3IgbnVsbCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBnZXRDb25zdHJhaW50cyhTdHJpbmcgcGF0aCwgaW50IGFjdGlvbikgeworICAgICAgICBpZiAobnVsbCA9PSBwYXRoIHx8IHBhdGguZXF1YWxzKCIiKSB8fCAhRHJtU3RvcmUuQWN0aW9uLmlzVmFsaWQoYWN0aW9uKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gdXNhZ2Ugb3IgcGF0aCBpcyBpbnZhbGlkL251bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2dldENvbnN0cmFpbnRzKG1VbmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICB9CisKKyAgIC8qKgorICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGZyb20gRFJNIGNvbnRlbnQKKyAgICAqCisgICAgKiBAcGFyYW0gcGF0aCBDb250ZW50IHBhdGggZnJvbSB3aGVyZSBEUk0gbWV0YWRhdGEgd291bGQgYmUgcmV0cmlldmVkLgorICAgICogQHJldHVybiBDb250ZW50VmFsdWVzIGluc3RhbmNlIGluIHdoaWNoIG1ldGFkYXRhIGtleS12YWx1ZSBwYWlycyBhcmUgZW1iZWRkZWQKKyAgICAqICAgICAgICAgb3IgbnVsbCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgICAqLworICAgIHB1YmxpYyBDb250ZW50VmFsdWVzIGdldE1ldGFkYXRhKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChudWxsID09IHBhdGggfHwgcGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBwYXRoIGlzIGludmFsaWQvbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZ2V0TWV0YWRhdGEobVVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uc3RyYWludHMgaW5mb3JtYXRpb24gZXZhbHVhdGVkIGZyb20gRFJNIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgQ29udGVudCBVUkkgZnJvbSB3aGVyZSBEUk0gY29uc3RyYWludHMgd291bGQgYmUgcmV0cmlldmVkLgorICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9ucyBkZWZpbmVkIGluIHtAbGluayBEcm1TdG9yZS5BY3Rpb259CisgICAgICogQHJldHVybiBDb250ZW50VmFsdWVzIGluc3RhbmNlIGluIHdoaWNoIGNvbnN0cmFpbnRzIGtleS12YWx1ZSBwYWlycyBhcmUgZW1iZWRkZWQKKyAgICAgKiAgICAgICAgIG9yIG51bGwgaW4gY2FzZSBvZiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0Q29uc3RyYWludHMoVXJpIHVyaSwgaW50IGFjdGlvbikgeworICAgICAgICBpZiAobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXJpIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRDb25zdHJhaW50cyhjb252ZXJ0VXJpVG9QYXRoKHVyaSksIGFjdGlvbik7CisgICAgfQorCisgICAvKioKKyAgICAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmcm9tIERSTSBjb250ZW50CisgICAgKgorICAgICogQHBhcmFtIHVyaSBDb250ZW50IFVSSSBmcm9tIHdoZXJlIERSTSBtZXRhZGF0YSB3b3VsZCBiZSByZXRyaWV2ZWQuCisgICAgKiBAcmV0dXJuIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2UgaW4gd2hpY2ggbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFyZSBlbWJlZGRlZAorICAgICogICAgICAgICBvciBudWxsIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICovCisgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0TWV0YWRhdGEoVXJpIHVyaSkgeworICAgICAgICBpZiAobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXJpIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRNZXRhZGF0YShjb252ZXJ0VXJpVG9QYXRoKHVyaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgRFJNIHJpZ2h0cyB0byBzcGVjaWZpZWQgcmlnaHRzIHBhdGgKKyAgICAgKiBhbmQgbWFrZSBhc3NvY2lhdGlvbiB3aXRoIGNvbnRlbnQgcGF0aC4KKyAgICAgKgorICAgICAqIDxwIGNsYXNzPSJub3RlIj5JbiBjYXNlIG9mIE9NQSBvciBXTS1EUk0sIHJpZ2h0c1BhdGggYW5kIGNvbnRlbnRQYXRoIGNvdWxkIGJlIG51bGwuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtIGNvbnRlbnRQYXRoIEZpbGUgcGF0aCB3aGVyZSBjb250ZW50IHdhcyBzYXZlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBmYWlsZWQgdG8gc2F2ZSByaWdodHMgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNhdmVSaWdodHMoCisgICAgICAgICAgICBEcm1SaWdodHMgZHJtUmlnaHRzLCBTdHJpbmcgcmlnaHRzUGF0aCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSBkcm1SaWdodHMgfHwgIWRybVJpZ2h0cy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIGRybVJpZ2h0cyBvciBjb250ZW50UGF0aCBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSByaWdodHNQYXRoICYmICFyaWdodHNQYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIERybVV0aWxzLndyaXRlVG9GaWxlKHJpZ2h0c1BhdGgsIGRybVJpZ2h0cy5nZXREYXRhKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfc2F2ZVJpZ2h0cyhtVW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgbmV3IERSTSBFbmdpbmUgUGx1Zy1pbiBhdCB0aGUgcnVudGltZQorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZUZpbGVQYXRoIFBhdGggb2YgdGhlIHBsdWctaW4gZmlsZSB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zdGFsbERybUVuZ2luZShTdHJpbmcgZW5naW5lRmlsZVBhdGgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gZW5naW5lRmlsZVBhdGggfHwgZW5naW5lRmlsZVBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiR2l2ZW4gZW5naW5lRmlsZVBhdGg6ICIrIGVuZ2luZUZpbGVQYXRoICsgImlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIF9pbnN0YWxsRHJtRW5naW5lKG1VbmlxdWVJZCwgZW5naW5lRmlsZVBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTWltZXR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBoYW5kbGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICAgICB0cnVlIC0gaWYgdGhlIGdpdmVuIG1pbWVUeXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKiAgICAgICAgZmFsc2UgLSBjYW5ub3QgYmUgaGFuZGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAoKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikpICYmIChudWxsID09IG1pbWVUeXBlIHx8IG1pbWVUeXBlLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXRoIG9yIHRoZSBtaW1ldHlwZSBzaG91bGQgYmUgbm9uIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NhbkhhbmRsZShtVW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBtaW1ldHlwZSBvciB1cmkgY2FuIGJlIGhhbmRsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIENvbnRlbnQgVVJJIG9mIHRoZSBkYXRhIHRvIGJlIGhhbmRsZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1pbWV0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgaGFuZGxlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICAgdHJ1ZSAtIGlmIHRoZSBnaXZlbiBtaW1lVHlwZSBvciBwYXRoIGNhbiBiZSBoYW5kbGVkCisgICAgICogICAgICAgIGZhbHNlIC0gY2Fubm90IGJlIGhhbmRsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAoKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpICYmIChudWxsID09IG1pbWVUeXBlIHx8IG1pbWVUeXBlLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgb3IgdGhlIG1pbWV0eXBlIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYW5IYW5kbGUoY29udmVydFVyaVRvUGF0aCh1cmkpLCBtaW1lVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgZ2l2ZW4gZHJtIGluZm9ybWF0aW9uIGJhc2VkIG9uIGl0cyB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJtSW5mbyBJbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEVSUk9SX05PTkUgZm9yIHN1Y2Nlc3MKKyAgICAgKiAgICAgRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgcHJvY2Vzc0RybUluZm8oRHJtSW5mbyBkcm1JbmZvKSB7CisgICAgICAgIGlmIChudWxsID09IGRybUluZm8gfHwgIWRybUluZm8uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBkcm1JbmZvIGlzIGludmFsaWQvbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGludCByZXN1bHQgPSBFUlJPUl9VTktOT1dOOworICAgICAgICBpZiAobnVsbCAhPSBtRXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudEhhbmRsZXIub2J0YWluTWVzc2FnZShBQ1RJT05fUFJPQ0VTU19EUk1fSU5GTywgZHJtSW5mbyk7CisgICAgICAgICAgICByZXN1bHQgPSAobUV2ZW50SGFuZGxlci5zZW5kTWVzc2FnZShtc2cpKSA/IEVSUk9SX05PTkUgOiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RlciwgdW5yZWdpc3RlciBvciByaWdodHMgYWNxdWlzaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJtSW5mb1JlcXVlc3QgUmVxdWVzdCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBkcm1JbmZvCisgICAgICogQHJldHVybiBEcm1JbmZvIEluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtSW5mbyBhY3F1aXJlRHJtSW5mbyhEcm1JbmZvUmVxdWVzdCBkcm1JbmZvUmVxdWVzdCkgeworICAgICAgICBpZiAobnVsbCA9PSBkcm1JbmZvUmVxdWVzdCB8fCAhZHJtSW5mb1JlcXVlc3QuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBkcm1JbmZvUmVxdWVzdCBpcyBpbnZhbGlkL251bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2FjcXVpcmVEcm1JbmZvKG1VbmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIERybUluZm9SZXF1ZXN0IGFuZCByZXR1cm5zIHRoZSByaWdodHMgaW5mb3JtYXRpb24gYXN5bmNocm9ub3VzbHkuCisgICAgICogVGhpcyBpcyBhIHV0aWxpdHkgQVBJIHdoaWNoIGNvbnNpc3RzIG9mIHtAbGluayAjYWNxdWlyZURybUluZm8oRHJtSW5mb1JlcXVlc3QpfQorICAgICAqIGFuZCB7QGxpbmsgI3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfS4KKyAgICAgKiBJdCBjYW4gYmUgdXNlZCBpZiBzZWxlY3RlZCBEUk0gYWdlbnQgY2FuIHdvcmsgd2l0aCB0aGlzIGNvbWJpbmVkIHNlcXVlbmNlcy4KKyAgICAgKiBJbiBjYXNlIG9mIHNvbWUgRFJNIHNjaGVtZXMsIHN1Y2ggYXMgT01BIERSTSwgYXBwbGljYXRpb24gbmVlZHMgdG8gaW52b2tlCisgICAgICoge0BsaW5rICNhY3F1aXJlRHJtSW5mbyhEcm1JbmZvUmVxdWVzdCl9IGFuZCB7QGxpbmsgI3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfSwgc2VwYXJhdGVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEVSUk9SX05PTkUgZm9yIHN1Y2Nlc3MKKyAgICAgKiAgICAgRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgYWNxdWlyZVJpZ2h0cyhEcm1JbmZvUmVxdWVzdCBkcm1JbmZvUmVxdWVzdCkgeworICAgICAgICBEcm1JbmZvIGRybUluZm8gPSBhY3F1aXJlRHJtSW5mbyhkcm1JbmZvUmVxdWVzdCk7CisgICAgICAgIHJldHVybiBwcm9jZXNzRHJtSW5mbyhkcm1JbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgICAgICogdG8gcmV0cmlldmUgRFJNIG9iamVjdCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHJldHVybiBUeXBlIG9mIHRoZSBEUk0gY29udGVudC4KKyAgICAgKiBAc2VlIERybVN0b3JlLkRybU9iamVjdFR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERybU9iamVjdFR5cGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAoKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikpICYmIChudWxsID09IG1pbWVUeXBlIHx8IG1pbWVUeXBlLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXRoIG9yIHRoZSBtaW1ldHlwZSBzaG91bGQgYmUgbm9uIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2dldERybU9iamVjdFR5cGUobVVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICAgICAqIHVzaW5nIHNwZWNpZmllZCB1cmkgb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgICAgICogdG8gcmV0cmlldmUgRFJNIG9iamVjdCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBjb250ZW50IFVSSSBvZiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNaW1ldHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQuCisgICAgICogQHNlZSBEcm1TdG9yZS5Ecm1PYmplY3RUeXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXREcm1PYmplY3RUeXBlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAoKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpICYmIChudWxsID09IG1pbWVUeXBlIHx8IG1pbWVUeXBlLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgb3IgdGhlIG1pbWV0eXBlIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwYXRoID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXRoID0gY29udmVydFVyaVRvUGF0aCh1cmkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXZlbiB1cmkgaXMgaW52YWxpZCB0aGUgbWltZXR5cGUgc2hhbGwgYmUgdmFsaWQsIHNvIGFsbG93IHRvIHByb2NlZWQgZnVydGhlci4KKyAgICAgICAgICAgIExvZy53KFRBRywgIkdpdmVuIFVyaSBjb3VsZCBub3QgYmUgZm91bmQgaW4gbWVkaWEgc3RvcmUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0RHJtT2JqZWN0VHlwZShwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gTWltZXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbE1pbWVUeXBlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChudWxsID09IHBhdGggfHwgcGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBwYXRoIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZ2V0T3JpZ2luYWxNaW1lVHlwZShtVW5pcXVlSWQsIHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgY29udGVudCBVUkkgb2YgdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIE1pbWV0eXBlIG9mIHRoZSBvcmlnaW5hbCBjb250ZW50LCBzdWNoIGFzICJ2aWRlby9tcGVnIgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWxNaW1lVHlwZShVcmkgdXJpKSB7CisgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBVcmkuRU1QVFkgPT0gdXJpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiB1cmkgaXMgbm90IHZhbGlkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9yaWdpbmFsTWltZVR5cGUoY29udmVydFVyaVRvUGF0aCh1cmkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gU3RhdHVzIG9mIHRoZSByaWdodHMgZm9yIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBzZWUgRHJtU3RvcmUuUmlnaHRzU3RhdHVzCisgICAgICovCisgICAgcHVibGljIGludCBjaGVja1JpZ2h0c1N0YXR1cyhTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gY2hlY2tSaWdodHNTdGF0dXMocGF0aCwgRHJtU3RvcmUuQWN0aW9uLkRFRkFVTFQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGNvbnRlbnQgVVJJIG9mIHRoZSBkYXRhCisgICAgICogQHJldHVybiBTdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHNlZSBEcm1TdG9yZS5SaWdodHNTdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNoZWNrUmlnaHRzU3RhdHVzKFVyaSB1cmkpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHVyaSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2tSaWdodHNTdGF0dXMoY29udmVydFVyaVRvUGF0aCh1cmkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90IGZvciBzcGVjaWZpZWQgYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtCisgICAgICogQHJldHVybiBTdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHNlZSBEcm1TdG9yZS5SaWdodHNTdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNoZWNrUmlnaHRzU3RhdHVzKFN0cmluZyBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChudWxsID09IHBhdGggfHwgcGF0aC5lcXVhbHMoIiIpIHx8ICFEcm1TdG9yZS5BY3Rpb24uaXNWYWxpZChhY3Rpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBwYXRoIG9yIGFjdGlvbiBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NoZWNrUmlnaHRzU3RhdHVzKG1VbmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90IGZvciBzcGVjaWZpZWQgYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgY29udGVudCBVUkkgb2YgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtCisgICAgICogQHJldHVybiBTdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHNlZSBEcm1TdG9yZS5SaWdodHNTdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNoZWNrUmlnaHRzU3RhdHVzKFVyaSB1cmksIGludCBhY3Rpb24pIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHVyaSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2tSaWdodHNTdGF0dXMoY29udmVydFVyaVRvUGF0aCh1cmkpLCBhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCByZW1vdmVSaWdodHMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHBhdGggc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZW1vdmVSaWdodHMobVVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgY29udGVudCBVUkkgb2YgdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEVSUk9SX05PTkUgZm9yIHN1Y2Nlc3MKKyAgICAgKiAgICAgRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVtb3ZlUmlnaHRzKFVyaSB1cmkpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHVyaSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3ZlUmlnaHRzKGNvbnZlcnRVcmlUb1BhdGgodXJpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBldmVyeSBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCByZW1vdmVBbGxSaWdodHMoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBFUlJPUl9VTktOT1dOOworICAgICAgICBpZiAobnVsbCAhPSBtRXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudEhhbmRsZXIub2J0YWluTWVzc2FnZShBQ1RJT05fUkVNT1ZFX0FMTF9SSUdIVFMpOworICAgICAgICAgICAgcmVzdWx0ID0gKG1FdmVudEhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKSkgPyBFUlJPUl9OT05FIDogcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBBUEkgaXMgZm9yIEZvcndhcmQgTG9jayBiYXNlZCBEUk0gc2NoZW1lLgorICAgICAqIEVhY2ggdGltZSB0aGUgYXBwbGljYXRpb24gdHJpZXMgdG8gZG93bmxvYWQgYSBuZXcgRFJNIGZpbGUKKyAgICAgKiB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyB0bworICAgICAqIGJlZ2luIHdpdGggY2FsbGluZyB0aGlzIEFQSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBEZXNjcmlwdGlvbi9NSU1FIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEgcGFja2V0CisgICAgICogQHJldHVybiBjb252ZXJ0IElEIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgbWFpbnRhaW5pbmcgY29udmVydCBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobnVsbCA9PSBtaW1lVHlwZSB8fCBtaW1lVHlwZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXRoIG9yIHRoZSBtaW1lVHlwZSBzaG91bGQgYmUgbm9uIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX29wZW5Db252ZXJ0U2Vzc2lvbihtVW5pcXVlSWQsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGFuZCBjb252ZXJ0cyB0aGUgaW5wdXQgZGF0YSB3aGljaCBpcyBwYXJ0IG9mIERSTSBmaWxlLgorICAgICAqIFRoZSByZXN1bHRhbnQgY29udmVydGVkIGRhdGEgYW5kIHRoZSBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gdGhlIERybUNvbnZlcnRlZEluZm8KKyAgICAgKiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGVyZSBhcmUgbmV3IGJsb2NrCisgICAgICogb2YgZGF0YSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICAgICAqIEBwYXJhbSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiAgICAgICAgIGFwcGxpY2F0aW9uIHdpbGwgaWdub3JlIHRoZSBvZmZzZXQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIERybUNvbnZlcnRlZFN0YXR1cyBjb252ZXJ0RGF0YShpbnQgY29udmVydElkLCBieXRlW10gaW5wdXREYXRhKSB7CisgICAgICAgIGlmIChudWxsID09IGlucHV0RGF0YSB8fCAwID49IGlucHV0RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIGlucHV0RGF0YSBzaG91bGQgYmUgbm9uIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NvbnZlcnREYXRhKG1VbmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERybSBBZ2VudCB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBVcG9uIHN1Y2Nlc3NmdWwgY29udmVyc2lvbiBvZiB0aGUgY29tcGxldGUgZGF0YSwKKyAgICAgKiB0aGUgYWdlbnQgd2lsbCBpbmZvcm0gdGhhdCB3aGVyZSB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZQorICAgICAqIHNob3VsZCBiZSBhZGRlZC4gVGhpcyBzaWduYXR1cmUgYXBwZW5kaW5nIGlzIG5lZWRlZCB0byBpbnRlZ3JpdHkKKyAgICAgKiBwcm90ZWN0IHRoZSBjb252ZXJ0ZWQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgICAgICogICAgIHRoZSBhcHBsaWNhdGlvbiBvbiB3aGljaCBvZmZzZXQgdGhlc2Ugc2lnbmF0dXJlIGRhdGEgc2hvdWxkIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBEcm1Db252ZXJ0ZWRTdGF0dXMgY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgY29udmVydElkKSB7CisgICAgICAgIHJldHVybiBfY2xvc2VDb252ZXJ0U2Vzc2lvbihtVW5pcXVlSWQsIGNvbnZlcnRJZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXZlbnRUeXBlKGludCBpbmZvVHlwZSkgeworICAgICAgICBpbnQgZXZlbnRUeXBlID0gLTE7CisKKyAgICAgICAgc3dpdGNoIChpbmZvVHlwZSkgeworICAgICAgICBjYXNlIERybUluZm9SZXF1ZXN0LlRZUEVfUkVHSVNUUkFUSU9OX0lORk86CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3QuVFlQRV9VTlJFR0lTVFJBVElPTl9JTkZPOgorICAgICAgICBjYXNlIERybUluZm9SZXF1ZXN0LlRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk86CisgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1FdmVudC5UWVBFX0RSTV9JTkZPX1BST0NFU1NFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBldmVudFR5cGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXJyb3JUeXBlKGludCBpbmZvVHlwZSkgeworICAgICAgICBpbnQgZXJyb3IgPSAtMTsKKworICAgICAgICBzd2l0Y2ggKGluZm9UeXBlKSB7CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3QuVFlQRV9SRUdJU1RSQVRJT05fSU5GTzoKKyAgICAgICAgY2FzZSBEcm1JbmZvUmVxdWVzdC5UWVBFX1VOUkVHSVNUUkFUSU9OX0lORk86CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3QuVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fSU5GTzoKKyAgICAgICAgICAgIGVycm9yID0gRHJtRXJyb3JFdmVudC5UWVBFX1BST0NFU1NfRFJNX0lORk9fRkFJTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGV4cGVjdHMgdXJpIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisgICAgICogICAgIGNvbnRlbnQ6Ly9tZWRpYS88dGFibGVfbmFtZT4vPHJvd19pbmRleD4gKG9yKQorICAgICAqICAgICBmaWxlOi8vc2RjYXJkL3Rlc3QubXA0CisgICAgICoKKyAgICAgKiBIZXJlIDx0YWJsZV9uYW1lPiBzaGFsbCBiZSAidmlkZW8iIG9yICJhdWRpbyIgb3IgImltYWdlcyIKKyAgICAgKiA8cm93X2luZGV4PiB0aGUgaW5kZXggb2YgdGhlIGNvbnRlbnQgaW4gZ2l2ZW4gdGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VXJpVG9QYXRoKFVyaSB1cmkpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBpZiAobnVsbCAhPSB1cmkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBzY2hlbWUgfHwgc2NoZW1lLmVxdWFscygiIikgfHwKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmVxdWFscyhDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IHVyaS5nZXRQYXRoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtZS5lcXVhbHMoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5UKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10ge01lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEF9OworICAgICAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgcHJvamVjdGlvbiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yIHx8IDAgPT0gY3Vyc29yLmdldENvdW50KCkgfHwgIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgY291bGQgbm90IGJlIGZvdW5kIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gbWVkaWEgc3RvcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgcGF0aEluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGN1cnNvci5nZXRTdHJpbmcocGF0aEluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgaXMgbm90IGZvcm1hdHRlZCBpbiBhIHdheSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic28gdGhhdCBpdCBjYW4gYmUgZm91bmQgaW4gbWVkaWEgc3RvcmUuIik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIHNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLy8gcHJpdmF0ZSBuYXRpdmUgaW50ZXJmYWNlcworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX2luaXRpYWxpemUoaW50IHVuaXF1ZUlkLCBPYmplY3Qgd2Vha190aGlzKTsKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX2ZpbmFsaXplKGludCB1bmlxdWVJZCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9pbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgU3RyaW5nIGVuZ2luZUZpbGVwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIENvbnRlbnRWYWx1ZXMgX2dldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgU3RyaW5nIHBhdGgsIGludCB1c2FnZSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBDb250ZW50VmFsdWVzIF9nZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIFN0cmluZyBwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gX2NhbkhhbmRsZShpbnQgdW5pcXVlSWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgbWltZVR5cGUpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgRHJtSW5mb1N0YXR1cyBfcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBEcm1JbmZvIGRybUluZm8pOworCisgICAgcHJpdmF0ZSBuYXRpdmUgRHJtSW5mbyBfYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBEcm1JbmZvUmVxdWVzdCBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX3NhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERybVJpZ2h0cyBkcm1SaWdodHMsIFN0cmluZyByaWdodHNQYXRoLCBTdHJpbmcgY29udGVudFBhdGgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IF9nZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgX2dldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBTdHJpbmcgcGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2NoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgU3RyaW5nIHBhdGgsIGludCBhY3Rpb24pOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IF9yZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBTdHJpbmcgcGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX3JlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IF9vcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBTdHJpbmcgbWltZVR5cGUpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgRHJtQ29udmVydGVkU3RhdHVzIF9jb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgYnl0ZVtdIGlucHV0RGF0YSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBEcm1Db252ZXJ0ZWRTdGF0dXMgX2Nsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIHByaXZhdGUgbmF0aXZlIERybVN1cHBvcnRJbmZvW10gX2dldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVJpZ2h0cy5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtUmlnaHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzYWYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVJpZ2h0cy5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgYW4gZW50aXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSBsaWNlbnNlIGluZm9ybWF0aW9uIHdoaWNoIHdhcworICogcmV0cmlldmVkIGZyb20gdGhlIG9ubGluZSBEUk0gc2VydmVyLgorICoKKyAqIENhbGxlciBjYW4gaW5zdGFudGlhdGUge0BsaW5rIERybVJpZ2h0c30gYnkKKyAqIGludm9raW5nIHtAbGluayBEcm1SaWdodHMjRHJtUmlnaHRzKFByb2Nlc3NlZERhdGEsIFN0cmluZyl9CisgKiBjb25zdHJ1Y3RvciBieSB1c2luZyB0aGUgcmVzdWx0IG9mIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfSBpbnRlcmZhY2UuCisgKiBDYWxsZXIgY2FuIGFsc28gaW5zdGFudGlhdGUge0BsaW5rIERybVJpZ2h0c30gdXNpbmcgdGhlIGZpbGUgcGF0aAorICogd2hpY2ggY29udGFpbnMgcmlnaHRzIGluZm9ybWF0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIERybVJpZ2h0cyB7CisgICAgcHJpdmF0ZSBieXRlW10gbURhdGE7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU1pbWVUeXBlOworICAgIHByaXZhdGUgU3RyaW5nIG1BY2NvdW50SWQgPSAiX05PX1VTRVIiOworICAgIHByaXZhdGUgU3RyaW5nIG1TdWJzY3JpcHRpb25JZCA9ICIiOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybVJpZ2h0cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmlnaHRzRmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBEcm1SaWdodHMoU3RyaW5nIHJpZ2h0c0ZpbGVQYXRoLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmlnaHRzRmlsZVBhdGgpOworICAgICAgICBpbnN0YW50aWF0ZShmaWxlLCBtaW1lVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybVJpZ2h0cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmlnaHRzRmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqIEBwYXJhbSBhY2NvdW50SWQgQWNjb3VudCBJZCBvZiB0aGUgdXNlcgorICAgICAqLworICAgIHB1YmxpYyBEcm1SaWdodHMoU3RyaW5nIHJpZ2h0c0ZpbGVQYXRoLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgdGhpcyhyaWdodHNGaWxlUGF0aCwgbWltZVR5cGUpOworCisgICAgICAgIGlmIChudWxsICE9IGFjY291bnRJZCAmJiAhYWNjb3VudElkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG1BY2NvdW50SWQgPSBhY2NvdW50SWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtUmlnaHRzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodHNGaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgcmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICogQHBhcmFtIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIFN1YnNjcmlwdGlvbiBJZCBvZiB0aGUgdXNlcgorICAgICAqLworICAgIHB1YmxpYyBEcm1SaWdodHMoCisgICAgICAgICAgICBTdHJpbmcgcmlnaHRzRmlsZVBhdGgsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGFjY291bnRJZCwgU3RyaW5nIHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgIHRoaXMocmlnaHRzRmlsZVBhdGgsIG1pbWVUeXBlKTsKKworICAgICAgICBpZiAobnVsbCAhPSBhY2NvdW50SWQgJiYgIWFjY291bnRJZC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBtQWNjb3VudElkID0gYWNjb3VudElkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgIT0gc3Vic2NyaXB0aW9uSWQgJiYgIXN1YnNjcmlwdGlvbklkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG1TdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybVJpZ2h0cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmlnaHRzRmlsZSBGaWxlIGNvbnRhaW5pbmcgcmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybVJpZ2h0cyhGaWxlIHJpZ2h0c0ZpbGUsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpbnN0YW50aWF0ZShyaWdodHNGaWxlLCBtaW1lVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbnRpYXRlKEZpbGUgcmlnaHRzRmlsZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YSA9IERybVV0aWxzLnJlYWRCeXRlcyhyaWdodHNGaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1SaWdodHMgb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqIFRoZSB1c2VyIGNhbiBwYXNzIFN0cmluZyBvciBiaW5hcnkgZGF0YTxwPgorICAgICAqIFVzYWdlOjxwPgorICAgICAqICAgICAgICBpKSAgU3RyaW5nKGUuZy4gZGF0YSBpcyBpbnN0YW5jZSBvZiBTdHJpbmcpOjxicj4KKyAgICAgKiAgICAgICAgICAgIC0gbmV3IERybVJpZ2h0cyhkYXRhLmdldEJ5dGVzKCksIG1pbWVUeXBlKTxwPgorICAgICAqICAgICAgICBpaSkgQmluYXJ5IGRhdGE8YnI+CisgICAgICogICAgICAgICAgICAtIG5ldyBEcm1SaWdodHMoYmluYXJ5RGF0YVtdLCBtaW1lVHlwZSk8YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBQcm9jZXNzZWQgZGF0YQorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtUmlnaHRzKFByb2Nlc3NlZERhdGEgZGF0YSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIG1EYXRhID0gZGF0YS5nZXREYXRhKCk7CisKKyAgICAgICAgU3RyaW5nIGFjY291bnRJZCA9IGRhdGEuZ2V0QWNjb3VudElkKCk7CisgICAgICAgIGlmIChudWxsICE9IGFjY291bnRJZCAmJiAhYWNjb3VudElkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG1BY2NvdW50SWQgPSBhY2NvdW50SWQ7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgc3Vic2NyaXB0aW9uSWQgPSBkYXRhLmdldFN1YnNjcmlwdGlvbklkKCk7CisgICAgICAgIGlmIChudWxsICE9IHN1YnNjcmlwdGlvbklkICYmICFzdWJzY3JpcHRpb25JZC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBtU3Vic2NyaXB0aW9uSWQgPSBzdWJzY3JpcHRpb25JZDsKKyAgICAgICAgfQorCisgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBSaWdodHMgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbWV0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjY291bnQtaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFjY291bnQgSWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY291bnRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY2NvdW50SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3Vic2NyaXB0aW9uLWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBTdWJzY3JpcHRpb24gSWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnNjcmlwdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbVN1YnNjcmlwdGlvbklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGluc3RhbmNlIGlzIHZhbGlkIG9yIG5vdAorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICB0cnVlIGlmIHZhbGlkCisgICAgICogICAgIGZhbHNlIGlmIGludmFsaWQKKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiAobnVsbCAhPSBtTWltZVR5cGUgJiYgIW1NaW1lVHlwZS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgJiYgbnVsbCAhPSBtRGF0YSAmJiBtRGF0YS5sZW5ndGggPiAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVN0b3JlLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGY5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1TdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYWxsIHRoZSBjb25zdGFudHMgdXNlZCBieSBEUk0gZnJhbWV3b3JrCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtU3RvcmUgeworICAgIC8qKgorICAgICAqIENvbHVtbnMgcmVwcmVzZW50aW5nIGRybSBjb25zdHJhaW50cworICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29uc3RyYWludHNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggcmVwZWF0IGNvdW50CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfUkVQRUFUX0NPVU5UID0gIm1heF9yZXBlYXRfY291bnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmVtYWluaW5nIHJlcGVhdCBjb3VudAorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNQUlOSU5HX1JFUEVBVF9DT1VOVCA9ICJyZW1haW5pbmdfcmVwZWF0X2NvdW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgYmVmb3JlIHdoaWNoIHRoZSBwcm90ZWN0ZWQgZmlsZSBjYW4gbm90IGJlIHBsYXllZC92aWV3ZWQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfU1RBUlRfVElNRSA9ICJsaWNlbnNlX3N0YXJ0X3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB0aGUgcHJvdGVjdGVkIGZpbGUgY2FuIG5vdCBiZSBwbGF5ZWQvdmlld2VkCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX0VYUElSWV9USU1FID0gImxpY2Vuc2VfZXhwaXJ5X3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXZhaWxhYmxlIHRpbWUgZm9yIGxpY2Vuc2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfQVZBSUxBQkxFX1RJTUUgPSAibGljZW5zZV9hdmFpbGFibGVfdGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRhIHN0cmVhbSBmb3IgZXh0ZW5kZWQgbWV0YWRhdGEKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX01FVEFEQVRBID0gImV4dGVuZGVkX21ldGFkYXRhIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIERSTSB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHJtT2JqZWN0VHlwZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHVua25vd24gdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDB4MDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHByb3RlY3RlZCBjb250ZW50IHR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAweDAxOworICAgICAgICAvKioKKyAgICAgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSByaWdodHMgaW5mb3JtYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUU19PQkpFQ1QgPSAweDAyOworICAgICAgICAvKioKKyAgICAgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSB0cmlnZ2VyIGluZm9ybWF0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUklHR0VSX09CSkVDVCA9IDB4MDM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyBjb25zdGFudHMgcmVsYXRlZCB0byBwbGF5YmFjaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGxheWJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHBsYXliYWNrIHN0YXJ0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDB4MDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RvcAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUCA9IDB4MDE7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgcGF1c2VkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRSA9IDB4MDI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgcmVzdW1lZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FID0gMHgwMzsKKworICAgICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IHBsYXliYWNrU3RhdHVzKSB7CisgICAgICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChwbGF5YmFja1N0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBUlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgUEFVU0U6CisgICAgICAgICAgICAgICAgY2FzZSBSRVNVTUU6CisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHByb3RlY3RlZCBjb250ZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBY3Rpb24geworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMHgwMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSBwbGF5ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVkgPSAweDAxOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHNldCBhcyByaW5nIHRvbmUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTkdUT05FID0gMHgwMjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSB0cmFuc2ZlcmVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0ZFUiA9IDB4MDM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgc2V0IGFzIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUUFVUID0gMHgwNDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHByZXZpZXcgaXMgYWxsb3dlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFVklFVyA9IDB4MDU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgZXhlY3V0ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYRUNVVEUgPSAweDA2OworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGRpc3BsYXllZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWSA9IDB4MDc7CisKKyAgICAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgREVGQVVMVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBMQVk6CisgICAgICAgICAgICAgICAgY2FzZSBSSU5HVE9ORToKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TRkVSOgorICAgICAgICAgICAgICAgIGNhc2UgT1VUUFVUOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFVklFVzoKKyAgICAgICAgICAgICAgICBjYXNlIEVYRUNVVEU6CisgICAgICAgICAgICAgICAgY2FzZSBESVNQTEFZOgorICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyBjb25zdGFudHMgcmVsYXRlZCB0byBzdGF0dXMgb2YgdGhlIHJpZ2h0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmlnaHRzU3RhdHVzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIHZhbGlkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVFNfVkFMSUQgPSAweDAwOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgaW52YWxpZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRTX0lOVkFMSUQgPSAweDAxOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgZXhwaXJlZCBmb3IgdGhlIGNvbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUU19FWFBJUkVEID0gMHgwMjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIG5vdCBhY3F1aXJlZCBmb3IgdGhlIGNvbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUU19OT1RfQUNRVUlSRUQgPSAweDAzOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtU3VwcG9ydEluZm8uamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVN1cHBvcnRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVN1cHBvcnRJbmZvLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIGNhcGFiaWxpdHkgb2YgZWFjaCBwbHVnLWluLAorICogc3VjaCBhcyBtaW1ldHlwZSdzIGFuZCBmaWxlIHN1ZmZpeGVzIGl0IGNvdWxkIGhhbmRsZS4KKyAqCisgKiBQbHVnLWluIGRldmVsb3BlciBjb3VsZCByZXR1cm4gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIHBsdWdpbiBieSBwYXNzaW5nCisgKiB7QGxpbmsgRHJtU3VwcG9ydEluZm99IGluc3RhbmNlLgorICoKKyAqLworcHVibGljIGNsYXNzIERybVN1cHBvcnRJbmZvIHsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1GaWxlU3VmZml4TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbU1pbWVUeXBlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjcmlwdGlvbiA9ICIiOworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBtaW1lLXR5cGUgdG8gdGhlIHN1cHBvcnQgaW5mbyBzdWNoIHRoYXQgcmVzcGVjdGl2ZSBwbHVnLWluIGlzCisgICAgICogY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgZ2l2ZW4gbWltZS10eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBtTWltZVR5cGVMaXN0LmFkZChtaW1lVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBmaWxlIHN1ZmZpeCB0byB0aGUgc3VwcG9ydCBpbmZvIHN1Y2ggdGhhdCByZXNwZWN0aXZlIHBsdWctaW4gaXMKKyAgICAgKiBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSBnaXZlbiBmaWxlIHN1ZmZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlU3VmZml4IEZpbGUgc3VmZml4IHdoaWNoIGNhbiBiZSBoYW5kbGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZVN1ZmZpeChTdHJpbmcgZmlsZVN1ZmZpeCkgeworICAgICAgICBtRmlsZVN1ZmZpeExpc3QuYWRkKGZpbGVTdWZmaXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIHRvIHdhbGsgdG8gdGhyb3VnaCBtaW1lIHR5cGVzIG9mIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldE1pbWVUeXBlSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBtTWltZVR5cGVMaXN0Lml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgdG8gd2FsayB0byB0aHJvdWdoIGZpbGUgc3VmZml4ZXMgb2YgdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0RmlsZVN1ZmZpeEl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbUZpbGVTdWZmaXhMaXN0Lml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1bmlxdWUgZGVzY3JpcHRpb24gYWJvdXQgdGhlIHBsdWdpbgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFVuaXF1ZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICBpZiAobnVsbCAhPSBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnaW4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwcml0aW9uKCkgeworICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRkZW4gaGFzaCBjb2RlIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2ggY29kZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBtRmlsZVN1ZmZpeExpc3QuaGFzaENvZGUoKSArIG1NaW1lVHlwZUxpc3QuaGFzaENvZGUoKSArIG1EZXNjcmlwdGlvbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRkZW4gZXF1YWxzIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgZXF1YWwKKyAgICAgKiAgICAgZmFsc2UgaWYgbm90IGVxdWFsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRHJtU3VwcG9ydEluZm8pIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1GaWxlU3VmZml4TGlzdC5lcXVhbHMoKChEcm1TdXBwb3J0SW5mbykgb2JqZWN0KS5tRmlsZVN1ZmZpeExpc3QpICYmCisgICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZUxpc3QuZXF1YWxzKCgoRHJtU3VwcG9ydEluZm8pIG9iamVjdCkubU1pbWVUeXBlTGlzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uLmVxdWFscygoKERybVN1cHBvcnRJbmZvKSBvYmplY3QpLm1EZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgZ2l2ZW4gbWltZS10eXBlIGlzIHN1cHBvcnRlZCBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgbWltZSB0eXBlIGlzIHN1cHBvcnRlZAorICAgICAqICAgICBmYWxzZSBpZiBtaW1lIHR5cGUgaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1N1cHBvcnRlZE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobnVsbCAhPSBtaW1lVHlwZSAmJiAhbWltZVR5cGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWltZVR5cGVMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXRlTWltZVR5cGUgPSBtTWltZVR5cGVMaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVNaW1lVHlwZS5zdGFydHNXaXRoKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBnaXZlbiBmaWxlIHN1ZmZpeCBpcyBzdXBwb3J0ZWQgb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVN1ZmZpeCBGaWxlIHN1ZmZpeAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgdHJ1ZSAtIGlmIGZpbGUgc3VmZml4IGlzIHN1cHBvcnRlZAorICAgICAqICAgICBmYWxzZSAtIGlmIGZpbGUgc3VmZml4IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTdXBwb3J0ZWRGaWxlU3VmZml4KFN0cmluZyBmaWxlU3VmZml4KSB7CisgICAgICAgIHJldHVybiBtRmlsZVN1ZmZpeExpc3QuY29udGFpbnMoZmlsZVN1ZmZpeCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1VdGlscy5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTAzNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtVXRpbHMuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFRoZSB1dGlsaXR5IGNsYXNzIHVzZWQgaW4gdGhlIERSTSBGcmFtZXdvcmsuIFRoaXMgaW5jbHVlZHMgQVBJcyBmb3IgZmlsZSBvcGVyYXRpb25zCisgKiBhbmQgRXh0ZW5kZWRNZXRhZGF0YVBhcnNlciBmb3IgcGFyc2luZyBleHRlbmRlZCBtZXRhZGF0YSBCTE9CIGluIERSTSBjb25zdHJhaW50cy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1VdGlscyB7CisgICAgLyogU2hvdWxkIGJlIHVzZWQgd2hlbiB3ZSBuZWVkIHRvIHJlYWQgZnJvbSBsb2NhbCBmaWxlICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIHJldHVybiByZWFkQnl0ZXMoZmlsZSk7CisgICAgfQorCisgICAgLyogU2hvdWxkIGJlIHVzZWQgd2hlbiB3ZSBuZWVkIHRvIHJlYWQgZnJvbSBsb2NhbCBmaWxlICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlcyhGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYnVmZmVyZWRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlcmVkU3RyZWFtLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBlbnRpcmUgZGF0YQorICAgICAgICAgICAgICAgIGJ1ZmZlcmVkU3RyZWFtLnJlYWQoZGF0YSk7CisgICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcXVpdGVEaXNwb3NlKGJ1ZmZlcmVkU3RyZWFtKTsKKyAgICAgICAgICAgIHF1aXRlRGlzcG9zZShpbnB1dFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qIGNoZWNrIGZvciBpbnZhbGlkIGlucHV0cyAqLworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgaWYgKG51bGwgIT0gcGF0aCAmJiBudWxsICE9IGRhdGEpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGRhdGEpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBxdWl0ZURpc3Bvc2Uob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIHZvaWQgcmVtb3ZlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWl0ZURpc3Bvc2UoSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBzdHJlYW0pIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjYXJlLCBhdCBsZWFzdCBhcyBvZiBub3cKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcXVpdGVEaXNwb3NlKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHN0cmVhbSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNhcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBpbnN0YW5jZSBvZiBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcKKyAgICAgKiBleHRlbmRlZCBtZXRhZGF0YSBCTE9CIGluIERSTSBjb25zdHJhaW50cy4gPGJyPgorICAgICAqCisgICAgICogZXh0ZW5kZWRNZXRhZGF0YSBCTE9CIGlzIHJldHJpZXZlZCBieSBzcGVjaWZpbmcKKyAgICAgKiBrZXkgRHJtU3RvcmUuQ29uc3RyYWludHNDb2x1bW5zLkVYVEVOREVEX01FVEFEQVRBLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuZGVkTWV0YWRhdGEgQkxPQiBpbiB3aGljaCBrZXktdmFsdWUgcGFpcnMgb2YgZXh0ZW5kZWQgbWV0YWRhdGEgYXJlIGVtYmVkZGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyIGdldEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIoYnl0ZVtdIGV4dGVuZGVkTWV0YWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyKGV4dGVuZGVkTWV0YWRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgcGFyc2VyIHRvIHBhcnNlIHRoZSBleHRlbmRlZCBtZXRhLWRhdGEgZW1iZWRkZWQgaW5zaWRlIERSTSBjb25zdHJhaW50czxicj48YnI+CisgICAgICoKKyAgICAgKiBVc2FnZSBleGFtcGxlPGJyPgorICAgICAqIGJ5dGVbXSBleHRlbmRlZE1ldGFkYXRhPGJyPgorICAgICAqICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9CisgICAgICogICAgICAgICBjb25zdHJhaW50cy5nZXRBc0J5dGVBcnJheShEcm1TdG9yZS5Db25zdHJhaW50c0NvbHVtbnMuRVhURU5ERURfTUVUQURBVEEpOzxicj4KKyAgICAgKiBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyIHBhcnNlciA9IGdldEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIoZXh0ZW5kZWRNZXRhZGF0YSk7PGJyPgorICAgICAqIEl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gcGFyc2VyLmtleUl0ZXJhdG9yKCk7PGJyPgorICAgICAqIHdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHs8YnI+CisgICAgICogICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1N0cmluZyBleHRlbmRlZE1ldGFkYXRhS2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOzxicj4KKyAgICAgKiAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyaW5nIGV4dGVuZGVkTWV0YWRhdGFWYWx1ZSA9CisgICAgICogICAgICAgICAgICAgcGFyc2VyLmdldChleHRlbmRlZE1ldGFkYXRhS2V5KTs8YnI+CisgICAgICogfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRNZXRhZGF0YVBhcnNlciB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBwcml2YXRlIGludCByZWFkQnl0ZShieXRlW10gY29uc3RyYWludERhdGEsIGludCBhcnJheUluZGV4KSB7CisgICAgICAgICAgICAvL0NvbnZlcnQgYnl0ZVtdIGludG8gaW50LgorICAgICAgICAgICAgcmV0dXJuIChpbnQpY29uc3RyYWludERhdGFbYXJyYXlJbmRleF07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyByZWFkTXVsdGlwbGVCeXRlcygKKyAgICAgICAgICAgICAgICBieXRlW10gY29uc3RyYWludERhdGEsIGludCBudW1iZXJPZkJ5dGVzLCBpbnQgYXJyYXlJbmRleCkgeworICAgICAgICAgICAgYnl0ZVtdIHJldHVybkJ5dGVzID0gbmV3IGJ5dGVbbnVtYmVyT2ZCeXRlc107CisgICAgICAgICAgICBmb3IgKGludCBqID0gYXJyYXlJbmRleCwgaSA9IDA7IGogPCBhcnJheUluZGV4ICsgbnVtYmVyT2ZCeXRlczsgaisrLGkrKykgeworICAgICAgICAgICAgICAgIHJldHVybkJ5dGVzW2ldID0gY29uc3RyYWludERhdGFbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXR1cm5CeXRlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIHdpbGwgcGFyc2UgdGhlIGZvbGxvd2luZyBmb3JtYXQKKyAgICAgICAgICogS2V5TGVuZ3RoVmFsdWVMZW5ndGhLZXlWYWx1ZUtleUxlbmd0aDFWYWx1ZUxlbmd0aDFLZXkxVmFsdWUxLi5cMAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyKGJ5dGVbXSBjb25zdHJhaW50RGF0YSkgeworICAgICAgICAgICAgLy9FeHRyYWN0IEtleVZhbHVlIFBhaXIgSW5mbywgdGlsbCB0ZXJtaW5hdG9yIG9jY3Vycy4KKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNvbnN0cmFpbnREYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vUGFyc2UgS2V5IExlbmd0aAorICAgICAgICAgICAgICAgIGludCBrZXlMZW5ndGggPSByZWFkQnl0ZShjb25zdHJhaW50RGF0YSwgaW5kZXgpOworICAgICAgICAgICAgICAgIGluZGV4Kys7CisKKyAgICAgICAgICAgICAgICAvL1BhcnNlIFZhbHVlIExlbmd0aAorICAgICAgICAgICAgICAgIGludCB2YWx1ZUxlbmd0aCA9IHJlYWRCeXRlKGNvbnN0cmFpbnREYXRhLCBpbmRleCk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKworICAgICAgICAgICAgICAgIC8vRmV0Y2gga2V5CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0cktleSA9IHJlYWRNdWx0aXBsZUJ5dGVzKGNvbnN0cmFpbnREYXRhLCBrZXlMZW5ndGgsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBpbmRleCArPSBrZXlMZW5ndGg7CisKKyAgICAgICAgICAgICAgICAvL0ZldGNoIFZhbHVlCisgICAgICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gcmVhZE11bHRpcGxlQnl0ZXMoY29uc3RyYWludERhdGEsIHZhbHVlTGVuZ3RoLCBpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHN0clZhbHVlLmVxdWFscygiICIpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0clZhbHVlID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IHZhbHVlTGVuZ3RoOworICAgICAgICAgICAgICAgIG1NYXAucHV0KHN0cktleSwgc3RyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4ga2V5SXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICAgICAgcmV0dXJuIG1NYXAuZ2V0KGtleSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL1Byb2Nlc3NlZERhdGEuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL1Byb2Nlc3NlZERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzkyNjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vUHJvY2Vzc2VkRGF0YS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCisvKioKKyAqIFRoaXMgaXMgYW4gZW50aXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSByZXN1bHQgb2YgdHJhbnNhY3Rpb24gYmV0d2VlbgorICogZGV2aWNlIGFuZCBvbmxpbmUgRFJNIHNlcnZlciBieSB1c2luZyB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNwcm9jZXNzRHJtSW5mbyhEcm1JbmZvKX0KKyAqCisgKiBJbiBsaWNlbnNlIGFjcXVpc2l0aW9uIHNjZW5hcmlvIHRoaXMgY2xhc3Mgd291bGQgaG9sZCB0aGUgYmluYXJ5IGRhdGEKKyAqIG9mIHJpZ2h0cyBpbmZvcm1hdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9jZXNzZWREYXRhIHsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtRGF0YTsKKyAgICBwcml2YXRlIFN0cmluZyBtQWNjb3VudElkID0gIl9OT19VU0VSIjsKKyAgICBwcml2YXRlIFN0cmluZyBtU3Vic2NyaXB0aW9uSWQgPSAiIjsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBQcm9jZXNzZWREYXRhIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBQcm9jZXNzZWREYXRhKGJ5dGVbXSBkYXRhLCBTdHJpbmcgYWNjb3VudElkKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbUFjY291bnRJZCA9IGFjY291bnRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgUHJvY2Vzc2VkRGF0YSBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBSaWdodHMgZGF0YQorICAgICAqIEBwYXJhbSBhY2NvdW50SWQgQWNjb3VudCBJZCBvZiB0aGUgdXNlcgorICAgICAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBTdWJzY3JpcHRpb24gSWQgb2YgdGhlIHVzZXIKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFByb2Nlc3NlZERhdGEoYnl0ZVtdIGRhdGEsIFN0cmluZyBhY2NvdW50SWQsIFN0cmluZyBzdWJzY3JpcHRpb25JZCkgeworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgIG1BY2NvdW50SWQgPSBhY2NvdW50SWQ7CisgICAgICAgIG1TdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb2Nlc3NlZCBkYXRhIGFzIGEgcmVzdWx0LgorICAgICAqCisgICAgICogQHJldHVybiBSaWdodHMgZGF0YSBhc3NvY2lhdGVkCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNjb3VudC1pZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjb3VudCBJZCBhc3NvY2lhdGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBY2NvdW50SWQoKSB7CisgICAgICAgIHJldHVybiBtQWNjb3VudElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN1YnNjcmlwdGlvbi1pZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3Vic2NyaXB0aW9uIElkIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnNjcmlwdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbVN1YnNjcmlwdGlvbklkOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2puaS9BbmRyb2lkLm1rIGIvZHJtL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWU0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50LmNwcAorCitMT0NBTF9NT0RVTEU6PSBsaWJkcm1mcmFtZXdvcmtfam5pCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmRybWZyYW1ld29yayBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJiaW5kZXIKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorIExPQ0FMX0xETElCUyArPSAtbGRsCitlbHNlCisgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKEpOSV9IX0lOQ0xVREUpIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2RybS9qbmkvYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudC5jcHAgYi9kcm0vam5pL2FuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzE4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vam5pL2FuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnQuY3BwCkBAIC0wLDAgKzEsNzk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSA8ZHJtL0RybUluZm8uaD4KKyNpbmNsdWRlIDxkcm0vRHJtUmlnaHRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9FdmVudC5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvU3RhdHVzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8ZHJtL0RybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8ZHJtL0RybUNvbnN0cmFpbnRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8ZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8RHJtTWFuYWdlckNsaWVudEltcGwuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB1c2VkIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGphdmEgb2JqZWN0LgorICogTWF5IG5lZWQgdG8gYWRkIHNvbWUgdXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgamF2YSBvYmplY3QuCisgKi8KK2NsYXNzIFV0aWxpdHkgeworcHVibGljOgorICAgIHN0YXRpYyBTdHJpbmc4IGdldFN0cmluZ1ZhbHVlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgY29uc3QgY2hhciogZmllbGROYW1lKTsKKworICAgIHN0YXRpYyBjaGFyKiBnZXRCeXRlQXJyYXlWYWx1ZSgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgY29uc3QgY2hhciogZmllbGROYW1lLCBpbnQqIGRhdGFMZW5ndGgpOworCisgICAgc3RhdGljIGNoYXIqIGdldEJ5dGVBcnJheVZhbHVlKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpieXRlQXJyYXkgYnl0ZUFycmF5LCBpbnQqIGRhdGFMZW5ndGgpOworCisgICAgc3RhdGljIFN0cmluZzggZ2V0U3RyaW5nVmFsdWUoSk5JRW52KiBlbnYsIGpzdHJpbmcgc3RyaW5nKTsKKworICAgIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBjb25zdCBjaGFyKiBmaWVsZE5hbWUpOworfTsKKworU3RyaW5nOCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGNvbnN0IGNoYXIqIGZpZWxkTmFtZSkgeworICAgIFN0cmluZzggZGF0YVN0cmluZygiIik7CisKKyAgICAvKiBMb29rIGZvciB0aGUgaW5zdGFuY2UgZmllbGQgd2l0aCB0aGUgbmFtZSBmaWVsZE5hbWUgKi8KKyAgICBqZmllbGRJRCBmaWVsZElECisgICAgICAgID0gZW52LT5HZXRGaWVsZElEKGVudi0+R2V0T2JqZWN0Q2xhc3Mob2JqZWN0KSwgZmllbGROYW1lICwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOworCisgICAgaWYgKE5VTEwgIT0gZmllbGRJRCkgeworICAgICAgICBqc3RyaW5nIHZhbHVlU3RyaW5nID0gKGpzdHJpbmcpIGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZElEKTsKKworICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZVN0cmluZyAmJiB2YWx1ZVN0cmluZyAhPSBlbnYtPk5ld1N0cmluZ1VURigiIikpIHsKKyAgICAgICAgICAgIGNoYXIqIGJ5dGVzID0gY29uc3RfY2FzdDwgY2hhciogPiAoZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YWx1ZVN0cmluZywgTlVMTCkpOworCisgICAgICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gc3RybGVuKGJ5dGVzKSArIDE7CisgICAgICAgICAgICBjaGFyICpkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgICAgIHN0cm5jcHkoZGF0YSwgYnl0ZXMsIGxlbmd0aCk7CisgICAgICAgICAgICBkYXRhU3RyaW5nID0gU3RyaW5nOChkYXRhKTsKKworICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnModmFsdWVTdHJpbmcsIGJ5dGVzKTsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBkYXRhOyBkYXRhID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIHRoZSBmaWVsZCAlcyIsIGZpZWxkTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGFTdHJpbmc7Cit9CisKK1N0cmluZzggVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoSk5JRW52KiBlbnYsIGpzdHJpbmcgc3RyaW5nKSB7CisgICAgU3RyaW5nOCBkYXRhU3RyaW5nKCIiKTsKKworICAgIGlmIChOVUxMICE9IHN0cmluZyAmJiBzdHJpbmcgIT0gZW52LT5OZXdTdHJpbmdVVEYoIiIpKSB7CisgICAgICAgIGNoYXIqIGJ5dGVzID0gY29uc3RfY2FzdDwgY2hhciogPiAoZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzdHJpbmcsIE5VTEwpKTsKKworICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gc3RybGVuKGJ5dGVzKSArIDE7CisgICAgICAgIGNoYXIgKmRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICBzdHJuY3B5KGRhdGEsIGJ5dGVzLCBsZW5ndGgpOworICAgICAgICBkYXRhU3RyaW5nID0gU3RyaW5nOChkYXRhKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdHJpbmcsIGJ5dGVzKTsKKyAgICAgICAgZGVsZXRlIFtdIGRhdGE7IGRhdGEgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGF0YVN0cmluZzsKK30KKworY2hhciogVXRpbGl0eTo6Z2V0Qnl0ZUFycmF5VmFsdWUoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGNvbnN0IGNoYXIqIGZpZWxkTmFtZSwgaW50KiBkYXRhTGVuZ3RoKSB7CisgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgKmRhdGFMZW5ndGggPSAwOworCisgICAgamZpZWxkSUQgZmllbGRJRCA9IGVudi0+R2V0RmllbGRJRChlbnYtPkdldE9iamVjdENsYXNzKG9iamVjdCksIGZpZWxkTmFtZSAsICJbQiIpOworCisgICAgaWYgKE5VTEwgIT0gZmllbGRJRCkgeworICAgICAgICBqYnl0ZUFycmF5IGJ5dGVBcnJheSA9IChqYnl0ZUFycmF5KSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRJRCk7CisgICAgICAgIGlmIChOVUxMICE9IGJ5dGVBcnJheSkgeworICAgICAgICAgICAgamludCBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGJ5dGVBcnJheSk7CisKKyAgICAgICAgICAgICpkYXRhTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgaWYgKDAgPCAqZGF0YUxlbmd0aCkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICAgICAgICAgIGVudi0+R2V0Qnl0ZUFycmF5UmVnaW9uKGJ5dGVBcnJheSwgKGppbnQpMCwgbGVuZ3RoLCAoamJ5dGUgKikgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK2NoYXIqIFV0aWxpdHk6OmdldEJ5dGVBcnJheVZhbHVlKEpOSUVudiogZW52LCBqYnl0ZUFycmF5IGJ5dGVBcnJheSwgaW50KiBkYXRhTGVuZ3RoKSB7CisgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgaWYgKE5VTEwgIT0gYnl0ZUFycmF5KSB7CisgICAgICAgIGppbnQgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChieXRlQXJyYXkpOworCisgICAgICAgICpkYXRhTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBpZiAoMCA8ICpkYXRhTGVuZ3RoKSB7CisgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgICAgIGVudi0+R2V0Qnl0ZUFycmF5UmVnaW9uKGJ5dGVBcnJheSwgKGppbnQpMCwgbGVuZ3RoLCAoamJ5dGUgKikgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK2ludCBVdGlsaXR5OjpnZXRJbnRWYWx1ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGNvbnN0IGNoYXIqIGZpZWxkTmFtZSkgeworICAgIGpmaWVsZElEIGZpZWxkSUQ7CisgICAgaW50IGludFZhbHVlID0gLTE7CisKKyAgICAvKiBHZXQgYSByZWZlcmVuY2UgdG8gb2Jq4oCZcyBjbGFzcyAqLworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3Mob2JqZWN0KTsKKyAgICAvKiBMb29rIGZvciB0aGUgaW5zdGFuY2UgZmllbGQgd2l0aCB0aGUgbmFtZSBmaWVsZE5hbWUgKi8KKyAgICBmaWVsZElEID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCBmaWVsZE5hbWUgLCAiSSIpOworCisgICAgaWYgKE5VTEwgIT0gZmllbGRJRCkgeworICAgICAgICBpbnRWYWx1ZSA9IChpbnQpIGVudi0+R2V0SW50RmllbGQob2JqZWN0LCBmaWVsZElEKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW50VmFsdWU7Cit9CisKK2NsYXNzIEpOSU9uSW5mb0xpc3RlbmVyIDogcHVibGljIERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBKTklPbkluZm9MaXN0ZW5lcihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IHdlYWtfdGhpeik7CisKKyAgICB2aXJ0dWFsIH5KTklPbkluZm9MaXN0ZW5lcigpOworICAgIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOworCitwcml2YXRlOgorICAgIEpOSU9uSW5mb0xpc3RlbmVyKCk7CisgICAgamNsYXNzIG1DbGFzczsKKyAgICBqb2JqZWN0IG1PYmplY3Q7Cit9OworCitKTklPbkluZm9MaXN0ZW5lcjo6Sk5JT25JbmZvTGlzdGVuZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCB3ZWFrX3RoaXopIHsKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkdldE9iamVjdENsYXNzKHRoaXopOworCisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50Iik7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9FeGNlcHRpb24iLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2xhc3MgPSAoamNsYXNzKWVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBtT2JqZWN0ICA9IGVudi0+TmV3R2xvYmFsUmVmKHdlYWtfdGhpeik7Cit9CisKK0pOSU9uSW5mb0xpc3RlbmVyOjp+Sk5JT25JbmZvTGlzdGVuZXIoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU9iamVjdCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNsYXNzKTsKK30KKwordm9pZCBKTklPbkluZm9MaXN0ZW5lcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKKyAgICBqaW50IHVuaXF1ZUlkID0gZXZlbnQuZ2V0VW5pcXVlSWQoKTsKKyAgICBqaW50IHR5cGUgPSBldmVudC5nZXRUeXBlKCk7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBtZXNzYWdlID0gZW52LT5OZXdTdHJpbmdVVEYoZXZlbnQuZ2V0TWVzc2FnZSgpLnN0cmluZygpKTsKKyAgICBMT0dWKCJKTklPbkluZm9MaXN0ZW5lcjo6b25JbmZvID0+ICVkIHwgJWQgfCAlcyIsIHVuaXF1ZUlkLCB0eXBlLCBldmVudC5nZXRNZXNzYWdlKCkuc3RyaW5nKCkpOworCisgICAgZW52LT5DYWxsU3RhdGljVm9pZE1ldGhvZCgKKyAgICAgICAgICAgIG1DbGFzcywKKyAgICAgICAgICAgIGVudi0+R2V0U3RhdGljTWV0aG9kSUQobUNsYXNzLCAibm90aWZ5IiwgIihMamF2YS9sYW5nL09iamVjdDtJSUxqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgICAgICAgICAgICBtT2JqZWN0LCB1bmlxdWVJZCwgdHlwZSwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyBNdXRleCBzTG9jazsKKworc3RhdGljIHNwPERybU1hbmFnZXJDbGllbnRJbXBsPiBzZXREcm1NYW5hZ2VyQ2xpZW50SW1wbCgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnRJbXBsPiYgY2xpZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwoc0xvY2spOworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50Iik7CisgICAgamZpZWxkSUQgZmllbGRJZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKworICAgIHNwPERybU1hbmFnZXJDbGllbnRJbXBsPiBvbGQgPSAoRHJtTWFuYWdlckNsaWVudEltcGwqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRJZCk7CisgICAgaWYgKGNsaWVudC5nZXQoKSkgeworICAgICAgICBjbGllbnQtPmluY1N0cm9uZyh0aGl6KTsKKyAgICB9CisgICAgaWYgKG9sZCAhPSAwKSB7CisgICAgICAgIG9sZC0+ZGVjU3Ryb25nKHRoaXopOworICAgIH0KKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkSWQsIChpbnQpY2xpZW50LmdldCgpKTsKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgc3A8RHJtTWFuYWdlckNsaWVudEltcGw+IGdldERybU1hbmFnZXJDbGllbnRJbXBsKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChzTG9jayk7CisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQiKTsKKyAgICBqZmllbGRJRCBmaWVsZElkID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworCisgICAgRHJtTWFuYWdlckNsaWVudEltcGwqIGNvbnN0IGNsaWVudCA9IChEcm1NYW5hZ2VyQ2xpZW50SW1wbCopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZElkKTsKKyAgICByZXR1cm4gc3A8RHJtTWFuYWdlckNsaWVudEltcGw+KGNsaWVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfaW5pdGlhbGl6ZSgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwgam9iamVjdCB3ZWFrX3RoaXopIHsKKyAgICBMT0dWKCJpbml0aWFsaXplIC0gRW50ZXIiKTsKKworICAgIHNwPERybU1hbmFnZXJDbGllbnRJbXBsPiBkcm1NYW5hZ2VyID0gRHJtTWFuYWdlckNsaWVudEltcGw6OmNyZWF0ZSgmdW5pcXVlSWQpOworICAgIGRybU1hbmFnZXItPmFkZENsaWVudCh1bmlxdWVJZCk7CisKKyAgICAvLyBTZXQgdGhlIGxpc3RlbmVyIHRvIERybU1hbmFnZXIKKyAgICBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgSk5JT25JbmZvTGlzdGVuZXIoZW52LCB0aGl6LCB3ZWFrX3RoaXopOworICAgIGRybU1hbmFnZXItPnNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCBsaXN0ZW5lcik7CisKKyAgICBzZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXosIGRybU1hbmFnZXIpOworICAgIExPR1YoImluaXRpYWxpemUgLSBFeGl0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCkgeworICAgIExPR1YoImZpbmFsaXplIC0gRW50ZXIiKTsKKyAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlKHVuaXF1ZUlkKTsKKyAgICBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgTlVMTCk7CisKKyAgICBzcDxEcm1NYW5hZ2VyQ2xpZW50SW1wbD4gb2xkQ2xpZW50ID0gc2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6LCBOVUxMKTsKKyAgICBpZiAob2xkQ2xpZW50ICE9IE5VTEwpIHsKKyAgICAgICAgb2xkQ2xpZW50LT5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgTlVMTCk7CisgICAgICAgIG9sZENsaWVudC0+cmVtb3ZlQ2xpZW50KHVuaXF1ZUlkKTsKKyAgICB9CisgICAgTE9HVigiZmluYWxpemUgLSBFeGl0Iik7Cit9CisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0Q29uc3RyYWludHNGcm9tQ29udGVudCgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpzdHJpbmcganBhdGgsIGppbnQgdXNhZ2UpIHsKKyAgICBMT0dWKCJHZXRDb25zdHJhaW50cyAtIEVudGVyIik7CisKKyAgICBjb25zdCBTdHJpbmc4IHBhdGhTdHJpbmcgPSBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGpwYXRoKTsKKyAgICBEcm1Db25zdHJhaW50cyogcENvbnN0cmFpbnRzCisgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KS0+Z2V0Q29uc3RyYWludHModW5pcXVlSWQsICZwYXRoU3RyaW5nLCB1c2FnZSk7CisKKyAgICBqY2xhc3MgbG9jYWxSZWYgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMiKTsKKyAgICBqb2JqZWN0IGNvbnN0cmFpbnRzID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IGxvY2FsUmVmICYmIE5VTEwgIT0gcENvbnN0cmFpbnRzKSB7CisgICAgICAgIC8vIEdldCB0aGUgY29uc3RydWN0b3IgaWQKKyAgICAgICAgam1ldGhvZElEIGNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICAvLyBjcmVhdGUgdGhlIGphdmEgRHJtQ29uc3RyYWludHMgb2JqZWN0CisgICAgICAgIGNvbnN0cmFpbnRzID0gZW52LT5OZXdPYmplY3QobG9jYWxSZWYsIGNvbnN0cnVjdG9ySWQpOworCisgICAgICAgIERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBrZXlJdCA9IHBDb25zdHJhaW50cy0+a2V5SXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKworICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBlbnRyeTxjb25zdHJhaW50S2V5LCBjb25zdHJhaW50VmFsdWU+IHRvIG5ld2x5IGNyZWF0ZWQgamF2YSBvYmplY3QKKyAgICAgICAgICAgIGlmIChEcm1Db25zdHJhaW50czo6RVhURU5ERURfTUVUQURBVEEgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSBwQ29uc3RyYWludHMtPmdldEFzQnl0ZUFycmF5KCZrZXkpOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGpieXRlQXJyYXkgZGF0YUFycmF5ID0gZW52LT5OZXdCeXRlQXJyYXkoc3RybGVuKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGRhdGFBcnJheSwgMCwgc3RybGVuKHZhbHVlKSwgKGpieXRlKil2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cywgZW52LT5HZXRNZXRob2RJRChsb2NhbFJlZiwgInB1dCIsICIoTGphdmEvbGFuZy9TdHJpbmc7W0IpViIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGtleS5zdHJpbmcoKSksIGRhdGFBcnJheSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gcENvbnN0cmFpbnRzLT5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChsb2NhbFJlZiwgInB1dCIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihrZXkuc3RyaW5nKCkpLCBlbnYtPk5ld1N0cmluZ1VURih2YWx1ZS5zdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHBDb25zdHJhaW50czsgcENvbnN0cmFpbnRzID0gTlVMTDsKKyAgICBMT0dWKCJHZXRDb25zdHJhaW50cyAtIEV4aXQiKTsKKyAgICByZXR1cm4gY29uc3RyYWludHM7Cit9CisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0TWV0YWRhdGFGcm9tQ29udGVudCgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpzdHJpbmcganBhdGgpIHsKKyAgICBMT0dWKCJHZXRNZXRhZGF0YSAtIEVudGVyIik7CisgICAgY29uc3QgU3RyaW5nOCBwYXRoU3RyaW5nID0gVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBqcGF0aCk7CisgICAgRHJtTWV0YWRhdGEqIHBNZXRhZGF0YSA9CisgICAgICAgICAgICBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5nZXRNZXRhZGF0YSh1bmlxdWVJZCwgJnBhdGhTdHJpbmcpOworCisgICAgam9iamVjdCBtZXRhZGF0YSA9IE5VTEw7CisKKyAgICBqY2xhc3MgbG9jYWxSZWYgPSBOVUxMOworICAgIGxvY2FsUmVmID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzIik7CisgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYgJiYgTlVMTCAhPSBwTWV0YWRhdGEpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjb25zdHJ1Y3RvciBpZAorICAgICAgICBqbWV0aG9kSUQgY29uc3RydWN0b3JJZCA9IE5VTEw7CisgICAgICAgIGNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICBpZiAoTlVMTCAhPSBjb25zdHJ1Y3RvcklkKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGphdmEgRHJtTWV0YWRhdGEgb2JqZWN0CisgICAgICAgICAgICBtZXRhZGF0YSA9IGVudi0+TmV3T2JqZWN0KGxvY2FsUmVmLCBjb25zdHJ1Y3RvcklkKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIGtleUl0ID0gcE1ldGFkYXRhLT5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZW50cnk8Y29uc3RyYWludEtleSwgY29uc3RyYWludFZhbHVlPgorICAgICAgICAgICAgICAgICAgICAvLyB0byBuZXdseSBjcmVhdGVkIGphdmEgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBwTWV0YWRhdGEtPmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1ldGFkYXRhLCBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAicHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGtleS5zdHJpbmcoKSksIGVudi0+TmV3U3RyaW5nVVRGKHZhbHVlLnN0cmluZygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBwTWV0YWRhdGE7IHBNZXRhZGF0YSA9IE5VTEw7CisgICAgTE9HVigiR2V0TWV0YWRhdGEgLSBFeGl0Iik7CisgICAgcmV0dXJuIG1ldGFkYXRhOworfQorCitzdGF0aWMgam9iamVjdEFycmF5IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0QWxsU3VwcG9ydEluZm8oCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigiR2V0QWxsU3VwcG9ydEluZm8gLSBFbnRlciIpOworICAgIERybVN1cHBvcnRJbmZvKiBkcm1TdXBwb3J0SW5mb0FycmF5ID0gTlVMTDsKKworICAgIGludCBsZW5ndGggPSAwOworICAgIGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPmdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCAmbGVuZ3RoLCAmZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtU3VwcG9ydEluZm8iKTsKKworICAgIGpvYmplY3RBcnJheSBhcnJheSA9IChqb2JqZWN0QXJyYXkpZW52LT5OZXdPYmplY3RBcnJheShsZW5ndGgsIGNsYXp6LCBOVUxMKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgRHJtU3VwcG9ydEluZm8gaW5mbyA9IGRybVN1cHBvcnRJbmZvQXJyYXlbaV07CisKKyAgICAgICAgam9iamVjdCBkcm1TdXBwb3J0SW5mbyA9IGVudi0+TmV3T2JqZWN0KGNsYXp6LCBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiPGluaXQ+IiwgIigpViIpKTsKKworICAgICAgICBqbWV0aG9kSUQgYWRkTWltZVR5cGVJZAorICAgICAgICAgICAgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiYWRkTWltZVR5cGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgICAgIGptZXRob2RJRCBhZGRGaWxlU3VmZml4SWQKKyAgICAgICAgICAgID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImFkZEZpbGVTdWZmaXgiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CisKKyAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCgKKyAgICAgICAgICAgIGRybVN1cHBvcnRJbmZvLCBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0RGVzY3JpcHRpb24iLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihpbmZvLmdldERlc2NyaXB0aW9uKCkuc3RyaW5nKCkpKTsKKworICAgICAgICBEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciBpdGVyYXRvciA9IGluZm8uZ2V0TWltZVR5cGVJdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4ICB2YWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZHJtU3VwcG9ydEluZm8sIGFkZE1pbWVUeXBlSWQsIGVudi0+TmV3U3RyaW5nVVRGKHZhbHVlLnN0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRGaWxlU3VmZml4SXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgZHJtU3VwcG9ydEluZm8sIGFkZEZpbGVTdWZmaXhJZCwgZW52LT5OZXdTdHJpbmdVVEYodmFsdWUuc3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFycmF5LCBpLCBkcm1TdXBwb3J0SW5mbyk7CisgICAgfQorCisgICAgZGVsZXRlIFtdIGRybVN1cHBvcnRJbmZvQXJyYXk7IGRybVN1cHBvcnRJbmZvQXJyYXkgPSBOVUxMOworICAgIExPR1YoIkdldEFsbFN1cHBvcnRJbmZvIC0gRXhpdCIpOworICAgIHJldHVybiBhcnJheTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9pbnN0YWxsRHJtRW5naW5lKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBlbmdpbmVGaWxlUGF0aCkgeworICAgIExPR1YoImluc3RhbGxEcm1FbmdpbmUgLSBFbnRlciIpOworICAgIC8vZ2V0RHJtTWFuYWdlckNsaWVudChlbnYsIHRoaXopCisgICAgLy8gIC0+aW5zdGFsbERybUVuZ2luZSh1bmlxdWVJZCwgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBlbmdpbmVGaWxlUGF0aCkpOworICAgIExPR1YoImluc3RhbGxEcm1FbmdpbmUgLSBFeGl0Iik7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfc2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsCisgICAgICAgICAgICBqb2JqZWN0IGRybVJpZ2h0cywganN0cmluZyByaWdodHNQYXRoLCBqc3RyaW5nIGNvbnRlbnRQYXRoKSB7CisgICAgTE9HVigic2F2ZVJpZ2h0cyAtIEVudGVyIik7CisgICAgaW50IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICBjaGFyKiBtRGF0YSA9ICBVdGlsaXR5OjpnZXRCeXRlQXJyYXlWYWx1ZShlbnYsIGRybVJpZ2h0cywgIm1EYXRhIiwgJmRhdGFMZW5ndGgpOworCisgICAgaWYgKE5VTEwgIT0gbURhdGEpIHsKKyAgICAgICAgRHJtUmlnaHRzIHJpZ2h0cyhEcm1CdWZmZXIobURhdGEsIGRhdGFMZW5ndGgpLAorICAgICAgICAgICAgICAgIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgZHJtUmlnaHRzLCAibU1pbWVUeXBlIiksCisgICAgICAgICAgICAgICAgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBkcm1SaWdodHMsICJtQWNjb3VudElkIiksCisgICAgICAgICAgICAgICAgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBkcm1SaWdodHMsICJtU3Vic2NyaXB0aW9uSWQiKSk7CisgICAgICAgIHJlc3VsdCA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeikKKyAgICAgICAgICAgIC0+c2F2ZVJpZ2h0cyh1bmlxdWVJZCwgcmlnaHRzLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHJpZ2h0c1BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGNvbnRlbnRQYXRoKSk7CisgICAgfQorCisgICAgZGVsZXRlIG1EYXRhOyBtRGF0YSA9IE5VTEw7CisgICAgTE9HVigic2F2ZVJpZ2h0cyAtIEV4aXQiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jYW5IYW5kbGUoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIHBhdGgsIGpzdHJpbmcgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJjYW5IYW5kbGUgLSBFbnRlciIpOworICAgIGpib29sZWFuIHJlc3VsdAorICAgICAgICA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeikKKyAgICAgICAgICAgIC0+Y2FuSGFuZGxlKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHBhdGgpLAorICAgICAgICAgICAgICAgICAgICBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIG1pbWVUeXBlKSk7CisgICAgTE9HVigiY2FuSGFuZGxlIC0gRXhpdCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfcHJvY2Vzc0RybUluZm8oCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqb2JqZWN0IGRybUluZm9PYmplY3QpIHsKKyAgICBMT0dWKCJwcm9jZXNzRHJtSW5mbyAtIEVudGVyIik7CisgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgIGNvbnN0IFN0cmluZzggbU1pbWVUeXBlID0gIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgZHJtSW5mb09iamVjdCwgIm1NaW1lVHlwZSIpOworICAgIGNoYXIqIG1EYXRhID0gIFV0aWxpdHk6OmdldEJ5dGVBcnJheVZhbHVlKGVudiwgZHJtSW5mb09iamVjdCwgIm1EYXRhIiwgJmRhdGFMZW5ndGgpOworICAgIGludCBtSW5mb1R5cGUgPSBVdGlsaXR5OjpnZXRJbnRWYWx1ZShlbnYsIGRybUluZm9PYmplY3QsICJtSW5mb1R5cGUiKTsKKworICAgIGNvbnN0IERybUJ1ZmZlciBidWZmZXIobURhdGEsIGRhdGFMZW5ndGgpOworICAgIERybUluZm8gZHJtSW5mbyhtSW5mb1R5cGUsIGJ1ZmZlciwgbU1pbWVUeXBlKTsKKworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1JbmZvIik7CisgICAgam9iamVjdCBrZXlJdGVyYXRvcgorICAgICAgICA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChkcm1JbmZvT2JqZWN0LAorICAgICAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJrZXlJdGVyYXRvciIsICIoKUxqYXZhL3V0aWwvSXRlcmF0b3I7IikpOworCisgICAgam1ldGhvZElEIGhhc05leHRJZCA9IGVudi0+R2V0TWV0aG9kSUQoZW52LT5GaW5kQ2xhc3MoImphdmEvdXRpbC9JdGVyYXRvciIpLCAiaGFzTmV4dCIsICIoKVoiKTsKKworICAgIHdoaWxlIChlbnYtPkNhbGxCb29sZWFuTWV0aG9kKGtleUl0ZXJhdG9yLCBoYXNOZXh0SWQpKSB7CisgICAgICAgIGpzdHJpbmcga2V5ID0gKGpzdHJpbmcpIGVudi0+Q2FsbE9iamVjdE1ldGhvZChrZXlJdGVyYXRvciwKKyAgICAgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvSXRlcmF0b3IiKSwKKyAgICAgICAgICAgICAgICAibmV4dCIsICIoKUxqYXZhL2xhbmcvT2JqZWN0OyIpKTsKKworICAgICAgICBqb2JqZWN0IHZhbHVlT2JqZWN0ID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGRybUluZm9PYmplY3QsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OyIpLCBrZXkpOworCisgICAgICAgIGpzdHJpbmcgdmFsU3RyaW5nID0gTlVMTDsKKyAgICAgICAgaWYgKE5VTEwgIT0gdmFsdWVPYmplY3QpIHsKKyAgICAgICAgICAgIHZhbFN0cmluZyA9IChqc3RyaW5nKSBlbnYtPkNhbGxPYmplY3RNZXRob2QodmFsdWVPYmplY3QsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL09iamVjdCIpLAorICAgICAgICAgICAgICAgICJ0b1N0cmluZyIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzgga2V5U3RyaW5nID0gVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBrZXkpOworICAgICAgICBTdHJpbmc4IHZhbHVlU3RyaW5nID0gVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCB2YWxTdHJpbmcpOworICAgICAgICBMT0dWKCJLZXk6ICVzIHwgVmFsdWU6ICVzIiwga2V5U3RyaW5nLnN0cmluZygpLCB2YWx1ZVN0cmluZy5zdHJpbmcoKSk7CisKKyAgICAgICAgZHJtSW5mby5wdXQoa2V5U3RyaW5nLCB2YWx1ZVN0cmluZyk7CisgICAgfQorCisgICAgRHJtSW5mb1N0YXR1cyogcERybUluZm9TdGF0dXMKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5wcm9jZXNzRHJtSW5mbyh1bmlxdWVJZCwgJmRybUluZm8pOworCisgICAgamNsYXNzIGxvY2FsUmVmID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybUluZm9TdGF0dXMiKTsKKyAgICBqb2JqZWN0IGRybUluZm9TdGF0dXMgPSBOVUxMOworCisgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYgJiYgTlVMTCAhPSBwRHJtSW5mb1N0YXR1cykgeworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IHBEcm1JbmZvU3RhdHVzLT5zdGF0dXNDb2RlOworICAgICAgICBpbnQgaW5mb1R5cGUgPSBwRHJtSW5mb1N0YXR1cy0+aW5mb1R5cGU7CisKKyAgICAgICAgamJ5dGVBcnJheSBkYXRhQXJyYXkgPSBOVUxMOworICAgICAgICBpZiAoTlVMTCAhPSBwRHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcERybUluZm9TdGF0dXMtPmRybUJ1ZmZlci0+bGVuZ3RoOworICAgICAgICAgICAgZGF0YUFycmF5ID0gZW52LT5OZXdCeXRlQXJyYXkobGVuZ3RoKTsKKyAgICAgICAgICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKAorICAgICAgICAgICAgICAgIGRhdGFBcnJheSwgMCwgbGVuZ3RoLCAoamJ5dGUqKSBwRHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyLT5kYXRhKTsKKworICAgICAgICAgICAgZGVsZXRlIFtdIHBEcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXItPmRhdGE7CisgICAgICAgICAgICBkZWxldGUgcERybUluZm9TdGF0dXMtPmRybUJ1ZmZlcjsgcERybUluZm9TdGF0dXMtPmRybUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL1Byb2Nlc3NlZERhdGEiKTsKKyAgICAgICAgam1ldGhvZElEIGNvbnN0cnVjdG9ySWQKKyAgICAgICAgICAgID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoW0JMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgICAgICBqb2JqZWN0IHByb2Nlc3NlZERhdGEgPSBlbnYtPk5ld09iamVjdChjbGF6eiwgY29uc3RydWN0b3JJZCwgZGF0YUFycmF5LAorICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURigoZHJtSW5mby5nZXQoRHJtSW5mb1JlcXVlc3Q6OkFDQ09VTlRfSUQpKS5zdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKChkcm1JbmZvLmdldChEcm1JbmZvUmVxdWVzdDo6U1VCU0NSSVBUSU9OX0lEKSkuc3RyaW5nKCkpKTsKKworICAgICAgICBjb25zdHJ1Y3RvcklkCisgICAgICAgICAgICA9IGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsCisgICAgICAgICAgICAgICAgIjxpbml0PiIsICIoSUlMYW5kcm9pZC9kcm0vUHJvY2Vzc2VkRGF0YTtMamF2YS9sYW5nL1N0cmluZzspViIpOworCisgICAgICAgIGRybUluZm9TdGF0dXMgPSBlbnYtPk5ld09iamVjdChsb2NhbFJlZiwgY29uc3RydWN0b3JJZCwgc3RhdHVzQ29kZSwgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSwgZW52LT5OZXdTdHJpbmdVVEYocERybUluZm9TdGF0dXMtPm1pbWVUeXBlLnN0cmluZygpKSk7CisgICAgfQorCisgICAgZGVsZXRlIG1EYXRhOyBtRGF0YSA9IE5VTEw7CisgICAgZGVsZXRlIHBEcm1JbmZvU3RhdHVzOyBwRHJtSW5mb1N0YXR1cyA9IE5VTEw7CisKKyAgICBMT0dWKCJwcm9jZXNzRHJtSW5mbyAtIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9hY3F1aXJlRHJtSW5mbygKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpvYmplY3QgZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBMT0dWKCJhY3F1aXJlRHJtSW5mbyBFbnRlciIpOworICAgIGNvbnN0IFN0cmluZzggbU1pbWVUeXBlID0gIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgZHJtSW5mb1JlcXVlc3QsICJtTWltZVR5cGUiKTsKKyAgICBpbnQgbUluZm9UeXBlID0gVXRpbGl0eTo6Z2V0SW50VmFsdWUoZW52LCBkcm1JbmZvUmVxdWVzdCwgIm1JbmZvVHlwZSIpOworCisgICAgRHJtSW5mb1JlcXVlc3QgZHJtSW5mb1JlcShtSW5mb1R5cGUsIG1NaW1lVHlwZSk7CisKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtSW5mb1JlcXVlc3QiKTsKKyAgICBqb2JqZWN0IGtleUl0ZXJhdG9yCisgICAgICAgID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGRybUluZm9SZXF1ZXN0LAorICAgICAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJrZXlJdGVyYXRvciIsICIoKUxqYXZhL3V0aWwvSXRlcmF0b3I7IikpOworCisgICAgam1ldGhvZElEIGhhc05leHRJZCA9IGVudi0+R2V0TWV0aG9kSUQoZW52LT5GaW5kQ2xhc3MoImphdmEvdXRpbC9JdGVyYXRvciIpLCAiaGFzTmV4dCIsICIoKVoiKTsKKworICAgIHdoaWxlIChlbnYtPkNhbGxCb29sZWFuTWV0aG9kKGtleUl0ZXJhdG9yLCBoYXNOZXh0SWQpKSB7CisgICAgICAgIGpzdHJpbmcga2V5CisgICAgICAgICAgICA9IChqc3RyaW5nKSBlbnYtPkNhbGxPYmplY3RNZXRob2Qoa2V5SXRlcmF0b3IsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL0l0ZXJhdG9yIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXh0IiwgIigpTGphdmEvbGFuZy9PYmplY3Q7IikpOworCisgICAgICAgIGpzdHJpbmcgdmFsdWUgPSAoanN0cmluZykgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGRybUluZm9SZXF1ZXN0LAorICAgICAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXQiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsiKSwga2V5KTsKKworICAgICAgICBTdHJpbmc4IGtleVN0cmluZyA9IFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwga2V5KTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZVN0cmluZyA9IFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgdmFsdWUpOworICAgICAgICBMT0dWKCJLZXk6ICVzIHwgVmFsdWU6ICVzIiwga2V5U3RyaW5nLnN0cmluZygpLCB2YWx1ZVN0cmluZy5zdHJpbmcoKSk7CisKKyAgICAgICAgZHJtSW5mb1JlcS5wdXQoa2V5U3RyaW5nLCB2YWx1ZVN0cmluZyk7CisgICAgfQorCisgICAgRHJtSW5mbyogcERybUluZm8gPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5hY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgJmRybUluZm9SZXEpOworCisgICAgam9iamVjdCBkcm1JbmZvT2JqZWN0ID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IHBEcm1JbmZvKSB7CisgICAgICAgIGpjbGFzcyBsb2NhbFJlZiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1JbmZvIik7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwRHJtSW5mby0+Z2V0RGF0YSgpLmxlbmd0aDsKKworICAgICAgICAgICAgamJ5dGVBcnJheSBkYXRhQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShsZW5ndGgpOworICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YUFycmF5LCAwLCBsZW5ndGgsIChqYnl0ZSopcERybUluZm8tPmdldERhdGEoKS5kYXRhKTsKKworICAgICAgICAgICAgZHJtSW5mb09iamVjdAorICAgICAgICAgICAgICAgID0gZW52LT5OZXdPYmplY3QobG9jYWxSZWYsCisgICAgICAgICAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICI8aW5pdD4iLCAiKElbQkxqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgICAgICAgICAgICAgICAgICAgIG1JbmZvVHlwZSwgZGF0YUFycmF5LCBlbnYtPk5ld1N0cmluZ1VURihwRHJtSW5mby0+Z2V0TWltZVR5cGUoKS5zdHJpbmcoKSkpOworCisgICAgICAgICAgICBEcm1JbmZvOjpLZXlJdGVyYXRvciBpdCA9IHBEcm1JbmZvLT5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgam1ldGhvZElEIHB1dE1ldGhvZElkCisgICAgICAgICAgICAgICAgPSBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAicHV0IiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspViIpOworCisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IHBEcm1JbmZvLT5nZXQoa2V5KTsKKworICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZHJtSW5mb09iamVjdCwgcHV0TWV0aG9kSWQsCisgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGtleS5zdHJpbmcoKSksIGVudi0+TmV3U3RyaW5nVVRGKHZhbHVlLnN0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIHBEcm1JbmZvLT5nZXREYXRhKCkuZGF0YTsKKyAgICB9CisKKyAgICBkZWxldGUgcERybUluZm87IHBEcm1JbmZvID0gTlVMTDsKKworICAgIExPR1YoImFjcXVpcmVEcm1JbmZvIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtSW5mb09iamVjdDsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBwYXRoLCBqc3RyaW5nIG1pbWVUeXBlKSB7CisgICAgTE9HVigiZ2V0RHJtT2JqZWN0VHlwZSBFbnRlciIpOworICAgIGludCBkcm1PYmplY3RUeXBlCisgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KQorICAgICAgICAgICAgLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIG1pbWVUeXBlKSk7CisgICAgTE9HVigiZ2V0RHJtT2JqZWN0VHlwZSBFeGl0Iik7CisgICAgcmV0dXJuIGRybU9iamVjdFR5cGU7Cit9CisKK3N0YXRpYyBqc3RyaW5nIGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0T3JpZ2luYWxNaW1lVHlwZSgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoImdldE9yaWdpbmFsTWltZVR5cGUgRW50ZXIiKTsKKyAgICBTdHJpbmc4IG1pbWVUeXBlCisgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KQorICAgICAgICAgICAgLT5nZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHBhdGgpKTsKKyAgICBMT0dWKCJnZXRPcmlnaW5hbE1pbWVUeXBlIEV4aXQiKTsKKyAgICByZXR1cm4gZW52LT5OZXdTdHJpbmdVVEYobWltZVR5cGUuc3RyaW5nKCkpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2NoZWNrUmlnaHRzU3RhdHVzKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgTE9HVigiZ2V0T3JpZ2luYWxNaW1lVHlwZSBFbnRlciIpOworICAgIGludCByaWdodHNTdGF0dXMKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopCisgICAgICAgICAgICAtPmNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHBhdGgpLCBhY3Rpb24pOworICAgIExPR1YoImdldE9yaWdpbmFsTWltZVR5cGUgRXhpdCIpOworICAgIHJldHVybiByaWdodHNTdGF0dXM7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfcmVtb3ZlUmlnaHRzKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBwYXRoKSB7CisgICAgTE9HVigicmVtb3ZlUmlnaHRzIik7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeikKKyAgICAgICAgICAgICAgIC0+cmVtb3ZlUmlnaHRzKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHBhdGgpKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9yZW1vdmVBbGxSaWdodHMoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigicmVtb3ZlQWxsUmlnaHRzIik7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPnJlbW92ZUFsbFJpZ2h0cyh1bmlxdWVJZCk7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfb3BlbkNvbnZlcnRTZXNzaW9uKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBtaW1lVHlwZSkgeworICAgIExPR1YoIm9wZW5Db252ZXJ0U2Vzc2lvbiBFbnRlciIpOworICAgIGludCBjb252ZXJ0SWQKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopCisgICAgICAgICAgICAtPm9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBtaW1lVHlwZSkpOworICAgIExPR1YoIm9wZW5Db252ZXJ0U2Vzc2lvbiBFeGl0Iik7CisgICAgcmV0dXJuIGNvbnZlcnRJZDsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGppbnQgY29udmVydElkLCBqYnl0ZUFycmF5IGlucHV0RGF0YSkgeworICAgIExPR1YoImNvbnZlcnREYXRhIEVudGVyIik7CisKKyAgICBpbnQgZGF0YUxlbmd0aCA9IDA7CisgICAgY2hhciogbURhdGEgPSBVdGlsaXR5OjpnZXRCeXRlQXJyYXlWYWx1ZShlbnYsIGlucHV0RGF0YSwgJmRhdGFMZW5ndGgpOworICAgIGNvbnN0IERybUJ1ZmZlciBidWZmZXIobURhdGEsIGRhdGFMZW5ndGgpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBwRHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPmNvbnZlcnREYXRhKHVuaXF1ZUlkLCBjb252ZXJ0SWQsICZidWZmZXIpOworCisgICAgamNsYXNzIGxvY2FsUmVmID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybUNvbnZlcnRlZFN0YXR1cyIpOworCisgICAgam9iamVjdCBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYgJiYgTlVMTCAhPSBwRHJtQ29udmVydGVkU3RhdHVzKSB7CisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcERybUNvbnZlcnRlZFN0YXR1cy0+c3RhdHVzQ29kZTsKKworICAgICAgICBqYnl0ZUFycmF5IGRhdGFBcnJheSA9IE5VTEw7CisgICAgICAgIGlmIChOVUxMICE9IHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhLT5sZW5ndGg7CisgICAgICAgICAgICBkYXRhQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShsZW5ndGgpOworICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YUFycmF5LCAwLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikgcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YS0+ZGF0YSk7CisKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhLT5kYXRhOworICAgICAgICAgICAgZGVsZXRlIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGE7IHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGptZXRob2RJRCBjb25zdHJ1Y3RvcklkID0gZW52LT5HZXRNZXRob2RJRChsb2NhbFJlZiwgIjxpbml0PiIsICIoSVtCSSlWIik7CisgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cworICAgICAgICAgICAgPSBlbnYtPk5ld09iamVjdChsb2NhbFJlZiwgY29uc3RydWN0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSwgZGF0YUFycmF5LCBwRHJtQ29udmVydGVkU3RhdHVzLT5vZmZzZXQpOworICAgIH0KKworICAgIGRlbGV0ZSBtRGF0YTsgbURhdGEgPSBOVUxMOworICAgIGRlbGV0ZSBwRHJtQ29udmVydGVkU3RhdHVzOyBwRHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKworICAgIExPR1YoImNvbnZlcnREYXRhIC0gRXhpdCIpOworICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfY2xvc2VDb252ZXJ0U2Vzc2lvbigKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGludCB1bmlxdWVJZCwgamludCBjb252ZXJ0SWQpIHsKKworICAgIExPR1YoImNsb3NlQ29udmVydFNlc3Npb24gRW50ZXIiKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogcERybUNvbnZlcnRlZFN0YXR1cworICAgICAgICAgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KS0+Y2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKKworICAgIGpjbGFzcyBsb2NhbFJlZiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMiKTsKKworICAgIGpvYmplY3QgZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IGxvY2FsUmVmICYmIE5VTEwgIT0gcERybUNvbnZlcnRlZFN0YXR1cykgeworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IHBEcm1Db252ZXJ0ZWRTdGF0dXMtPnN0YXR1c0NvZGU7CisKKyAgICAgICAgamJ5dGVBcnJheSBkYXRhQXJyYXkgPSBOVUxMOworICAgICAgICBpZiAoTlVMTCAhPSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YS0+bGVuZ3RoOworICAgICAgICAgICAgZGF0YUFycmF5ID0gZW52LT5OZXdCeXRlQXJyYXkobGVuZ3RoKTsKKyAgICAgICAgICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKAorICAgICAgICAgICAgICAgIGRhdGFBcnJheSwgMCwgbGVuZ3RoLCAoamJ5dGUqKSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhLT5kYXRhKTsKKworICAgICAgICAgICAgZGVsZXRlIFtdIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEtPmRhdGE7CisgICAgICAgICAgICBkZWxldGUgcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YTsgcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgam1ldGhvZElEIGNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAiPGluaXQ+IiwgIihJW0JJKVYiKTsKKyAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGVudi0+TmV3T2JqZWN0KGxvY2FsUmVmLCBjb25zdHJ1Y3RvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLCBkYXRhQXJyYXksIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPm9mZnNldCk7CisgICAgfQorCisgICAgZGVsZXRlIHBEcm1Db252ZXJ0ZWRTdGF0dXM7IHBEcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgTE9HVigiY2xvc2VDb252ZXJ0U2Vzc2lvbiAtIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtQ29udmVydGVkU3RhdHVzOworfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG5hdGl2ZU1ldGhvZHNbXSA9IHsKKworICAgIHsiX2luaXRpYWxpemUiLCAiKElMamF2YS9sYW5nL09iamVjdDspViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9pbml0aWFsaXplfSwKKworICAgIHsiX2ZpbmFsaXplIiwgIihJKVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZmluYWxpemV9LAorCisgICAgeyJfZ2V0Q29uc3RyYWludHMiLCAiKElMamF2YS9sYW5nL1N0cmluZztJKUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlczsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0Q29uc3RyYWludHNGcm9tQ29udGVudH0sCisKKyAgICB7Il9nZXRNZXRhZGF0YSIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2dldE1ldGFkYXRhRnJvbUNvbnRlbnR9LAorCisgICAgeyJfZ2V0QWxsU3VwcG9ydEluZm8iLCAiKEkpW0xhbmRyb2lkL2RybS9Ecm1TdXBwb3J0SW5mbzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0QWxsU3VwcG9ydEluZm99LAorCisgICAgeyJfaW5zdGFsbERybUVuZ2luZSIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2luc3RhbGxEcm1FbmdpbmV9LAorCisgICAgeyJfY2FuSGFuZGxlIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfY2FuSGFuZGxlfSwKKworICAgIHsiX3Byb2Nlc3NEcm1JbmZvIiwgIihJTGFuZHJvaWQvZHJtL0RybUluZm87KUxhbmRyb2lkL2RybS9Ecm1JbmZvU3RhdHVzOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9wcm9jZXNzRHJtSW5mb30sCisKKyAgICB7Il9hY3F1aXJlRHJtSW5mbyIsICIoSUxhbmRyb2lkL2RybS9Ecm1JbmZvUmVxdWVzdDspTGFuZHJvaWQvZHJtL0RybUluZm87IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2FjcXVpcmVEcm1JbmZvfSwKKworICAgIHsiX3NhdmVSaWdodHMiLCAiKElMYW5kcm9pZC9kcm0vRHJtUmlnaHRzO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X3NhdmVSaWdodHN9LAorCisgICAgeyJfZ2V0RHJtT2JqZWN0VHlwZSIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2dldERybU9iamVjdFR5cGV9LAorCisgICAgeyJfZ2V0T3JpZ2luYWxNaW1lVHlwZSIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0T3JpZ2luYWxNaW1lVHlwZX0sCisKKyAgICB7Il9jaGVja1JpZ2h0c1N0YXR1cyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0kpSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jaGVja1JpZ2h0c1N0YXR1c30sCisKKyAgICB7Il9yZW1vdmVSaWdodHMiLCAiKElMamF2YS9sYW5nL1N0cmluZzspSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9yZW1vdmVSaWdodHN9LAorCisgICAgeyJfcmVtb3ZlQWxsUmlnaHRzIiwgIihJKUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfcmVtb3ZlQWxsUmlnaHRzfSwKKworICAgIHsiX29wZW5Db252ZXJ0U2Vzc2lvbiIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X29wZW5Db252ZXJ0U2Vzc2lvbn0sCisKKyAgICB7Il9jb252ZXJ0RGF0YSIsICIoSUlbQilMYW5kcm9pZC9kcm0vRHJtQ29udmVydGVkU3RhdHVzOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jb252ZXJ0RGF0YX0sCisKKyAgICB7Il9jbG9zZUNvbnZlcnRTZXNzaW9uIiwgIihJSSlMYW5kcm9pZC9kcm0vRHJtQ29udmVydGVkU3RhdHVzOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jbG9zZUNvbnZlcnRTZXNzaW9ufSwKK307CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJOYXRpdmVNZXRob2RzKEpOSUVudiogZW52KSB7CisgICAgaW50IHJlc3VsdCA9IC0xOworCisgICAgLyogbG9vayB1cCB0aGUgY2xhc3MgKi8KKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudCIpOworCisgICAgaWYgKE5VTEwgIT0gY2xhenopIHsKKyAgICAgICAgaWYgKGVudi0+UmVnaXN0ZXJOYXRpdmVzKGNsYXp6LCBuYXRpdmVNZXRob2RzLCBzaXplb2YobmF0aXZlTWV0aG9kcykKKyAgICAgICAgICAgICAgICAvIHNpemVvZihuYXRpdmVNZXRob2RzWzBdKSkgPT0gSk5JX09LKSB7CisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ppbnQgSk5JX09uTG9hZChKYXZhVk0qIHZtLCB2b2lkKiByZXNlcnZlZCkgeworICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICBqaW50IHJlc3VsdCA9IC0xOworCisgICAgaWYgKHZtLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSA9PSBKTklfT0spIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gZW52ICYmIHJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYpID09IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxMzNiYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgRHJtTWFuYWdlckNsaWVudEltcGwuY3BwIFwKKyAgICBEcm1NYW5hZ2VyQ2xpZW50LmNwcAorCitMT0NBTF9NT0RVTEU6PSBsaWJkcm1mcmFtZXdvcmsKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmJpbmRlcgorCitpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisgTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKKyBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkcm1mcmFtZXdvcmtjb21tb24KKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjAwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KKworI2luY2x1ZGUgIkRybU1hbmFnZXJDbGllbnRJbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1NYW5hZ2VyQ2xpZW50OjpEcm1NYW5hZ2VyQ2xpZW50KCk6CisgICAgICAgIG1VbmlxdWVJZCgwKSwgbURybU1hbmFnZXJDbGllbnRJbXBsKE5VTEwpIHsKKyAgICBtRHJtTWFuYWdlckNsaWVudEltcGwgPSBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y3JlYXRlKCZtVW5pcXVlSWQpOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+YWRkQ2xpZW50KG1VbmlxdWVJZCk7Cit9CisKK0RybU1hbmFnZXJDbGllbnQ6On5Ecm1NYW5hZ2VyQ2xpZW50KCkgeworICAgIERybU1hbmFnZXJDbGllbnRJbXBsOjpyZW1vdmUobVVuaXF1ZUlkKTsKKyAgICBtRHJtTWFuYWdlckNsaWVudEltcGwtPnJlbW92ZUNsaWVudChtVW5pcXVlSWQpOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+c2V0T25JbmZvTGlzdGVuZXIobVVuaXF1ZUlkLCBOVUxMKTsKKyAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnRJbXBsOyBtRHJtTWFuYWdlckNsaWVudEltcGwgPSBOVUxMOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5zZXRPbkluZm9MaXN0ZW5lcihtVW5pcXVlSWQsIGluZm9MaXN0ZW5lcik7Cit9CisKK0RybUNvbnN0cmFpbnRzKiBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRDb25zdHJhaW50cyhjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0Q29uc3RyYWludHMobVVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitEcm1NZXRhZGF0YSogRHJtTWFuYWdlckNsaWVudDo6Z2V0TWV0YWRhdGEoY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmdldE1ldGFkYXRhKG1VbmlxdWVJZCwgcGF0aCk7Cit9CisKK2Jvb2wgRHJtTWFuYWdlckNsaWVudDo6Y2FuSGFuZGxlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y2FuSGFuZGxlKG1VbmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50Ojpwcm9jZXNzRHJtSW5mbyhjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cHJvY2Vzc0RybUluZm8obVVuaXF1ZUlkLCBkcm1JbmZvKTsKK30KKworRHJtSW5mbyogRHJtTWFuYWdlckNsaWVudDo6YWNxdWlyZURybUluZm8oY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+YWNxdWlyZURybUluZm8obVVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNhdmVSaWdodHMoCisgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLCBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnNhdmVSaWdodHMobVVuaXF1ZUlkLCBkcm1SaWdodHMsIHJpZ2h0c1BhdGgsIGNvbnRlbnRQYXRoKTsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRPcmlnaW5hbE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXRPcmlnaW5hbE1pbWVUeXBlKG1VbmlxdWVJZCwgcGF0aCk7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50OjpnZXREcm1PYmplY3RUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0RHJtT2JqZWN0VHlwZSggbVVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50OjpjaGVja1JpZ2h0c1N0YXR1cyhjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y2hlY2tSaWdodHNTdGF0dXMobVVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50Ojpjb25zdW1lUmlnaHRzKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNvbnN1bWVSaWdodHMobVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbAorICAgICAgICAgICAgLT5zZXRQbGF5YmFja1N0YXR1cyhtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7Cit9CisKK2Jvb2wgRHJtTWFuYWdlckNsaWVudDo6dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT52YWxpZGF0ZUFjdGlvbihtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpyZW1vdmVSaWdodHMoY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnJlbW92ZVJpZ2h0cyhtVW5pcXVlSWQsIHBhdGgpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpyZW1vdmVBbGxSaWdodHMoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cmVtb3ZlQWxsUmlnaHRzKG1VbmlxdWVJZCk7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuQ29udmVydFNlc3Npb24oY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5vcGVuQ29udmVydFNlc3Npb24obVVuaXF1ZUlkLCBtaW1lVHlwZSk7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlckNsaWVudDo6Y29udmVydERhdGEoaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jb252ZXJ0RGF0YShtVW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50OjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCBjb252ZXJ0SWQpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jbG9zZUNvbnZlcnRTZXNzaW9uKG1VbmlxdWVJZCwgY29udmVydElkKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6Z2V0QWxsU3VwcG9ydEluZm8oaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmdldEFsbFN1cHBvcnRJbmZvKG1VbmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5EZWNyeXB0U2Vzc2lvbihtVW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnQ6Om9wZW5EZWNyeXB0U2Vzc2lvbihjb25zdCBjaGFyKiB1cmkpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5vcGVuRGVjcnlwdFNlc3Npb24obVVuaXF1ZUlkLCB1cmkpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpjbG9zZURlY3J5cHRTZXNzaW9uKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jbG9zZURlY3J5cHRTZXNzaW9uKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpkZWNyeXB0KAorICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5kZWNyeXB0KAorICAgICAgICAgICAgbVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpmaW5hbGl6ZURlY3J5cHRVbml0KERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+ZmluYWxpemVEZWNyeXB0VW5pdChtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworfQorCitzc2l6ZV90IERybU1hbmFnZXJDbGllbnQ6OnByZWFkKAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5wcmVhZChtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMzEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1NYW5hZ2VyQ2xpZW50SW1wbChOYXRpdmUpIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgIkRybU1hbmFnZXJDbGllbnRJbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIElOVkFMSURfVkFMVUUgLTEKKworTXV0ZXggRHJtTWFuYWdlckNsaWVudEltcGw6Om1NdXRleDsKK3NwPElEcm1NYW5hZ2VyU2VydmljZT4gRHJtTWFuYWdlckNsaWVudEltcGw6Om1Ecm1NYW5hZ2VyU2VydmljZTsKK2NvbnN0IFN0cmluZzggRHJtTWFuYWdlckNsaWVudEltcGw6OkVNUFRZX1NUUklORygiIik7CisKK0RybU1hbmFnZXJDbGllbnRJbXBsKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y3JlYXRlKGludCogcFVuaXF1ZUlkKSB7CisgICAgaWYgKDAgPT0gKnBVbmlxdWVJZCkgeworICAgICAgICBpbnQgdW5pcXVlSWQgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5hZGRVbmlxdWVJZCgqcFVuaXF1ZUlkKTsKKyAgICAgICAgKnBVbmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFkZFVuaXF1ZUlkKCpwVW5pcXVlSWQpOworICAgIH0KKyAgICByZXR1cm4gbmV3IERybU1hbmFnZXJDbGllbnRJbXBsKCk7Cit9CisKK3ZvaWQgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZShpbnQgdW5pcXVlSWQpIHsKKyAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVVbmlxdWVJZCh1bmlxdWVJZCk7Cit9CisKK2NvbnN0IHNwPElEcm1NYW5hZ2VyU2VydmljZT4mIERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXREcm1NYW5hZ2VyU2VydmljZSgpIHsKKyAgICBtTXV0ZXgubG9jaygpOworICAgIGlmIChOVUxMID09IG1Ecm1NYW5hZ2VyU2VydmljZS5nZXQoKSkgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIikpOworICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dXKCJEcm1NYW5hZ2VyU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgcmVxdDsKKyAgICAgICAgICAgIHJlcXQudHZfc2VjICA9IDA7CisgICAgICAgICAgICByZXF0LnR2X25zZWMgPSA1MDAwMDAwMDA7IC8vMC41IHNlYworICAgICAgICAgICAgbmFub3NsZWVwKCZyZXF0LCBOVUxMKTsKKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgbURybU1hbmFnZXJTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SURybU1hbmFnZXJTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKyAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyU2VydmljZTsKK30KKwordm9pZCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6YWRkQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFkZENsaWVudCh1bmlxdWVJZCk7Cit9CisKK3ZvaWQgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVDbGllbnQodW5pcXVlSWQpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6c2V0T25JbmZvTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtT25JbmZvTGlzdGVuZXIgPSBpbmZvTGlzdGVuZXI7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldERybVNlcnZpY2VMaXN0ZW5lcih1bmlxdWVJZCwKKyAgICAgICAgICAgIChOVUxMICE9IGluZm9MaXN0ZW5lci5nZXQoKSkgPyB0aGlzIDogTlVMTCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gZHJtRW5naW5lRmlsZSkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbnN0YWxsRHJtRW5naW5lKHVuaXF1ZUlkLCBkcm1FbmdpbmVGaWxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRHJtQ29uc3RyYWludHMqIERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRDb25zdHJhaW50cygKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CisgICAgRHJtQ29uc3RyYWludHMgKmRybUNvbnN0cmFpbnRzID0gTlVMTDsKKyAgICBpZiAoKE5VTEwgIT0gcGF0aCkgJiYgKEVNUFRZX1NUUklORyAhPSAqcGF0aCkpIHsKKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnN0cmFpbnRzOworfQorCitEcm1NZXRhZGF0YSogRHJtTWFuYWdlckNsaWVudEltcGw6OmdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIERybU1ldGFkYXRhICpkcm1NZXRhZGF0YSA9IE5VTEw7CisgICAgaWYgKChOVUxMICE9IHBhdGgpICYmIChFTVBUWV9TVFJJTkcgIT0gKnBhdGgpKSB7CisgICAgICAgIGRybU1ldGFkYXRhID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0TWV0YWRhdGEodW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gZHJtTWV0YWRhdGE7Cit9CisKK2Jvb2wgRHJtTWFuYWdlckNsaWVudEltcGw6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgYm9vbCByZXRDb2RlID0gZmFsc2U7CisgICAgaWYgKChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgfHwgKEVNUFRZX1NUUklORyAhPSBtaW1lVHlwZSkpIHsKKyAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworRHJtSW5mb1N0YXR1cyogRHJtTWFuYWdlckNsaWVudEltcGw6OnByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIERybUluZm9TdGF0dXMgKmRybUluZm9TdGF0dXMgPSBOVUxMOworICAgIGlmIChOVUxMICE9IGRybUluZm8pIHsKKyAgICAgICAgZHJtSW5mb1N0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7Cit9CisKK0RybUluZm8qIERybU1hbmFnZXJDbGllbnRJbXBsOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOworICAgIGlmIChOVUxMICE9IGRybUluZm9SZXF1ZXN0KSB7CisgICAgICAgIGRybUluZm8gPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5hY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworICAgIH0KKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OnNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBjb250ZW50UGF0aCkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zYXZlUmlnaHRzKHVuaXF1ZUlkLCBkcm1SaWdodHMsIHJpZ2h0c1BhdGgsIGNvbnRlbnRQYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBTdHJpbmc4IG1pbWVUeXBlID0gRU1QVFlfU1RSSU5HOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgeworICAgICAgICBtaW1lVHlwZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBpbnQgZHJtT2plY3RUeXBlID0gRHJtT2JqZWN0VHlwZTo6VU5LTk9XTjsKKyAgICBpZiAoKEVNUFRZX1NUUklORyAhPSBwYXRoKSB8fCAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSkgeworICAgICAgICAgZHJtT2plY3RUeXBlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0RHJtT2JqZWN0VHlwZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gZHJtT2plY3RUeXBlOworfQorCitpbnQgRHJtTWFuYWdlckNsaWVudEltcGw6OmNoZWNrUmlnaHRzU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgaW50IHJpZ2h0c1N0YXR1cyA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX0lOVkFMSUQ7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwYXRoKSB7CisgICAgICAgIHJpZ2h0c1N0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gcmlnaHRzU3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y29uc3VtZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6c2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIGJvb2wgcmV0Q29kZSA9IGZhbHNlOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgeworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+dmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cmVtb3ZlUmlnaHRzKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGludCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSB7CisgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1pbWVUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIERybUNvbnZlcnRlZFN0YXR1cyogZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSBpbnB1dERhdGEpIHsKKyAgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnZlcnREYXRhKHVuaXF1ZUlkLCBjb252ZXJ0SWQsIGlucHV0RGF0YSk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmICgoTlVMTCAhPSBkcm1TdXBwb3J0SW5mb0FycmF5KSAmJiAoTlVMTCAhPSBsZW5ndGgpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CisgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSB1cmkpIHsKKyAgICAgICAgaGFuZGxlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkpOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlRGVjcnlwdFNlc3Npb24oIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmIChOVUxMICE9IGhlYWRlckluZm8pKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKKyAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cworICAgICAgICAgICAgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBzc2l6ZV90IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBidWZmZXIpICYmICgwIDwgbnVtQnl0ZXMpKSB7CisgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpub3RpZnkoY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgeworICAgIGlmIChOVUxMICE9IG1PbkluZm9MaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4gbGlzdGVuZXIgPSBtT25JbmZvTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbkluZm8oZXZlbnQpOworICAgIH0KKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtSU9TZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtSU9TZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0MTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1JT1NlcnZpY2UuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9JT19TRVJWSUNFX0hfXworI2RlZmluZSBfX0RSTV9JT19TRVJWSUNFX0hfXworCisjaW5jbHVkZSAiSURybUlPU2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBJTyBzZXJ2aWNlLgorICoKKyAqIFRoZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIERSTSBJTyBzZXJ2aWNlLgorICoKKyAqLworY2xhc3MgRHJtSU9TZXJ2aWNlIDogcHVibGljIEJuRHJtSU9TZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpOworCitwcml2YXRlOgorICAgIERybUlPU2VydmljZSgpOworICAgIHZpcnR1YWwgfkRybUlPU2VydmljZSgpOworCitwdWJsaWM6CisgICAgdm9pZCB3cml0ZVRvRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgZGF0YUJ1ZmZlcik7CisgICAgU3RyaW5nOCByZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0lPX1NFUlZJQ0VfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDYyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlci5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9NQU5BR0VSX0hfXworI2RlZmluZSBfX0RSTV9NQU5BR0VSX0hfXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorI2luY2x1ZGUgIklEcm1FbmdpbmUuaCIKKyNpbmNsdWRlICJQbHVnSW5NYW5hZ2VyLmgiCisjaW5jbHVkZSAiSURybVNlcnZpY2VMaXN0ZW5lci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElEcm1NYW5hZ2VyOworY2xhc3MgRHJtUmVnaXN0cmF0aW9uSW5mbzsKK2NsYXNzIERybVVucmVnaXN0cmF0aW9uSW5mbzsKK2NsYXNzIERybVJpZ2h0c0FjcXVpc2l0aW9uSW5mbzsKK2NsYXNzIERybUNvbnRlbnRJZHM7CitjbGFzcyBEcm1Db25zdHJhaW50czsKK2NsYXNzIERybU1ldGFkYXRhOworY2xhc3MgRHJtUmlnaHRzOworY2xhc3MgRHJtSW5mbzsKK2NsYXNzIERybUluZm9TdGF0dXM7CitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXM7CitjbGFzcyBEcm1JbmZvUmVxdWVzdDsKK2NsYXNzIERybVN1cHBvcnRJbmZvOworY2xhc3MgQWN0aW9uRGVzY3JpcHRpb247CisKKy8qKgorICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIE1hbmFnZXIuIFRoaXMgY2xhc3MgZGVsZWdhdGVzIHRoZQorICogZnVuY3Rpb25hbGl0eSB0byBjb3JyZXNwb25kaW5nIERSTSBFbmdpbmUuCisgKgorICogVGhlIERybU1hbmFnZXJTZXJ2aWNlIGNsYXNzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAqCisgKi8KK2NsYXNzIERybU1hbmFnZXIgOiBwdWJsaWMgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIgeworcHVibGljOgorICAgIERybU1hbmFnZXIoKTsKKyAgICB2aXJ0dWFsIH5Ecm1NYW5hZ2VyKCk7CisKK3B1YmxpYzoKKyAgICBpbnQgYWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZvaWQgcmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZvaWQgYWRkQ2xpZW50KGludCB1bmlxdWVJZCk7CisKKyAgICB2b2lkIHJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgc3RhdHVzX3QgbG9hZFBsdWdJbnMoKTsKKworICAgIHN0YXR1c190IGxvYWRQbHVnSW5zKGNvbnN0IFN0cmluZzgmIHBsdWdJbkRpclBhdGgpOworCisgICAgc3RhdHVzX3QgdW5sb2FkUGx1Z0lucygpOworCisgICAgc3RhdHVzX3Qgc2V0RHJtU2VydmljZUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgZHJtU2VydmljZUxpc3RlbmVyKTsKKworICAgIHN0YXR1c190IGluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKTsKKworICAgIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCk7CisKKyAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbyk7CisKKyAgICBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICBzdGF0dXNfdCBzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIGludCBnZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisgICAgc3RhdHVzX3QgcmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIGludCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworICAgIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOworCitwcml2YXRlOgorICAgIFN0cmluZzggZ2V0U3VwcG9ydGVkUGx1Z0luSWQoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBTdHJpbmc4IGdldFN1cHBvcnRlZFBsdWdJbklkKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIFN0cmluZzggZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aChpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgVmVjdG9yPGludD4gbVVuaXF1ZUlkVmVjdG9yOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IEVNUFRZX1NUUklORzsKKworICAgIGludCBtRGVjcnlwdFNlc3Npb25JZDsKKyAgICBpbnQgbUNvbnZlcnRJZDsKKyAgICBNdXRleCBtTG9jazsKKyAgICBNdXRleCBtRGVjcnlwdExvY2s7CisgICAgTXV0ZXggbUNvbnZlcnRMb2NrOworICAgIFRQbHVnSW5NYW5hZ2VyPElEcm1FbmdpbmU+IG1QbHVnSW5NYW5hZ2VyOworICAgIEtleWVkVmVjdG9yPCBEcm1TdXBwb3J0SW5mbywgU3RyaW5nOCA+IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXA7CisgICAgS2V5ZWRWZWN0b3I8IGludCwgSURybUVuZ2luZSo+IG1Db252ZXJ0U2Vzc2lvbk1hcDsKKyAgICBLZXllZFZlY3RvcjwgaW50LCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiA+IG1TZXJ2aWNlTGlzdGVuZXJzOworICAgIEtleWVkVmVjdG9yPCBpbnQsIElEcm1FbmdpbmUqPiBtRGVjcnlwdFNlc3Npb25NYXA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fTUFOQUdFUl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjg0ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0lNUExfSF9fCisjZGVmaW5lIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0lNUExfSF9fCisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgorCisjaW5jbHVkZSAiSURybU1hbmFnZXJTZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtSW5mb0V2ZW50OworLyoqCisgKiBUaGlzIGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEcm1NYW5hZ2VyQ2xpZW50IGNsYXNzLgorICoKKyAqIE9ubHkgdGhlIEpOSSBsYXllciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gZGVsZWdhdGUKKyAqIGZ1bmN0aW9uYWxpdHkgdG8gTmF0aXZlIGxhdGVyLgorICoKKyAqLworY2xhc3MgRHJtTWFuYWdlckNsaWVudEltcGwgOiBwdWJsaWMgQm5Ecm1TZXJ2aWNlTGlzdGVuZXIgeworcHJpdmF0ZToKKyAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbCgpIHsgfQorCitwdWJsaWM6CisgICAgc3RhdGljIERybU1hbmFnZXJDbGllbnRJbXBsKiBjcmVhdGUoaW50KiBwVW5pcXVlSWQpOworCisgICAgc3RhdGljIHZvaWQgcmVtb3ZlKGludCB1bmlxdWVJZCk7CisKKyAgICB2aXJ0dWFsIH5Ecm1NYW5hZ2VyQ2xpZW50SW1wbCgpIHsgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWRkcyB0aGUgY2xpZW50IHJlc3BlY3RpdmUgdG8gZ2l2ZW4gdW5pcXVlIGlkLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICovCisgICAgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGNsaWVudCByZXNwZWN0aXZlIHRvIGdpdmVuIHVuaXF1ZSBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvCisgICAgICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5mb0xpc3RlbmVyIExpc3RlbmVyCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICAgICAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0T25JbmZvTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIEdldCBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb25zIGRlZmluZWQgc3VjaCBhcywKKyAgICAgKiAgICAgQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YworICAgICAqIEByZXR1cm4gRHJtQ29uc3RyYWludHMKKyAgICAgKiAgICAga2V5LXZhbHVlIHBhaXJzIG9mIGNvbnN0cmFpbnQgYXJlIGVtYmVkZGVkIGluIGl0CisgICAgICogQG5vdGUKKyAgICAgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAgICAgKi8KKyAgICBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gRHJtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgIGtleS12YWx1ZSBwYWlycyBvZiBtZXRhZGF0YSBhcmUgZW1iZWRkZWQgaW4gaXQKKyAgICAgKiBAbm90ZQorICAgICAqICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBtaW1ldHlwZSBvciBwYXRoIGNhbiBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBuZWVkcyB0byBiZSBoYW5kbGVkCisgICAgICogQHBhcmFtW2luXSBtaW1ldHlwZSBNaW1ldHlwZSBvZiB0aGUgY29udGVudCBuZWVkcyB0byBiZSBoYW5kbGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBUcnVlIGlmIERybU1hbmFnZXIgY2FuIGhhbmRsZSBnaXZlbiBwYXRoIG9yIG1pbWUgdHlwZS4KKyAgICAgKi8KKyAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIGRybSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBpdHMgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdHJhdGlvbiwgdW5yZWdpc3RyYXRpb24gb3IgcmlnaHRzCisgICAgICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICAgICAqIEByZXR1cm4gRHJtSW5mbworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisgICAgLyoqCisgICAgICogU2F2ZSBEUk0gcmlnaHRzIHRvIHNwZWNpZmllZCByaWdodHMgcGF0aAorICAgICAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gY29udGVudFBhdGggRmlsZSBwYXRoIHdoZXJlIGNvbnRlbnQgd2FzIHNhdmVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIFN0cmluZzgKKyAgICAgKiAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgICAgICogdG8gcmV0cmlldmUgRFJNIG9iamVjdCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTWltZSB0eXBlIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHJldHVybiB0eXBlIG9mIHRoZSBEUk0gY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgICAgICovCisgICAgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybSAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50LAorICAgICAqICAgICBzdWNoIGFzIFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElELCBSaWdodHNTdGF0dXM6OlJJR0hUU19FWFBJUkVELCBldGMuCisgICAgICovCisgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgcmlnaHRzIGZvciBhIGNvbnRlbnQuCisgICAgICogSWYgdGhlIHJlc2VydmUgcGFyYW1ldGVyIGlzIHRydWUgdGhlIHJpZ2h0cyBpcyByZXNlcnZlZCB1bnRpbCB0aGUgc2FtZQorICAgICAqIGFwcGxpY2F0aW9uIGNhbGxzIHRoaXMgYXBpIGFnYWluIHdpdGggdGhlIHJlc2VydmUgcGFyYW1ldGVyIHNldCB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHBhcmFtW2luXSByZXNlcnZlIFRydWUgaWYgdGhlIHJpZ2h0cyBzaG91bGQgYmUgcmVzZXJ2ZWQuCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERSTSBlbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwbGF5YmFja1N0YXR1cyBQbGF5YmFjayBhY3Rpb24gKFBsYXliYWNrOjpTVEFSVCwgUGxheWJhY2s6OlNUT1AsIFBsYXliYWNrOjpQQVVTRSkKKyAgICAgKiBAcGFyYW1baW5dIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgICAgICogICAgIE9ubHkgdmFsaWQgdG9nZXRoZXIgd2l0aCBQbGF5YmFjazo6U1RBUlQuCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgICAgICogQHBhcmFtW2luXSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIGJhc2VkIERSTSBzY2hlbWUuCisgICAgICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICAgICAqIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gaGFzIHRvCisgICAgICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBEZXNjcmlwdGlvbi9NSU1FIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEgcGFja2V0CisgICAgICogQHJldHVybiBSZXR1cm4gaGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICovCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgICAgICogVGhlIHJlc3VsdGFudCBjb252ZXJ0ZWQgZGF0YSBhbmQgdGhlIHN0YXR1cyBpcyByZXR1cm5lZCBpbiB0aGUgRHJtQ29udmVydGVkSW5mbworICAgICAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGFyZSBuZXcgYmxvY2sKKyAgICAgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgRHJtIEFnZW50IHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkCisgICAgICogb3Igd2hlbiBhbiBlcnJvciBvY2N1cnMuIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLAorICAgICAqIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB0aGF0IHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlCisgICAgICogc2hvdWxkIGJlIGFkZGVkLiBUaGlzIHNpZ25hdHVyZSBhcHBlbmRpbmcgaXMgbmVlZGVkIHRvIGludGVncml0eQorICAgICAqIHByb3RlY3QgdGhlIGNvbnZlcnRlZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgICAgICogICAgIHRoZSBhcHBsaWNhdGlvbiBvbiB3aGljaCBvZmZzZXQgdGhlc2Ugc2lnbmF0dXJlIGRhdGEKKyAgICAgKiAgICAgc2hvdWxkIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBEcm1TdXBwb3J0SW5mbyBpbnN0YW5jZSB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUuCisgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBKTkkgbGF5ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtvdXRdIGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZHJtU3VwcG9ydEluZm9BcnJheQorICAgICAqIEBwYXJhbVtvdXRdIGRybVN1cHBvcnRJbmZvQXJyYXkgQXJyYXkgY29udGFpbnMgYWxsIERybVN1cHBvcnRJbmZvCisgICAgICogICAgICAgICAgICAgdGhhdCBuYXRpdmUgRFJNIGZyYW1ld29yayBjYW4gaGFuZGxlCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICovCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSB1cmkgUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKi8KKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICAgICAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcGFyYW1baW5dIGVuY0J1ZmZlciBFbmNyeXB0ZWQgZGF0YSBibG9jaworICAgICAqIEBwYXJhbVtvdXRdIGRlY0J1ZmZlciBEZWNyeXB0ZWQgZGF0YSBibG9jaworICAgICAqIEBwYXJhbVtpbl0gSVYgT3B0aW9uYWwgYnVmZmVyCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICAgICAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCisgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgLyoqCisgICAgICogRmluYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW291dF0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAgICAgKiBAcGFyYW1baW5dIG51bUJ5dGVzIE51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqIEBwYXJhbVtpbl0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCisgICAgICovCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGV2ZW50IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGV2ZW50IFRoZSBldmVudCB0byBiZSBub3RpZmllZAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgbm90aWZ5KGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEluc3RhbGwgbmV3IERSTSBFbmdpbmUgUGx1Zy1pbiBhdCB0aGUgcnVudGltZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1FbmdpbmUgU2hhcmVkIE9iamVjdChzbykgRmlsZSBpbiB3aGljaCBEUk0gRW5naW5lIGRlZmluZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKTsKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKyAgICBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4gbU9uSW5mb0xpc3RlbmVyOworCitwcml2YXRlOgorICAgIHN0YXRpYyBNdXRleCBtTXV0ZXg7CisgICAgc3RhdGljIHNwPElEcm1NYW5hZ2VyU2VydmljZT4gbURybU1hbmFnZXJTZXJ2aWNlOworICAgIHN0YXRpYyBjb25zdCBzcDxJRHJtTWFuYWdlclNlcnZpY2U+JiBnZXREcm1NYW5hZ2VyU2VydmljZSgpOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IEVNUFRZX1NUUklORzsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX0NMSUVOVF9JTVBMX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fTUFOQUdFUl9TRVJWSUNFX0hfXworI2RlZmluZSBfX0RSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlICJJRHJtTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtTWFuYWdlcjsKK2NsYXNzIFN0cmluZzg7CitjbGFzcyBNdXRleDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIG1hbmFnZXIgc2VydmljZS4gVGhpcyBkZWxlZ2F0ZXMKKyAqIHRoZSByZXNwb25zaWJpbGl0eSB0byBEcm1NYW5hZ2VyLgorICoKKyAqIFRoZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIERSTSBtYW5hZ2VyIHNlcnZpY2UuCisgKgorICovCitjbGFzcyBEcm1NYW5hZ2VyU2VydmljZSA6IHB1YmxpYyBCbkRybU1hbmFnZXJTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpOworCitwcml2YXRlOgorICAgIERybU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+RHJtTWFuYWdlclNlcnZpY2UoKTsKKworcHVibGljOgorICAgIGludCBhZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpOworCisgICAgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgY29uc3QgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KTsKKworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLGludCBhY3Rpb24pOworCisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisgICAgc3RhdHVzX3QgcmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIGludCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworcHJpdmF0ZToKKyAgICBEcm1NYW5hZ2VyKiBtRHJtTWFuYWdlcjsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtSU9TZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybUlPU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGQ5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybUlPU2VydmljZS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSURSTV9JT19TRVJWSUNFX0hfXworI2RlZmluZSBfX0lEUk1fSU9fU0VSVklDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBjbGFzcyBmb3IgRFJNIElPIHNlcnZpY2UuCisgKgorICovCitjbGFzcyBJRHJtSU9TZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgV1JJVEVfVE9fRklMRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIFJFQURfRlJPTV9GSUxFCisgICAgfTsKKworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRHJtSU9TZXJ2aWNlKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbVtpbl0gZGF0YUJ1ZmZlciBEYXRhIHRvIHdyaXRlCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEByZXR1cm4gRGF0YSByZWFkIGZyb20gdGhlIGZpbGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmluZzggcmVhZEZyb21GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoKSA9IDA7Cit9OworCisvKioKKyAqIFRoaXMgaXMgdGhlIEJpbmRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIElPIHNlcnZpY2UuCisgKi8KK2NsYXNzIEJwRHJtSU9TZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybUlPU2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICBCcERybUlPU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgICAgIDogQnBJbnRlcmZhY2U8SURybUlPU2VydmljZT4oaW1wbCkge30KKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZVRvRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgZGF0YUJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIFN0cmluZzggcmVhZEZyb21GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoKTsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gSU8gc2VydmljZS4KKyAqLworY2xhc3MgQm5Ecm1JT1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJRHJtSU9TZXJ2aWNlPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0lEUk1fSU9fU0VSVklDRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZGFiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSURSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fSURSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSAiSURybVNlcnZpY2VMaXN0ZW5lci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERybUNvbnRlbnRJZHM7CitjbGFzcyBEcm1Db25zdHJhaW50czsKK2NsYXNzIERybU1ldGFkYXRhOworY2xhc3MgRHJtUmlnaHRzOworY2xhc3MgRHJtSW5mbzsKK2NsYXNzIERybUluZm9TdGF0dXM7CitjbGFzcyBEcm1JbmZvUmVxdWVzdDsKK2NsYXNzIERybVN1cHBvcnRJbmZvOworY2xhc3MgRHJtQ29udmVydGVkU3RhdHVzOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIEFjdGlvbkRlc2NyaXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBjbGFzcyBmb3IgRFJNIE1hbmFnZXIgc2VydmljZS4KKyAqCisgKi8KK2NsYXNzIElEcm1NYW5hZ2VyU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIEFERF9VTklRVUVJRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIFJFTU9WRV9VTklRVUVJRCwKKyAgICAgICAgQUREX0NMSUVOVCwKKyAgICAgICAgUkVNT1ZFX0NMSUVOVCwKKyAgICAgICAgU0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSLAorICAgICAgICBJTlNUQUxMX0RSTV9FTkdJTkUsCisgICAgICAgIEdFVF9DT05TVFJBSU5UU19GUk9NX0NPTlRFTlQsCisgICAgICAgIEdFVF9NRVRBREFUQV9GUk9NX0NPTlRFTlQsCisgICAgICAgIENBTl9IQU5ETEUsCisgICAgICAgIFBST0NFU1NfRFJNX0lORk8sCisgICAgICAgIEFDUVVJUkVfRFJNX0lORk8sCisgICAgICAgIFNBVkVfUklHSFRTLAorICAgICAgICBHRVRfT1JJR0lOQUxfTUlNRVRZUEUsCisgICAgICAgIEdFVF9EUk1fT0JKRUNUX1RZUEUsCisgICAgICAgIENIRUNLX1JJR0hUU19TVEFUVVMsCisgICAgICAgIENPTlNVTUVfUklHSFRTLAorICAgICAgICBTRVRfUExBWUJBQ0tfU1RBVFVTLAorICAgICAgICBWQUxJREFURV9BQ1RJT04sCisgICAgICAgIFJFTU9WRV9SSUdIVFMsCisgICAgICAgIFJFTU9WRV9BTExfUklHSFRTLAorICAgICAgICBPUEVOX0NPTlZFUlRfU0VTU0lPTiwKKyAgICAgICAgQ09OVkVSVF9EQVRBLAorICAgICAgICBDTE9TRV9DT05WRVJUX1NFU1NJT04sCisgICAgICAgIEdFVF9BTExfU1VQUE9SVF9JTkZPLAorICAgICAgICBPUEVOX0RFQ1JZUFRfU0VTU0lPTiwKKyAgICAgICAgT1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkksCisgICAgICAgIENMT1NFX0RFQ1JZUFRfU0VTU0lPTiwKKyAgICAgICAgSU5JVElBTElaRV9ERUNSWVBUX1VOSVQsCisgICAgICAgIERFQ1JZUFQsCisgICAgICAgIEZJTkFMSVpFX0RFQ1JZUFRfVU5JVCwKKyAgICAgICAgUFJFQUQKKyAgICB9OworCitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShEcm1NYW5hZ2VyU2VydmljZSk7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBhZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpID0gMDsKKworICAgIHZpcnR1YWwgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybU1ldGFkYXRhKiBnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgdmlydHVhbCBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pID0gMDsKKworICAgIHZpcnR1YWwgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb3JlcXVlc3QpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpID0gMDsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgPSAwOworCisgICAgdmlydHVhbCBpbnQgZ2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKKworICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgPSAwOworCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSA9IDA7CisKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcyxvZmZfdCBvZmZzZXQpID0gMDsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gTWFuYWdlciBzZXJ2aWNlLgorICovCitjbGFzcyBCcERybU1hbmFnZXJTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybU1hbmFnZXJTZXJ2aWNlPgoreworcHVibGljOgorICAgIEJwRHJtTWFuYWdlclNlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgICAgICA6IEJwSW50ZXJmYWNlPElEcm1NYW5hZ2VyU2VydmljZT4oaW1wbCkge30KKworICAgIHZpcnR1YWwgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RHJtU2VydmljZUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCisgICAgdmlydHVhbCBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKTsKKworICAgIHZpcnR1YWwgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgdmlydHVhbCBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgdmlydHVhbCBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvcmVxdWVzdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICB2aXJ0dWFsIGludCBnZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKTsKKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gTWFuYWdlciBzZXJ2aWNlLgorICovCitjbGFzcyBCbkRybU1hbmFnZXJTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SURybU1hbmFnZXJTZXJ2aWNlPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0lEUk1fTUFOQUdFUl9TRVJWSUNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybVNlcnZpY2VMaXN0ZW5lci5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1TZXJ2aWNlTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjcxMDlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1TZXJ2aWNlTGlzdGVuZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0lEUk1fU0VSVklDRV9MSVNURU5FUl9IX18KKyNkZWZpbmUgX19JRFJNX1NFUlZJQ0VfTElTVEVORVJfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtSW5mb0V2ZW50OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBjbGFzcyBmb3IgRFJNIHNlcnZpY2UgbGlzdGVuZXIuCisgKgorICovCitjbGFzcyBJRHJtU2VydmljZUxpc3RlbmVyIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgTk9USUZZID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICB9OworCitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShEcm1TZXJ2aWNlTGlzdGVuZXIpOworCitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnkoY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgPSAwOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBzZXJ2aWNlIGxpc3RlbmVyLgorICovCitjbGFzcyBCcERybVNlcnZpY2VMaXN0ZW5lcjogcHVibGljIEJwSW50ZXJmYWNlPElEcm1TZXJ2aWNlTGlzdGVuZXI+Cit7CitwdWJsaWM6CisgICAgQnBEcm1TZXJ2aWNlTGlzdGVuZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgICAgICA6IEJwSW50ZXJmYWNlPElEcm1TZXJ2aWNlTGlzdGVuZXI+KGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KTsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gc2VydmljZSBsaXN0ZW5lci4KKyAqLworY2xhc3MgQm5Ecm1TZXJ2aWNlTGlzdGVuZXI6IHB1YmxpYyBCbkludGVyZmFjZTxJRHJtU2VydmljZUxpc3RlbmVyPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0lEUk1fU0VSVklDRV9MSVNURU5FUl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMTk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fUExVR0lOX01BTkFHRVJfSF9fCisjZGVmaW5lIF9fUExVR0lOX01BTkFHRVJfSF9fCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgY2hhciogY29uc3QgUExVR0lOX01BTkFHRVJfQ1JFQVRFID0gImNyZWF0ZSI7Citjb25zdCBjaGFyKiBjb25zdCBQTFVHSU5fTUFOQUdFUl9ERVNUUk9ZID0gImRlc3Ryb3kiOworY29uc3QgY2hhciogY29uc3QgUExVR0lOX0VYVEVOU0lPTiA9ICIuc28iOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHRlbXBsYXRlIGNsYXNzIGZvciBQbHVnaW4gbWFuYWdlci4KKyAqCisgKiBUaGUgRHJtTWFuYWdlciB1c2VzIHRoaXMgY2xhc3MgdG8gaGFuZGxlIHRoZSBwbHVnaW5zLgorICoKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFRQbHVnSW5NYW5hZ2VyIHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB2b2lkKiAgICAgIEhBTkRMRTsKKyAgICB0eXBlZGVmIFR5cGUqICAgICAgY3JlYXRlX3Qodm9pZCk7CisgICAgdHlwZWRlZiB2b2lkICAgICAgIGRlc3Ryb3lfdChUeXBlKik7CisgICAgdHlwZWRlZiBjcmVhdGVfdCogIEZQQ1JFQVRFOworICAgIHR5cGVkZWYgZGVzdHJveV90KiBGUERFU1RPUlk7CisKKyAgICB0eXBlZGVmIHN0cnVjdCBfUGx1Z0luQ29udGFpbmVyIHsKKyAgICAgICAgU3RyaW5nOCAgIHNQYXRoOworICAgICAgICBIQU5ETEUgICAgaEhhbmRsZTsKKyAgICAgICAgRlBDUkVBVEUgIGZwQ3JlYXRlOworICAgICAgICBGUERFU1RPUlkgZnBEZXN0b3J5OworICAgICAgICBUeXBlKiAgICAgcEluc3RhbmNlOworCisgICAgICAgIF9QbHVnSW5Db250YWluZXIoKToKKyAgICAgICAgICAgIHNQYXRoKCIiKQorICAgICAgICAgICAgLGhIYW5kbGUoTlVMTCkKKyAgICAgICAgICAgICxmcENyZWF0ZShOVUxMKQorICAgICAgICAgICAgLGZwRGVzdG9yeShOVUxMKQorICAgICAgICAgICAgLHBJbnN0YW5jZShOVUxMKQorICAgICAgICAgICAge30KKyAgICB9IFBsdWdJbkNvbnRhaW5lcjsKKworICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgUGx1Z0luQ29udGFpbmVyKj4gUGx1Z0luTWFwOworICAgIFBsdWdJbk1hcCBtX3BsdWdJbk1hcDsKKworICAgIHR5cGVkZWYgVmVjdG9yPFN0cmluZzg+IFBsdWdJbklkTGlzdDsKKyAgICBQbHVnSW5JZExpc3QgbV9wbHVnSW5JZExpc3Q7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBMb2FkIGFsbCB0aGUgcGx1Zy1pbnMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNQbHVnSW5EaXJQYXRoCisgICAgICogICAgIERpcmVjdG9yeSBwYXRoIHdoaWNoIHBsdWctaW5zIChkeW5hbWljIGxpYnJhcnkpIGFyZSBzdG9yZWQKKyAgICAgKiBAbm90ZSBQbHVnLWlucyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiByc1BsdWdJbkRpclBhdGgpIHsKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbkZpbGVMaXN0ID0gZ2V0UGx1Z0luUGF0aExpc3QocnNQbHVnSW5EaXJQYXRoKTsKKworICAgICAgICBpZiAoIXBsdWdJbkZpbGVMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5GaWxlTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGxvYWRQbHVnSW4ocGx1Z0luRmlsZUxpc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5sb2FkIGFsbCB0aGUgcGx1Zy1pbnMKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgdW5sb2FkUGx1Z0lucygpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtX3BsdWdJbklkTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgdW5sb2FkUGx1Z0luKG1fcGx1Z0luSWRMaXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBtX3BsdWdJbklkTGlzdC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgdGhlIElEcyBvZiBhdmFpbGFibGUgcGx1Zy1pbnMKKyAgICAgKgorICAgICAqIEByZXR1cm5baW5dIHBsdWdJbklkTGlzdAorICAgICAqICAgICBTdHJpbmcgdHlwZSBWZWN0b3IgaW4gd2hpY2ggYWxsIHBsdWctaW4gSURzIGFyZSBzdG9yZWQKKyAgICAgKi8KKyAgICBWZWN0b3I8U3RyaW5nOD4gZ2V0UGx1Z0luSWRMaXN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9wbHVnSW5JZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgcGx1Zy1pbiByZWZlcmVuY2Ugb2Ygc3BlY2lmaWVkIElECisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJzUGx1Z0luSWQKKyAgICAgKiAgICAgUGx1Zy1pbiBJRCB0byBiZSB1c2VkCisgICAgICogQHJldHVybiBwbHVnSW4KKyAgICAgKiAgICAgUmVmZXJlbmNlIG9mIHNwZWNpZmllZCBwbHVnLWluIGluc3RhbmNlCisgICAgICovCisgICAgVHlwZSYgZ2V0UGx1Z0luKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luSWQpIHsKKyAgICAgICAgaWYgKCFjb250YWlucyhyc1BsdWdJbklkKSkgeworICAgICAgICAgICAgLy8gVGhpcyBlcnJvciBjYXNlIG5ldmVyIGhhcHBlbnMKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKihtX3BsdWdJbk1hcC52YWx1ZUZvcihyc1BsdWdJbklkKS0+cEluc3RhbmNlKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBMb2FkIGEgcGx1Zy1pbiBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJzUGx1Z0luUGF0aAorICAgICAqICAgICBQbHVnLWluIChkeW5hbWljIGxpYnJhcnkpIGZpbGUgcGF0aAorICAgICAqIEBub3RlIFBsdWctaW4gc2hvdWxkIGJlIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAqLworICAgIHZvaWQgbG9hZFBsdWdJbihjb25zdCBTdHJpbmc4JiByc1BsdWdJblBhdGgpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKHJzUGx1Z0luUGF0aCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsdWdJbkNvbnRhaW5lciogcFBsdWdJbkNvbnRhaW5lciA9IG5ldyBQbHVnSW5Db250YWluZXIoKTsKKworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5oSGFuZGxlID0gZGxvcGVuKHJzUGx1Z0luUGF0aC5zdHJpbmcoKSwgUlRMRF9MQVpZKTsKKworICAgICAgICBpZiAoTlVMTCA9PSBwUGx1Z0luQ29udGFpbmVyLT5oSGFuZGxlKSB7CisgICAgICAgICAgICBkZWxldGUgcFBsdWdJbkNvbnRhaW5lcjsKKyAgICAgICAgICAgIHBQbHVnSW5Db250YWluZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcFBsdWdJbkNvbnRhaW5lci0+c1BhdGggPSByc1BsdWdJblBhdGg7CisgICAgICAgIHBQbHVnSW5Db250YWluZXItPmZwQ3JlYXRlCisgICAgICAgICAgICAgICAgPSAoRlBDUkVBVEUpZGxzeW0ocFBsdWdJbkNvbnRhaW5lci0+aEhhbmRsZSwgUExVR0lOX01BTkFHRVJfQ1JFQVRFKTsKKyAgICAgICAgcFBsdWdJbkNvbnRhaW5lci0+ZnBEZXN0b3J5CisgICAgICAgICAgICAgICAgPSAoRlBERVNUT1JZKWRsc3ltKHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUsIFBMVUdJTl9NQU5BR0VSX0RFU1RST1kpOworCisgICAgICAgIGlmIChOVUxMICE9IHBQbHVnSW5Db250YWluZXItPmZwQ3JlYXRlICYmIE5VTEwgIT0gcFBsdWdJbkNvbnRhaW5lci0+ZnBEZXN0b3J5KSB7CisgICAgICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5wSW5zdGFuY2UgPSAoVHlwZSopcFBsdWdJbkNvbnRhaW5lci0+ZnBDcmVhdGUoKTsKKyAgICAgICAgICAgIG1fcGx1Z0luSWRMaXN0LmFkZChyc1BsdWdJblBhdGgpOworICAgICAgICAgICAgbV9wbHVnSW5NYXAuYWRkKHJzUGx1Z0luUGF0aCwgcFBsdWdJbkNvbnRhaW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkbGNsb3NlKHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUpOworICAgICAgICAgICAgZGVsZXRlIHBQbHVnSW5Db250YWluZXI7CisgICAgICAgICAgICBwUGx1Z0luQ29udGFpbmVyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVubG9hZCBhIHBsdWctaW4gc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgcGF0aAorICAgICAqCisgICAgICogQHBhcmFtW2luXSByc1BsdWdJblBhdGgKKyAgICAgKiAgICAgUGx1Zy1pbiAoZHluYW1pYyBsaWJyYXJ5KSBmaWxlIHBhdGgKKyAgICAgKi8KKyAgICB2b2lkIHVubG9hZFBsdWdJbihjb25zdCBTdHJpbmc4JiByc1BsdWdJblBhdGgpIHsKKyAgICAgICAgaWYgKCFjb250YWlucyhyc1BsdWdJblBhdGgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBQbHVnSW5Db250YWluZXIqIHBQbHVnSW5Db250YWluZXIgPSBtX3BsdWdJbk1hcC52YWx1ZUZvcihyc1BsdWdJblBhdGgpOworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5mcERlc3RvcnkocFBsdWdJbkNvbnRhaW5lci0+cEluc3RhbmNlKTsKKyAgICAgICAgZGxjbG9zZShwUGx1Z0luQ29udGFpbmVyLT5oSGFuZGxlKTsKKworICAgICAgICBtX3BsdWdJbk1hcC5yZW1vdmVJdGVtKHJzUGx1Z0luUGF0aCk7CisgICAgICAgIGRlbGV0ZSBwUGx1Z0luQ29udGFpbmVyOworICAgICAgICBwUGx1Z0luQ29udGFpbmVyID0gTlVMTDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBUUGx1Z0luTWFuYWdlciBjb250YWlucyByc1BsdWdJbklkCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhjb25zdCBTdHJpbmc4JiByc1BsdWdJbklkKSB7CisgICAgICAgIHJldHVybiBtX3BsdWdJbk1hcC5pbmRleE9mS2V5KHJzUGx1Z0luSWQpICE9IE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBmaWxlIHBhdGggbGlzdCBvZiBwbHVnLWlucyBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNEaXJQYXRoCisgICAgICogICAgIERpcmVjdG9yeSBwYXRoIGluIHdoaWNoIHBsdWctaW5zIGFyZSBzdG9yZWQKKyAgICAgKiBAcmV0dXJuIHBsdWdJbkZpbGVMaXN0CisgICAgICogICAgIFN0cmluZyB0eXBlIFZlY3RvciBpbiB3aGljaCBmaWxlIHBhdGggb2YgcGx1Zy1pbnMgYXJlIHN0b3JlZAorICAgICAqLworICAgIFZlY3RvcjxTdHJpbmc4PiBnZXRQbHVnSW5QYXRoTGlzdChjb25zdCBTdHJpbmc4JiByc0RpclBhdGgpIHsKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IGZpbGVMaXN0OworICAgICAgICBESVIqIHBEaXIgPSBvcGVuZGlyKHJzRGlyUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeSA9IG5ldyBkaXJlbnQoKTsKKworICAgICAgICB3aGlsZSAoTlVMTCAhPSBwRGlyICYmIE5VTEwgIT0gKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7CisgICAgICAgICAgICBpZiAoIWlzUGx1Z0luKHBFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggcGx1Z0luUGF0aDsKKyAgICAgICAgICAgIHBsdWdJblBhdGggKz0gcnNEaXJQYXRoOworICAgICAgICAgICAgcGx1Z0luUGF0aCArPSAiLyI7CisgICAgICAgICAgICBwbHVnSW5QYXRoICs9IHBFbnRyeS0+ZF9uYW1lOworCisgICAgICAgICAgICBmaWxlTGlzdC5hZGQocGx1Z0luUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCAhPSBwRGlyKSB7CisgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgcEVudHJ5OworICAgICAgICBwRW50cnkgPSBOVUxMOworCisgICAgICAgIHJldHVybiBmaWxlTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBpbnB1dCBuYW1lIGRlbm90ZXMgcGx1Zy1pbgorICAgICAqLworICAgIGJvb2wgaXNQbHVnSW4oY29uc3Qgc3RydWN0IGRpcmVudCogcEVudHJ5KSBjb25zdCB7CisgICAgICAgIFN0cmluZzggc05hbWUocEVudHJ5LT5kX25hbWUpOworICAgICAgICBpbnQgZXh0ZW50aW9uUG9zID0gc05hbWUuc2l6ZSgpIC0gU3RyaW5nOChQTFVHSU5fRVhURU5TSU9OKS5zaXplKCk7CisgICAgICAgIGlmIChleHRlbnRpb25Qb3MgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4dGVudGlvblBvcyA9PSAoaW50KXNOYW1lLmZpbmQoUExVR0lOX0VYVEVOU0lPTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgaW5wdXQgZW50cnkgaXMgIi4iIG9yICIuLiIKKyAgICAgKi8KKyAgICBib29sIGlzRG90T3JERG90KGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICBTdHJpbmc4IHNOYW1lKHBFbnRyeS0+ZF9uYW1lKTsKKyAgICAgICAgcmV0dXJuICIuIiA9PSBzTmFtZSB8fCAiLi4iID09IHNOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgaW5wdXQgZW50cnkgaXMgZGlyZWN0b3J5CisgICAgICovCisgICAgYm9vbCBpc0RpcmVjdG9yeShjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIERUX0RJUiA9PSBwRW50cnktPmRfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIGlucHV0IGVudHJ5IGlzIHJlZ3VsYXIgZmlsZQorICAgICAqLworICAgIGJvb2wgaXNSZWd1bGFyRmlsZShjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIERUX1JFRyA9PSBwRW50cnktPmRfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIGlucHV0IGVudHJ5IGlzIGxpbmsKKyAgICAgKi8KKyAgICBib29sIGlzTGluayhjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIERUX0xOSyA9PSBwRW50cnktPmRfdHlwZTsKKyAgICB9Cit9OworCit9OworCisjZW5kaWYgLyogX19QTFVHSU5fTUFOQUdFUl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1JlYWRXcml0ZVV0aWxzLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUmVhZFdyaXRlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliMzQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1JlYWRXcml0ZVV0aWxzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19SRUFEX1dSSVRFX1VUSUxTX0hfXworI2RlZmluZSBfX1JFQURfV1JJVEVfVVRJTFNfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9GaWxlTWFwLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggcGVyZm9ybXMgSU8gb3BlcmF0aW9ucy4KKyAqCisgKi8KK2NsYXNzIFJlYWRXcml0ZVV0aWxzIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVhZFdyaXRlVXRpbHMKKyAgICAgKi8KKyAgICBSZWFkV3JpdGVVdGlscygpIHt9CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBSZWFkV3JpdGVVdGlscworICAgICAqLworICAgIHZpcnR1YWwgflJlYWRXcml0ZVV0aWxzKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEByZXR1cm4gRGF0YSByZWFkIGZyb20gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nOCByZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpOworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBkYXRhIGludG8gdGhlIGdpdmVuIGJ1ZmZlciBmcm9tIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbVtvdXRdIGJ1ZmZlciBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqIEByZXR1cm4gTGVuZ3RoIG9mIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqLworICAgIHN0YXRpYyBpbnQgcmVhZEJ5dGVzKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjaGFyKiogYnVmZmVyKTsKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRhdGEgaW50byB0aGUgZmlsZSBwYXRoIHByb3ZpZGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZpbGVQYXRoIFBhdGggb2YgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW1baW5dIGRhdGFCdWZmZXIgRGF0YSB0byB3cml0ZQorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhKTsKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBkYXRhIGludG8gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHBhcmFtW2luXSBkYXRhQnVmZmVyIERhdGEgdG8gYXBwZW5kCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYXBwZW5kVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhKTsKKworcHJpdmF0ZToKKyAgICBGaWxlTWFwKiBtRmlsZU1hcDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX1JFQURfV1JJVEVfVVRJTFNfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9TdHJpbmdUb2tlbml6ZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9TdHJpbmdUb2tlbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU3NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1N0cmluZ1Rva2VuaXplci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fU1RSSU5HX1RPS0VOSVpFUl9IX18KKyNkZWZpbmUgX19TVFJJTkdfVE9LRU5JWkVSX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3MgZm9yIFN0cmluZyBtYW5pcHVsYXRpb24uCisgKgorICovCitjbGFzcyBTdHJpbmdUb2tlbml6ZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBzdHJpbmcgdG9rZW5zCisgICAgICovCisgICAgY2xhc3MgSXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgU3RyaW5nVG9rZW5pemVyOworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKFN0cmluZ1Rva2VuaXplciogU3RyaW5nVG9rZW5pemVyKQorICAgICAgICAgOiBtU3RyaW5nVG9rZW5pemVyKFN0cmluZ1Rva2VuaXplciksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFN0cmluZ1Rva2VuaXplciogbVN0cmluZ1Rva2VuaXplcjsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFN0cmluZ1Rva2VuaXplcgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJpbmcgQ29tcGxldGUgc3RyaW5nIGRhdGEKKyAgICAgKiBAcGFyYW1baW5dIGRlbGltZXRlciBEZWxpbWV0ZXIgdXNlZCB0byBzcGxpdCB0aGUgc3RyaW5nCisgICAgICovCisgICAgU3RyaW5nVG9rZW5pemVyKGNvbnN0IFN0cmluZzgmIHN0cmluZywgY29uc3QgU3RyaW5nOCYgZGVsaW1ldGVyKTsKKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIFN0cmluZ1Rva2VuaXplcgorICAgICAqLworICAgIH5TdHJpbmdUb2tlbml6ZXIoKSB7fQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNwbGl0cyB0aGUgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgZGVsaW1ldGVyCisgICAgICovCisgICAgdm9pZCBzcGxpdFN0cmluZyhjb25zdCBTdHJpbmc4JiBzdHJpbmcsIGNvbnN0IFN0cmluZzgmIGRlbGltZXRlcik7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIHNwbGl0IHN0cmluZyB2YWx1ZXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8U3RyaW5nOD4gbVN0cmluZ1Rva2VuaXplclZlY3RvcjsKK307CisKK307CisjZW5kaWYgLyogX19TVFJJTkdfVE9LRU5JWkVSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I2MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fRU5HSU5FX0JBU0VfSF9fCisjZGVmaW5lIF9fRFJNX0VOR0lORV9CQVNFX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSAiSURybUVuZ2luZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBpbnRlcmZhY2UgZm9yIHBsdWctaW4gZGV2ZWxvcGVycworICoKKyAqIFJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgY29udHJvbCB0aGUgc2VxdWVuY2Ugb2YgYWN0dWFsIHBsdWctaW4uCisgKiBBbGwgZWFjaCBwbHVnLWluIGRldmVsb3BlciBoYXMgdG8gZG8gaXMgaW1wbGVtZW50IG9uWFhYKCkgdHlwZSB2aXJ0dWFsIGludGVyZmFjZXMuCisgKi8KK2NsYXNzIERybUVuZ2luZUJhc2UgOiBwdWJsaWMgSURybUVuZ2luZSB7CitwdWJsaWM6CisgICAgRHJtRW5naW5lQmFzZSgpOworICAgIHZpcnR1YWwgfkRybUVuZ2luZUJhc2UoKTsKKworcHVibGljOgorICAgIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pOworCisgICAgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBzZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpOworCisgICAgc3RhdHVzX3QgdGVybWluYXRlKGludCB1bmlxdWVJZCk7CisKKyAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KTsKKworICAgIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKTsKKworICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgc3RhdHVzX3Qgb3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBEcm1TdXBwb3J0SW5mbyogZ2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJbnRlcmZhY2UgZm9yIHBsdWctaW4gZGV2ZWxvcGVycyAgICAgICAgICAgICAgICAvLworICAgIC8vIGVhY2ggcGx1Zy1pbiBoYXMgdG8gaW1wbGVtZW50IGZvbGxvd2luZyBtZXRob2QgIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvKioKKyAgICAgKiBHZXQgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9ucyBkZWZpbmVkIHN1Y2ggYXMsCisgICAgICogICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAgICAgKiBAcmV0dXJuIERybUNvbnN0cmFpbnRzCisgICAgICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgdmlydHVhbCBEcm1Db25zdHJhaW50cyogb25HZXRDb25zdHJhaW50cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgICAgICogICAgICAgICBrZXktdmFsdWUgcGFpcnMgb2YgbWV0YWRhdGEKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIHZpcnR1YWwgRHJtTWV0YWRhdGEqIG9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHBsdWctaW4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvCisgICAgICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5mb0xpc3RlbmVyIExpc3RlbmVyCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2V0T25JbmZvTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlcm1pbmF0ZSB0aGUgcGx1Zy1pbgorICAgICAqIGFuZCByZWxlYXNlIHJlc291cmNlIGJvdW5kIHRvIHBsdWctaW4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGNhbiBiZSBoYW5kbGVkIGJ5IHRoaXMgcGx1Z2luIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggdGhlIHByb3RlY3RlZCBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGJvb2wKKyAgICAgKiAgICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgcGx1Z2luIGNhbiBoYW5kbGUgLCBmYWxzZSBpbiBjYXNlIG9mIG5vdCBhYmxlIHRvIGhhbmRsZQorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBvbkNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIGRybSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBpdHMgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgdmlydHVhbCBEcm1JbmZvU3RhdHVzKiBvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgPSAwOworCisgICAgLyoqCisgICAgICogU2F2ZSBEUk0gcmlnaHRzIHRvIHNwZWNpZmllZCByaWdodHMgcGF0aAorICAgICAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gY29udGVudFBhdGggRmlsZSBwYXRoIHdoZXJlIGNvbnRlbnQgd2FzIHNhdmVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzcGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdHJhdGlvbiwgdW5yZWdpc3RyYXRpb24gb3IgcmlnaHRzCisgICAgICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICAgICAqIEByZXR1cm4gRHJtSW5mbworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgdmlydHVhbCBEcm1JbmZvKiBvbkFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gU3RyaW5nOAorICAgICAqICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICAgICAqIHVzaW5nIHNwZWNpZmllZCBwYXRoIG9yIG1pbWV0eXBlLiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIHNob3VsZCBiZSBub24gbnVsbAorICAgICAqIHRvIHJldHJpZXZlIERSTSBvYmplY3QgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgRHJtT2JqZWN0VHlwZTo6Q09OVEVOVCwgRHJtT2JqZWN0VHlwZTo6UklHSFRTX09CSkVDVAorICAgICAqLworICAgIHZpcnR1YWwgaW50IG9uR2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCBvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICAgICAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgaXMgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0uIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEBwYXJhbVtpbl0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEUk0gRW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGxheWJhY2tTdGF0dXMgUGxheWJhY2sgYWN0aW9uIChQbGF5YmFjazo6U1RBUlQsIFBsYXliYWNrOjpTVE9QLCBQbGF5YmFjazo6UEFVU0UpCisgICAgICogQHBhcmFtW2luXSBwb3NpdGlvbiBQb3NpdGlvbiBpbiB0aGUgZmlsZSAoaW4gbWlsbGlzZWNvbmRzKSB3aGVyZSB0aGUgc3RhcnQgb2NjdXJzLgorICAgICAqICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgICAgICogQHBhcmFtW2luXSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgb25WYWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25SZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25SZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIGJhc2VkIERSTSBzY2hlbWUuCisgICAgICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICAgICAqIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gaGFzIHRvCisgICAgICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgPSAwOworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAgICAgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgRHJtQ29udmVydGVkU3RhdHVzKiBvbkNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgRHJtIEFnZW50IHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkCisgICAgICogb3Igd2hlbiBhbiBlcnJvciBvY2N1cnMuIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLAorICAgICAqIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB0aGF0IHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlCisgICAgICogc2hvdWxkIGJlIGFkZGVkLiBUaGlzIHNpZ25hdHVyZSBhcHBlbmRpbmcgaXMgbmVlZGVkIHRvIGludGVncml0eQorICAgICAqIHByb3RlY3QgdGhlIGNvbnZlcnRlZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgICAgICogICAgIHRoZSBhcHBsaWNhdGlvbiBvbiB3aGljaCBvZmZzZXQgdGhlc2Ugc2lnbmF0dXJlIGRhdGEKKyAgICAgKiAgICAgc2hvdWxkIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHZpcnR1YWwgRHJtQ29udmVydGVkU3RhdHVzKiBvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRHJtIEVuZ2luZSBjYXBhYmlsaXRpZXMgd2hpY2ggaW5jbHVkZXMKKyAgICAgKiBzdXBwb3J0ZWQgTWltZVR5cGVzIGFuZCBmaWxlIHN1ZmZpeGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBEcm1TdXBwb3J0SW5mbworICAgICAqICAgICBpbnN0YW5jZSB3aGljaCBob2xkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGEgcGx1Zy1pbgorICAgICAqLworICAgIHZpcnR1YWwgRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBjdXJyZW50IGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZmQgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBTdGFydCBwb3NpdGlvbiBvZiB0aGUgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybgorICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBjdXJyZW50IGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSkgPSAwOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SWQgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIFNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcGFyYW1baW5dIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICAgICAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRJZCBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgU3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1bb3V0XSBidWZmZXIgUmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICAgICAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgPSAwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0VOR0lORV9CQVNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM5MDcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19JRFJNX0VOR0lORV9IX18KKyNkZWZpbmUgX19JRFJNX0VOR0lORV9IX18KKworI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERybUNvbnRlbnRJZHM7CitjbGFzcyBEcm1Db25zdHJhaW50czsKK2NsYXNzIERybU1ldGFkYXRhOworY2xhc3MgRHJtUmlnaHRzOworY2xhc3MgRHJtSW5mbzsKK2NsYXNzIERybUluZm9TdGF0dXM7CitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXM7CitjbGFzcyBEcm1JbmZvUmVxdWVzdDsKK2NsYXNzIERybVN1cHBvcnRJbmZvOworY2xhc3MgRHJtSW5mb0V2ZW50OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4gaW50ZXJmYWNlIGZvciBwbHVnLWluIHVzZXIKKyAqCisgKiBSZXNwb25zaWJpbGl0eSBvZiB0aGlzIGNsYXNzIGlzIHByb3ZpZGUgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gRFJNIEVuZ2luZSBNYW5hZ2VyLgorICogRWFjaCBpbnRlcmZhY2UgbmVlZCB0byBiZSBhcyBhYnN0cmFjdCBhcyBwb3NzaWJsZS4KKyAqLworY2xhc3MgSURybUVuZ2luZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SURybUVuZ2luZSgpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBjbGFzcyBPbkluZm9MaXN0ZW5lciB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgfk9uSW5mb0xpc3RlbmVyKCkgeyB9CisgICAgfTsKKworcHVibGljOgorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIElEcm1FbmdpbmUgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHBsdWctaW4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICAgICAqIHJlY2VpdmUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGluZm9MaXN0ZW5lciBMaXN0ZW5lcgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgPSAwOworCisgICAgLyoqCisgICAgICogVGVybWluYXRlIHRoZSBwbHVnLWluCisgICAgICogYW5kIHJlbGVhc2UgcmVzb3VyY2UgYm91bmQgdG8gcGx1Zy1pbgorICAgICAqIGUuZy4pIHJlbGVhc2UgbmF0aXZlIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVybWluYXRlKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICAgICAqICAgICBBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjCisgICAgICogQHJldHVybiBEcm1Db25zdHJhaW50cworICAgICAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIHZpcnR1YWwgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gRHJtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgIGtleS12YWx1ZSBwYWlycyBvZiBtZXRhZGF0YQorICAgICAqIEBub3RlCisgICAgICogICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIHZpcnR1YWwgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgY2FuIGJlIGhhbmRsZWQgYnkgdGhpcyBwbHVnaW4gb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCB0aGUgcHJvdGVjdGVkIG9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbAorICAgICAqICAgICB0cnVlIGlmIHRoaXMgcGx1Z2luIGNhbiBoYW5kbGUgLCBmYWxzZSBpbiBjYXNlIG9mIG5vdCBhYmxlIHRvIGhhbmRsZQorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBnaXZlbiBkcm0gaW5mb3JtYXRpb24gYmFzZWQgb24gaXRzIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mbyBJbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcmV0dXJuIERybUluZm9TdGF0dXMKKyAgICAgKiAgICAgaW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIHZpcnR1YWwgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICAgICAqIGFjcXVpc2l0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAgICAgKiBAcmV0dXJuIERybUluZm8KKyAgICAgKiAgICAgaW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIHZpcnR1YWwgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpID0gMDsKKworICAgIC8qKgorICAgICAqIFNhdmUgRFJNIHJpZ2h0cyB0byBzcGVjaWZpZWQgcmlnaHRzIHBhdGgKKyAgICAgKiBhbmQgbWFrZSBhc3NvY2lhdGlvbiB3aXRoIGNvbnRlbnQgcGF0aAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1SaWdodHMgRHJtUmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSByaWdodHNQYXRoIEZpbGUgcGF0aCB3aGVyZSByaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW1baW5dIGNvbnRlbnRQYXRoIEZpbGUgcGF0aCB3aGVyZSBjb250ZW50IHdhcyBzYXZlZAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIFN0cmluZzgKKyAgICAgKiAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgICAgICogdG8gcmV0cmlldmUgRFJNIG9iamVjdCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTWltZSB0eXBlIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHJldHVybiB0eXBlIG9mIHRoZSBEUk0gY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgICAgICovCisgICAgdmlydHVhbCBpbnQgZ2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAgICAgKiBJZiB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmlnaHRzIGlzIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgICAgICogYXBwbGljYXRpb24gY2FsbHMgdGhpcyBhcGkgYWdhaW4gd2l0aCB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgc2V0IHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIHJlc2VydmUgVHJ1ZSBpZiB0aGUgcmlnaHRzIHNob3VsZCBiZSByZXNlcnZlZC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEUk0gRW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGxheWJhY2tTdGF0dXMgUGxheWJhY2sgYWN0aW9uIChQbGF5YmFjazo6U1RBUlQsIFBsYXliYWNrOjpTVE9QLCBQbGF5YmFjazo6UEFVU0UpCisgICAgICogQHBhcmFtW2luXSBwb3NpdGlvbiBQb3NpdGlvbiBpbiB0aGUgZmlsZSAoaW4gbWlsbGlzZWNvbmRzKSB3aGVyZSB0aGUgc3RhcnQgb2NjdXJzLgorICAgICAqICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgICAgICogQHBhcmFtW2luXSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIGJhc2VkIERSTSBzY2hlbWUuCisgICAgICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICAgICAqIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gaGFzIHRvCisgICAgICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgICAgICogVGhlIHJlc3VsdGFudCBjb252ZXJ0ZWQgZGF0YSBhbmQgdGhlIHN0YXR1cyBpcyByZXR1cm5lZCBpbiB0aGUgRHJtQ29udmVydGVkSW5mbworICAgICAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGFyZSBuZXcgYmxvY2sKKyAgICAgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEcm0gQWdlbnQgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERybSBFbmdpbmUgY2FwYWJpbGl0aWVzIHdoaWNoIGluY2x1ZGVzCisgICAgICogc3VwcG9ydGVkIE1pbWVUeXBlcyBhbmQgZmlsZSBzdWZmaXhlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gRHJtU3VwcG9ydEluZm8KKyAgICAgKiAgICAgaW5zdGFuY2Ugd2hpY2ggaG9sZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHBsdWctaW4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybVN1cHBvcnRJbmZvKiBnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBmZCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEBwYXJhbVtpbl0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpID0gMDsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSB1cmkgUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHBhcmFtW2luXSBoZWFkZXJJbmZvIEluZm9ybWF0aW9uIGZvciBpbml0aWFsaXppbmcgZGVjcnlwdGlvbiBvZiB0aGlzIGRlY3J5cFVuaXQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtvdXRdIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgICAgICogQHBhcmFtW2luXSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgPSAwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9FTkdJTkVfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkZGE4MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL01pbWVUeXBlVXRpbC5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybXV0aWxpdHkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJkbCBcCisgICAgbGliZHZtIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGlibG9nCisKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgJChiYXNlKS9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtL3BsdWdpbnMgXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChMT0NBTF9QQVRIKS90b29scworCitlbmRpZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01JTUVUWVBFVVRJTF9IX18KKyNkZWZpbmUgX19NSU1FVFlQRVVUSUxfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWltZVR5cGVVdGlsIHsKKworcHVibGljOgorCisgICAgTWltZVR5cGVVdGlsKCkge30KKworICAgIHZpcnR1YWwgfk1pbWVUeXBlVXRpbCgpIHt9CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworc3RhdGljIFN0cmluZzggY29udmVydE1pbWVUeXBlKFN0cmluZzgmIG1pbWVUeXBlKTsKKworfTsKK307CisKKyNlbmRpZiAvKiBfX01JTUVUWVBFVVRJTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZmNThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NFU1NJT05NQVBfSF9fCisjZGVmaW5lIF9fU0VTU0lPTk1BUF9IX18KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBIHdyYXBwZXIgdGVtcGxhdGUgY2xhc3MgZm9yIGhhbmRsaW5nIERSTSBFbmdpbmUgc2Vzc2lvbnMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBOT0RFPgorY2xhc3MgU2Vzc2lvbk1hcCB7CisKK3B1YmxpYzoKKyAgICBLZXllZFZlY3RvcjxpbnQsIE5PREU+IG1hcDsKKworICAgIFNlc3Npb25NYXAoKSB7fQorCisgICAgdmlydHVhbCB+U2Vzc2lvbk1hcCgpIHsKKyAgICAgICAgZGVzdHJveU1hcCgpOworICAgIH0KKworLyoqCisgKiBBZGRzIGEgbmV3IHZhbHVlIGluIHRoZSBzZXNzaW9uIG1hcCB0YWJsZS4gSXQgZXhwZWN0cyBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGFscmVhZHkKKyAqIGZvciB0aGUgc2Vzc2lvbiBvYmplY3QKKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9yIFNlc3Npb24gSUQKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGFkZAorICoKKyAqIEByZXR1cm4gYm9vbGVhbiByZXN1bHQgb2YgYWRkaW5nIHZhbHVlLiByZXR1cm5zIGZhbHNlIGlmIGtleSBpcyBhbHJlYWR5IGV4aXN0LgorICovCitib29sIGFkZFZhbHVlKGludCBrZXksIE5PREUgdmFsdWUpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgaWYgKCFpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICBtYXAuYWRkKGtleSwgdmFsdWUpOworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUga2V5CisgKgorICogQHBhcmFtIGtleSAtIGtleSBvciBTZXNzaW9uIElECisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGtleQorICovCitOT0RFIGdldFZhbHVlKGludCBrZXkpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICB2YWx1ZSA9IChOT0RFKSBtYXAudmFsdWVGb3Ioa2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHJldHVybiBjb3VudCBvZiBudW1iZXIgb2Ygc2Vzc2lvbiBvYmplY3RzLgorICovCitpbnQgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbWFwLnNpemUoKTsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUgaW5kZXggaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgdGhlIHZhbHVlIHJlcXVpcmVkCisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGluZGV4CisgKi8KK05PREUgZ2V0VmFsdWVBdCh1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChtYXAuc2l6ZSgpID4gaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gbWFwLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBkZWxldGVzIHRoZSBvYmplY3QgZnJvbSBzZXNzaW9uIG1hcC4gSXQgYWxzbyBmcmVlcyB1cCBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9mIHRoZSB2YWx1ZSB0byBiZSBkZWxldGVkCisgKgorICovCit2b2lkIHJlbW92ZVZhbHVlKGludCBrZXkpIHsKKyAgICBkZWxldGVWYWx1ZShnZXRWYWx1ZShrZXkpKTsKKyAgICBtYXAucmVtb3ZlSXRlbShrZXkpOworfQorCisvKioKKyAqIGRlY2lkZXMgaWYgc2Vzc2lvbiBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgKgorICogQHBhcmFtIGtleSAtIGtleSBvZiB0aGUgdmFsdWUgZm9yIHRoZSBzZXNzaW9uCisgKgorICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiB3aGV0aGVyIHNlc3Npb24gaXMgY3JlYXRlZAorICovCitib29sIGlzQ3JlYXRlZChpbnQga2V5KSB7CisgICAgcmV0dXJuICgwIDw9IG1hcC5pbmRleE9mS2V5KGtleSkpOworfQorCisvKioKKyAqIGVtcHR5IHRoZSBlbnRpcmUgc2Vzc2lvbiB0YWJsZS4gSXQgcmVsZWFzZXMgYWxsIHRoZSBtZW1vcnkgZm9yIHNlc3Npb24gb2JqZWN0cy4KKyAqLwordm9pZCBkZXN0cm95TWFwKCkgeworICAgIGludCBzaXplID0gbWFwLnNpemUoKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZVZhbHVlKG1hcC52YWx1ZUF0KGkpKTsKKyAgICB9CisKKyAgICBtYXAuY2xlYXIoKTsKK30KKworLyoqCisgKiBmcmVlIHVwIHRoZSBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqIE1ha2Ugc3VyZSBpZiBhbnkgcmVmZXJlbmNlIHRvIHRoZSBzZXNzaW9uIG9iamVjdCBhbnl3aGVyZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYQorICogZGFuZ2xlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGZyZWUKKyAqCisgKi8KK3ZvaWQgZGVsZXRlVmFsdWUoTk9ERSB2YWx1ZSkgeworICAgIGRlbGV0ZSB2YWx1ZTsKK30KKworfTsKKworfTsKKworI2VuZGlmIC8qIF9fU0VTU0lPTk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU5MDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPE1pbWVUeXBlVXRpbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIk1pbWVUeXBlVXRpbCIKKworZW51bSB7CisgICAgTUlNRVRZUEVfQVVESU8gICAgICAgPSAwLAorICAgIE1JTUVUWVBFX0FQUExJQ0FUSU9OID0gMSwKKyAgICBNSU1FVFlQRV9JTUFHRSAgICAgICA9IDIsCisgICAgTUlNRVRZUEVfVklERU8gICAgICAgPSAzLAorICAgIE1JTUVUWVBFX0xBU1QgICAgICAgID0gLTEsCit9OworCitzdHJ1Y3QgTWltZUdyb3VweworICAgIGludCAgICAgICAgIHR5cGU7ICAgICAvLyBBdWRpbywgdmlkZW8sLi4gdXNlIHRoZSBlbnVtIHZhbHVlcworICAgIGNvbnN0IGNoYXIqIHBHcm91cDsgICAvLyAiYXVkaW8vIiwgInZpZGVvLyIsLi4gc2hvdWxkIGNvbnRhaW4gdGhlIGxhc3QgIi8iCisgICAgaW50ICAgICAgICAgc2l6ZTsgICAgIC8vIE51bWJlciBvZiBieXRlcy4gZS5nLiAiYXVkaW8vIiA9IDYgYnl0ZXMKK307CisKK3N0cnVjdCBNaW1lVHlwZUxpc3R7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBwTWltZUV4dDsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlICcvJyBlLmcuIGF1ZGlvL3gtbXBlZyAtPiAieC1tcGVnIgorICAgIGludCAgICAgICAgIHNpemU7ICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzLiBlLmcuICJ4LW1wZWciID0gNiBieXRlcworICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZTsgLy8gTWltZXR5cGUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQKK307CisKKworLy8gS25vd24gbWltZXR5cGVzIGJ5IGFuZHJvaWQKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb19tcGVnW10gID0gImF1ZGlvL21wZWciOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvXzNncHBbXSAgPSAiYXVkaW8vM2dwcCI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fYW1yW10gICA9ICJhdWRpby9hbXItd2IiOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX2FhY1tdICAgPSAiYXVkaW8vbXA0YS1sYXRtIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb193YXZbXSAgID0gImF1ZGlvL3dhdiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb19tcGVnNFtdID0gInZpZGVvL21wZWc0IjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb18zZ3BwW10gID0gInZpZGVvLzNncHAiOworCisvLyBLbm93biBtaW1ldHlwZSBncm91cHMKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfYXVkaW9bXSAgICAgICA9ICJhdWRpby8iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF9hcHBsaWNhdGlvbltdID0gImFwcGxpY2F0aW9uLyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX2dyb3VwX2ltYWdlW10gICAgICAgPSAiaW1hZ2UvIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfdmlkZW9bXSAgICAgICA9ICJ2aWRlby8iOworCitzdGF0aWMgc3RydWN0IE1pbWVHcm91cCBtaW1lR3JvdXBbXSA9IHsKKyAgICB7TUlNRVRZUEVfQVVESU8sICAgICAgIG1pbWVfZ3JvdXBfYXVkaW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF9hdWRpbyktMX0sCisgICAge01JTUVUWVBFX0FQUExJQ0FUSU9OLCBtaW1lX2dyb3VwX2FwcGxpY2F0aW9uLCAgc2l6ZW9mKG1pbWVfZ3JvdXBfYXBwbGljYXRpb24pLTF9LAorICAgIHtNSU1FVFlQRV9JTUFHRSwgICAgICAgbWltZV9ncm91cF9pbWFnZSwgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX2ltYWdlKS0xfSwKKyAgICB7TUlNRVRZUEVfVklERU8sICAgICAgIG1pbWVfZ3JvdXBfdmlkZW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF92aWRlbyktMX0sCisgICAge01JTUVUWVBFX0xBU1QsICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgMH0gLy8gTXVzdCBiZSBsYXN0IGVudHJ5Cit9OworCisvLyBMaXN0IG9mIGFsbCBtaW1ldHlwZXMgdGhhdCBzaG91bGQgYmUgY29udmVydGVkLgorc3RhdGljIHN0cnVjdCBNaW1lVHlwZUxpc3QgbWltZVR5cGVMaXN0W10gPSB7CisgICAgLy8gTXAzIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcDMiLCAgICAgICAgICBzaXplb2YoIm1wMyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIngtbXBlZyIsICAgICAgIHNpemVvZigieC1tcGVnIiktMSwgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcDMiLCAgICAgICAgc2l6ZW9mKCJ4LW1wMyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcGciLCAgICAgICAgICBzaXplb2YoIm1wZyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIm1wZzMiLCAgICAgICAgIHNpemVvZigibXBnIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcGciLCAgICAgICAgc2l6ZW9mKCJ4LW1wZyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wZWdhdWRpbyIsICBzaXplb2YoIngtbXBlZ2F1ZGlvIiktMSwgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorCisgICAgLy8gM2dwcCBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiM2dwIiwgICAgICAgICAgc2l6ZW9mKCIzZ3AiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb18zZ3BwfSwKKworICAgIC8vIEFtciBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiYW1yIiwgICAgICAgICAgc2l6ZW9mKCJhbXIiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb19hbXJ9LAorCisgICAgLy8gQWFjIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJhYWMiLCAgICAgICAgICBzaXplb2YoImFhYyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX2FhY30sCisKKyAgICAvLyBXYXYgYXVkaW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgIngtd2F2IiwgICAgICAgIHNpemVvZigieC13YXYiKS0xLCAgICAgICBtaW1lX3R5cGVfYXVkaW9fd2F2fSwKKworICAgIC8vIE1wZWc0IHZpZGVvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcGc0IiwgICAgICAgICBzaXplb2YoIm1wZzQiKS0xLCAgICAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcDR2LWVzIiwgICAgICBzaXplb2YoIm1wNHYtZXMiKS0xLCAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKworICAgIC8vIDNncHAgdmlkZW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9WSURFTywgIjNncCIsICAgICAgICAgIHNpemVvZigiM2dwIiktMSwgICAgICAgICBtaW1lX3R5cGVfdmlkZW9fM2dwcH0sCisKKyAgICAvLyBNdXN0IGJlIGxhc3QgZW50cnkKKyAgICB7TUlNRVRZUEVfTEFTVCwgIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworU3RyaW5nOCBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggcmVzdWx0ID0gbWltZVR5cGU7CisgICAgY29uc3QgY2hhciogcFRtcDsKKyAgICBjb25zdCBjaGFyKiBwTWltZVR5cGU7CisgICAgc3RydWN0IE1pbWVHcm91cCogcEdyb3VwOworICAgIHN0cnVjdCBNaW1lVHlwZUxpc3QqIHBNaW1lSXRlbTsKKyAgICBpbnQgbGVuOworCisgICAgcE1pbWVUeXBlID0gbWltZVR5cGUuc3RyaW5nKCk7CisgICAgaWYgKE5VTEwgIT0gcE1pbWVUeXBlKSB7CisgICAgICAgIC8qIENoZWNrIHdoaWNoIGdyb3VwIHRoZSBtaW1ldHlwZSBpcyAqLworICAgICAgICBwR3JvdXAgPSBtaW1lR3JvdXA7CisKKyAgICAgICAgd2hpbGUgKE1JTUVUWVBFX0xBU1QgIT0gcEdyb3VwLT50eXBlKSB7CisgICAgICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBNaW1lVHlwZSwgcEdyb3VwLT5wR3JvdXAsIHBHcm91cC0+c2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBHcm91cCsrOworICAgICAgICB9CisKKyAgICAgICAgLyogR28gdGhyb3VnaCB0aGUgbWltZXR5cGUgbGlzdC4gT25seSBjaGVjayBpdGVtcyBvZiB0aGUgY29ycmVjdCBncm91cCAqLworICAgICAgICBpZiAoTUlNRVRZUEVfTEFTVCAhPSBwR3JvdXAtPnR5cGUpIHsKKyAgICAgICAgICAgIHBNaW1lSXRlbSA9IG1pbWVUeXBlTGlzdDsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiAocE1pbWVUeXBlK3BHcm91cC0+c2l6ZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChNSU1FVFlQRV9MQVNUICE9IHBNaW1lSXRlbS0+dHlwZSkgeworICAgICAgICAgICAgICAgIGlmICgobGVuID09IHBNaW1lSXRlbS0+c2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKDAgPT0gc3RyY21wKHBNaW1lVHlwZStwR3JvdXAtPnNpemUsIHBNaW1lSXRlbS0+cE1pbWVFeHQpKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4KHBNaW1lSXRlbS0+cE1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBNaW1lSXRlbSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0koImNvbnZlcnRNaW1lVHlwZSBnb3QgbWltZXR5cGUgJXMsIGNvbnZlcnRlZCBpbnRvIG1pbWV0eXBlICVzIiwKKyAgICAgICAgICAgICBwTWltZVR5cGUsIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KK307CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTZmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgRFJNIGZyYW1ld29yayB1c2VzIDY0LWJpdCBkYXRhIHR5cGVzIGZvciBmaWxlIG9mZnNldHMgYW5kIGRvIHRoZSBzYW1lLgoraWZuZXEgKCQoc2hlbGwgZ3JlcCAtYyAnb2ZmNjRfdCBvZmZzZXQnICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCksIDApCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfNjRCSVRfRFJNX0FQSQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9Gd2RMb2NrRW5naW5lLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9ja2VuZ2luZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJpY3VpMThuIFwKKyAgICBsaWJpY3V1YyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJzc2wgXAorICAgIGxpYmRybWZyYW1ld29yaworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkcm11dGlsaXR5IFwKKyAgICBsaWJkcm1mcmFtZXdvcmtjb21tb24gXAorICAgIGxpYmZ3ZGxvY2stY29tbW9uIFwKKyAgICBsaWJmd2Rsb2NrLWNvbnZlcnRlciBcCisgICAgbGliZndkbG9jay1kZWNvZGVyCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0gXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2RlciBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2RybS9wbHVnaW5zL25hdGl2ZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MDRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMCwwICsxLDU1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FX0hfXworI2RlZmluZSBfX0ZXRExPQ0tFTkdJTkVfSF9fCisKKyNpbmNsdWRlIDxEcm1FbmdpbmVCYXNlLmg+CisjaW5jbHVkZSA8RHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvLmg+CisjaW5jbHVkZSA8RHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPERybUNvbnZlcnRlZFN0YXR1cy5oPgorI2luY2x1ZGUgPERybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8RHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1JbmZvRXZlbnQuaD4KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrQ29udi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRm9yd2FyZCBMb2NrIEVuZ2luZSBjbGFzcy4KKyAqLworY2xhc3MgRndkTG9ja0VuZ2luZSA6IHB1YmxpYyBhbmRyb2lkOjpEcm1FbmdpbmVCYXNlIHsKKworcHVibGljOgorICAgIEZ3ZExvY2tFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5Gd2RMb2NrRW5naW5lKCk7CisKK3Byb3RlY3RlZDoKKy8qKgorICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICogICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAqIEByZXR1cm4gRHJtQ29uc3RyYWludHMKKyAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAqIEBub3RlCisgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAqLworRHJtQ29uc3RyYWludHMqIG9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKTsKKworLyoqCisgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgKiAgICAgIEZvciBGb3J3YXJkIExvY2sgZW5naW5lLCBpdCByZXR1cm5zIGFuIGVtcHR5IG9iamVjdAorICogQG5vdGUKKyAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm5zIE5VTEwKKyAqLworRHJtTWV0YWRhdGEqIG9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworLyoqCisgKiBJbml0aWFsaXplIHBsdWctaW4uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpOworCisvKioKKyAqIFRlcm1pbmF0ZSB0aGUgcGx1Zy1pbiBhbmQgcmVsZWFzZSByZXNvdXJjZXMgYm91bmQgdG8gaXQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIHBsdWdpbiBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIHByb3RlY3RlZCBvYmplY3QKKyAqIEByZXR1cm4gYm9vbAorICogICAgICBSZXR1cm5zIHRydWUgaWYgdGhpcyBwbHVnaW4gY2FuIGhhbmRsZSAsIGZhbHNlIGluIGNhc2Ugb2Ygbm90IGFibGUgdG8gaGFuZGxlCisgKi8KK2Jvb2wgb25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIERSTSBpbmZvcm1hdGlvbiBhcyBhcHByb3ByaWF0ZSBmb3IgaXRzIHR5cGUuCisgKiBOb3QgdXNlZCBmb3IgRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybUluZm8gSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm9TdGF0dXMqIG9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworLyoqCisgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgKiBhbmQgbWFrZSBhc3NvY2lhdGlvbiB3aXRoIGNvbnRlbnQgcGF0aC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSByaWdodHNQYXRoIEZpbGUgcGF0aCB3aGVyZSByaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworLyoqCisgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAqIEByZXR1cm4gRHJtSW5mbworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm8qIG9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisvKioKKyAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4gU3RyaW5nOAorICogICAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgKi8KK1N0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEBwYXJhbSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgKi8KK2ludCBvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50LAorICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAqLworaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pOworCisvKioKKyAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgYXJlIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcGFyYW0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpOworCisvKioKKyAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIHBsYXliYWNrU3RhdHVzIFBsYXliYWNrIGFjdGlvbiAoUGxheWJhY2s6OlNUQVJULCBQbGF5YmFjazo6U1RPUCwgUGxheWJhY2s6OlBBVVNFKQorICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgKiAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKTsKKyNlbHNlCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOworI2VuZGlmCisKKy8qKgorICogIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbgorICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAqLworYm9vbCBvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworLyoqCisgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudC4KKyAqIE5vdCB1c2VkIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisvKioKKyAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldCBidXQgZG9lcyBub3RoaW5nIGZvcgorICogRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisvKioKKyAqIFN0YXJ0cyB0aGUgRm9yd2FyZCBMb2NrIGZpbGUgY29udmVyc2lvbiBzZXNzaW9uLgorICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAqIGJlZ2luIHdpdGggY2FsbGluZyB0aGlzIEFQSS4gVGhlIGNvbnZlcnRJZCBpcyB1c2VkIGFzIHRoZSBjb252ZXJzaW9uIHNlc3Npb24ga2V5CisgKiBhbmQgbXVzdCBub3QgYmUgdGhlIHNhbWUgZm9yIGRpZmZlcmVudCBjb252ZXJ0IHNlc3Npb25zLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbk9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisvKioKKyAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgKiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGVyZSBpcyBhIG5ldyBibG9jaworICogb2YgZGF0YSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgKiBAcGFyYW0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAqICAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAqLworRHJtQ29udmVydGVkU3RhdHVzKiBvbkNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworLyoqCisgKiBDbG9zZXMgdGhlIGNvbnZlcnQgc2Vzc2lvbiBpbiBjYXNlIG9mIGRhdGEgc3VwcGx5IGNvbXBsZXRlZCBvciBlcnJvciBvY2N1cnJlZC4KKyAqIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLCBpdCByZXR1cm5zIHNpZ25hdHVyZSBjYWxjdWxhdGVkIG92ZXIKKyAqIHRoZSBlbnRpcmUgZGF0YSB1c2VkIG92ZXIgYSBjb252ZXJzaW9uIHNlc3Npb24uIFRoaXMgc2lnbmF0dXJlIG11c3QgYmUgY29waWVkIHRvIHRoZSBvZmZzZXQKKyAqIG1lbnRpb25lZCBpbiB0aGUgRHJtQ29udmVydGVkU3RhdHVzLiBTaWduYXR1cmUgaXMgdXNlZCBmb3IgZGF0YSBpbnRlZ3JpdHkgcHJvdGVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIGRhdGEuIEl0IGFsc28gaW5mb3JtcworICogICAgICB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlIGZpbGUgb2Zmc2V0IGF0IHdoaWNoIHRoaXMKKyAqICAgICAgc2lnbmF0dXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgKi8KK0RybUNvbnZlcnRlZFN0YXR1cyogb25DbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERybSBFbmdpbmUgY2FwYWJpbGl0aWVzIHdoaWNoIGluY2x1ZGVzCisgKiBzdXBwb3J0ZWQgTWltZVR5cGVzIGFuZCBmaWxlIHN1ZmZpeGVzLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcmV0dXJuIERybVN1cHBvcnRJbmZvCisgKiAgICAgIGluc3RhbmNlIHdoaWNoIGhvbGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBwbHVnLWluCisgKi8KK0RybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBjdXJyZW50IGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgKiBAcGFyYW0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisjZWxzZQorc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisjZW5kaWYKKworLyoqCisgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSk7CisKKy8qKgorICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHBhcmFtIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworLyoqCisgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdC4KKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CisKKy8qKgorICogRGVjcnlwdCB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgYnVmZmVycyBmb3IgdGhlIGdpdmVuIHVuaXQuCisgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLCBiYXNlZCBvbiBudW1iZXIgb2YKKyAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SWQgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gSVYgT3B0aW9uYWwgYnVmZmVyCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworLyoqCisgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgU3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworc3NpemVfdCBvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGZpbGUgcG9zaXRpb24gd2l0aGluIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqICAgICAgICAgICBUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdW5pc3RkLmguCisgKgorICogQHJldHVybiBOZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmZfdCktMSkgRmFpbHVyZS4KKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitvZmY2NF90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZWxzZQorb2ZmX3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3NzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisjZWxzZQorc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CisjZW5kaWYKKworcHJpdmF0ZToKKworLyoqCisgKiBTZXNzaW9uIENsYXNzIGZvciBGb3J3YXJkIExvY2sgQ29udmVyc2lvbi4gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogZm9yIGV2ZXJ5IGNvbnZlcnNpb24uCisgKi8KK2NsYXNzIENvbnZlcnRTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgdW5pcXVlSWQ7CisgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90IG91dHB1dDsKKworICAgICAgICBDb252ZXJ0U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIHVuaXF1ZUlkID0gMDsKKyAgICAgICAgICAgIG1lbXNldCgmb3V0cHV0LCAwLCBzaXplb2YoRndkTG9ja0NvbnZfT3V0cHV0X3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbnZlcnRTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBDbGFzcyBmb3IgRm9yd2FyZCBMb2NrIGRlY29kZXIuIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQKKyAqIGZvciBldmVyeSBkZWNvZGluZyBzZXNzaW9uLgorICovCitjbGFzcyBEZWNvZGVTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgZmlsZURlc2M7CisgICAgICAgIG9mZl90IG9mZnNldDsKKworICAgICAgICBEZWNvZGVTZXNzaW9uKCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBEZWNvZGVTZXNzaW9uKGludCBmZCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSBmZDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5EZWNvZGVTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBNYXAgVGFibGVzIGZvciBDb252ZXJzaW9uIGFuZCBEZWNvZGluZyBvZiBmb3J3YXJkIGxvY2sgZmlsZXMuCisgKi8KK1Nlc3Npb25NYXA8Q29udmVydFNlc3Npb24qPiBjb252ZXJ0U2Vzc2lvbk1hcDsKK1Nlc3Npb25NYXA8RGVjb2RlU2Vzc2lvbio+IGRlY29kZVNlc3Npb25NYXA7CisKKy8qKgorICogQ29udmVydHMgdGhlIGVycm9yIGNvZGUgZnJvbSBGb3J3YXJkIExvY2sgQ29udmVydGVyIHRvIERybUNvbnZlcnRTdGF0dXMgZXJyb3IgY29kZS4KKyAqCisgKiBAcGFyYW0gRm9yd2FyZCBMb2NrIENvbnZlcnRlciBlcnJvciBjb2RlCisgKgorICogQHJldHVybiBTdGF0dXMgY29kZSBmcm9tIERybUNvbnZlcnRTdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0Q29udmVydGVkU3RhdHVzKEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyk7Cit9OworCit9OworCisjZW5kaWYgLyogX19GV0RMT0NLRU5HSU5FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk1ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FQ09OU1RfSF9fCisjZGVmaW5lIF9fRldETE9DS0VOR0lORUNPTlNUX0hfXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29uc3RhbnRzIGZvciBmb3J3YXJkIExvY2sgRW5naW5lIHVzZWQgZm9yIGV4cG9zaW5nIGVuZ2luZSdzIGNhcGFiaWxpdGllcy4KKyAqLworI2RlZmluZSBGV0RMT0NLX0VYVEVOU0lPTl9GTCAgICAgICAgICAgKCJGTCIpCisjZGVmaW5lIEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMICAgICAgICAoIi5mbCIpCisjZGVmaW5lIEZXRExPQ0tfTUlNRVRZUEVfRkwgICAgICAgICAgICAoImFwcGxpY2F0aW9uL3gtYW5kcm9pZC1kcm0tZmwiKQorCisjZGVmaW5lIEZXRExPQ0tfRVhURU5TSU9OX0RNICAgICAgICAgICAoIkRNIikKKyNkZWZpbmUgRldETE9DS19ET1RFWFRFTlNJT05fRE0gICAgICAgICgiLmRtIikKKyNkZWZpbmUgRldETE9DS19NSU1FVFlQRV9ETSAgICAgICAgICAgICgiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSIpCisKKyNkZWZpbmUgRldETE9DS19ERVNDUklQVElPTiAgICAgICAgICAgICgiT01BIFYxIEZvcndhcmQgTG9jayIpCisKK307CisKKyNlbmRpZiAvKiBfX0ZXRExPQ0tFTkdJTkVDT05TVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzBmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrRW5naW5lLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPERybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8RHJtSW5mby5oPgorI2luY2x1ZGUgPERybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvUmVxdWVzdC5oPgorI2luY2x1ZGUgPERybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8RHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisjaW5jbHVkZSAiRndkTG9ja0ZpbGUuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tFbmdpbmVDb25zdC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlVXRpbC5oIgorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJGd2RMb2NrRW5naW5lIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiBJRHJtRW5naW5lKiBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBGd2RMb2NrRW5naW5lKCk7Cit9CisKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3koSURybUVuZ2luZSogcGx1Z0luKSB7CisgICAgZGVsZXRlIHBsdWdJbjsKK30KKworRndkTG9ja0VuZ2luZTo6RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIENvbnN0cnVjdGlvbiIpOworfQorCitGd2RMb2NrRW5naW5lOjp+RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIERlc3RydWN0aW9uIik7CisKKyAgICBjb252ZXJ0U2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7CisgICAgZGVjb2RlU2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpnZXRDb252ZXJ0ZWRTdGF0dXMoRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgaW50IHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0VSUk9SOworCisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19PSzoKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOgorICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ6CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdDoKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzoKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgZ2V0Q29udmVydGVkU3RhdHVzOiBmaWxlIGNvbnZlcnNpb24gRXJyb3IgJWQuICIgXAorICAgICAgICAgICAgICAgICAgIlJldHVybmluZyBTVEFUVVNfSU5QVVREQVRBX0VSUk9SIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0lOUFVUREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZSBnZXRDb252ZXJ0ZWRTdGF0dXM6IGZpbGUgY29udmVyc2lvbiBFcnJvciAlZC4gIiBcCisgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nIFNUQVRVU19FUlJPUiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBEcm1Db252ZXJ0ZWRTdGF0dXM6OlNUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXRTdGF0dXM7Cit9CisKK0RybUNvbnN0cmFpbnRzKiBGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoICYmCisgICAgICAgIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCA9PSBvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCAqcGF0aCwgYWN0aW9uKSkpIHsKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBlbXB0eSBjb25zdHJhaW50cyB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybU1ldGFkYXRhKiBGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoKSB7CisgICAgICAgIC8vIFJldHVybnMgZW1wdHkgbWV0YWRhdGEgdG8gc2hvdyBubyBlcnJvciBjb25kaXRpb24uCisgICAgICAgIGRybU1ldGFkYXRhID0gbmV3IERybU1ldGFkYXRhKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRybU1ldGFkYXRhOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIik7CisKKworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBzdWNjZWVkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUgLS0gRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24gZmFpbGVkOiIKKyAgICAgICAgICAgICAiZXJybm8gPSAlZCIsIGVycm5vKTsKKyAgICB9CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCithbmRyb2lkOjpzdGF0dXNfdAorRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICAvLyBOb3QgdXNlZAorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0T25JbmZvTGlzdGVuZXIiKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlIik7CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1TdXBwb3J0SW5mbyogRndkTG9ja0VuZ2luZTo6b25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpIHsKKyAgICBEcm1TdXBwb3J0SW5mbyogcFN1cHBvcnRJbmZvID0gbmV3IERybVN1cHBvcnRJbmZvKCk7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvIik7CisKKyAgICAvLyBmaWxsIGFsbCBGb3J3YXJkIExvY2sgbWltZXR5cGVzIGFuZCBleHRlbnNpb25zCisgICAgaWYgKE5VTEwgIT0gcFN1cHBvcnRJbmZvKSB7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0RNKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0RNKSk7CisKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5zZXREZXNjcmlwdGlvbihTdHJpbmc4KEZXRExPQ0tfREVTQ1JJUFRJT04pKTsKKyAgICB9CisKKyAgICByZXR1cm4gcFN1cHBvcnRJbmZvOworfQorCitib29sIEZ3ZExvY2tFbmdpbmU6Om9uQ2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBTdHJpbmc4IGV4dFN0cmluZyA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOworCisgICAgZXh0U3RyaW5nLnRvTG93ZXIoKTsKKworICAgIGlmICgoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRkwpKSB8fAorICAgICAgICAoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRE0pKSkgeworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcm1JbmZvU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIERybUluZm9TdGF0dXMgKmRybUluZm9TdGF0dXMgPSBOVUxMOworCisgICAgLy8gTm90aGluZyB0byBwcm9jZXNzCisKKyAgICBkcm1JbmZvU3RhdHVzID0gbmV3IERybUluZm9TdGF0dXMoKGludClEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssIDAsIE5VTEwsIFN0cmluZzgoIiIpKTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8iKTsKKworICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIC8vIE5vIHJpZ2h0cyB0byBzYXZlLiBSZXR1cm4KKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK0RybUluZm8qIEZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKKworICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgRm9yd2FyZCBMb2NrIGZpbGUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkFjcXVpcmVEcm1JbmZvIik7CisKKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pIHsKKyAgICBpbnQgcmVzdWx0ID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMiKTsKKworICAgIC8vIE9ubHkgVHJhbnNmZXIgYWN0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBmb3J3YXJkIExvY2sgZmlsZXMuCisgICAgaWYgKG9uQ2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKSkgeworICAgICAgICBzd2l0Y2goYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6REVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQTEFZOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlJJTkdUT05FOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246Ok9VVFBVVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQUkVWSUVXOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OkVYRUNVVEU6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6RElTUExBWToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBY3Rpb246OlRSQU5TRkVSOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKSB7CisgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzIik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYm9vbCBGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25WYWxpZGF0ZUFjdGlvbiIpOworCisgICAgLy8gRm9yIHRoZSBmb3J3YXJkbG9jayBlbmdpbmUgY2hlY2tSaWdodHMgYW5kIFZhbGlkYXRlQWN0aW9uIGFyZSB0aGUgc2FtZS4KKyAgICByZXR1cm4gKG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbikgPT0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQpOworfQorCitTdHJpbmc4IEZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUiKTsKKyAgICBTdHJpbmc4IG1pbWVTdHJpbmcgPSBTdHJpbmc4KCIiKTsKKyAgICBpbnQgZmlsZURlc2MgPSBGd2RMb2NrRmlsZV9vcGVuKHBhdGguc3RyaW5nKCkpOworCisgICAgaWYgKC0xIDwgZmlsZURlc2MpIHsKKyAgICAgICAgY29uc3QgY2hhciogcE1pbWVUeXBlID0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOworCisgICAgICAgIGlmIChOVUxMICE9IHBNaW1lVHlwZSkgeworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocE1pbWVUeXBlKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIG1pbWVTdHJpbmcgPSBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBGd2RMb2NrRmlsZV9jbG9zZShmaWxlRGVzYyk7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVTdHJpbmc7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggbWltZVN0ciA9IFN0cmluZzgobWltZVR5cGUpOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXREcm1PYmplY3RUeXBlIik7CisKKyAgICBtaW1lU3RyLnRvTG93ZXIoKTsKKworICAgIC8qIENoZWNrcyB3aGV0aGVyCisgICAgKiAxLiBwYXRoIGFuZCBtaW1lIHR5cGUgYm90aCBhcmUgbm90IGVtcHR5IHN0cmluZ3MgKG1lYW5pbmcgdW5hdmFpbGFibGUpIGVsc2UgY29udGVudCBpcyB1bmtub3duCisgICAgKiAyLiBpZiBvbmUgb2YgdGhlbSBpcyBlbXB0eSBzdHJpbmcgYW5kIGlmIG90aGVyIGlzIGtub3duIHRoZW4gaXRzIGEgRFJNIENvbnRlbnQgT2JqZWN0LgorICAgICogMy4gaWYgYm90aCBvZiB0aGVtIGFyZSBhdmFpbGFibGUsIHRoZW4gYm90aCBtYXkgYmUgb2Yga25vd24gdHlwZQorICAgICogICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlbSB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBvdGhlciBEUk0gRW5naW5lcykKKyAgICAqLworICAgIGlmICgoKDAgPT0gcGF0aC5sZW5ndGgoKSkgfHwgb25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSAmJgorICAgICAgICAoKDAgPT0gbWltZVR5cGUubGVuZ3RoKCkpIHx8ICgobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRkwpKSB8fAorICAgICAgICAobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRE0pKSkpICYmIChtaW1lVHlwZSAhPSBwYXRoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpDT05URU5UOworICAgIH0KKworICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICAvLyBObyBSaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICAvLyBObyByaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVBbGxSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyNlbHNlCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyNlbmRpZgorICAgIC8vIE5vdCB1c2VkCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIik7CisgICAgaWYgKCFjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqbmV3U2Vzc2lvbiA9IG5ldyBDb252ZXJ0U2Vzc2lvbigpOworICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09CisgICAgICAgICAgICBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbigmKG5ld1Nlc3Npb24tPnVuaXF1ZUlkKSwgJihuZXdTZXNzaW9uLT5vdXRwdXQpKSkgeworICAgICAgICAgICAgY29udmVydFNlc3Npb25NYXAuYWRkVmFsdWUoY29udmVydElkLCBuZXdTZXNzaW9uKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIC0tIEZ3ZExvY2tDb252X09wZW5TZXNzaW9uIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGRlbGV0ZSBuZXdTZXNzaW9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRndkTG9ja0VuZ2luZTo6b25Db252ZXJ0RGF0YShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBpbnB1dERhdGEgJiYgY29udmVydFNlc3Npb25NYXAuaXNDcmVhdGVkKGNvbnZlcnRJZCkpIHsKKyAgICAgICAgQ29udmVydFNlc3Npb24gKmNvbnZTZXNzaW9uID0gY29udmVydFNlc3Npb25NYXAuZ2V0VmFsdWUoY29udmVydElkKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBjb252U2Vzc2lvbikgeworICAgICAgICAgICAgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydERhdGEoY29udlNlc3Npb24tPnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gYnl0ZXMgZnJvbSBjb252ZXJzaW9uIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmIChjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udlJlc3VsdC0+ZGF0YSA9IG5ldyBjaGFyW2NvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjb252UmVzdWx0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb252UmVzdWx0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5lcnJvclBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IERybUNvbnZlcnRlZFN0YXR1cyhnZXRDb252ZXJ0ZWRTdGF0dXMocmV0U3RhdHVzKSwgY29udlJlc3VsdCwgb2Zmc2V0KTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24iKTsKKworICAgIGlmIChjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqY29udlNlc3Npb24gPSBjb252ZXJ0U2Vzc2lvbk1hcC5nZXRWYWx1ZShjb252ZXJ0SWQpOworCisgICAgICAgIGlmIChOVUxMICE9IGNvbnZTZXNzaW9uKSB7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oY29udlNlc3Npb24tPnVuaXF1ZUlkLCAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldDsKKyAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5kYXRhID0gbmV3IGNoYXJbRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFXTsKKworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNvbnZSZXN1bHQtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvbnZSZXN1bHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnZlcnRTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGNvbnZlcnRJZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKGdldENvbnZlcnRlZFN0YXR1cyhyZXRTdGF0dXMpLCBjb252UmVzdWx0LCBvZmZzZXQpOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKSB7CisjZWxzZQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisjZW5kaWYKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICBpbnQgZmlsZURlc2MgPSAtMTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoKC0xIDwgZmQpICYmCisgICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgICghZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpIHsKKyAgICAgICAgZmlsZURlc2MgPSBkdXAoZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIHBhcmFtZXRlciBlcnJvciIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICgtMSA8IGZpbGVEZXNjICYmCisgICAgICAgIC0xIDwgOjpsc2VlayhmaWxlRGVzYywgb2Zmc2V0LCBTRUVLX1NFVCkgJiYKKyAgICAgICAgLTEgPCBGd2RMb2NrRmlsZV9hdHRhY2goZmlsZURlc2MpKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBmaWxlIGludGVncml0eS4gVGhpcyBtdXN0IGJlIGRvbmUgdG8gcHJvdGVjdCB0aGUgY29udGVudCBtYW5nbGluZy4KKyAgICAgICAgaW50IHJldFZhbCA9IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKTsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlU2Vzc2lvbiA9IG5ldyBEZWNvZGVTZXNzaW9uKGZpbGVEZXNjKTsKKworICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbikgeworICAgICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5hZGRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQsIGRlY29kZVNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG1pbWU9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBTdHJpbmc4KHBtaW1lID09IE5VTEwgPyAiIiA6IHBtaW1lKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlID0gTWltZVR5cGVVdGlsOjpjb252ZXJ0TWltZVR5cGUoY29udGVudFR5cGUpOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VEOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+c3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYyk7CisgICAgICAgICAgICA6OmNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZWNvZGVTZXNzaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRXhpdC4gcmVzdWx0ID0gJWQiLCByZXN1bHQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IGNoYXIgZmlsZVRhZyBbXSA9ICJmaWxlOi8vIjsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKKyAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CisgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CisKKyAgICAgICAgaWYgKDAgPT0gc3RybmNtcCh1cmlUYWcuc3RyaW5nKCksIGZpbGVUYWcsIHNpemVvZihmaWxlVGFnKSAtIDEpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlUGF0aCA9IHN0cmNocih1cmkgKyBzaXplb2YoZmlsZVRhZykgLSAxLCAnLycpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZmlsZVBhdGggJiYgb25DYW5IYW5kbGUodW5pcXVlSWQsIFN0cmluZzgoZmlsZVBhdGgpKSkgeworICAgICAgICAgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKworICAgICAgICAgICAgICAgIGlmICgtMSA8IGZkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBpcyBhbHdheXMgMCBhbmQgbGVuZ3RoIGlzIG5vdCB1c2VkLiBzbyBhbnkgcG9zaXRpdmUgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGZkLCAwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmZCBpcyBkdXBsaWNhdGVkIGFscmVhZHkgaWYgc3VjY2Vzcy4gY2xvc2luZyB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goc2Vzc2lvbi0+ZmlsZURlc2MpOworICAgICAgICAgICAgOjpjbG9zZShzZXNzaW9uLT5maWxlRGVzYyk7CisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgeworICAgIHNzaXplX3Qgc2l6ZSA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKKyAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKKyAgICAgICAgbnVtQnl0ZXMgPiAtMSkgeworICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKKyAgICAgICAgICAgIHNpemUgPSBGd2RMb2NrRmlsZV9yZWFkKHNlc3Npb24tPmZpbGVEZXNjLCBidWZmZXIsIG51bUJ5dGVzKTsKKworICAgICAgICAgICAgaWYgKDAgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ID0gKChvZmZfdCktMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworI2Vsc2UKK29mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKKyNlbmRpZgorICAgIG9mZl90IG9mZnZhbCA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgeworICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKKyAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCA9IG9mZnZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZ2YWw7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisjZWxzZQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgeworI2VuZGlmCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSAtMTsKKworICAgIERlY29kZVNlc3Npb24qIGRlY29kZXJTZXNzaW9uID0gTlVMTDsKKworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSAoZGVjb2RlclNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSAmJgorICAgICAgICAoTlVMTCAhPSBidWZmZXIpICYmCisgICAgICAgIChudW1CeXRlcyA+IC0xKSAmJgorICAgICAgICAob2Zmc2V0ID4gLTEpKSB7CisgICAgICAgIGlmIChvZmZzZXQgIT0gZGVjb2RlclNlc3Npb24tPm9mZnNldCkgeworICAgICAgICAgICAgZGVjb2RlclNlc3Npb24tPm9mZnNldCA9IG9uTHNlZWsodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgob2ZmX3QpLTEpICE9IGRlY29kZXJTZXNzaW9uLT5vZmZzZXQpIHsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IG9uUmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQgZXJyb3IgcmVhZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25QcmVhZCBkZWNyeXB0SWQgbm90IGZvdW5kIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1ZDNjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tHbHVlLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuYyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmRhOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgS0VZX1NJWkUgMTYKKyNkZWZpbmUgS0VZX1NJWkVfSU5fQklUUyAoS0VZX1NJWkUgKiA4KQorCitzdGF0aWMgaW50IGlzSW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworc3RhdGljIGNvbnN0IGNoYXIgc3RyS2V5RmlsZW5hbWVbXSA9ICIvZGF0YS9kcm0vZndkbG9jay9rZWsuZGF0IjsKKworc3RhdGljIEFFU19LRVkgZW5jcnlwdGlvblJvdW5kS2V5czsKK3N0YXRpYyBBRVNfS0VZIGRlY3J5cHRpb25Sb3VuZEtleXM7CisKKy8qKgorICogQ3JlYXRlcyBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIG9mIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gcGF0aCBBIHJlZmVyZW5jZSB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgYSBmaWxlLgorICogQHBhcmFtW2luXSBtb2RlIFRoZSBhY2Nlc3MgbW9kZSB0byB1c2UgZm9yIHRoZSBkaXJlY3RvcmllcyBiZWluZyBjcmVhdGVkLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tHbHVlX0NyZWF0ZURpcmVjdG9yaWVzKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKSB7CisgICAgaW50IHJlc3VsdCA9IFRSVUU7CisgICAgc2l6ZV90IHBhcnRpYWxQYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIGNoYXIgKnBhcnRpYWxQYXRoID0gbWFsbG9jKHBhcnRpYWxQYXRoTGVuZ3RoICsgMSk7CisgICAgaWYgKHBhcnRpYWxQYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0aWFsUGF0aExlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAocGF0aFtpXSA9PSAnLycgJiYgaSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJ0aWFsUGF0aFtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYgKG1rZGlyKHBhcnRpYWxQYXRoLCBtb2RlKSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydGlhbFBhdGhbaV0gPSBwYXRoW2ldOworICAgICAgICB9CisgICAgICAgIGZyZWUocGFydGlhbFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSByb3VuZCBrZXlzIHVzZWQgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2Ygc2Vzc2lvbiBrZXlzLiBGaXJzdCBjcmVhdGVzIGEKKyAqIGRldmljZS11bmlxdWUga2V5LWVuY3J5cHRpb24ga2V5IGlmIG5vbmUgZXhpc3RzIHlldC4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZVJvdW5kS2V5cygpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGtleUVuY3J5cHRpb25LZXlbS0VZX1NJWkVdOworICAgIGludCBmaWxlRGVzYyA9IG9wZW4oc3RyS2V5RmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICBpZiAocmVhZChmaWxlRGVzYywga2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkUpID09IEtFWV9TSVpFKSB7CisgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQgJiYKKyAgICAgICAgICAgICAgIEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcihrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgJiYKKyAgICAgICAgICAgICAgIEZ3ZExvY2tHbHVlX0NyZWF0ZURpcmVjdG9yaWVzKHN0cktleUZpbGVuYW1lLCBTX0lSV1hVKSkgeworICAgICAgICBmaWxlRGVzYyA9IG9wZW4oc3RyS2V5RmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIFNfSVJVU1IpOworICAgICAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICAgICAgaWYgKHdyaXRlKGZpbGVEZXNjLCBrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgPT0gS0VZX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNJbml0aWFsaXplZCkgeworICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLCAmZW5jcnlwdGlvblJvdW5kS2V5cykgIT0gMCB8fAorICAgICAgICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLCAmZGVjcnlwdGlvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIG1lbXNldChrZXlFbmNyeXB0aW9uS2V5LCAwLCBLRVlfU0laRSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorfQorCisvKioKKyAqIFZhbGlkYXRlcyB0aGUgcGFkZGluZyBvZiBhIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHBhcmFtW2luXSBwRGF0YSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZCBrZXkgYW5kIHBhZGRpbmcuCisgKiBAcGFyYW1baW5dIGRlY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZWNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFkZGluZyB3YXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0dsdWVfVmFsaWRhdGVQYWRkaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBEYXRhLCBzaXplX3QgZGVjcnlwdGVkS2V5TGVuZ3RoKSB7CisgICAgc2l6ZV90IGk7CisgICAgc2l6ZV90IHBhZGRpbmcgPSBBRVNfQkxPQ0tfU0laRSAtIChkZWNyeXB0ZWRLZXlMZW5ndGggJSBBRVNfQkxPQ0tfU0laRSk7CisgICAgcERhdGEgKz0gZGVjcnlwdGVkS2V5TGVuZ3RoOworICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsKKyAgICAgICAgaWYgKChzaXplX3QpKnBEYXRhICE9IHBhZGRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICArK3BEYXRhOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworaW50IEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcih2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICAvLyBHZW5lcmF0ZSAnY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlJyByYW5kb20gYnl0ZXMgYnkgcmVhZGluZyB0aGVtIGZyb20gIi9kZXYvdXJhbmRvbSIgKHRoZQorICAgIC8vIG5vbi1ibG9ja2luZyB2ZXJzaW9uIG9mICIvZGV2L3JhbmRvbSIpLgorICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgaWYgKGZpbGVEZXNjID49IDApIHsKKyAgICAgICAgbnVtQnl0ZXNSZWFkID0gcmVhZChmaWxlRGVzYywgcEJ1ZmZlciwgbnVtQnl0ZXMpOworICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgfQorICAgIHJldHVybiBudW1CeXRlc1JlYWQgPj0gMCAmJiAoc2l6ZV90KW51bUJ5dGVzUmVhZCA9PSBudW1CeXRlczsKK30KKworaW50IEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkgeworICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisgICAgcHRocmVhZF9vbmNlKCZvbmNlLCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplUm91bmRLZXlzKTsKKyAgICByZXR1cm4gaXNJbml0aWFsaXplZDsKK30KKworc2l6ZV90IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoKSB7CisgICAgcmV0dXJuICgocGxhaW50ZXh0S2V5TGVuZ3RoIC8gQUVTX0JMT0NLX1NJWkUpICsgMikgKiBBRVNfQkxPQ0tfU0laRTsKK30KKworaW50IEZ3ZExvY2tHbHVlX0VuY3J5cHRLZXkoY29uc3Qgdm9pZCAqcFBsYWludGV4dEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCkgeworICAgIGludCByZXN1bHQgPSBGQUxTRTsKKyAgICBhc3NlcnQoZW5jcnlwdGVkS2V5TGVuZ3RoID09IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChwbGFpbnRleHRLZXlMZW5ndGgpKTsKKyAgICBpZiAoRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGluaXRWZWN0b3JbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICBpZiAoRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKGluaXRWZWN0b3IsIEFFU19CTE9DS19TSVpFKSkgeworICAgICAgICAgICAgc2l6ZV90IHBhZGRpbmcgPSBBRVNfQkxPQ0tfU0laRSAtIChwbGFpbnRleHRLZXlMZW5ndGggJSBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBzaXplX3QgZGF0YUxlbmd0aCA9IGVuY3J5cHRlZEtleUxlbmd0aCAtIEFFU19CTE9DS19TSVpFOworICAgICAgICAgICAgbWVtY3B5KHBFbmNyeXB0ZWRLZXksIHBQbGFpbnRleHRLZXksIHBsYWludGV4dEtleUxlbmd0aCk7CisgICAgICAgICAgICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIgKilwRW5jcnlwdGVkS2V5ICsgcGxhaW50ZXh0S2V5TGVuZ3RoLCAoaW50KXBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcEVuY3J5cHRlZEtleSArIGRhdGFMZW5ndGgsIGluaXRWZWN0b3IsIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIEFFU19jYmNfZW5jcnlwdChwRW5jcnlwdGVkS2V5LCBwRW5jcnlwdGVkS2V5LCBkYXRhTGVuZ3RoLCAmZW5jcnlwdGlvblJvdW5kS2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0VmVjdG9yLCBBRVNfRU5DUllQVCk7CisgICAgICAgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGd2RMb2NrR2x1ZV9EZWNyeXB0S2V5KGNvbnN0IHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERlY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpIHsKKyAgICBpbnQgcmVzdWx0ID0gRkFMU0U7CisgICAgYXNzZXJ0KGVuY3J5cHRlZEtleUxlbmd0aCA9PSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoZGVjcnlwdGVkS2V5TGVuZ3RoKSk7CisgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKKyAgICAgICAgc2l6ZV90IGRhdGFMZW5ndGggPSBlbmNyeXB0ZWRLZXlMZW5ndGggLSBBRVNfQkxPQ0tfU0laRTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBtYWxsb2MoZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChwRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluaXRWZWN0b3JbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICAgICAgbWVtY3B5KHBEYXRhLCBwRW5jcnlwdGVkS2V5LCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbWNweShpbml0VmVjdG9yLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBFbmNyeXB0ZWRLZXkgKyBkYXRhTGVuZ3RoLCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBBRVNfY2JjX2VuY3J5cHQocERhdGEsIHBEYXRhLCBkYXRhTGVuZ3RoLCAmZGVjcnlwdGlvblJvdW5kS2V5cywgaW5pdFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfREVDUllQVCk7CisgICAgICAgICAgICBtZW1jcHkocERlY3J5cHRlZEtleSwgcERhdGEsIGRlY3J5cHRlZEtleUxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHQgPSBGd2RMb2NrR2x1ZV9WYWxpZGF0ZVBhZGRpbmcocERhdGEsIGRlY3J5cHRlZEtleUxlbmd0aCk7CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzZmNmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLR0xVRV9IX18KKyNkZWZpbmUgX19GV0RMT0NLR0xVRV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIGJ5dGVzLgorICoKKyAqIEBwYXJhbVtvdXRdIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByYW5kb20gZGF0YS4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIodm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUga2V5LWVuY3J5cHRpb24ga2V5LiBTaG91bGQgYmUgY2FsbGVkIG9uY2UgZHVyaW5nIHN0YXJ0dXAgdG8KKyAqIGZhY2lsaXRhdGUgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZiBzZXNzaW9uIGtleXMuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpOworCisvKioKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZW5jcnlwdGVkIGtleSwgZ2l2ZW4gdGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGtleS4KKyAqCisgKiBAcGFyYW1baW5dIHBsYWludGV4dEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICoKKyAqIEByZXR1cm4gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGtleS4KKyAqLworc2l6ZV90IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoKTsKKworLyoqCisgKiBFbmNyeXB0cyB0aGUgZ2l2ZW4gc2Vzc2lvbiBrZXkgdXNpbmcgYSBrZXktZW5jcnlwdGlvbiBrZXkgdW5pcXVlIHRvIHRoaXMgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gcFBsYWludGV4dEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBsYWludGV4dCBrZXkuCisgKiBAcGFyYW1baW5dIHBsYWludGV4dEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICogQHBhcmFtW291dF0gcEVuY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGVuY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfRW5jcnlwdEtleShjb25zdCB2b2lkICpwUGxhaW50ZXh0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoKTsKKworLyoqCisgKiBEZWNyeXB0cyB0aGUgZ2l2ZW4gc2Vzc2lvbiBrZXkgdXNpbmcgYSBrZXktZW5jcnlwdGlvbiBrZXkgdW5pcXVlIHRvIHRoaXMgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gcEVuY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGVuY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICogQHBhcmFtW291dF0gcERlY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGRlY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZWNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfRGVjcnlwdEtleShjb25zdCB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBEZWNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9fRldETE9DS0dMVUVfSF9fCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBGd2RMb2NrQ29udi5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyeXB0bworCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stY29udmVydGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlYTllOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5jCkBAIC0wLDAgKzEsMTMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIElOVkFMSURfT0ZGU0VUICgob2ZmNjRfdCktMSkKKworI2RlZmluZSBNQVhfTlVNX1NFU1NJT05TIDMyCisKKyNkZWZpbmUgT1VUUFVUX0JVRkZFUl9TSVpFX0lOQ1JFTUVOVCAxMDI0CisjZGVmaW5lIFJFQURfQlVGRkVSX1NJWkUgMTAyNAorCisjZGVmaW5lIE1BWF9CT1VOREFSWV9MRU5HVEggNzAKKyNkZWZpbmUgTUFYX0RFTElNSVRFUl9MRU5HVEggKE1BWF9CT1VOREFSWV9MRU5HVEggKyA0KQorCisjZGVmaW5lIFNUUklOR19MRU5HVEhfSU5DUkVNRU5UIDI1CisKKyNkZWZpbmUgS0VZX1NJWkUgQUVTX0JMT0NLX1NJWkUKKyNkZWZpbmUgS0VZX1NJWkVfSU5fQklUUyAoS0VZX1NJWkUgKiA4KQorCisjZGVmaW5lIFNIQTFfSEFTSF9TSVpFIDIwCisKKyNkZWZpbmUgRldEX0xPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIEZXRF9MT0NLX1NVQkZPUk1BVCAwCisjZGVmaW5lIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIDAKKyNkZWZpbmUgQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1MgNworI2RlZmluZSBUT1BfSEVBREVSX1NJWkUgOAorCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHBhcnNlciBzdGF0ZXMgb2YgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlIHsKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXIsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNNaW1lSGVhZGVycywKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGEsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZQorfSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHNjYW5uZXIgc3RhdGVzIG9mIHRoZSBjb252ZXJ0ZXIuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGUgeworICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWUsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGVTdGFydCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX04sCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0EsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1MsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0UsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1QsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMywKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlNCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNQYWRkaW5nLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2UsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyCit9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZyB7CisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkLAorICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeSwKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CYXNlNjQKK30gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIGEgZHluYW1pY2FsbHkgZ3Jvd2luZyBzdHJpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X1N0cmluZyB7CisgICAgY2hhciAqcHRyOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgc2l6ZV90IG1heExlbmd0aDsKKyAgICBzaXplX3QgbGVuZ3RoSW5jcmVtZW50OworfSBGd2RMb2NrQ29udl9TdHJpbmdfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwZXItZmlsZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfU2Vzc2lvbiB7CisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfdCBwYXJzZXJTdGF0ZTsKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfdCBzY2FubmVyU3RhdGU7CisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX3Qgc2F2ZWRTY2FubmVyU3RhdGU7CisgICAgb2ZmNjRfdCBudW1DaGFyc0NvbnN1bWVkOworICAgIGNoYXIgZGVsaW1pdGVyW01BWF9ERUxJTUlURVJfTEVOR1RIXTsKKyAgICBzaXplX3QgZGVsaW1pdGVyTGVuZ3RoOworICAgIHNpemVfdCBkZWxpbWl0ZXJNYXRjaFBvczsKKyAgICBGd2RMb2NrQ29udl9TdHJpbmdfdCBtaW1lSGVhZGVyTmFtZTsKKyAgICBGd2RMb2NrQ29udl9TdHJpbmdfdCBjb250ZW50VHlwZTsKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ190IGNvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgIHVuc2lnbmVkIGNoYXIgc2Vzc2lvbktleVtLRVlfU0laRV07CisgICAgdm9pZCAqcEVuY3J5cHRlZFNlc3Npb25LZXk7CisgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgQUVTX0tFWSBlbmNyeXB0aW9uUm91bmRLZXlzOworICAgIEhNQUNfQ1RYIHNpZ25pbmdDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyW1RPUF9IRUFERVJfU0laRV07CisgICAgdW5zaWduZWQgY2hhciBjb3VudGVyW0FFU19CTE9DS19TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVN0cmVhbVtBRVNfQkxPQ0tfU0laRV07CisgICAgaW50IGtleVN0cmVhbUluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemU7CisgICAgc2l6ZV90IGRhdGFPZmZzZXQ7CisgICAgc2l6ZV90IG51bURhdGFCeXRlczsKK30gRndkTG9ja0NvbnZfU2Vzc2lvbl90OworCitzdGF0aWMgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpzZXNzaW9uUHRyc1tNQVhfTlVNX1NFU1NJT05TXSA9IHsgTlVMTCB9OworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHNlc3Npb25BY3F1aXNpdGlvbk11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RhdGljIGNvbnN0IEZ3ZExvY2tDb252X1N0cmluZ190IG51bGxTdHJpbmcgPSB7IE5VTEwsIDAsIDAsIFNUUklOR19MRU5HVEhfSU5DUkVNRU5UIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlclRlbXBsYXRlW10gPQorICAgIHsgJ0YnLCAnVycsICdMJywgJ0snLCBGV0RfTE9DS19WRVJTSU9OLCBGV0RfTE9DS19TVUJGT1JNQVQsIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIH07CisKK3N0YXRpYyBjb25zdCBjaGFyIHN0ckNvbnRlbnRbXSA9ICJjb250ZW50LSI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUeXBlW10gPSAidHlwZSI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUcmFuc2ZlckVuY29kaW5nW10gPSAidHJhbnNmZXItZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc3RyVGV4dFBsYWluW10gPSAidGV4dC9wbGFpbiI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJBcHBsaWNhdGlvblZuZE9tYURybVJpZ2h0c1htbFtdID0gImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt4bWwiOworc3RhdGljIGNvbnN0IGNoYXIgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1Db250ZW50W10gPSAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCI7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qgc3RybGVuQ29udGVudCA9IHNpemVvZiBzdHJDb250ZW50IC0gMTsKK3N0YXRpYyBjb25zdCBzaXplX3Qgc3RybGVuVGV4dFBsYWluID0gc2l6ZW9mIHN0clRleHRQbGFpbiAtIDE7CisKK3N0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiYXNlNjRWYWx1ZXNbXSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAtMSwKKyAgICAtMSwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEKK307CisKKy8qKgorICogQWNxdWlyZXMgYW4gdW51c2VkIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0FjcXVpcmVTZXNzaW9uKCkgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpbnQgaTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgIGlmIChzZXNzaW9uUHRyc1tpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZXNzaW9uUHRyc1tpXSA9IG1hbGxvYyhzaXplb2YgKnNlc3Npb25QdHJzW2ldKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgcmV0dXJuIHNlc3Npb25JZDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHNlc3Npb24gSUQgaXMgaW4gcmFuZ2UgYW5kIGN1cnJlbnRseSBpbiB1c2UuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2Vzc2lvbiBJRCBpcyBpbiByYW5nZSBhbmQgY3VycmVudGx5IGluIHVzZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc1ZhbGlkU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcmV0dXJuIDAgPD0gc2Vzc2lvbklkICYmIHNlc3Npb25JZCA8IE1BWF9OVU1fU0VTU0lPTlMgJiYgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSAhPSBOVUxMOworfQorCisvKioKKyAqIFJlbGVhc2VzIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrQ29udl9SZWxlYXNlU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgYXNzZXJ0KEZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkpOworICAgIG1lbXNldChzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLCAwLCBzaXplb2YgKnNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOworICAgIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0gPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7Cit9CisKKy8qKgorICogRGVyaXZlcyBjcnlwdG9ncmFwaGljYWxseSBpbmRlcGVuZGVudCBrZXlzIGZvciBlbmNyeXB0aW9uIGFuZCBzaWduaW5nIGZyb20gdGhlIHNlc3Npb24ga2V5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0Rlcml2ZUtleXMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBzdHJ1Y3QgRndkTG9ja0NvbnZfRGVyaXZlS2V5c19EYXRhIHsKKyAgICAgICAgQUVTX0tFWSBzZXNzaW9uUm91bmRLZXlzOworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlW0tFWV9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbS0VZX1NJWkVdOworICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MCwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBlbmNyeXB0aW9uIGtleS4KKyAgICAgICAgICAgIG1lbXNldChwRGF0YS0+dmFsdWUsIDAsIEtFWV9TSVpFKTsKKyAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHsxLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIHNpZ25pbmcga2V5LgorICAgICAgICAgICAgICAgICsrcERhdGEtPnZhbHVlWzBdOworICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICBITUFDX0NUWF9pbml0KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwRGF0YS0+a2V5LCBLRVlfU0laRSwgRVZQX3NoYTEoKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbXNldChwRGF0YSwgMCwgc2l6ZW9mIHBEYXRhKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgIGZyZWUocERhdGEpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgYm91bmRhcnkuIE5vdGUgdGhhdCB0aGUgYm91bmRhcnkgbWF5IGNvbnRhaW4KKyAqIGxlYWRpbmcgYW5kIGludGVybmFsIHNwYWNlcy4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBib3VuZGFyeS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc0JvdW5kYXJ5Q2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNhbG51bShjaCkgfHwgY2ggPT0gJ1wnJyB8fAorICAgICAgICAgICAgY2ggPT0gJygnIHx8IGNoID09ICcpJyB8fCBjaCA9PSAnKycgfHwgY2ggPT0gJ18nIHx8IGNoID09ICcsJyB8fCBjaCA9PSAnLScgfHwKKyAgICAgICAgICAgIGNoID09ICcuJyB8fCBjaCA9PSAnLycgfHwgY2ggPT0gJzonIHx8IGNoID09ICc9JyB8fCBjaCA9PSAnPycgfHwgY2ggPT0gJyAnOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UsIHVzaW5nIGEgbmFycm93ZXIgZGVmaW5pdGlvbgorICogdGhhbiB0aGUgc3RhbmRhcmQtbGlicmFyeSBpc3NwYWNlKCkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGludCBjaCkgeworICAgIHJldHVybiBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JzsKK30KKworLyoqCisgKiBSZW1vdmVzIHRyYWlsaW5nIHNwYWNlcyBmcm9tIHRoZSBkZWxpbWl0ZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9SaWdodFRyaW1EZWxpbWl0ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIHdoaWxlIChwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID4gNCAmJgorICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggLSAxXSA9PSAnICcpIHsKKyAgICAgICAgLS1wU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA+IDQpIHsKKyAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICB9CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKK30KKworLyoqCisgKiBNYXRjaGVzIHRoZSBvcGVuIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaE9wZW5EZWxpbWl0ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAvLyBUaGUgZGVsaW1pdGVyIHN0YXJ0cyB3aXRoICJcclxuLS0iICh0aGUgb3BlbiBkZWxpbWl0ZXIgbWF5IG9taXQgdGhlIGluaXRpYWwgIlxyXG4iKS4KKyAgICAgICAgICAgIC8vIFRoZSByZXN0IGlzIHRoZSB1c2VyLWRlZmluZWQgYm91bmRhcnkgdGhhdCBzaG91bGQgY29tZSBuZXh0LgorICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclswXSA9ICdccic7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzFdID0gJ1xuJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbMl0gPSAnLSc7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzNdID0gJy0nOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA9IDQ7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggIT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnk6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0JvdW5kYXJ5Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBib3VuZGFyeSBtYXkgY29udGFpbiBsZWFkaW5nIGFuZCBpbnRlcm5hbCBzcGFjZXMsIHNvIHRyYWlsaW5nIHNwYWNlcyB3aWxsIGFsc28gYmUKKyAgICAgICAgICAgIC8vIG1hdGNoZWQgaGVyZS4gVGhlc2Ugd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPCBNQVhfREVMSU1JVEVSX0xFTkdUSCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCsrXSA9IGNoOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCAhPSAnICcpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmlnaHRUcmltRGVsaW1pdGVyKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcdCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JpZ2h0VHJpbURlbGltaXRlcihwU2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZToKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZDsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBNSU1FIGhlYWRlciBuYW1lLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIG5hbWUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIGlzZ3JhcGgoY2gpICYmIGNoICE9ICc6JzsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIHZhbHVlLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIHZhbHVlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzTWltZUhlYWRlclZhbHVlQ2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNncmFwaChjaCkgJiYgY2ggIT0gJzsnOworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjaGFyYWN0ZXIgdG8gdGhlIHNwZWNpZmllZCBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU3RyaW5nIEEgcmVmZXJlbmNlIHRvIGEgZHluYW1pY2FsbHkgZ3Jvd2luZyBzdHJpbmcuCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZChGd2RMb2NrQ29udl9TdHJpbmdfdCAqcFN0cmluZywgaW50IGNoKSB7CisgICAgaWYgKHBTdHJpbmctPmxlbmd0aCA9PSBwU3RyaW5nLT5tYXhMZW5ndGgpIHsKKyAgICAgICAgc2l6ZV90IG5ld01heExlbmd0aCA9IHBTdHJpbmctPm1heExlbmd0aCArIHBTdHJpbmctPmxlbmd0aEluY3JlbWVudDsKKyAgICAgICAgY2hhciAqbmV3UHRyID0gcmVhbGxvYyhwU3RyaW5nLT5wdHIsIG5ld01heExlbmd0aCArIDEpOworICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgcFN0cmluZy0+cHRyID0gbmV3UHRyOworICAgICAgICBwU3RyaW5nLT5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGg7CisgICAgfQorICAgIHBTdHJpbmctPnB0cltwU3RyaW5nLT5sZW5ndGgrK10gPSBjaDsKKyAgICBwU3RyaW5nLT5wdHJbcFN0cmluZy0+bGVuZ3RoXSA9ICdcMCc7CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBBdHRlbXB0cyB0byByZWNvZ25pemUgdGhlIE1JTUUgaGVhZGVyIG5hbWUgYW5kIGNoYW5nZXMgdGhlIHNjYW5uZXIgc3RhdGUgYWNjb3JkaW5nbHkuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9SZWNvZ25pemVNaW1lSGVhZGVyTmFtZShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIGlmIChzdHJuY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIsIHN0ckNvbnRlbnQsIHN0cmxlbkNvbnRlbnQpID09IDApIHsKKyAgICAgICAgaWYgKHN0cmNtcChwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUucHRyICsgc3RybGVuQ29udGVudCwgc3RyVHlwZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIgKyBzdHJsZW5Db250ZW50LCBzdHJUcmFuc2ZlckVuY29kaW5nKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09CisgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQXBwbGllcyBkZWZhdWx0cyB0byBtaXNzaW5nIE1JTUUgaGVhZGVyIHZhbHVlcy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0FwcGx5RGVmYXVsdHMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgLy8gQ29udGVudCB0eXBlIGlzIG1pc3Npbmc6IGRlZmF1bHQgdG8gInRleHQvcGxhaW4iLgorICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID0gbWFsbG9jKHNpemVvZiBzdHJUZXh0UGxhaW4pOworICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9CisgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBzdHJUZXh0UGxhaW4sIHNpemVvZiBzdHJUZXh0UGxhaW4pOworICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoID0gc3RybGVuVGV4dFBsYWluOworICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubWF4TGVuZ3RoID0gc3RybGVuVGV4dFBsYWluOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZCkgeworICAgICAgICAvLyBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIGlzIG1pc3Npbmc6IGRlZmF1bHQgdG8gYmluYXJ5LgorICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnk7CisgICAgfQorICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7Cit9CisKKy8qKgorICogVmVyaWZpZXMgdGhhdCB0aGUgY29udGVudCB0eXBlIGlzIHN1cHBvcnRlZC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1ZlcmlmeUNvbnRlbnRUeXBlKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgIH0gZWxzZSBpZiAoc3RyY21wKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtUmlnaHRzWG1sKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1Db250ZW50KSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgaGVhZGVyIG9mIHRoZSBvdXRwdXQgZmlsZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW291dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Xcml0ZUhlYWRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoID4gVUNIQVJfTUFYKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSA9IE9VVFBVVF9CVUZGRVJfU0laRV9JTkNSRU1FTlQ7CisgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gbWFsbG9jKHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zID0gVE9QX0hFQURFUl9TSVpFICsgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIHNpemVfdCBkYXRhU2lnbmF0dXJlUG9zID0gZW5jcnlwdGVkU2Vzc2lvbktleVBvcyArIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgICAgICAgICAgc2l6ZV90IGhlYWRlclNpZ25hdHVyZVBvcyA9IGRhdGFTaWduYXR1cmVQb3MgKyBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ID0gaGVhZGVyU2lnbmF0dXJlUG9zICsgU0hBMV9IQVNIX1NJWkU7CisgICAgICAgICAgICBtZW1jcHkocFNlc3Npb24tPnRvcEhlYWRlciwgdG9wSGVhZGVyVGVtcGxhdGUsIHNpemVvZiB0b3BIZWFkZXJUZW1wbGF0ZSk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+dG9wSGVhZGVyW0NPTlRFTlRfVFlQRV9MRU5HVEhfUE9TXSA9CisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGg7CisgICAgICAgICAgICBtZW1jcHkocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIFRPUF9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgZW5jcnlwdGVkU2Vzc2lvbktleVBvcywKKyAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBzaWduYXR1cmVzIHRvIGFsbCB6ZXJvcyBmb3Igbm93OyB0aGV5IHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkIGxhdGVyLgorICAgICAgICAgICAgbWVtc2V0KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBkYXRhU2lnbmF0dXJlUG9zLCAwLAorICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKTsKKyAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgaGVhZGVyU2lnbmF0dXJlUG9zLCAwLAorICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKTsKKworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID0gcFNlc3Npb24tPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBNYXRjaGVzIHRoZSBNSU1FIGhlYWRlcnMuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoTWltZUhlYWRlcnMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlck5hbWVDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSwgdG9sb3dlcihjaCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlck5hbWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JlY29nbml6ZU1pbWVIZWFkZXJOYW1lKHBTZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZDoKKyAgICAgICAgaWYgKGNoID09ICc6JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmVjb2duaXplTWltZUhlYWRlck5hbWUocFNlc3Npb24pOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+Y29udGVudFR5cGUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlclZhbHVlQ2hhcihjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPmNvbnRlbnRUeXBlLCB0b2xvd2VyKGNoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0OgorICAgICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0k7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzcnIHx8IGNoID09ICc4JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19COworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0k6CisgICAgICAgIGlmIChjaCA9PSAnaScgfHwgY2ggPT0gJ0knKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX047CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2EnIHx8IGNoID09ICdBJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19TOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTjoKKyAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0E6CisgICAgICAgIGlmIChjaCA9PSAnYScgfHwgY2ggPT0gJ0EnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19SOgorICAgICAgICBpZiAoY2ggPT0gJ3InIHx8IGNoID09ICdSJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfWToKKyAgICAgICAgaWYgKGNoID09ICd5JyB8fCBjaCA9PSAnWScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1M6CisgICAgICAgIGlmIChjaCA9PSAncycgfHwgY2ggPT0gJ1MnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19FOgorICAgICAgICBpZiAoY2ggPT0gJ2UnIHx8IGNoID09ICdFJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c182OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNjoKKyAgICAgICAgaWYgKGNoID09ICc2JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c180OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNDoKKyAgICAgICAgaWYgKGNoID09ICc0JykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmFzZTY0OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQjoKKyAgICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0k6CisgICAgICAgIGlmIChjaCA9PSAnaScgfHwgY2ggPT0gJ0knKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19UOgorICAgICAgICBpZiAoY2ggPT0gJ3QnIHx8IGNoID09ICdUJykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDoKKyAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfQXBwbHlEZWZhdWx0cyhwU2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1ZlcmlmeUNvbnRlbnRUeXBlKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVIZWFkZXIocFNlc3Npb24sIHBPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09CisgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCaW5hcnlFbmNvZGVkRGF0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0Jhc2U2NEVuY29kZWREYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgY291bnRlciwgdHJlYXRlZCBhcyBhIDE2LWJ5dGUgbGl0dGxlLWVuZGlhbiBudW1iZXIsIGJ5IG9uZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrQ29udl9JbmNyZW1lbnRDb3VudGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKCgrK3BTZXNzaW9uLT5jb3VudGVyW2ldID09IDApICYmICgrK2kgPCBBRVNfQkxPQ0tfU0laRSkpCisgICAgICAgIDsKK30KKworLyoqCisgKiBFbmNyeXB0cyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuZCB3cml0ZXMgaXQgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBlbmNyeXB0IGFuZCB3cml0ZS4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgaWYgKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA9PSBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSkgeworICAgICAgICB2b2lkICpwQnVmZmVyOworICAgICAgICBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSArPSBPVVRQVVRfQlVGRkVSX1NJWkVfSU5DUkVNRU5UOworICAgICAgICBwQnVmZmVyID0gcmVhbGxvYyhwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwgcFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9CisgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gcEJ1ZmZlcjsKKyAgICB9CisgICAgaWYgKCsrcFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID09IEFFU19CTE9DS19TSVpFKSB7CisgICAgICAgIEZ3ZExvY2tDb252X0luY3JlbWVudENvdW50ZXIocFNlc3Npb24pOworICAgICAgICBwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPSAwOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID09IDApIHsKKyAgICAgICAgQUVTX2VuY3J5cHQocFNlc3Npb24tPmNvdW50ZXIsIHBTZXNzaW9uLT5rZXlTdHJlYW0sICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cyk7CisgICAgfQorICAgIGNoIF49IHBTZXNzaW9uLT5rZXlTdHJlYW1bcFNlc3Npb24tPmtleVN0cmVhbUluZGV4XTsKKyAgICAoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcilbcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzKytdID0gY2g7CisgICAgKytwU2Vzc2lvbi0+bnVtRGF0YUJ5dGVzOworICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7Cit9CisKKy8qKgorICogTWF0Y2hlcyBiaW5hcnktZW5jb2RlZCBjb250ZW50IGRhdGEgYW5kIGVuY3J5cHRzIGl0LCB3aGlsZSBsb29raW5nIG91dCBmb3IgdGhlIGNsb3NlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hCaW5hcnlFbmNvZGVkRGF0YShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMToKKyAgICAgICAgaWYgKGNoICE9IHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zXSkgeworICAgICAgICAgICAgLy8gVGhlIHBhcnRpYWwgbWF0Y2ggb2YgdGhlIGRlbGltaXRlciB0dXJuZWQgb3V0IHRvIGJlIHNwdXJpb3VzLiBGbHVzaCB0aGUgbWF0Y2hlZCBieXRlcworICAgICAgICAgICAgLy8gdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3M7ICsraSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmRlbGltaXRlcltpXSwgcE91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChjaCAhPSBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvc10pIHsKKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlciBpc24ndCBwYXJ0IG9mIHRoZSBkZWxpbWl0ZXIuIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIH0gZWxzZSBpZiAoKytwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPT0gcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCkgeworICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBkZWxpbWl0ZXIgaGFzIGJlZW4gbWF0Y2hlZC4gVGhlIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBub3cgYXJlIHRoZSAiLS0iCisgICAgICAgICAgICAvLyB0aGF0IGNvbXBsZXRlIHRoZSBjbG9zZSBkZWxpbWl0ZXIgKG5vIG1vcmUgbWVzc2FnZSBwYXJ0cyBhcmUgZXhwZWN0ZWQpLgorICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGJhc2U2NC1lbmNvZGVkIGRhdGEuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGJhc2U2NC1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGludCBjaCkgeworICAgIHJldHVybiAwIDw9IGNoICYmIGNoIDw9ICd6JyAmJiBiYXNlNjRWYWx1ZXNbY2hdID49IDA7Cit9CisKKy8qKgorICogTWF0Y2hlcyBiYXNlNjQtZW5jb2RlZCBjb250ZW50IGRhdGEgYW5kIGVuY3J5cHRzIGl0LCB3aGlsZSBsb29raW5nIG91dCBmb3IgdGhlIGNsb3NlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hCYXNlNjRFbmNvZGVkRGF0YShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMToKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRjoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCA9IGJhc2U2NFZhbHVlc1tjaF0gPDwgMjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEY7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9PSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEYpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAzOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTI6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXSA+PiA0OworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+Y2gsIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggPSBiYXNlNjRWYWx1ZXNbY2hdIDw8IDQ7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoIHw9IGJhc2U2NFZhbHVlc1tjaF0gPj4gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmNoLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNoID0gYmFzZTY0VmFsdWVzW2NoXSA8PCA2OworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmc7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoIHw9IGJhc2U2NFZhbHVlc1tjaF07CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5jaCwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmc6CisgICAgICAgIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZToKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEY7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9PSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRikgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDM7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyOgorICAgICAgICBpZiAoY2ggIT0gcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3NdKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0gZWxzZSBpZiAoKytwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPT0gcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFB1c2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaW50byB0aGUgY29udmVydGVyJ3Mgc3RhdGUgbWFjaGluZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfUHVzaENoYXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgKytwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZDsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNPcGVuRGVsaW1pdGVyOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaE9wZW5EZWxpbWl0ZXIocFNlc3Npb24sIGNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaE1pbWVIZWFkZXJzKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCaW5hcnlFbmNvZGVkRGF0YToKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hCaW5hcnlFbmNvZGVkRGF0YShwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGE6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoQmFzZTY0RW5jb2RlZERhdGEocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbihpbnQgKnBTZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwU2Vzc2lvbklkID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBTZXNzaW9uSWQgPSBGd2RMb2NrQ29udl9BY3F1aXJlU2Vzc2lvbigpOworICAgICAgICBpZiAoKnBTZXNzaW9uSWQgPCAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzWypwU2Vzc2lvbklkXTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoID0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKEtFWV9TSVpFKTsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCA8IEFFU19CTE9DS19TSVpFKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyB1c2VkIGFzIHRoZSBDVFItbW9kZSBub25jZSwgc28gaXQgbXVzdCBiZSBhdCBsZWFzdAorICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIG9mIGEgc2luZ2xlIEFFUyBibG9jay4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBtYWxsb2MocFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIocFNlc3Npb24tPnNlc3Npb25LZXksIEtFWV9TSVpFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tHbHVlX0VuY3J5cHRLZXkocFNlc3Npb24tPnNlc3Npb25LZXksIEtFWV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfRGVyaXZlS2V5cyhwU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwU2Vzc2lvbi0+c2Vzc2lvbktleSwgMCwgS0VZX1NJWkUpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+Y291bnRlciwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSA9IG51bGxTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUgPSBudWxsU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEuZXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfUmVsZWFzZVNlc3Npb24oKnBTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICpwU2Vzc2lvbklkID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydERhdGEoaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIUZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkgfHwgcEJ1ZmZlciA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQgPSAwOworICAgICAgICBwU2Vzc2lvbi0+bnVtRGF0YUJ5dGVzID0gMDsKKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID0gMDsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlczsgKytpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9QdXNoQ2hhcihwU2Vzc2lvbiwgKChjaGFyICopcEJ1ZmZlcilbaV0sIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCh1bnNpZ25lZCBjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIpW3BTZXNzaW9uLT5kYXRhT2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5udW1EYXRhQnl0ZXMpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IpIHsKKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5lcnJvclBvcyA9IHBTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihpbnQgc2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIUZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIGZyZWUocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIpOworICAgICAgICBpZiAocFNlc3Npb24tPnBhcnNlclN0YXRlICE9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmUpIHsKKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3MgPSBwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpbmFsaXplIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplOworICAgICAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmVTaXplICE9IFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBoZWFkZXIgc2lnbmF0dXJlLCB3aGljaCBpcyBhIHNpZ25hdHVyZSBvZiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKilwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGgpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5zaWduYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgICAgIEhNQUNfRmluYWwoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgJnBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzW3NpZ25hdHVyZVNpemVdLCAmc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVNpemUgIT0gU0hBMV9IQVNIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLmZpbGVPZmZzZXQgPSBUT1BfSEVBREVSX1NJWkUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggKyBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIpOworICAgICAgICBmcmVlKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIpOworICAgICAgICBmcmVlKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCk7CisgICAgICAgIEZ3ZExvY2tDb252X1JlbGVhc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnQgaW5wdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWFkRnVuY190ICpmcFJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdCAqZnBXcml0ZUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QgKmZwTFNlZWtGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcykgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgIH0KKyAgICBpZiAoZnBSZWFkRnVuYyA9PSBOVUxMIHx8IGZwV3JpdGVGdW5jID09IE5VTEwgfHwgZnBMU2Vla0Z1bmMgPT0gTlVMTCB8fCBpbnB1dEZpbGVEZXNjIDwgMCB8fAorICAgICAgICBvdXRwdXRGaWxlRGVzYyA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICpwUmVhZEJ1ZmZlciA9IG1hbGxvYyhSRUFEX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgaWYgKHBSZWFkQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWQ7CisgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCBvdXRwdXQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbigmc2Vzc2lvbklkLCAmb3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgY2xvc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKChudW1CeXRlc1JlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgZnBSZWFkRnVuYyhpbnB1dEZpbGVEZXNjLCBwUmVhZEJ1ZmZlciwgUkVBRF9CVUZGRVJfU0laRSkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShzZXNzaW9uSWQsIHBSZWFkQnVmZmVyLCAoc2l6ZV90KW51bUJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNXcml0dGVuID0gZnBXcml0ZUZ1bmMob3V0cHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNXcml0dGVuICE9IChzc2l6ZV90KW91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciAmJiBwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRXJyb3JQb3MgPSBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVuZCB3aGlsZQorICAgICAgICAgICAgICAgIGlmIChudW1CeXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZVN0YXR1cyA9IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihzZXNzaW9uSWQsICZvdXRwdXQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZVN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZVN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IgJiYgcEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEVycm9yUG9zID0gb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjbG9zZVN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcExTZWVrRnVuYyhvdXRwdXRGaWxlRGVzYywgb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcFdyaXRlRnVuYyhvdXRwdXRGaWxlRGVzYywgb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkUpICE9IEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwUmVhZEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydEZpbGUoY29uc3QgY2hhciAqcElucHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwT3V0cHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90ICpwRXJyb3JQb3MpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICpwRXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9CisgICAgaWYgKHBJbnB1dEZpbGVuYW1lID09IE5VTEwgfHwgcE91dHB1dEZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaW5wdXRGaWxlRGVzYyA9IG9wZW4ocElucHV0RmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKGlucHV0RmlsZURlc2MgPCAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjID0gb3BlbihwT3V0cHV0RmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworICAgICAgICAgICAgaWYgKG91dHB1dEZpbGVEZXNjIDwgMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlQ3JlYXRpb25GYWlsZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnB1dEZpbGVEZXNjLCByZWFkLCBvdXRwdXRGaWxlRGVzYywgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzZWVrNjQsIHBFcnJvclBvcyk7CisgICAgICAgICAgICAgICAgaWYgKGNsb3NlKG91dHB1dEZpbGVEZXNjKSA9PSAwICYmIHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHBPdXRwdXRGaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpY2xvc2UoaW5wdXRGaWxlRGVzYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYzBjMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5oCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tDT05WX0hfXworI2RlZmluZSBfX0ZXRExPQ0tDT05WX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoqCisgKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBhbmQgaGVhZGVyIHNpZ25hdHVyZXMgY29tYmluZWQuIFRoZSBzaWduYXR1cmVzIGFyZSBhZGphY2VudCB0byBlYWNoIG90aGVyIGluCisgKiB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUuCisgKi8KKyNkZWZpbmUgRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFICgyICogMjApCisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgb3V0cHV0IGZyb20gRndkTG9ja0NvbnZfQ29udmVydERhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dCB7CisgICAgLy8vIFRoZSBjb252ZXJ0ZWQgZGF0YS4KKyAgICB2b2lkICpwQnVmZmVyOworCisgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBjb252ZXJ0ZWQgZGF0YS4KKyAgICBzaXplX3QgbnVtQnl0ZXM7CisKKyAgICAvLy8gVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4KKyAgICBvZmY2NF90IGVycm9yUG9zOworfSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YV9PdXRwdXRfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBvdXRwdXQgZnJvbSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbl9PdXRwdXQgeworICAgIC8vLyBUaGUgZmluYWwgc2V0IG9mIHNpZ25hdHVyZXMuCisgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVzW0ZXRF9MT0NLX1NJR05BVFVSRVNfU0laRV07CisKKyAgICAvLy8gVGhlIG9mZnNldCBpbiB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUgd2hlcmUgdGhlIHNpZ25hdHVyZXMgYXJlIGxvY2F0ZWQuCisgICAgb2ZmNjRfdCBmaWxlT2Zmc2V0OworCisgICAgLy8vIFRoZSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaW4gdGhlIGNhc2Ugb2YgYSBzeW50YXggZXJyb3IuCisgICAgb2ZmNjRfdCBlcnJvclBvczsKK30gRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKi8KK3R5cGVkZWYgdW5pb24gRndkTG9ja0NvbnZfT3V0cHV0IHsKKyAgICBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YV9PdXRwdXRfdCBmcm9tQ29udmVydERhdGE7CisgICAgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dF90IGZyb21DbG9zZVNlc3Npb247Cit9IEZ3ZExvY2tDb252X091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIFBvc2l4LXN0eWxlIHJlYWQgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAqIEBwYXJhbVtvdXRdIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90IEZ3ZExvY2tDb252X1JlYWRGdW5jX3QoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIFBvc2l4LXN0eWxlIHdyaXRlIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNvbnZlcnRlciBpbiBwdWxsIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGEgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgKiBAcGFyYW1baW5dIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdChpbnQgZmlsZURlc2MsIGNvbnN0IHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgbHNlZWsgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW1baW5dIHdoZW5jZSBPbmUgb2YgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQuCisgKgorICogQHJldHVybiBUaGUgbmV3IGZpbGUgcG9zaXRpb24uCisgKiBAcmV0dmFsICgob2ZmNjRfdCktMSkgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBvZmY2NF90IEZ3ZExvY2tDb252X0xTZWVrRnVuY190KGludCBmaWxlRGVzYywgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpOworCisvKioKKyAqIFRoZSBzdGF0dXMgY29kZXMgcmV0dXJuZWQgYnkgdGhlIGNvbnZlcnRlciBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9TdGF0dXMgeworICAgIC8vLyBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19PSyA9IDAsCisKKyAgICAvLy8gQW4gYWN0dWFsIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbiBpcyBpbnZhbGlkIChhIHByb2dyYW0gZXJyb3Igb24gdGhlIGNhbGxlcidzIHBhcnQpLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQgPSAxLAorCisgICAgLy8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggZnJlZSBkeW5hbWljIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeSA9IDIsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgb3BlbmluZyB0aGUgaW5wdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kID0gMywKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyB0aGUgb3V0cHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVDcmVhdGlvbkZhaWxlZCA9IDQsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yID0gNSwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3IgPSA2LAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNlZWtpbmcgdG8gYSBuZXcgZmlsZSBwb3NpdGlvbiB3aXRoaW4gdGhlIG91dHB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yID0gNywKKworICAgIC8vLyBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IgPSA4LAorCisgICAgLy8vIFN1cHBvcnQgZm9yIHRoaXMgRFJNIGZpbGUgZm9ybWF0IGhhcyBiZWVuIGRpc2FibGVkIGluIHRoZSBjdXJyZW50IHByb2R1Y3QgY29uZmlndXJhdGlvbi4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0ID0gOSwKKworICAgIC8vLyBUaGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBpcyBub3Qgb25lIG9mICJiaW5hcnkiLCAiYmFzZTY0IiwgIjdiaXQiLCBvciAiOGJpdCIKKyAgICAvLy8gKGNhc2UtaW5zZW5zaXRpdmUpLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gMTAsCisKKyAgICAvLy8gVGhlIGdlbmVyYXRpb24gb2YgYSByYW5kb20gbnVtYmVyIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZCA9IDExLAorCisgICAgLy8vIEtleSBlbmNyeXB0aW9uIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZCA9IDEyLAorCisgICAgLy8vIFRoZSBjYWxjdWxhdGlvbiBvZiBhIGtleWVkIGhhc2ggZm9yIGludGVncml0eSBwcm90ZWN0aW9uIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZCA9IDEzLAorCisgICAgLy8vIFRoZXJlIGFyZSB0b28gbWFueSBvbmdvaW5nIHNlc3Npb25zIGZvciBhbm90aGVyIG9uZSB0byBiZSBvcGVuZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucyA9IDE0LAorCisgICAgLy8vIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvciA9IDE1Cit9IEZ3ZExvY2tDb252X1N0YXR1c190OworCisvKioKKyAqIE9wZW5zIGEgc2Vzc2lvbiBmb3IgY29udmVydGluZyBhbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZQorICogZm9ybWF0LgorICoKKyAqIEBwYXJhbVtvdXRdIHBTZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChpbml0aWFsaXplZCkuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKGludCAqcFNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIFN1cHBsaWVzIHRoZSBjb252ZXJ0ZXIgd2l0aCBkYXRhIHRvIGNvbnZlcnQuIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgdGhlIGNvbnZlcnRlZCBkYXRhCisgKiB0byBmaWxlLiBDYW4gYmUgY2FsbGVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGltZXMuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1baW5dIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb252ZXJ0LgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnZlcnQuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChhbGxvY2F0ZWQvcmVhbGxvY2F0ZWQpLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KTsKKworLyoqCisgKiBDbG9zZXMgYSBzZXNzaW9uIGZvciBjb252ZXJ0aW5nIGFuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jaworICogZmlsZSBmb3JtYXQuIFRoZSBjYWxsZXIgbXVzdCB1cGRhdGUgdGhlIHByb2R1Y2VkIG91dHB1dCBmaWxlIGF0IHRoZSBpbmRpY2F0ZWQgZmlsZSBvZmZzZXQgd2l0aAorICogdGhlIGZpbmFsIHNldCBvZiBzaWduYXR1cmVzLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIElELgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2VzcyAoZGVhbGxvY2F0ZWQgYW5kIG92ZXJ3cml0dGVuKS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oaW50IHNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIENvbnZlcnRzIGFuIG9wZW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0IGluIHB1bGwKKyAqIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBpbnB1dEZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW4gaW5wdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gZnBSZWFkRnVuYyBBIHJlZmVyZW5jZSB0byBhIHJlYWQgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBpbnB1dCBmaWxlLgorICogQHBhcmFtW2luXSBvdXRwdXRGaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvcGVuIG91dHB1dCBmaWxlLgorICogQHBhcmFtW2luXSBmcFdyaXRlRnVuYyBBIHJlZmVyZW5jZSB0byBhIHdyaXRlIGZ1bmN0aW9uIHRoYXQgY2FuIG9wZXJhdGUgb24gdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIGZwTFNlZWtGdW5jIEEgcmVmZXJlbmNlIHRvIGFuIGxzZWVrIGZ1bmN0aW9uIHRoYXQgY2FuIG9wZXJhdGUgb24gdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1bb3V0XSBwRXJyb3JQb3MKKyAqICAgVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4gTWF5IGJlIE5VTEwuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnQgaW5wdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWFkRnVuY190ICpmcFJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdCAqZnBXcml0ZUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QgKmZwTFNlZWtGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcyk7CisKKy8qKgorICogQ29udmVydHMgYW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0IGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHBJbnB1dEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBmaWxlbmFtZS4KKyAqIEBwYXJhbVtpbl0gcE91dHB1dEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgZmlsZW5hbWUuCisgKiBAcGFyYW1bb3V0XSBwRXJyb3JQb3MKKyAqICAgVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4gTWF5IGJlIE5VTEwuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVOb3RGb3VuZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZUNyZWF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRGF0YUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludGVncml0eVByb3RlY3Rpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucworICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RmlsZShjb25zdCBjaGFyICpwSW5wdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBPdXRwdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0ZXRExPQ0tDT05WX0hfXwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRndkTG9ja0ZpbGUuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWRlY29kZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjg0ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tGaWxlLmgiCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIElOVkFMSURfT0ZGU0VUICgob2ZmNjRfdCktMSkKKworI2RlZmluZSBJTlZBTElEX0JMT0NLX0lOREVYICgodWludDY0X3QpLTEpCisKKyNkZWZpbmUgTUFYX05VTV9TRVNTSU9OUyAxMjgKKworI2RlZmluZSBLRVlfU0laRSBBRVNfQkxPQ0tfU0laRQorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKKyNkZWZpbmUgU0hBMV9IQVNIX1NJWkUgMjAKKyNkZWZpbmUgU0hBMV9CTE9DS19TSVpFIDY0CisKKyNkZWZpbmUgRldEX0xPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIEZXRF9MT0NLX1NVQkZPUk1BVCAwCisjZGVmaW5lIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIDAKKyNkZWZpbmUgQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1MgNworI2RlZmluZSBUT1BfSEVBREVSX1NJWkUgOAorCisjZGVmaW5lIFNJR19DQUxDX0JVRkZFUl9TSVpFICgxNiAqIFNIQTFfQkxPQ0tfU0laRSkKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwZXItZmlsZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGRlY29kZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tGaWxlX1Nlc3Npb24geworICAgIGludCBmaWxlRGVzYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlcltUT1BfSEVBREVSX1NJWkVdOworICAgIGNoYXIgKnBDb250ZW50VHlwZTsKKyAgICBzaXplX3QgY29udGVudFR5cGVMZW5ndGg7CisgICAgdm9pZCAqcEVuY3J5cHRlZFNlc3Npb25LZXk7CisgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBkYXRhU2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0OworICAgIG9mZjY0X3QgZmlsZVBvczsKKyAgICBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CisgICAgSE1BQ19DVFggc2lnbmluZ0NvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciBrZXlTdHJlYW1bQUVTX0JMT0NLX1NJWkVdOworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXg7Cit9IEZ3ZExvY2tGaWxlX1Nlc3Npb25fdDsKKworc3RhdGljIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqc2Vzc2lvblB0cnNbTUFYX05VTV9TRVNTSU9OU10gPSB7IE5VTEwgfTsKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzZXNzaW9uQWNxdWlzaXRpb25NdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlclRlbXBsYXRlW10gPQorICAgIHsgJ0YnLCAnVycsICdMJywgJ0snLCBGV0RfTE9DS19WRVJTSU9OLCBGV0RfTE9DS19TVUJGT1JNQVQsIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIH07CisKKy8qKgorICogQWNxdWlyZXMgYW4gdW51c2VkIGZpbGUgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIEEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tGaWxlX0FjcXVpcmVTZXNzaW9uKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpZiAoZmlsZURlc2MgPCAwKSB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2FuZGlkYXRlU2Vzc2lvbklkID0gKGZpbGVEZXNjICsgaSkgJSBNQVhfTlVNX1NFU1NJT05TOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPSBtYWxsb2Moc2l6ZW9mICoqc2Vzc2lvblB0cnMpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+ZmlsZURlc2MgPSBmaWxlRGVzYzsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjYW5kaWRhdGVTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGlmIChpID09IE1BWF9OVU1fU0VTU0lPTlMpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5GSUxFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGZpbGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBBIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gLTE7CisgICAgaWYgKGZpbGVEZXNjIDwgMCkgeworICAgICAgICBlcnJubyA9IEVCQURGOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VTU0lPTlM7ICsraSkgeworICAgICAgICAgICAgaW50IGNhbmRpZGF0ZVNlc3Npb25JZCA9IChmaWxlRGVzYyArIGkpICUgTUFYX05VTV9TRVNTSU9OUzsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5maWxlRGVzYyA9PSBmaWxlRGVzYykgeworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbmRpZGF0ZVNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBpZiAoaSA9PSBNQVhfTlVNX1NFU1NJT05TKSB7CisgICAgICAgICAgICBlcnJubyA9IEVCQURGOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBmaWxlIHNlc3Npb24uCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrRmlsZV9SZWxlYXNlU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgYXNzZXJ0KDAgPD0gc2Vzc2lvbklkICYmIHNlc3Npb25JZCA8IE1BWF9OVU1fU0VTU0lPTlMgJiYgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSAhPSBOVUxMKTsKKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnBDb250ZW50VHlwZSk7CisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgbWVtc2V0KHNlc3Npb25QdHJzW3Nlc3Npb25JZF0sIDAsIHNpemVvZiAqc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7CisgICAgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKK30KKworLyoqCisgKiBEZXJpdmVzIGtleXMgZm9yIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcgZnJvbSB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBrZXkgZGVyaXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9EZXJpdmVLZXlzKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfRGVyaXZlS2V5c19EYXRhIHsKKyAgICAgICAgQUVTX0tFWSBzZXNzaW9uUm91bmRLZXlzOworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlW0tFWV9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbS0VZX1NJWkVdOworICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoLCBwRGF0YS0+a2V5LCBLRVlfU0laRSk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHswLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgICAgICAgIG1lbXNldChwRGF0YS0+dmFsdWUsIDAsIEtFWV9TSVpFKTsKKyAgICAgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MSwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBzaWduaW5nIGtleS4KKyAgICAgICAgICAgICAgICAgICAgKytwRGF0YS0+dmFsdWVbMF07CisgICAgICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19DVFhfaW5pdCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5rZXksIEtFWV9TSVpFLCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5PU1lTOworICAgICAgICB9CisgICAgICAgIG1lbXNldChwRGF0YSwgMCwgc2l6ZW9mIHBEYXRhKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgIGZyZWUocERhdGEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENhbGN1bGF0ZXMgdGhlIGNvdW50ZXIsIHRyZWF0ZWQgYXMgYSAxNi1ieXRlIGxpdHRsZS1lbmRpYW4gbnVtYmVyLCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBrZXlzdHJlYW0KKyAqIGZvciB0aGUgZ2l2ZW4gYmxvY2suCisgKgorICogQHBhcmFtW2luXSBwTm9uY2UgQSByZWZlcmVuY2UgdG8gdGhlIG5vbmNlLgorICogQHBhcmFtW2luXSBibG9ja0luZGV4IFRoZSBpbmRleCBudW1iZXIgb2YgdGhlIGJsb2NrLgorICogQHBhcmFtW291dF0gcENvdW50ZXIgQSByZWZlcmVuY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tGaWxlX0NhbGN1bGF0ZUNvdW50ZXIoY29uc3QgdW5zaWduZWQgY2hhciAqcE5vbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBibG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwQ291bnRlcikgeworICAgIHVuc2lnbmVkIGNoYXIgY2FycnkgPSAwOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHNpemVvZiBibG9ja0luZGV4OyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwYXJ0ID0gcE5vbmNlW2ldICsgKHVuc2lnbmVkIGNoYXIpKGJsb2NrSW5kZXggPj4gKGkgKiBDSEFSX0JJVCkpOworICAgICAgICBwQ291bnRlcltpXSA9IHBhcnQgKyBjYXJyeTsKKyAgICAgICAgY2FycnkgPSAocGFydCA8IHBOb25jZVtpXSB8fCBwQ291bnRlcltpXSA8IHBhcnQpID8gMSA6IDA7CisgICAgfQorICAgIGZvciAoOyBpIDwgQUVTX0JMT0NLX1NJWkU7ICsraSkgeworICAgICAgICBwQ291bnRlcltpXSA9IHBOb25jZVtpXSArIGNhcnJ5OworICAgICAgICBjYXJyeSA9IChwQ291bnRlcltpXSA8IHBOb25jZVtpXSkgPyAxIDogMDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjcnlwdHMgdGhlIGJ5dGUgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiB1c2luZyBBRVMtMTI4LUNUUi4gSW4gQ1RSIChvciAiY291bnRlciIpIG1vZGUsCisgKiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlIHNhbWUgYWxnb3JpdGhtLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICogQHBhcmFtW2luXSBwQnl0ZSBUaGUgYnl0ZSB0byBkZWNyeXB0LgorICovCit2b2lkIEZ3ZExvY2tGaWxlX0RlY3J5cHRCeXRlKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpwQnl0ZSkgeworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXggPSBwU2Vzc2lvbi0+ZmlsZVBvcyAvIEFFU19CTE9DS19TSVpFOworICAgIHVpbnQ2NF90IGJsb2NrT2Zmc2V0ID0gcFNlc3Npb24tPmZpbGVQb3MgJSBBRVNfQkxPQ0tfU0laRTsKKyAgICBpZiAoYmxvY2tJbmRleCAhPSBwU2Vzc2lvbi0+YmxvY2tJbmRleCkgeworICAgICAgICAvLyBUaGUgZmlyc3QgMTYgYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyB1c2VkIGFzIHRoZSBub25jZS4KKyAgICAgICAgdW5zaWduZWQgY2hhciBjb3VudGVyW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgRndkTG9ja0ZpbGVfQ2FsY3VsYXRlQ291bnRlcihwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIGJsb2NrSW5kZXgsIGNvdW50ZXIpOworICAgICAgICBBRVNfZW5jcnlwdChjb3VudGVyLCBwU2Vzc2lvbi0+a2V5U3RyZWFtLCAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpOworICAgICAgICBwU2Vzc2lvbi0+YmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7CisgICAgfQorICAgICpwQnl0ZSBePSBwU2Vzc2lvbi0+a2V5U3RyZWFtW2Jsb2NrT2Zmc2V0XTsKK30KKworaW50IEZ3ZExvY2tGaWxlX2F0dGFjaChpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfQWNxdWlyZVNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPj0gMCkgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgaW50IGlzU3VjY2VzcyA9IEZBTFNFOworICAgICAgICBpZiAocmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKSA9PSBUT1BfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAocFNlc3Npb24tPnRvcEhlYWRlciwgdG9wSGVhZGVyVGVtcGxhdGUsIHNpemVvZiB0b3BIZWFkZXJUZW1wbGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoID0gcFNlc3Npb24tPnRvcEhlYWRlcltDT05URU5UX1RZUEVfTEVOR1RIX1BPU107CisgICAgICAgICAgICBhc3NlcnQocFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoIDw9IFVDSEFSX01BWCk7IC8vIFVudGFpbnQgc2NhbGFyIGZvciBjb2RlIGNoZWNrZXJzLgorICAgICAgICAgICAgcFNlc3Npb24tPnBDb250ZW50VHlwZSA9IG1hbGxvYyhwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cENvbnRlbnRUeXBlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnBDb250ZW50VHlwZSwgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29udGVudFR5cGVbcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoS0VZX1NJWkUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IG1hbGxvYyhwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3NpemVfdClwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIFNIQTFfSEFTSF9TSVpFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmhlYWRlclNpZ25hdHVyZSwgU0hBMV9IQVNIX1NJWkUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IEZ3ZExvY2tGaWxlX0Rlcml2ZUtleXMocFNlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdWNjZXNzKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoICsgVE9QX0hFQURFUl9TSVpFICsgMiAqIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSAwOworICAgICAgICAgICAgcFNlc3Npb24tPmJsb2NrSW5kZXggPSBJTlZBTElEX0JMT0NLX0lOREVYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoc2Vzc2lvbklkID49IDApID8gMCA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfb3Blbihjb25zdCBjaGFyICpwRmlsZW5hbWUpIHsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKHBGaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwICYmIEZ3ZExvY2tGaWxlX2F0dGFjaChmaWxlRGVzYykgPCAwKSB7CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZpbGVEZXNjOworfQorCitzc2l6ZV90IEZ3ZExvY2tGaWxlX3JlYWQoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBzc2l6ZV90IGk7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IHJlYWQocFNlc3Npb24tPmZpbGVEZXNjLCBwQnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlc1JlYWQ7ICsraSkgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfRGVjcnlwdEJ5dGUocFNlc3Npb24sICYoKHVuc2lnbmVkIGNoYXIgKilwQnVmZmVyKVtpXSk7CisgICAgICAgICAgICArK3BTZXNzaW9uLT5maWxlUG9zOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK29mZjY0X3QgRndkTG9ja0ZpbGVfbHNlZWsoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICAgIG9mZjY0X3QgbmV3RmlsZVBvczsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICAgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQgKyBvZmZzZXQsIHdoZW5jZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdGaWxlUG9zICE9IElOVkFMSURfT0ZGU0VUKSB7CisgICAgICAgICAgICBpZiAobmV3RmlsZVBvcyA8IHBTZXNzaW9uLT5kYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWxlIHBvc2l0aW9uIGlzIGlsbGVnYWwgZm9yIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLiBSZXN0b3JlIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGZpbGUgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB0aGUgZmlsZSBwb3NpdGlvbiB0aGF0IGxzZWVrNjQoKSB3b3VsZCBoYXZlIHJldHVybmVkCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBlbWJlZGRlZCBjb250ZW50IGZpbGUuCisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSBuZXdGaWxlUG9zIC0gcFNlc3Npb24tPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IHBTZXNzaW9uLT5maWxlUG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdGaWxlUG9zOworfQorCitpbnQgRndkTG9ja0ZpbGVfZGV0YWNoKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBITUFDX0NUWF9jbGVhbnVwKCZzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5zaWduaW5nQ29udGV4dCk7CisgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYykgeworICAgIHJldHVybiAoRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKSA9PSAwKSA/IGNsb3NlKGZpbGVEZXNjKSA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYykgeworICAgIGludCByZXN1bHQ7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5X0RhdGEgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbU0lHX0NBTENfQlVGRkVSX1NJWkVdOworICAgICAgICB9ICpwRGF0YSA9IG1hbGxvYyhzaXplb2YgKnBEYXRhKTsKKyAgICAgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgICAgICBpZiAobHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemUgPSBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKHBTZXNzaW9uLT5maWxlRGVzYywgcERhdGEtPmJ1ZmZlciwgU0lHX0NBTENfQlVGRkVSX1NJWkUpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPmJ1ZmZlciwgKHNpemVfdCludW1CeXRlc1JlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5zaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZW1jbXAocERhdGEtPnNpZ25hdHVyZSwgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplID0gU0hBMV9IQVNIX1NJWkU7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsICh1bnNpZ25lZCBjaGFyICopcFNlc3Npb24tPnBDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5kYXRhU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKTsKKyAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBzaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICByZXN1bHQgPSBtZW1jbXAoc2lnbmF0dXJlLCBwU2Vzc2lvbi0+aGVhZGVyU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKSA9PSAwOworICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgcmV0dXJuIEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKSAmJiBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHkoZmlsZURlc2MpOworfQorCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjQwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0ZJTEVfSF9fCisjZGVmaW5lIF9fRldETE9DS0ZJTEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIEF0dGFjaGVzIHRvIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuIFRoZSBmaWxlIHBvc2l0aW9uIGlzIGFzc3VtZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9hdHRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBPcGVucyBhIEZvcndhcmQgTG9jayBmaWxlIGZvciByZWFkaW5nLgorICoKKyAqIEBwYXJhbVtpbl0gcEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIGEgZmlsZW5hbWUuCisgKgorICogQHJldHVybiBBIGZpbGUgZGVzY3JpcHRvci4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX29wZW4oY29uc3QgY2hhciAqcEZpbGVuYW1lKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKiBAcGFyYW1bb3V0XSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3NzaXplX3QgRndkTG9ja0ZpbGVfcmVhZChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoaW4gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW1baW5dIHdoZW5jZSBPbmUgb2YgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQuCisgKgorICogQHJldHVybiBUaGUgbmV3IGZpbGUgcG9zaXRpb24uCisgKiBAcmV0dmFsICgob2ZmNjRfdCktMSkgRmFpbHVyZS4KKyAqLworb2ZmNjRfdCBGd2RMb2NrRmlsZV9sc2VlayhpbnQgZmlsZURlc2MsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBEZXRhY2hlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9kZXRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDbG9zZXMgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIDAgU3VjY2Vzcy4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBkYXRhIGludGVncml0eSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZWdyaXR5IGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENoZWNrcyBib3RoIHRoZSBkYXRhIGFuZCBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0ludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4KKyAqICAgQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRlbnQgdHlwZS4gVGhlIHJlZmVyZW5jZSByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGZpbGUgaXMga2VwdCBvcGVuLgorICovCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLRklMRV9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmOTVjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCkBAIC0wLDAgKzEsMTAzOSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxMiAoZmlsdGVyZWQpIj4KKzx0aXRsZT5Gb3J3YXJkIExvY2sgQ29udmVydGVyIGFuZCBEZWNvZGVyPC90aXRsZT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCisgQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpTaW1TdW47CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOworCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIjsKKwlwYW5vc2UtMToyIDExIDYgOSA0IDUgNCAyIDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJcQFNpbVN1biI7CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitoMQorCXttYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1sZWZ0OjIxLjZwdDsKKwl0ZXh0LWluZGVudDotMjEuNnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE2LjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjt9CitoMgorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6MjguOHB0OworCXRleHQtaW5kZW50Oi0yOC44cHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTQuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK2gzCisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDozNi4wcHQ7CisJdGV4dC1pbmRlbnQ6LTM2LjBwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxMy4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQoraDQKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjQzLjJwdDsKKwl0ZXh0LWluZGVudDotNDMuMnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE0LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK2g1CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo1MC40cHQ7CisJdGV4dC1pbmRlbnQ6LTUwLjRwdDsKKwlmb250LXNpemU6MTMuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQoraDYKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjU3LjZwdDsKKwl0ZXh0LWluZGVudDotNTcuNnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0hlYWRpbmc3LCBsaS5Nc29IZWFkaW5nNywgZGl2Lk1zb0hlYWRpbmc3CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo2NC44cHQ7CisJdGV4dC1pbmRlbnQ6LTY0LjhwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkaW5nOCwgbGkuTXNvSGVhZGluZzgsIGRpdi5Nc29IZWFkaW5nOAorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NzIuMHB0OworCXRleHQtaW5kZW50Oi03Mi4wcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK3AuTXNvSGVhZGluZzksIGxpLk1zb0hlYWRpbmc5LCBkaXYuTXNvSGVhZGluZzkKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0Ojc5LjJwdDsKKwl0ZXh0LWluZGVudDotNzkuMnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQorcC5Nc29Ub2MxLCBsaS5Nc29Ub2MxLCBkaXYuTXNvVG9jMQorCXttYXJnaW4tdG9wOjYuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTo2LjBwdDsKKwltYXJnaW4tbGVmdDowY207CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQorcC5Nc29Ub2MyLCBsaS5Nc29Ub2MyLCBkaXYuTXNvVG9jMgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjEyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC12YXJpYW50OnNtYWxsLWNhcHM7fQorcC5Nc29Ub2MzLCBsaS5Nc29Ub2MzLCBkaXYuTXNvVG9jMworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjI0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQorcC5Nc29Ub2M0LCBsaS5Nc29Ub2M0LCBkaXYuTXNvVG9jNAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjM2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M1LCBsaS5Nc29Ub2M1LCBkaXYuTXNvVG9jNQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjQ4LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M2LCBsaS5Nc29Ub2M2LCBkaXYuTXNvVG9jNgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjYwLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M3LCBsaS5Nc29Ub2M3LCBkaXYuTXNvVG9jNworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjcyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M4LCBsaS5Nc29Ub2M4LCBkaXYuTXNvVG9jOAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojg0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M5LCBsaS5Nc29Ub2M5LCBkaXYuTXNvVG9jOQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojk2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290bm90ZVRleHQsIGxpLk1zb0Zvb3Rub3RlVGV4dCwgZGl2Lk1zb0Zvb3Rub3RlVGV4dAorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTAuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkZXIsIGxpLk1zb0hlYWRlciwgZGl2Lk1zb0hlYWRlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290ZXIsIGxpLk1zb0Zvb3RlciwgZGl2Lk1zb0Zvb3RlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29DYXB0aW9uLCBsaS5Nc29DYXB0aW9uLCBkaXYuTXNvQ2FwdGlvbgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitzcGFuLk1zb0Zvb3Rub3RlUmVmZXJlbmNlCisJe3ZlcnRpY2FsLWFsaWduOnN1cGVyO30KK3AuTXNvVGl0bGUsIGxpLk1zb1RpdGxlLCBkaXYuTXNvVGl0bGUKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjEyMC4wcHQ7CisJbWFyZ2luLWxlZnQ6MGNtOworCXRleHQtYWxpZ246Y2VudGVyOworCWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitwLk1zb0JvZHlUZXh0LCBsaS5Nc29Cb2R5VGV4dCwgZGl2Lk1zb0JvZHlUZXh0CisJe21zby1zdHlsZS1saW5rOiJCb2R5IFRleHQgQ2hhciI7CisJbWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjYuMHB0OworCW1hcmdpbi1sZWZ0OjBjbTsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaworCXtjb2xvcjpibHVlOworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQorYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkCisJe2NvbG9yOnB1cnBsZTsKKwl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KK3AuTXNvQWNldGF0ZSwgbGkuTXNvQWNldGF0ZSwgZGl2Lk1zb0FjZXRhdGUKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIjt9CitzcGFuLkJvZHlUZXh0Q2hhcgorCXttc28tc3R5bGUtbmFtZToiQm9keSBUZXh0IENoYXIiOworCW1zby1zdHlsZS1saW5rOiJCb2R5IFRleHQiO30KKyAvKiBQYWdlIERlZmluaXRpb25zICovCisgQHBhZ2UgV29yZFNlY3Rpb24xCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjEKKwl7cGFnZTpXb3JkU2VjdGlvbjE7fQorQHBhZ2UgV29yZFNlY3Rpb24yCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjIKKwl7cGFnZTpXb3JkU2VjdGlvbjI7fQorIC8qIExpc3QgRGVmaW5pdGlvbnMgKi8KKyBvbAorCXttYXJnaW4tYm90dG9tOjBjbTt9Cit1bAorCXttYXJnaW4tYm90dG9tOjBjbTt9CistLT4KKzwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorCis8ZGl2IGNsYXNzPVdvcmRTZWN0aW9uMT4KKworPHAgY2xhc3M9TXNvVGl0bGU+Rm9yd2FyZCBMb2NrIENvbnZlcnRlciBBbmQgRGVjb2RlcjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbgorY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDIyIj4xPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7CitsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LXdlaWdodDpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPkludHJvZHVjdGlvbjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyMyI+MjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPk92ZXJ2aWV3PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNCI+MzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPlVzZSBDYXNlczxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjQ8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI1Ij4zLjE8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPkNvbnZlcnRlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz40PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjYiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IERhdGEgKFB1c2gtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+NDwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjciPjMuMS4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IEZpbGUgKFB1bGwtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Njwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+RGVjb2RlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz43PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5DaGVjayBJbnRlZ3JpdHk8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+ODwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzAiPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5HZXQgQ29udGVudCBUeXBlPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjk8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMxIj4zLjIuMzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+RGVjb2RlIEZpbGU8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTA8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMyIj40PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+RGVmaW5pdGlvbiBvZiB0aGUKK0ludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMTwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+S2V5IERlcml2YXRpb248c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjExPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzQiPjQuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+Q2FsY3VsYXRpb24gb2YgdGhlIENvdW50ZXJzPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEyPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzUiPjU8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5Vbml0IFRlc3QgQ2FzZXM8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzYiPjY8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5SZWZlcmVuY2VzPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTI8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjwvcD4KKworPC9kaXY+CisKKzxzcGFuIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTpyaWdodCc+Cis8L3NwYW4+CisKKzxkaXYgY2xhc3M9V29yZFNlY3Rpb24yPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzQiPjE8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+SW50cm9kdWN0aW9uPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaXMgdXNlZCBmb3IgZW5jcnlwdGluZworaW5oZXJlbnRseSB1bmVuY3J5cHRlZCBPTUEgRFJNIHZlcnNpb24gMSBGb3J3YXJkIExvY2sgYW5kIENvbWJpbmVkIERlbGl2ZXJ5CitmaWxlcyBzbyB0aGV5IGNhbiBiZSBzZWN1cmVseSBzdG9yZWQgb24gZXh0ZXJuYWxseSBhY2Nlc3NpYmxlIGZpbGUgc3lzdGVtIHBhcnRpdGlvbnMKK3N1Y2ggYXMgbWVtb3J5IHN0aWNrLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+T3VyIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdG8gY29udmVydCBzdWNoIDxpPk9NQSBEUk0gTWVzc2FnZTwvaT4KKyiRLmRtkikgZmlsZXMgdG8gaW50ZXJuYWwgRm9yd2FyZCBMb2NrICiRLmZskikgZmlsZXMgYXMgc29vbiBhcyB0aGV5IGFyZQorZG93bmxvYWRlZCBvciBvdGhlcndpc2UgdHJhbnNmZXJyZWQgdG8gdGhlIHBob25lLCBhbmQgbm90IGFjdHVhbGx5IHByb3ZpZGUgYW55CitkZWNvZGVycyBmb3IgkS5kbZIgZmlsZXMuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMyI+MjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5PdmVydmlldzwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgPGk+Rm9yd2FyZCBMb2NrIENvbnZlcnRlcjwvaT4gY29udmVydHMgT01BIERSTSBNZXNzYWdlCitmaWxlcyB0byB0aGUgaW50ZXJuYWwgZmlsZSBmb3JtYXQuIFRoZSA8aT5Gb3J3YXJkIExvY2sgRGVjb2RlcjwvaT4gcHJvdmlkZXMgYQorUE9TSVgtbGV2ZWwgQVBJIGZvciB0cmFuc3BhcmVudCByZWFkaW5nIGFuZCBzZWVraW5nIHRocm91Z2ggc3VjaCBhIGNvbnZlcnRlZAorZmlsZSBhcyBpZiBpdCB3ZXJlIHVuZW5jcnlwdGVkLiBUaGUgQVBJIGFsc28gaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBjaGVja2luZyBhCitmaWxlknMgaW50ZWdyaXR5IGFuZCBnZXR0aW5nIHRoZSBNSU1FIHR5cGUgb2YgaXRzIGVtYmVkZGVkIGNvbnRlbnQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPlRoZSBjb252ZXJ0ZXIgYW5kIGRlY29kZXIgYXJlCitidWlsdCBpbnRvIHR3byBzZXBhcmF0ZSBsaWJyYXJpZXMsIHdoaWNoIHNoYXJlIGNvbW1vbiBjb2RlIGZvciByYW5kb20gbnVtYmVyCitnZW5lcmF0aW9uIGFuZCBrZXkgZW5jcnlwdGlvbiBpbiBhIHRoaXJkIGxpYnJhcnkuIEZvciB0ZXN0IHB1cnBvc2VzIHRoZXJlIGlzCithbHNvIGEgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLiBTZWUgRmlndXJlIDEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD0yODggaGVpZ2h0PTM2NAorc3JjPSJpbWFnZXMvaW1hZ2UwMDEuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6MTIuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjI3MzA4ODUiPkZpZ3VyZSA8L2E+MS4gQmxvY2sgZGlhZ3JhbSBpbGx1c3RyYXRpbmcgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBleGVjdXRhYmxlIG1vZHVsZXMuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE2LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNCI+MzxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Vc2UgQ2FzZXM8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIHVzZSBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlcgorYW5kIGRlY29kZXIuIEl0IHNob3dzIHRoZSBzZXF1ZW5jZSBvZiBBUEkgY2FsbHMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzb2x2ZQordGhlc2UgdXNlIGNhc2VzLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjUiPjMuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Db252ZXJ0ZXI8L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhyb3VnaCB0aGUgY29udmVydGVyIEFQSSwgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIGluIG9uZQorb2YgdHdvIHdheXM6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1c2gtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY2xpZW50IHByb2dyZXNzaXZlbHkgZmVlZHMgZGF0YSB0byB0aGUgY29udmVydGVyIGFzCitpdCBhcnJpdmVzLiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZGF0YSBhcnJpdmVzIGdyYWR1YWxseSBpbiBjaHVua3MsIHdpdGgKK2lkbGUgdGltZSBpbiBiZXR3ZWVuLiBDb25zZXF1ZW50bHksIHB1c2ggbW9kZSBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIGZpbGVzCitiZWluZyBkb3dubG9hZGVkIHRocm91Z2ggSFRUUC4gU2VlIHNlY3Rpb24gMy4xLjEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1bGwtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY29udmVydGVyIGRyaXZlcyB0aGUgcHJvY2VzcyBhbmQgY29uc3VtZXMgZGF0YSBmcm9tCit0aGUgY2xpZW50IGFzIGl0IG5lZWRzIGl0LiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gdGhlIGVudGlyZSBmaWxlIHRvIGJlCitjb252ZXJ0ZWQgaXMgcmVhZGlseSBhdmFpbGFibGUuIEhlbmNlLCBwdWxsIG1vZGUgaXMgdXNlZCBieSB0aGUgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLgorU2VlIHNlY3Rpb24gMy4xLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCBwdWxsLW1vZGUgY29udmVyc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcworb2YgdGhlIEFQSSBmb3IgcHVzaC1tb2RlIGNvbnZlcnNpb24uPC9wPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzgiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNvbnZlcnQgRGF0YQorKFB1c2gtTW9kZSBDb252ZXJzaW9uKTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5QdXNoLW1vZGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYXMgZm9sbG93cyAoc2VlIGFsc28gRmlndXJlIDIpOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X09wZW5TZXNzaW9uPC9zcGFuPgoraW5pdGlhbGl6ZXMgdGhlIG91dHB1dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSA8aT5zZXNzaW9uIElEPC9pPiB0byBiZSB1c2VkIGluCitzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBBUEkuIFRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIGEgdW5pb24gb2YgcmV0dXJuIHZhbHVlcword2hvc2UgY29ycmVjdCB1c2UgYXQgYW55IGdpdmVuIG1vbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBBUEkgZnVuY3Rpb24gbGFzdAorY2FsbGVkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X0NvbnZlcnREYXRhPC9zcGFuPgoraXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbW9yZSBpbnB1dCBkYXRhIHJlbWFpbnMuIEVhY2ggY2FsbCBjb252ZXJ0cyB0aGUKK21heGltdW0gYW1vdW50IG9mIGRhdGEgcG9zc2libGUgYW5kIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGNsaWVudCB0aGVuCit3cml0ZXMgdGhpcyBkYXRhIHRvIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uPC9zcGFuPgorY2xlYW5zIHVwIHRoZSBzZXNzaW9uIGFuZCBkZWFsbG9jYXRlcyB0aGUgb3V0cHV0IGJ1ZmZlci4gSWYgYWxsIGhhcyBnb25lIHdlbGwsIGEKK3R3by1wYXJ0IGNyeXB0b2dyYXBoaWMgc2lnbmF0dXJlIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyBjYWxjdWxhdGVkLiBUaGUgY2xpZW50CittdXN0IGdvIGJhY2sgYW5kIHJld3JpdGUgcGFydCBvZiB0aGUgZmlsZSBoZWFkZXIgd2l0aCB0aGlzIHVwZGF0ZWQgc2lnbmF0dXJlCitpbmZvcm1hdGlvbi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkV2ZXJ5IHRpbWUgYSBmaWxlIGlzIGJlaW5nIGNvbnZlcnRlZCwgdGhlIGNvbnZlcnRlciBjYWxscyA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcjwvc3Bhbj4KK3RvIGdlbmVyYXRlIGEgbmV3LCB1bmlxdWUgc2Vzc2lvbiBrZXkuIE5vIHR3byBjb252ZXJ0ZWQgZmlsZXMgbG9vayBhbGlrZSwgZXZlbgoraWYgdGhlIG9yaWdpbmFsIGZpbGVzIGFyZSB0aGUgc2FtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUgcmFuZG9tIGJ5dGVzIGNhbm5vdCBjb21lIGZyb20gYW55IGJhcmUtbWluaW11bQoraW1wbGVtZW50YXRpb24gb2YgdGhlIEMtbGlicmFyeSA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+cmFuZDwvc3Bhbj4KK2Z1bmN0aW9ul3RoZXkgbXVzdCBiZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUuIE90aGVyd2lzZSwgc2VjdXJpdHkgd2lsbCBiZQorY29tcHJvbWlzZWQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgaXMgZW5jcnlwdGVkIGFuZCBzdG9yZWQgd2l0aGluIHRoZQorY29udmVydGVkIGZpbGUuIEtleSBlbmNyeXB0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGg8L3NwYW4+IGFuZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0VuY3J5cHRLZXk8L3NwYW4+LgorVGhlc2UgdHdvIGZ1bmN0aW9ucywgdG9nZXRoZXIgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkZWNyeXB0aW9uIGZ1bmN0aW9uICg8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0RlY3J5cHRLZXk8L3NwYW4+KSwKK2FyZSB0aGUgaW50ZWdyYXRpb24gcG9pbnRzIHdoZXJlIGFuIE9FTSBtYW51ZmFjdHVyZXIgbWF5IGltcGxlbWVudCB0aGVpciBvd24KK2tleS1lbmNyeXB0aW9uIHNjaGVtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUga2V5LWVuY3J5cHRpb24ga2V5IG11c3QgYmUgdW5pcXVlIHRvIGVhY2gKK2RldmljZTsgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBmaWxlcyBmb3J3YXJkIGxvY2uWcHJvdGVjdGVkLiBJZGVhbGx5LCBpdCBzaG91bGQKK2JlIGRlcml2ZWQgZnJvbSBzZWNyZXQgaGFyZHdhcmUgcGFyYW1ldGVycywgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZCBiZQorcGVyc2lzdGVudCBmcm9tIG9uZSBtYXN0ZXIgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgorCis8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OworYmFja2dyb3VuZDojRjJGMkYyJz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J2JhY2tncm91bmQ6I0YyRjJGMjtib3JkZXI6Citub25lO3BhZGRpbmc6MGNtJz48Yj5Ob3RlOjwvYj4gSW4gdGhlIG9wZW4tc291cmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxpYmZ3ZGxvY2stY29tbW9uPC9zcGFuPgorbGlicmFyeSwgYSByYW5kb20ga2V5LWVuY3J5cHRpb24ga2V5IGlzIGdlbmVyYXRlZCBhbmQgc3RvcmVkIGluIHBsYWludGV4dCBpbgordGhlIGZpbGUgc3lzdGVtLCB3aXRob3V0IGJlaW5nIG9iZnVzY2F0ZWQgaW4gYW55IHdheSAoZG9pbmcgc28gd291bGQgYmUgZnV0aWxlCitzaW5jZSB0aGUgc291cmNlIGNvZGUgaXMgb3Blbmx5IGF2YWlsYWJsZSkuIFRoaXMga2V5IG11c3QgYmUga2VwdCBzZWNyZXQgZnJvbQordGhlIHVzZXIsIGFuZCBzaG91bGRuknQgYmUgcG9zc2libGUgdG8gZXh0cmFjdCB0aHJvdWdoIGJhY2t1cC1hbmQtcmVzdG9yZQorZnVuY3Rpb25hbGl0eSBvciB0aGUgbGlrZS4gT0VNIG1hbnVmYWN0dXJlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIGltcGxlbWVudCBhCit0cnVseSBoYXJkd2FyZS1iYXNlZCBkZXZpY2UtdW5pcXVlIGtleS48L3A+CisKKzwvZGl2PgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01MzEgaGVpZ2h0PTU2Mworc3JjPSJpbWFnZXMvaW1hZ2UwMDIuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzA4NTE4NyI+RmlndXJlIDwvYT4yLiBDb252ZXJ0ZXIgVUM6IENvbnZlcnQgRGF0YS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDI3Ij48L2E+PGEgbmFtZT0iX1JlZjI2MzE2MzA4MiI+My4xLjI8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q29udmVydCBGaWxlCisoUHVsbC1Nb2RlIENvbnZlcnNpb24pPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlB1bGwtbW9kZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBieSBjYWxsaW5nIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydEZpbGU8L3NwYW4+Cit3aXRoIHRoZSBmaWxlbmFtZSwgdW5sZXNzIHRoZXJlIGlzIG5lZWQgZm9yIGEgc3BlY2lhbGl6ZWQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5yZWFkPC9zcGFuPiBmdW5jdGlvbiwgaW4KK3doaWNoIGNhc2UgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRPcGVuRmlsZTwvc3Bhbj4KK3Nob3VsZCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQuIFNlZSBGaWd1cmUgMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+SW50ZXJuYWxseSwgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0RmlsZTwvc3Bhbj4KK2NhbGxzIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0T3BlbkZpbGU8L3NwYW4+LgorVGhlIGxhdHRlciB0aGVuIHByb2NlZWRzIHdpdGggdGhlIGNvbnZlcnNpb24gdXNpbmcgdGhlIHB1c2gtbW9kZSBBUEksIGFjdGluZyBhcwordGhlIGNsaWVudCBpbiB0aGUgcHJldmlvdXMgdXNlIGNhc2U7IHNlZSBzZWN0aW9uIDMuMS4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTMxIGhlaWdodD03MzEKK3NyYz0iaW1hZ2VzL2ltYWdlMDAzLmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMwODUyMDgiPkZpZ3VyZSA8L2E+My4gQ29udmVydGVyIFVDOiBDb252ZXJ0IEZpbGUuPC9wPgorCis8Yj48aT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE0LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9pPjwvYj4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5EZWNvZGVyPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBkZWNvZGVyIEFQSSBhbGxvd3MgdGhlIGNsaWVudCB0byBkbyB0aGUgZm9sbG93aW5nOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5DaGVjawordGhlIGludGVncml0eSBvZiBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSwgaS5lLiwgZGV0ZWN0IHdoZXRoZXIgaXQgaGFzCitiZWVuIG1hbmlwdWxhdGVkIGluIGFueSB3YXk7IHNlZSBzZWN0aW9uIDMuMi4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5HZXQKK3RoZSBNSU1FIHR5cGUgb2YgdGhlIGVtYmVkZGVkIGNvbnRlbnQgKHRoZSCTb3JpZ2luYWyUIE1JTUUgdHlwZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24KK3dhcyBhcHBsaWVkKTsgc2VlIHNlY3Rpb24gMy4yLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZQordGhlIGZpbGUgYnkgcmFuZG9tIGFjY2VzcywgaS5lLiwgcmVhZCBhbmQgc2VlayB0aHJvdWdoIGl0IGluIGFuIGFyYml0cmFyeQorbWFubmVyOyBzZWUgc2VjdGlvbiAzLjIuMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gYSBmaWxlIGZpcnN0IHJlcXVpcmUgaXQgdG8gYmUKK29wZW5lZC4gT3BlbmluZyBhIGZpbGUgcmV0dXJucyBhIDxpPmZpbGUgZGVzY3JpcHRvcjwvaT6XYSBoYW5kbGUgdG8gYmUgdXNlZCBpbgordGhlc2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgdGhlIGZpbGVuYW1lIGlzIGtub3duLCBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZQorY2FuIGJlIG9wZW5lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4uCitJZiBvbmx5IHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gYWxyZWFkeSBvcGVuIGZpbGUgaXMgYXZhaWxhYmxlLCBhIGRlY29kaW5nCitzZXNzaW9uIGNhbiBpbnN0ZWFkIGJlIGluaXRpYWxpemVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToKKyJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPiBjYWxscyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+LiBGb3IgZWZmaWNpZW5jeQorcmVhc29ucywgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4KK3RoZXJlZm9yZSBhc3N1bWVzIHRoYXQgdGhlIGZpbGUgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB3aGVuCit0aGUgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuIEEgY2xpZW50IHdobyBjYWxscyBpdCBkaXJlY3RseSBtdXN0IG1ha2Ugc3VyZSB0aGF0Cit0aGlzIGFzc3VtcHRpb24gaG9sZHMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5XaGVuIGEgZmlsZSBpcyBiZWluZyBhdHRhY2hlZCwgdGhlIHNlc3Npb24ga2V5IHN0b3JlZCBpbgordGhlIGZpbGUgZHVyaW5nIGNvbnZlcnNpb24gaXMgZGVjcnlwdGVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfRGVjcnlwdEtleTwvc3Bhbj4sCitpbiBvcmRlciB0byBzZXQgdXAgZm9yIGRlY29kaW5nIGFuZCBpbnRlZ3JpdHkgY2hlY2tpbmcuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Gb3IganVzdCBnZXR0aW5nIHRoZSBjb250ZW50IHR5cGUsIGhvd2V2ZXIsIHJldHJpZXZpbmcgdGhlCitzZXNzaW9uIGtleSB3b3VsZCBzdHJpY3RseSBzcGVha2luZyBub3QgYmUgbmVjZXNzYXJ5LCBzbyB0aGVyZSBpcyBhbgorb3Bwb3J0dW5pdHkgaGVyZSB0byBvcHRpbWl6ZSBmb3IgdGhhdCBpZiBpdCBwcm92ZXMgbmVjZXNzYXJ5IGxhdGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+U3ltbWV0cmljYWwgdG8gPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6CisiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4gYW5kIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4sIHRoZXJlIGFyZSBhbHNvIGZ1bmN0aW9ucworZm9yIGNsb3NpbmcgYSBmaWxlIG9yIGRldGFjaGluZyBmcm9tIGl0OjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5JZgoraXQgd2FzIG9wZW5lZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPgoraXQgc2hvdWxkIGJlIGNsb3NlZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9jbG9zZTwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPklmCitpdCB3YXMgYXR0YWNoZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPgoraXQgc2hvdWxkIGJlIGRldGFjaGVkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2RldGFjaDwvc3Bhbj4uPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1JlZjI2MzE2MzA5OSI+PC9hPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNoZWNrIEludGVncml0eTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGVyZSBhcmUgdGhyZWUgbWV0aG9kcyBmb3IgY2hlY2tpbmcgdGhlIGludGVncml0eSBvZiBhbgoraW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUsIGluIHdob2xlIG9yIGluIHBhcnQgKHNlZSBhbHNvIEZpZ3VyZSA0KTo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhbmQKK290aGVyIGZpZWxkcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBidXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggaW50ZXJuYWxseSBjYWxscyBmaXJzdCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+CithbmQgdGhlbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+IGlzCitnZW5lcmFsbHkgbXVjaCBmYXN0ZXIgdGhhbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPiwKK3dob3NlIHJ1bm5pbmcgdGltZSBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTU3NQorc3JjPSJpbWFnZXMvaW1hZ2UwMDQuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2MzMwOCI+RmlndXJlIDwvYT40LiBEZWNvZGVyIFVDOiBDaGVjayBJbnRlZ3JpdHkuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMCI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMTciPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkdldCBDb250ZW50IFR5cGU8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZTwvc3Bhbj4gcmV0dXJucyBhCityZWFkLW9ubHkgcmVmZXJlbmNlIHRvIGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlCitlbWJlZGRlZCBjb250ZW50LiBUaGlzIHJlZmVyZW5jZSBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBmaWxlIGlzIGtlcHQgb3Blbi4KK0NsaWVudHMgd2hvIG5lZWQgYWNjZXNzIHRvIHRoZSBjb250ZW50IHR5cGUgYWZ0ZXIgY2xvc2luZyB0aGUgZmlsZSBzaG91bGQgbWFrZQorYSBjb3B5IG9mIHRoZSBzdHJpbmcuIFNlZSBGaWd1cmUgNSBiZWxvdy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTU0MyBoZWlnaHQ9NDg4CitzcmM9ImltYWdlcy9pbWFnZTAwNS5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMTYzMzkyIj5GaWd1cmUgPC9hPjUuIERlY29kZXIgVUM6IEdldCBDb250ZW50IFR5cGUuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMSI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMzciPjMuMi4zPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZSBGaWxlPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFmdGVyIG9wZW5pbmcgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgKG9yIGF0dGFjaGluZwordG8gYW4gYWxyZWFkeSBvcGVuIG9uZSksIGl0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHJlYWQgZnJvbSBhcyBpZiBpdCB3ZXJlCit1bmVuY3J5cHRlZC4gQW55IG51bWJlciBvZiBjYWxscyB0byByZWFkIGRhdGEgZnJvbSB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIG9yCitzZXQgaXQgdG8gYSBuZXcgb25lICh3aGljaCBpcyB3aGF0IDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OgorIkx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiBkb2VzKSBjYW4gYmUgbWFkZSBpbiBhbnkgb3JkZXI7IHRoaXMgaXMgd2hhdCB3ZQorY2FsbCA8aT5yYW5kb20gYWNjZXNzPC9pPi4gU2VlIEZpZ3VyZSA2LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIEZvcndhcmQgTG9jayBEZWNvZGVyIHZlcnNpb25zIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPnJlYWQ8L3NwYW4+LCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiwgYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Y2xvc2U8L3NwYW4+IGZ1bmN0aW9ucworaGF2ZSB0aGUgZXhhY3Qgc2FtZSBzaWduYXR1cmVzIGFzIHRoZWlyIFBPU0lYIGNvdW50ZXJwYXJ0cy4gU28sIGZvciBleGFtcGxlLAordGhlIGNhbGwgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2xzZWVrKGZkLAorMCwgU0VFS19FTkQpPC9zcGFuPiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbWJlZGRlZCBjb250ZW50IGRhdGEsIGkuZS4sIHRoZQorc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPk1vcmVvdmVyLCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+CitpcyBsaWtlIHJlZ3VsYXIgUE9TSVggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPm9wZW48L3NwYW4+CitleGNlcHQgaXQgdGFrZXMgb25seSB0aGUgZmlsZW5hbWUgYXMgYSBwYXJhbWV0ZXKXYWNjZXNzIGlzIGFsd2F5cyByZWFkLW9ubHkuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTUyMgorc3JjPSJpbWFnZXMvaW1hZ2UwMDYuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2NjMwMyI+RmlndXJlIDwvYT42LiBEZWNvZGVyIFVDOiBEZWNvZGUgRmlsZS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTYuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDMyIj40PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkRlZmluaXRpb24gb2YgdGhlIEludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPlRoZSBpbm5lciBzdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuYWwKK0ZvcndhcmQgTG9jayBmaWxlIGlzIGRlZmluZWQgaW4gVGFibGUgMSBiZWxvdy48L3A+CisKKzx0YWJsZSBjbGFzcz1Nc29Ob3JtYWxUYWJsZSBib3JkZXI9MSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAKKyBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlcjpub25lJz4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPk9mZnNldCBbYnl0ZXNdPC9iPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLWxlZnQ6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPlNpemUgW2J5dGVzXTwvYj48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci1sZWZ0Om5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48Yj5EZXNjcmlwdGlvbjwvYj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4wPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBmaWxlIHNpZ25hdHVyZSAoc28tY2FsbGVkCisgIDxpPm1hZ2ljIG51bWJlcjwvaT4pOiBhIGZvdXItY2hhcmFjdGVyIGNvZGUgY29uc2lzdGluZyBvZiB0aGUgbGV0dGVycworICBGLVctTC1LLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjQ8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VmVyc2lvbiBudW1iZXIgKDAgZm9yIHRoZQorICBmaXJzdCB2ZXJzaW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz41PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkluZGljYXRlcyB0aGUgc3ViZm9ybWF0OjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAwIEZvcndhcmQgTG9jazwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMSBDb21iaW5lZCBEZWxpdmVyeTwvaT48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz42PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlVzYWdlIHJlc3RyaWN0aW9uIGZsYWdzIChwcm9oaWJpdGlvbnMKKyAgYWdhaW5zdCB1c2FnZSBhcyByaW5ndG9uZSBvciBhcyB3YWxscGFwZXIgYW5kIHNjcmVlbiBzYXZlcikuIEFsc28gaW5kaWNhdGVzCisgIGlmIHRoZSBmaWxlIGlzIGJvdW5kIHRvIGEgc3BlY2lmaWMgU0lNIGNhcmQuPC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDAgTm8gdXNhZ2UKKyAgcmVzdHJpY3Rpb25zPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAxIFJpbmd0b25lIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDIgU2NyZWVuIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4ODAgQm91bmQgdG8gU0lNPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4oQW55IG51bWJlciBvZiB0aGVzZSBtYXkgYmUKKyAgT1ItZWQgdG9nZXRoZXIuKTwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjc8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+TGVuZ3RoIG9mIHRoZSBNSU1FIGNvbnRlbnQKKyAgdHlwZSAoPGk+azwvaT4pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjg8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5rPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBNSU1FIGNvbnRlbnQgdHlwZQorICAoQVNDSUktZW5jb2RlZCB3aXRob3V0IG51bGwtY2hhcmFjdGVyIHRlcm1pbmF0aW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bCA8L2k+PSAwIG9yIDE2PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIHN1YmZvcm1hdCBpcworICBDb21iaW5lZCBEZWxpdmVyeSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgYXV0by1nZW5lcmF0ZWQgY29udGVudCBJRCAoMTYmbmJzcDtieXRlcykuCisgIElmIG5vdCwgdGhpcyBmaWVsZCBpcyB6ZXJvLXNpemUuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPm0gPC9pPj0gMCBvciA5PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIGZpbGUgaXMgYm91bmQgdG8gYQorICBzcGVjaWZpYyBTSU0gY2FyZCwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgOS1ieXRlIHBhY2tlZCBJTVNJIG51bWJlci4gSWYgbm90LAorICB0aGlzIGZpZWxkIGlzIHplcm8tc2l6ZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bjwvaT4gJiM4ODA1OyAxNjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXksIHRoZQorICBmaXJzdCBzaXh0ZWVuIGJ5dGVzIG9mIHdoaWNoIGFyZSBhbHNvIHVzZWQgYXMgdGhlIENUUi1tb2RlIDxpPm5vbmNlPC9pPiAoc2ltaWxhcgorICB0byB0aGUgQ0JDLW1vZGUgPGk+aW5pdGlhbGl6YXRpb24gdmVjdG9yPC9pPikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjIwPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+RGF0YSBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MjgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT4rPGk+bjwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4yMDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkhlYWRlciBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgYWxsIHRoZSBmaWVsZHMgYWJvdmUsIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGFuZCBkYXRhCisgIHNpZ25hdHVyZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz40OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPiZsdDt0byB0aGUgZW5kIG9mIHRoZQorICBmaWxlJmd0OzwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgY29udGVudCBkYXRhIGVuY3J5cHRlZAorICB1c2luZyAxMjgtYml0IEFFUyBpbiBDVFIgbW9kZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKzwvdGFibGU+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbTtwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48YSBuYW1lPSJfUmVmMTUxMjY5MjA2Ij5UYWJsZSA8L2E+MS4gRGVmaW5pdGlvbiBvZiB0aGUgZmllbGRzIG9mIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+QXMgb2Ygbm93LCBuZWl0aGVyIENvbWJpbmVkIERlbGl2ZXJ5IG5vciB1c2FnZQorcmVzdHJpY3Rpb25zIChpbmNsdWRpbmcgU0lNIGJpbmRpbmcpIGFyZSBzdXBwb3J0ZWQuIFRoZXNlIGZpZWxkcyBhcmUgcmVzZXJ2ZWQKK2ZvciBmdXR1cmUgdXNlLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5LZXkgRGVyaXZhdGlvbjwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgY29uc2lzdHMgb2Ygc2l4dGVlbiBieXRlcyBmZXRjaGVkIGZyb20gYQorY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBGcm9tIHRoZSBzZXNzaW9uIGtleSwgdHdvCitzZXBhcmF0ZSBrZXlzIGFyZSBkZXJpdmVkOiBvbmUgdXNlZCBmb3IgZW5jcnlwdGlvbiwgdGhlIG90aGVyIGZvciBzaWduaW5nLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGVuY3J5cHRpb24ga2V5IGlzIHRoZSBvdXRwdXQgZnJvbSBlbmNyeXB0aW5nIHRoZQorMTYtYnl0ZSBhbGwtemVybyBpbnB1dCBibG9jayB7MCwgMCwghSwgMH0gdXNpbmcgMTI4LWJpdCBBRVMgd2l0aCB0aGUgcmFuZG9tIHNlc3Npb24KK2tleSBhcyB0aGUga2V5LiBUaGUgc2lnbmluZyBrZXkgaXMgdGhlIG91dHB1dCBmcm9tIGVuY3J5cHRpbmcgdGhlIDE2LWJ5dGUgaW5wdXQKK2Jsb2NrIHsxLCAwLCCFLCAwfSB0aGUgc2FtZSB3YXkuIFRoZSBrZXlzIHNvIGRlcml2ZWQgd2lsbCBiZSBjcnlwdG9ncmFwaGljYWxseQoraW5kZXBlbmRlbnQgZnJvbSBlYWNoIG90aGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIHNlc3Npb24ga2V5IGlzIGVuY3J5cHRlZCB1c2luZyBhIGhhcmR3YXJlLWRlcGVuZGVudAora2V5LWVuY3J5cHRpb24ga2V5IHVuaXF1ZSB0byBlYWNoIGRldmljZS4gVGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyBzdG9yZWQKK2luc2lkZSB0aGUgZmlsZSwgYW5kIGl0cyBmaXJzdCBzaXh0ZWVuIGJ5dGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIDxpPm5vbmNlPC9pPgorZm9yIHRoZSBDVFItbW9kZSBlbmNyeXB0aW9uIG9mIHRoZSBjb250ZW50IGRhdGEuPC9wPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNCI+NC4yPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkNhbGN1bGF0aW9uIG9mIHRoZSBDb3VudGVyczwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Vc2luZyBDVFIgKJNjb3VudGVylCkgbW9kZSwgYSBibG9jayBjaXBoZXIgc3VjaCBhcyBBRVMgY2FuCitiZSB0dXJuZWQgaW50byBhIHN0cmVhbSBjaXBoZXIuIFRoZSBwcm9jZXNzIG9mIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gaXMKK3dlbGwgZGVmaW5lZCBpbiBbMV0sIGV4Y2VwdCBmb3IgdGhlIHNwZWNpZmljcyBvZiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCitjb3VudGVycy4gRm9yIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQsIHRoZSBjb3VudGVycyBhcmUKK2NhbGN1bGF0ZWQgYXMgZm9sbG93czo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCitub25jZSBpcyBpbnRlcnByZXRlZCBhcyBhIDEyOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCit6ZXJvLWJhc2VkIGJsb2NrIHNlcXVlbmNlIG51bWJlciAoYWxzbyBhIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlcikgaXMKK2FkZGVkIG1vZHVsbyAyPHN1cD4xMjg8L3N1cD4gdG8gdGhlIG5vbmNlIHRvIHByb2R1Y2UgdGhlIGNvdW50ZXIgZm9yIGEgZ2l2ZW4KK2Jsb2NrLjwvcD4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzUiPjU8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+VW5pdCBUZXN0IENhc2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlVuaXQgdGVzdCBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlciBhbmQgZGVjb2RlciBjb21lIGluIHR3bwordmFyaWV0aWVzOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5CbGFjay1ib3g8L2k+Cit0ZXN0IGNhc2VzIGFpbSB0byB2ZXJpZnkgdGhhdCB5b3UgZ2V0IHNlbnNpYmxlIHJlc3VsdHMgZnJvbSBtYWxmb3JtZWQgb3IKK5N0cmlja3mUIGlucHV0IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPldoaXRlLWJveDwvaT4KK3Rlc3QgY2FzZXMgYWltIHRvIG1heGltaXplIGNvZGUgY292ZXJhZ2UgdXNpbmcga25vd2xlZGdlIG9mIGNvZGUgaW50ZXJuYWxzLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGJsYWNrLWJveCB0ZXN0IGNhc2VzIGFyZSBkZXBlbmRlbnQgb24gYSBzcGVjaWZpY2FsbHkKK2Rlc2lnbmVkIHNldCBvZiBpbnB1dCBmaWxlcyBmb3VuZCBpbiB0aGUgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Zm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC90ZXN0L3Jlczwvc3Bhbj4KK2RpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeS4gRm9yIJF0ZXN0c5IgdmFyaWFudHMgb2YgdGhlIHNvZnR3YXJlLCB0aGVzZSBpbnB1dAorZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gaW1hZ2UgZHVyaW5nIGJ1aWxkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+UnVuIHRoZSB0ZXN0IGNhc2VzIGZyb20gdGhlIEFEQiBzaGVsbCBjb21tYW5kIGxpbmUgYXMKK2ZvbGxvd3M6PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi10b3A6MGNtO21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbTo2LjBwdDsKK21hcmdpbi1sZWZ0OjIxLjU1cHQnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz4jCitndGVzdF9md2Rsb2NrPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgYWxsIGJsYWNrLWJveCBidXQgbm8gd2hpdGUtYm94IHRlc3QgY2FzZXMgZmFpbCwgdGhlCitpbnB1dCBmaWxlcyBwcm9iYWJseSBjYW6SdCBiZSBmb3VuZCBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNiI+NjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5SZWZlcmVuY2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDoyOC45cHQ7dGV4dC1pbmRlbnQ6LTI4LjlwdCc+WzFdPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj48YQoraHJlZj0iaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0zOGEvc3A4MDAtMzhhLnBkZiI+RHdvcmtpbiwKK01vcnJpczogk1JlY29tbWVuZGF0aW9uIGZvciBCbG9jayBDaXBoZXIgTW9kZXMgb2YgT3BlcmF0aW9ul01ldGhvZHMgYW5kCitUZWNobmlxdWVzLJQgTklTVCBTcGVjaWFsIFB1YmxpY2F0aW9uIDgwMC0zOEEsIERlY2VtYmVyIDIwMDEuPC9hPjxhCituYW1lPSJfUmVmMTUxMjY5MDczIj48L2E+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTJmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTFkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODdiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDViNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybXBhc3N0aHJ1cGx1Z2luCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnV0aWxzCisKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKKyMgU2V0IHRoZSBmb2xsb3dpbmcgZmxhZyB0byBlbmFibGUgdGhlIGRlY3J5cHRpb24gcGFzc3RocnUgZmxvdworI0xPQ0FMX0NGTEFHUyArPSAtREVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiY2Q5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9QQVNTVEhSVV9QTFVHSU5fSF9fCisjZGVmaW5lIF9fRFJNX1BBU1NUSFJVX1BMVUdJTl9IX18KKworI2luY2x1ZGUgPERybUVuZ2luZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1QYXNzdGhydVBsdWdJbiA6IHB1YmxpYyBEcm1FbmdpbmVCYXNlIHsKKworcHVibGljOgorICAgIERybVBhc3N0aHJ1UGx1Z0luKCk7CisgICAgdmlydHVhbCB+RHJtUGFzc3RocnVQbHVnSW4oKTsKKworcHJvdGVjdGVkOgorICAgIERybUNvbnN0cmFpbnRzKiBvbkdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogb25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisgICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCBvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpOworCisgICAgYm9vbCBvbkNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgRHJtSW5mb1N0YXR1cyogb25Qcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICBEcm1JbmZvKiBvbkFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KTsKKworICAgIFN0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBpbnQgb25HZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisKKyAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICBib29sIG9uVmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgc3RhdHVzX3Qgb25SZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IG9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisgICAgRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisgICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCk7CisKK3ByaXZhdGU6CisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uSW1wbCgpOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1BBU1NUSFJVX1BMVUdJTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWUxZmRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1QYXNzdGhydVBsdWdJbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1QYXNzdGhydVBsdWdJbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCisvLyBUaGlzIGV4dGVybiAiQyIgaXMgbWFuZGF0b3J5IHRvIGJlIG1hbmFnZWQgYnkgVFBsdWdJbk1hbmFnZXIKK2V4dGVybiAiQyIgSURybUVuZ2luZSogY3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgRHJtUGFzc3RocnVQbHVnSW4oKTsKK30KKworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveShJRHJtRW5naW5lKiBwUGx1Z0luKSB7CisgICAgZGVsZXRlIHBQbHVnSW47CisgICAgcFBsdWdJbiA9IE5VTEw7Cit9CisKK0RybVBhc3N0aHJ1UGx1Z0luOjpEcm1QYXNzdGhydVBsdWdJbigpCisgICAgOiBEcm1FbmdpbmVCYXNlKCkgeworCit9CisKK0RybVBhc3N0aHJ1UGx1Z0luOjp+RHJtUGFzc3RocnVQbHVnSW4oKSB7CisKK30KKworRHJtTWV0YWRhdGEqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIHJldHVybiBOVUxMOworfQorCitEcm1Db25zdHJhaW50cyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0Q29uc3RyYWludHMoCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldENvbnN0cmFpbnRzIEZyb20gUGF0aDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gbmV3IERybUNvbnN0cmFpbnRzKCk7CisKKyAgICBTdHJpbmc4IHZhbHVlKCJkdW1teV9hdmFpbGFibGVfdGltZSIpOworICAgIGNoYXIqIGNoYXJWYWx1ZSA9IE5VTEw7CisgICAgY2hhclZhbHVlID0gbmV3IGNoYXJbdmFsdWUubGVuZ3RoKCkgKyAxXTsKKyAgICBzdHJuY3B5KGNoYXJWYWx1ZSwgdmFsdWUuc3RyaW5nKCksIHZhbHVlLmxlbmd0aCgpKTsKKworICAgIC8vSnVzdCBhZGQgZHVtbXkgYXZhaWxhYmxlIHRpbWUgZm9yIHZlcmlmaWNhdGlvbgorICAgIGRybUNvbnN0cmFpbnRzLT5wdXQoJihEcm1Db25zdHJhaW50czo6TElDRU5TRV9BVkFJTEFCTEVfVElNRSksIGNoYXJWYWx1ZSk7CisKKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybUluZm9TdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvIC0gRW50ZXIgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBEcm1JbmZvU3RhdHVzKiBkcm1JbmZvU3RhdHVzID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSBkcm1JbmZvKSB7CisgICAgICAgIHN3aXRjaCAoZHJtSW5mby0+Z2V0SW5mb1R5cGUoKSkgeworICAgICAgICBjYXNlIERybUluZm9SZXF1ZXN0OjpUWVBFX1JFR0lTVFJBVElPTl9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVtcHR5QnVmZmVyID0gbmV3IERybUJ1ZmZlcigpOworICAgICAgICAgICAgZHJtSW5mb1N0YXR1cyA9IG5ldyBEcm1JbmZvU3RhdHVzKERybUluZm9TdGF0dXM6OlNUQVRVU19PSywKKyAgICAgICAgICAgICAgICAgICAgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfUkVHSVNUUkFUSU9OX0lORk8sIGVtcHR5QnVmZmVyLCBkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTzogeworICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbXB0eUJ1ZmZlciA9IG5ldyBEcm1CdWZmZXIoKTsKKyAgICAgICAgICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cyhEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssCisgICAgICAgICAgICAgICAgICAgIERybUluZm9SZXF1ZXN0OjpUWVBFX1VOUkVHSVNUUkFUSU9OX0lORk8sIGVtcHR5QnVmZmVyLCBkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk86IHsKKyAgICAgICAgICAgIFN0cmluZzggbGljZW5zZVN0cmluZygiZHVtbXlfbGljZW5zZV9zdHJpbmciKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gbGljZW5zZVN0cmluZy5zaXplKCk7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCBsaWNlbnNlU3RyaW5nLnN0cmluZygpLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogYnVmZmVyID0gbmV3IERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cyhEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssCisgICAgICAgICAgICAgICAgICAgIERybUluZm9SZXF1ZXN0OjpUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPLCBidWZmZXIsIGRybUluZm8tPmdldE1pbWVUeXBlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Qcm9jZXNzRHJtSW5mbyAtIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0T25JbmZvTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRPbkluZm9MaXN0ZW5lciA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZSA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25UZXJtaW5hdGUgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1TdXBwb3J0SW5mbyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0U3VwcG9ydEluZm8gOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBEcm1TdXBwb3J0SW5mbyogZHJtU3VwcG9ydEluZm8gPSBuZXcgRHJtU3VwcG9ydEluZm8oKTsKKyAgICAvLyBBZGQgbWltZXR5cGUncworICAgIGRybVN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KCJhcHBsaWNhdGlvbi92bmQucGFzc3RocnUuZHJtIikpOworICAgIC8vIEFkZCBGaWxlIFN1ZmZpeGVzCisgICAgZHJtU3VwcG9ydEluZm8tPmFkZEZpbGVTdWZmaXgoU3RyaW5nOCgiLnBhc3N0aHJ1IikpOworICAgIC8vIEFkZCBwbHVnLWluIGRlc2NyaXB0aW9uCisgICAgZHJtU3VwcG9ydEluZm8tPnNldERlc2NyaXB0aW9uKFN0cmluZzgoIlBhc3N0aHJ1IHBsdWctaW4iKSk7CisgICAgcmV0dXJuIGRybVN1cHBvcnRJbmZvOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNhdmVSaWdodHMgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1JbmZvKiBEcm1QYXNzdGhydVBsdWdJbjo6b25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkFjcXVpcmVEcm1JbmZvIDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtSW5mbyogZHJtSW5mbyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSBkcm1JbmZvUmVxdWVzdCkgeworICAgICAgICBTdHJpbmc4IGRhdGFTdHJpbmcoImR1bW15X2FjcXVpc3Rpb25fc3RyaW5nIik7CisgICAgICAgIGludCBsZW5ndGggPSBkYXRhU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIG1lbWNweShkYXRhLCBkYXRhU3RyaW5nLnN0cmluZygpLCBsZW5ndGgpOworICAgICAgICBkcm1JbmZvID0gbmV3IERybUluZm8oZHJtSW5mb1JlcXVlc3QtPmdldEluZm9UeXBlKCksCisgICAgICAgICAgICBEcm1CdWZmZXIoZGF0YSwgbGVuZ3RoKSwgZHJtSW5mb1JlcXVlc3QtPmdldE1pbWVUeXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworYm9vbCBEcm1QYXNzdGhydVBsdWdJbjo6b25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46OmNhbkhhbmRsZTogJXMgIiwgcGF0aC5zdHJpbmcoKSk7CisgICAgU3RyaW5nOCBleHRlbnNpb24gPSBwYXRoLmdldFBhdGhFeHRlbnNpb24oKTsKKyAgICBleHRlbnNpb24udG9Mb3dlcigpOworICAgIHJldHVybiAoU3RyaW5nOCgiLnBhc3N0aHJ1IikgPT0gZXh0ZW5zaW9uKTsKK30KKworU3RyaW5nOCBEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE9yaWdpbmFsTWltZVR5cGUoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBTdHJpbmc4KCJ2aWRlby9wYXNzdGhydSIpOworfQorCitpbnQgRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXREcm1PYmplY3RUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRHJtT2JqZWN0VHlwZTo6VU5LTk9XTjsKK30KKworaW50IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CisgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitib29sIERybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZUFsbFJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtQnVmZmVyKiBjb252ZXJ0ZWREYXRhID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSAmJiAwIDwgaW5wdXREYXRhLT5sZW5ndGgpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGlucHV0RGF0YS0+bGVuZ3RoOworICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIGNvbnZlcnRlZERhdGEgPSBuZXcgRHJtQnVmZmVyKGRhdGEsIGxlbmd0aCk7CisgICAgICAgIG1lbWNweShjb252ZXJ0ZWREYXRhLT5kYXRhLCBpbnB1dERhdGEtPmRhdGEsIGxlbmd0aCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LLCBjb252ZXJ0ZWREYXRhLCAwIC8qb2Zmc2V0Ki8pOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfT0ssIE5VTEwsIDAgLypvZmZzZXQqLyk7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKworI2lmZGVmIEVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCisgICAgZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUgPSBTdHJpbmc4KCJ2aWRlby9wYXNzdGhydSIpOworICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID0gRGVjcnlwdEFwaVR5cGU6OkVMRU1FTlRBUllfU1RSRUFNX0JBU0VEOworICAgIGRlY3J5cHRIYW5kbGUtPnN0YXR1cyA9IERSTV9OT19FUlJPUjsKKyAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyNlbmRpZgorCisgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgLyoqCisgICAgICogQXMgYSB3b3JrYXJvdW5kIGltcGxlbWVudGF0aW9uIHBhc3N0aHJ1IHdvdWxkIGNvcHkgdGhlIGdpdmVuCisgICAgICogZW5jcnlwdGVkIGJ1ZmZlciBhcyBpdCBpcyB0byBkZWNyeXB0ZWQgYnVmZmVyLiBOb3RlLCBkZWNCdWZmZXIKKyAgICAgKiBtZW1vcnkgaGFzIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgorICAgICAqLworICAgIGlmIChOVUxMICE9ICgqZGVjQnVmZmVyKSAmJiAwIDwgKCpkZWNCdWZmZXIpLT5sZW5ndGgpIHsKKyAgICAgICAgbWVtY3B5KCgqZGVjQnVmZmVyKS0+ZGF0YSwgZW5jQnVmZmVyLT5kYXRhLCBlbmNCdWZmZXItPmxlbmd0aCk7CisgICAgICAgICgqZGVjQnVmZmVyKS0+bGVuZ3RoID0gZW5jQnVmZmVyLT5sZW5ndGg7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IDhhYzJhYTAuLmE1ODdkMGQxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogICAgICAgICAgICAgY2hlY2tSYW5nZSh0ZXhzLmxlbmd0aCwgdGV4T2Zmc2V0LCB2ZXJ0ZXhDb3VudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGVja1JhbmdlKGNvbG9ycy5sZW5ndGgsIGNvbG9yT2Zmc2V0LCB2ZXJ0ZXhDb3VudCk7CisgICAgICAgICAgICBjaGVja1JhbmdlKGNvbG9ycy5sZW5ndGgsIGNvbG9yT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAvIDIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIHsKICAgICAgICAgICAgIGNoZWNrUmFuZ2UoaW5kaWNlcy5sZW5ndGgsIGluZGV4T2Zmc2V0LCBpbmRleENvdW50KTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRlZFJvdGF0ZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQW5pbWF0ZWRSb3RhdGVEcmF3YWJsZS5qYXZhCmluZGV4IDU4MjA2ZDQuLjQ5ZjQ5N2MgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRlZFJvdGF0ZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGVkUm90YXRlRHJhd2FibGUuamF2YQpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgaWYgKG1TdGF0ZS5jYW5Db25zdGFudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgICAgIHJldHVybiBtU3RhdGU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCmluZGV4IDMyMTExZTguLjBiODQ2NWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCkBAIC00MjcsNyArNDI3LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7Ci0gICAgICAgIG1CaXRtYXBTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgbUJpdG1hcFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICByZXR1cm4gbUJpdG1hcFN0YXRlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhCmluZGV4IGE3NzI4NzEuLjJiM2JkODAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9DbGlwRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlLmphdmEKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7CiAgICAgICAgIGlmIChtQ2xpcFN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbUNsaXBTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1DbGlwU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgICAgICByZXR1cm4gbUNsaXBTdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ29sb3JEcmF3YWJsZS5qYXZhCmluZGV4IDYwNGM2MDIuLjA5ODVjMWIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YQpAQCAtMTI0LDcgKzEyNCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewotICAgICAgICBtU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKaW5kZXggYzZmNTdkNC4uYjEzZjI2ZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7CiAgICAgICAgIGlmIChtRHJhd2FibGVDb250YWluZXJTdGF0ZS5jYW5Db25zdGFudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1EcmF3YWJsZUNvbnRhaW5lclN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgICAgICByZXR1cm4gbURyYXdhYmxlQ29udGFpbmVyU3RhdGU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQppbmRleCAzM2VjYmVhLi4zMDhmZDA4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKQEAgLTgzMiw3ICs4MzIsNyBAQAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7Ci0gICAgICAgIG1HcmFkaWVudFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICBtR3JhZGllbnRTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIG1HcmFkaWVudFN0YXRlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9JbnNldERyYXdhYmxlLmphdmEKaW5kZXggYTljOTgzZS4uNjdjOTI4YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvSW5zZXREcmF3YWJsZS5qYXZhCkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobUluc2V0U3RhdGUuY2FuQ29uc3RhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBtSW5zZXRTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1JbnNldFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1JbnNldFN0YXRlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKaW5kZXggODA0N2RkNC4uMjM0YjgwZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCkBAIC01MjMsNyArNTIzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobUxheWVyU3RhdGUuY2FuQ29uc3RhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBtTGF5ZXJTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1MYXllclN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1MYXllclN0YXRlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQppbmRleCAwMDQxNmQ4Li42NzY4MTg2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKLSAgICAgICAgbU5pbmVQYXRjaFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICBtTmluZVBhdGNoU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgIHJldHVybiBtTmluZVBhdGNoU3RhdGU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvUm90YXRlRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCmluZGV4IDljNDdkYWIuLjE0MjhlZmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCkBAIC0xODksNyArMTg5LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobVN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgbVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZS5qYXZhCmluZGV4IGI2MjNkODAuLmE5NWViMDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUuamF2YQpAQCAtMjM3LDcgKzIzNyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgaWYgKG1TY2FsZVN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbVNjYWxlU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgICAgICBtU2NhbGVTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgICAgIHJldHVybiBtU2NhbGVTdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TaGFwZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2hhcGVEcmF3YWJsZS5qYXZhCmluZGV4IGJlMTg5MmUuLjAyMDFmYjAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TaGFwZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGUuamF2YQpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKLSAgICAgICAgbVNoYXBlU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIG1TaGFwZVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICByZXR1cm4gbVNoYXBlU3RhdGU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1Db25zdHJhaW50cy5oIGIvaW5jbHVkZS9kcm0vRHJtQ29uc3RyYWludHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVjOTQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtQ29uc3RyYWludHMuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fQ09OU1RSQUlOVFNfSF9fCisjZGVmaW5lIF9fRFJNX0NPTlNUUkFJTlRTX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgY29uc3RyYWludHMgaW5mb3JtYXRpb24uCisgKgorICogQXMgYSByZXN1bHQgb2YgRHJtTWFuYWdlckNsaWVudDo6Z2V0Q29uc3RyYWludHMoY29uc3QgU3RyaW5nOCosIGNvbnN0IGludCkKKyAqIGFuIGluc3RhbmNlIG9mIERybUNvbnN0cmFpbnRzIHdvdWxkIGJlIHJldHVybmVkLgorICoKKyAqLworY2xhc3MgRHJtQ29uc3RyYWludHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSByZXBsaWNhIG9mIGFuZHJvaWQuZHJtLkRybVN0b3JlLkNvbnN0cmFpbnRzQ29sdW1ucworICAgICAqIEFueSBjaGFuZ2VzIHNob3VsZCBhbHNvIGJlIGluY29ycG9yYXRlZCB3aXRoIEphdmEgTGF5ZXIgYXMgd2VsbAorICAgICAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggcmVwZWF0IGNvdW50CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggTUFYX1JFUEVBVF9DT1VOVDsKKyAgICAvKioKKyAgICAgKiBUaGUgcmVtYWluaW5nIHJlcGVhdCBjb3VudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IFJFTUFJTklOR19SRVBFQVRfQ09VTlQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIHByb3RlY3RlZCBmaWxlIGNhbiBub3QgYmUgcGxheWVkL3ZpZXdlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IExJQ0VOU0VfU1RBUlRfVElNRTsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBwcm90ZWN0ZWQgZmlsZSBjYW4gbm90IGJlIHBsYXllZC92aWV3ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBMSUNFTlNFX0VYUElSWV9USU1FOworCisgICAgLyoqCisgICAgICogVGhlIGF2YWlsYWJsZSB0aW1lIGZvciBsaWNlbnNlCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggTElDRU5TRV9BVkFJTEFCTEVfVElNRTsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHN0cmVhbSBmb3IgZXh0ZW5kZWQgbWV0YWRhdGEKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBFWFRFTkRFRF9NRVRBREFUQTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBrZXkKKyAgICAgKi8KKyAgICBjbGFzcyBLZXlJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1Db25zdHJhaW50czsKKyAgICBwcml2YXRlOgorICAgICAgICBLZXlJdGVyYXRvcihEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMpCisgICAgICAgICAgICA6IG1Ecm1Db25zdHJhaW50cyhkcm1Db25zdHJhaW50cyksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUNvbnN0cmFpbnRzKiBtRHJtQ29uc3RyYWludHM7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBjb25zdHJhaW50cworICAgICAqLworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybUNvbnN0cmFpbnRzOworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cykKKyAgICAgICAgICAgIDogbURybUNvbnN0cmFpbnRzKGRybUNvbnN0cmFpbnRzKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1Db25zdHJhaW50cyogbURybUNvbnN0cmFpbnRzOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICBEcm1Db25zdHJhaW50cygpIHt9CisgICAgdmlydHVhbCB+RHJtQ29uc3RyYWludHMoKSB7CisgICAgICAgIERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBrZXlJdCA9IHRoaXMtPmtleUl0ZXJhdG9yKCk7CisKKyAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSB0aGlzLT5nZXRBc0J5dGVBcnJheSgma2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ29uc3RyYWludE1hcC5jbGVhcigpOworICAgIH0KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc3RyYWludHMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGNvbnN0cmFpbnRzCisgICAgICovCisgICAgaW50IGdldENvdW50KHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQWRkcyBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0ga2V5IEtleSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqIEByZXR1cm4gUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlCisgICAgICovCisgICAgU3RyaW5nOCBnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKKworICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGFzIGJ5dGUgYXJyYXkgb2YgZ2l2ZW4ga2V5CisgICAgICogQHBhcmFtIGtleSBLZXkgd2hvc2UgdmFsdWUgdG8gYmUgcmV0cmlldmVkIGFzIGJ5dGUgYXJyYXkKKyAgICAgKiBAcmV0dXJuIFRoZSBieXRlIGFycmF5IHZhbHVlCisgICAgICovCisgICAgY29uc3QgY2hhciogZ2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgS2V5SXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBLZXlJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKTsKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciogZ2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBjb25zdCBjaGFyKj4gRHJtQ29uc3RyYWludHNNYXA7CisgICAgRHJtQ29uc3RyYWludHNNYXAgbUNvbnN0cmFpbnRNYXA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fQ09OU1RSQUlOVFNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oIGIvaW5jbHVkZS9kcm0vRHJtQ29udmVydGVkU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5ZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fCisjZGVmaW5lIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnZlcnNpb24sIHRoZSBjb252ZXJ0ZWQKKyAqIGRhdGEvY2hlY2tzdW0gZGF0YSBhbmQgdGhlIG9mZnNldC4gT2Zmc2V0IGlzIGdvaW5nIHRvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgY2xvc2UKKyAqIHNlc3Npb24gd2hlcmUgdGhlIGFnZW50IHdpbGwgaW5mb3JtIHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIHNob3VsZCBiZSBhZGRlZAorICoKKyAqIEFzIGEgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OmNvbnZlcnREYXRhKGludCwgY29uc3QgRHJtQnVmZmVyKikgYW5kCisgKiBEcm1NYW5hZ2VyQ2xpZW50OjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCkgYW4gaW5zdGFuY2Ugb2YgRHJtQ29udmVydGVkU3RhdHVzCisgKiB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKi8KK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1cyB7CitwdWJsaWM6CisgICAgLy8gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1Db252ZXJ0ZWRTdGF0dXMuamF2YQorICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX09LID0gMTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19JTlBVVERBVEFfRVJST1IgPSAyOworICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX0VSUk9SID0gMzsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1Db252ZXJ0ZWRTdGF0dXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uCisgICAgICogQHBhcmFtW2luXSBfY29udmVydGVkRGF0YSBDb252ZXJ0ZWQgZGF0YS9jaGVja3N1bSBkYXRhCisgICAgICogQHBhcmFtW2luXSBfb2Zmc2V0IE9mZnNldCB2YWx1ZQorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyhpbnQgX3N0YXR1c0NvZGUsIGNvbnN0IERybUJ1ZmZlciogX2NvbnZlcnRlZERhdGEsIGludCBfb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIERybUNvbnZlcnRlZFN0YXR1cworICAgICAqLworICAgIHZpcnR1YWwgfkRybUNvbnZlcnRlZFN0YXR1cygpIHsKKworICAgIH0KKworcHVibGljOgorICAgIGludCBzdGF0dXNDb2RlOworICAgIGNvbnN0IERybUJ1ZmZlciogY29udmVydGVkRGF0YTsKKyAgICBpbnQgb2Zmc2V0OworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUluZm8uaCBiL2luY2x1ZGUvZHJtL0RybUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ4NTQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mby5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9JTkZPX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyBpbiB3aGljaCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gdHJhbnNhY3QKKyAqIGJldHdlZW4gZGV2aWNlIGFuZCBvbmxpbmUgRFJNIHNlcnZlciBpcyBkZXNjcmliZWQuIERSTSBGcmFtZXdvcmsgYWNoaWV2ZXMKKyAqIHNlcnZlciByZWdpc3RyYXRpb24sIGxpY2Vuc2UgYWNxdWlzaXRpb24gYW5kIGFueSBvdGhlciBzZXJ2ZXIgcmVsYXRlZCB0cmFuc2FjdGlvbgorICogYnkgcGFzc2luZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIERybU1hbmFnZXJDbGllbnQ6OnByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qKS4KKyAqCisgKiBUaGUgQ2FsbGVyIGNhbiByZXRyaWV2ZSB0aGUgRHJtSW5mbyBpbnN0YW5jZSBieSB1c2luZworICogRHJtTWFuYWdlckNsaWVudDo6YWNxdWlyZURybUluZm8oY29uc3QgRHJtSW5mb1JlcXVlc3QqKSBieSBwYXNzaW5nIERybUluZm9SZXF1ZXN0IGluc3RhbmNlLgorICoKKyAqLworY2xhc3MgRHJtSW5mbyB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm8KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtQnVmZmVyIFRyaWdnZXIgZGF0YQorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgRHJtSW5mbyhpbnQgaW5mb1R5cGUsIGNvbnN0IERybUJ1ZmZlciYgZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvCisgICAgICovCisgICAgdmlydHVhbCB+RHJtSW5mbygpIHt9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mbzsKKworICAgIHByaXZhdGU6CisgICAgICAgIEtleUl0ZXJhdG9yKGNvbnN0IERybUluZm8qIGRybUluZm8pCisgICAgICAgICAgICA6IG1Ecm1JbmZvKGNvbnN0X2Nhc3QgPERybUluZm8qPiAoZHJtSW5mbykpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgS2V5SXRlcmF0b3IoY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgS2V5SXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5LZXlJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvKiBtRHJtSW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSXRlcmF0b3IKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1JbmZvOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgRHJtSW5mbyogZHJtSW5mbykKKyAgICAgICAgICAgIDogbURybUluZm8oY29uc3RfY2FzdCA8RHJtSW5mbyo+IChkcm1JbmZvKSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUluZm8qIG1Ecm1JbmZvOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIGludCBnZXRJbmZvVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIFN0cmluZzggZ2V0TWltZVR5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmlnZ2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJpZ2dlciBkYXRhCisgICAgICovCisgICAgY29uc3QgRHJtQnVmZmVyJiBnZXREYXRhKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBpbnQgZ2V0Q291bnQodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0ga2V5IEtleSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXJyb3IgY29kZQorICAgICAqLworICAgIHN0YXR1c190IHB1dChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZQorICAgICAqLworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEtleUl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gS2V5SXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5kZXgKKyAgICAgKi8KKyAgICBpbnQgaW5kZXhPZktleShjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgaW50IG1JbmZvVHlwZTsKKyAgICBEcm1CdWZmZXIgbURhdGE7CisgICAgU3RyaW5nOCBtTWltZVR5cGU7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUF0dHJpYnV0ZXM7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU5GT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmggYi9pbmNsdWRlL2RybS9Ecm1JbmZvRXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQwOWZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lORk9fRVZFTlRfSF9fCisjZGVmaW5lIF9fRFJNX0lORk9fRVZFTlRfSF9fCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3b3VsZCBiZSBwYXNzZWQgdG8gY2FsbGVyIGluCisgKiBEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYpLgorICovCitjbGFzcyBEcm1JbmZvRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb0V2ZW50LmphdmEKKyAgICAgKi8KKyAgICAvLyEgVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5ULCB3aGVuIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbgorICAgIC8vISBhbHJlYWR5IGRvbmUgYnkgYW5vdGhlciBhY2NvdW50IElELgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5UID0gMTsKKyAgICAvLyEgVFlQRV9SRU1PVkVfUklHSFRTLCB3aGVuIHRoZSByaWdodHMgbmVlZHMgdG8gYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9SRU1PVkVfUklHSFRTID0gMjsKKyAgICAvLyEgVFlQRV9SSUdIVFNfSU5TVEFMTEVELCB3aGVuIHRoZSByaWdodHMgYXJlIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZCBvay4KKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX0lOU1RBTExFRCA9IDM7CisgICAgLy8hIFRZUEVfV0FJVF9GT1JfUklHSFRTLCByaWdodHMgb2JqZWN0IGlzIG9uIGl0J3Mgd2F5IHRvIHBob25lLAorICAgIC8vISB3YWl0IGJlZm9yZSBjYWxsaW5nIGNoZWNrUmlnaHRzIGFnYWluCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1dBSVRfRk9SX1JJR0hUUyA9IDQ7CisgICAgLy8hIFRZUEVfQUNDT1VOVF9BTFJFQURZX1JFR0lTVEVSRUQsIHdoZW4gcmVnaXN0cmF0aW9uIGhhcyBiZWVuCisgICAgLy8hIGFscmVhZHkgZG9uZSBmb3IgdGhlIGdpdmVuIGFjY291bnQuCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX0FDQ09VTlRfQUxSRUFEWV9SRUdJU1RFUkVEID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtRXJyb3JFdmVudC5qYXZhCisgICAgICovCisgICAgLy8hIFRZUEVfUklHSFRTX05PVF9JTlNUQUxMRUQsIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zdGFsbGluZyB0aGUgcmlnaHRzCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19OT1RfSU5TVEFMTEVEID0gMjAwMTsKKyAgICAvLyEgVFlQRV9SSUdIVFNfUkVORVdBTF9OT1RfQUxMT1dFRCwgd2hlbiB0aGUgc2VydmVyIHJlamVjdHMgcmVuZXdhbCBvZiByaWdodHMKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX1JFTkVXQUxfTk9UX0FMTE9XRUQgPSAyMDAyOworICAgIC8vISBUWVBFX05PVF9TVVBQT1JURUQsIHdoZW4gYW5zd2VyIGZyb20gc2VydmVyIGNhbiBub3QgYmUgaGFuZGxlZCBieSB0aGUgbmF0aXZlIGFnZW50CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX05PVF9TVVBQT1JURUQgPSAyMDAzOworICAgIC8vISBUWVBFX09VVF9PRl9NRU1PUlksIHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gZmFpbCBkdXJpbmcgcmVuZXdhbC4KKyAgICAvLyEgQ2FuIGluIHRoZSBmdXR1cmUgcGVyaGFwcyBiZSB1c2VkIHRvIHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfT1VUX09GX01FTU9SWSA9IDIwMDQ7CisgICAgLy8hIFRZUEVfTk9fSU5URVJORVRfQ09OTkVDVElPTiwgd2hlbiB0aGUgSW50ZXJuZXQgY29ubmVjdGlvbiBpcyBtaXNzaW5nIGFuZCBubyBhdHRlbXB0CisgICAgLy8hIGNhbiBiZSBtYWRlIHRvIHJlbmV3IHJpZ2h0cworICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9OT19JTlRFUk5FVF9DT05ORUNUSU9OID0gMjAwNTsKKyAgICAvLyEgVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCwgd2hlbiBmYWlsZWQgdG8gcHJvY2VzcyBEcm1JbmZvLgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCA9IDIwMDY7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtSW5mb0V2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW1baW5dIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIERybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvRXZlbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1JbmZvRXZlbnQoKSB7fQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVW5pcXVlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVuaXF1ZSBJZAorICAgICAqLworICAgIGludCBnZXRVbmlxdWVJZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVHlwZSBvZiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqLworICAgIGludCBnZXRUeXBlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBNZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgY29uc3QgU3RyaW5nOCYgZ2V0TWVzc2FnZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludCBtVW5pcXVlSWQ7CisgICAgaW50IG1JbmZvVHlwZTsKKyAgICBjb25zdCBTdHJpbmc4JiBtTWVzc2FnZTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9JTkZPX0VWRU5UX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1JbmZvUmVxdWVzdC5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQ4ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1JlcXVlc3QuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fSU5GT19SRVFVRVNUX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX1JFUVVFU1RfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gcGFzcyByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGdldAorICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjb21tdW5pY2F0ZSB3aXRoIG9ubGluZSBEUk0gc2VydmVyCisgKgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBwYXNzZWQgdG8KKyAqIERybU1hbmFnZXJDbGllbnQ6OmFjcXVpcmVEcm1JbmZvKGNvbnN0IERybUluZm9SZXF1ZXN0KikgdG8gZ2V0IHRoZQorICogaW5zdGFuY2Ugb2YgRHJtSW5mby4KKyAqCisgKi8KK2NsYXNzIERybUluZm9SZXF1ZXN0IHsKK3B1YmxpYzoKKyAgICAvLyBDaGFuZ2VzIGluIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvUmVxdWVzdC5qYXZhCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JFR0lTVFJBVElPTl9JTkZPID0gMTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTyA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPID0gMzsKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX1BST0dSRVNTX0lORk8gPSA0OworCisgICAgLyoqCisgICAgICogS2V5IHRvIHBhc3MgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGFjY291bnQgb3IgdGhlIHVzZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBBQ0NPVU5UX0lEOworICAgIC8qKgorICAgICAqIEtleSB0byBwYXNzIHRoZSBzdWJzY3JpcHRpb24gaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBTVUJTQ1JJUFRJT05fSUQ7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtSW5mb1JlcXVlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgRHJtSW5mb1JlcXVlc3QoaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvUmVxdWVzdAorICAgICAqLworICAgIHZpcnR1YWwgfkRybUluZm9SZXF1ZXN0KCkge30KKworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBrZXkKKyAgICAgKi8KKyAgICBjbGFzcyBLZXlJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1JbmZvUmVxdWVzdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIEtleUl0ZXJhdG9yKGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkKKyAgICAgICAgICAgIDogbURybUluZm9SZXF1ZXN0KGNvbnN0X2Nhc3QgPERybUluZm9SZXF1ZXN0Kj4gKGRybUluZm9SZXF1ZXN0KSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUluZm9SZXF1ZXN0KiBtRHJtSW5mb1JlcXVlc3Q7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yCisgICAgICovCisgICAgY2xhc3MgSXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mb1JlcXVlc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBJdGVyYXRvcihjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpCisgICAgICAgICAgICA6IG1Ecm1JbmZvUmVxdWVzdChjb25zdF9jYXN0IDxEcm1JbmZvUmVxdWVzdCo+IChkcm1JbmZvUmVxdWVzdCkpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvUmVxdWVzdCogbURybUluZm9SZXF1ZXN0OworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIGludCBnZXRJbmZvVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIFN0cmluZzggZ2V0TWltZVR5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBEcm1SZXF1ZXN0SW5mb01hcAorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgZW50cmllcworICAgICAqLworICAgIGludCBnZXRDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFkZHMgb3B0aW9uYWwgaW5mb3JtYXRpb24gYXMgPGtleSwgdmFsdWU+IHBhaXIgdG8gdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBrZXkgS2V5IHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gdmFsdWUgVmFsdWUgdG8gYWRkCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlCisgICAgICovCisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlCisgICAgICovCisgICAgU3RyaW5nOCBnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgS2V5SXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBLZXlJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQgbUluZm9UeXBlOworICAgIFN0cmluZzggbU1pbWVUeXBlOworCisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBEcm1SZXF1ZXN0SW5mb01hcDsKKyAgICBEcm1SZXF1ZXN0SW5mb01hcCBtUmVxdWVzdEluZm9ybWF0aW9uTWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0lORk9fUkVRVUVTVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb1N0YXR1cy5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzBmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1JbmZvU3RhdHVzLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fSU5GT19TVEFUVVNfSF9fCisjZGVmaW5lIF9fRFJNX0lORk9fU1RBVFVTX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgcmVzdWx0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBkZXZpY2UKKyAqIGFuZCBvbmxpbmUgRFJNIHNlcnZlci4KKyAqCisgKiBBcyBhIHJlc3VsdCBvZiBEcm1NYW5hZ2VyQ2xpZW50Ojpwcm9jZXNzRHJtSW5mbyhjb25zdCBEcm1JbmZvKikgYW4gaW5zdGFuY2Ugb2YKKyAqIERybUluZm9TdGF0dXMgd291bGQgYmUgcmV0dXJuZWQuIFRoaXMgY2xhc3MgaG9sZHMgRHJtQnVmZmVyIHdoaWNoIGNvdWxkIGJlCisgKiB1c2VkIHRvIGluc3RhbnRpYXRlIERybVJpZ2h0cyBpbiBsaWNlbnNlIGFjcXVpc2l0aW9uLgorICoKKyAqLworY2xhc3MgRHJtSW5mb1N0YXR1cyB7CitwdWJsaWM6CisgICAgLy8gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvU3RhdHVzLmphdmEKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19PSyA9IDE7CisgICAgc3RhdGljIGNvbnN0IGludCBTVEFUVVNfRVJST1IgPSAyOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm9TdGF0dXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb21tdW5pY2F0aW9uCisgICAgICogQHBhcmFtW2luXSBfaW5mb1R5cGUgVHlwZSBvZiB0aGUgRFJNIGluZm9ybWF0aW9uIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbVtpbl0gX2RybUJ1ZmZlciBSaWdodHMgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIF9taW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBEcm1JbmZvU3RhdHVzKGludCBfc3RhdHVzQ29kZSwgaW50IF9pbmZvVHlwZSwgY29uc3QgRHJtQnVmZmVyKiBfZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBfbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mb1N0YXR1cworICAgICAqLworICAgIHZpcnR1YWwgfkRybUluZm9TdGF0dXMoKSB7CisKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgc3RhdHVzQ29kZTsKKyAgICBpbnQgaW5mb1R5cGU7CisgICAgY29uc3QgRHJtQnVmZmVyKiBkcm1CdWZmZXI7CisgICAgU3RyaW5nOCBtaW1lVHlwZTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9JTkZPX1NUQVRVU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0hfXworI2RlZmluZSBfX0RSTV9NQU5BR0VSX0NMSUVOVF9IX18KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtSW5mbzsKK2NsYXNzIERybVJpZ2h0czsKK2NsYXNzIERybU1ldGFkYXRhOworY2xhc3MgRHJtSW5mb0V2ZW50OworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBEcm1Db25zdHJhaW50czsKK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1czsKK2NsYXNzIERybU1hbmFnZXJDbGllbnRJbXBsOworCisvKioKKyAqIFRoZSBOYXRpdmUgYXBwbGljYXRpb24gd2lsbCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGFuZCBhY2Nlc3MgRFJNIEZyYW1ld29yaworICogc2VydmljZXMgdGhyb3VnaCB0aGlzIGNsYXNzLgorICoKKyAqLworY2xhc3MgRHJtTWFuYWdlckNsaWVudCB7CitwdWJsaWM6CisgICAgRHJtTWFuYWdlckNsaWVudCgpOworCisgICAgdmlydHVhbCB+RHJtTWFuYWdlckNsaWVudCgpOworCitwdWJsaWM6CisgICAgY2xhc3MgT25JbmZvTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UgeworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PbkluZm9MaXN0ZW5lcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgPSAwOworICAgIH07CisKKy8qKgorICogQVBJcyB3aGljaCB3aWxsIGJlIHVzZWQgYnkgbmF0aXZlIG1vZHVsZXMgKGUuZy4gU3RhZ2VGcmlnaHQpCisgKgorICovCitwdWJsaWM6CisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICovCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICovCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICAgICAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgaXMgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0uIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEBwYXJhbVtpbl0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlLgorICAgICAqICAgICBJbiBjYXNlIGxpY2Vuc2UgaGFzIGJlZW4gZXhwaXJlZCwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERSTSBlbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwbGF5YmFja1N0YXR1cyBQbGF5YmFjayBhY3Rpb24gKFBsYXliYWNrOjpTVEFSVCwgUGxheWJhY2s6OlNUT1AsIFBsYXliYWNrOjpQQVVTRSkKKyAgICAgKiBAcGFyYW1baW5dIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgICAgICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJViA9IE5VTEwpOworCisgICAgLyoqCisgICAgICogRmluYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtvdXRdIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgICAgICogQHBhcmFtW2luXSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICAgICAqLworICAgIHNzaXplX3QgcHJlYWQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHBhcmFtW2luXSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKy8qKgorICogQVBJcyB3aGljaCBhcmUganVzdCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEphdmEgQVBJCisgKgorICovCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICAgICAqIHJlY2VpdmUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGluZm9MaXN0ZW5lciBMaXN0ZW5lcgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0T25JbmZvTGlzdGVuZXIoY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICAgICAqICAgICAgICAgICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAgICAgKiBAcmV0dXJuIERybUNvbnN0cmFpbnRzCisgICAgICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgICAgICogICAgICAgICBrZXktdmFsdWUgcGFpcnMgb2YgbWV0YWRhdGEKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIERybU1ldGFkYXRhKiBnZXRNZXRhZGF0YShjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcGFyYW1baW5dIG1pbWV0eXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIFRydWUgaWYgRHJtTWFuYWdlciBjYW4gaGFuZGxlIGdpdmVuIHBhdGggb3IgbWltZSB0eXBlLgorICAgICAqLworICAgIGJvb2wgY2FuSGFuZGxlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIGRybSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBpdHMgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oY29uc3QgRHJtSW5mbyogZHJtSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICAgICAqIGFjcXVpc2l0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAgICAgKiBAcmV0dXJuIERybUluZm8KKyAgICAgKiAgICAgaW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgICAgICogYW5kIG1ha2UgYXNzb2NpYXRpb24gd2l0aCBjb250ZW50IHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNhdmVSaWdodHMoCisgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLCBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIFN0cmluZzgKKyAgICAgKiAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICAgICAqIGJ5IHVzaW5nIHNwZWNpZmllZCBwYXRoIG9yIG1pbWV0eXBlLiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIHNob3VsZCBiZSBub24gbnVsbAorICAgICAqIHRvIHJldHJpZXZlIERSTSBvYmplY3QgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgRHJtT2JqZWN0VHlwZTo6Q09OVEVOVCwgRHJtT2JqZWN0VHlwZTo6UklHSFRTX09CSkVDVAorICAgICAqLworICAgIGludCBnZXREcm1PYmplY3RUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgZm9yIHRoZSBwcm90ZWN0ZWQgY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICAgICAqLworICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIERSTS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIERlc2NyaXB0aW9uL01JTUUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBoYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKi8KKyAgICBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIFBhc3NlcyB0aGUgaW5wdXQgZGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZC4gVGhlIHJlc3VsdGFudAorICAgICAqIGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgLyoqCisgICAgICogV2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQgb3Igd2hlbiBhbgorICAgICAqIGVycm9yIG9jY3VycyB0aGF0IHRpbWUgdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBpbmZvcm0gdGhlIERybSBhZ2VudAorICAgICAqIHZpYSB0aGlzIEFQSS4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCBjb252ZXJ0SWQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBEcm1TdXBwb3J0SW5mbyBpbnN0YW5jZSB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUuCisgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBKTkkgbGF5ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbVtvdXRdIGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZHJtU3VwcG9ydEluZm9BcnJheQorICAgICAqIEBwYXJhbVtvdXRdIGRybVN1cHBvcnRJbmZvQXJyYXkgQXJyYXkgY29udGFpbnMgYWxsIERybVN1cHBvcnRJbmZvCisgICAgICogICAgIHRoYXQgbmF0aXZlIERSTSBmcmFtZXdvcmsgY2FuIGhhbmRsZQorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKK3ByaXZhdGU6CisgICAgaW50IG1VbmlxdWVJZDsKKyAgICBNdXRleCBtRGVjcnlwdExvY2s7CisgICAgRHJtTWFuYWdlckNsaWVudEltcGwqIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX0NMSUVOVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWV0YWRhdGEuaCBiL2luY2x1ZGUvZHJtL0RybU1ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NTM4YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybU1ldGFkYXRhLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01FVEFEQVRBX0hfXworI2RlZmluZSBfX0RSTV9NRVRBREFUQV9IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0cmFpbnRzIGluZm9ybWF0aW9uLgorICoKKyAqIEFzIGEgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OmdldE1ldGFkYXRhKGNvbnN0IFN0cmluZzgqKQorICogYW4gaW5zdGFuY2Ugb2YgRHJtTWV0YWRhdGEgd291bGQgYmUgcmV0dXJuZWQuCisgKi8KK2NsYXNzIERybU1ldGFkYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtTWV0YWRhdGE7CisgICAgcHJpdmF0ZToKKyAgICAgICAgS2V5SXRlcmF0b3IoRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhKSA6IG1Ecm1NZXRhZGF0YShkcm1NZXRhZGF0YSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybU1ldGFkYXRhKiBtRHJtTWV0YWRhdGE7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBjb25zdHJhaW50cworICAgICAqLworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybU1ldGFkYXRhOworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSkgOiBtRHJtTWV0YWRhdGEoZHJtTWV0YWRhdGEpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4IG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybU1ldGFkYXRhKiBtRHJtTWV0YWRhdGE7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworcHVibGljOgorICAgIERybU1ldGFkYXRhKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1NZXRhZGF0YSgpIHsKKyAgICAgICAgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIGtleUl0ID0gdGhpcy0+a2V5SXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gdGhpcy0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHZhbHVlOworICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTWV0YWRhdGFNYXAuY2xlYXIoKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgZ2V0Q291bnQodm9pZCkgY29uc3Q7CisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisgICAgY29uc3QgY2hhciogZ2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpOworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciogZ2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEtleWVkVmVjdG9yPFN0cmluZzgsIGNvbnN0IGNoYXIqPiBEcm1NZXRhZGF0YU1hcDsKKyAgICBEcm1NZXRhZGF0YU1hcCBtTWV0YWRhdGFNYXA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fTUVUQURBVEFfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybVJpZ2h0cy5oIGIvaW5jbHVkZS9kcm0vRHJtUmlnaHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmOGY3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybVJpZ2h0cy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9SSUdIVFNfSF9fCisjZGVmaW5lIF9fRFJNX1JJR0hUU19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gd2hpY2ggd2FzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgb25saW5lIERSTSBzZXJ2ZXIuCisgKgorICogQ2FsbGVyIGNhbiBpbnN0YW50aWF0ZSBEcm1SaWdodHMgYnkgaW52b2tpbmcgRHJtUmlnaHRzKGNvbnN0IERybUJ1ZmZlciYsIFN0cmluZykKKyAqIGNvbnN0cnVjdG9yIGJ5IHVzaW5nIHRoZSByZXN1bHQgb2YgRHJtTWFuYWdlckNsaWVudDo6UHJvY2Vzc0RybUluZm8oY29uc3QgRHJtSW5mbyopIEFQSS4KKyAqIENhbGxlciBjYW4gYWxzbyBpbnN0YW50aWF0ZSBEcm1SaWdodHMgdXNpbmcgdGhlIGZpbGUgcGF0aCB3aGljaCBjb250YWlucyByaWdodHMgaW5mb3JtYXRpb24uCisgKgorICovCitjbGFzcyBEcm1SaWdodHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1SaWdodHMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzRmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKiBAcGFyYW1baW5dIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICogQHBhcmFtW2luXSBzdWJzY3JpcHRpb25JZCBTdWJzY3JpcHRpb24gSWQgb2YgdGhlIHVzZXIKKyAgICAgKi8KKyAgICBEcm1SaWdodHMoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNGaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQgPSBTdHJpbmc4KCJfTk9fVVNFUiIpLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgc3Vic2NyaXB0aW9uSWQgPSBTdHJpbmc4KCIiKSk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtUmlnaHRzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c0RhdGEgUmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqIEBwYXJhbVtpbl0gYWNjb3VudElkIEFjY291bnQgSWQgb2YgdGhlIHVzZXIKKyAgICAgKiBAcGFyYW1baW5dIHN1YnNjcmlwdGlvbklkIFN1YnNjcmlwdGlvbiBJZCBvZiB0aGUgdXNlcgorICAgICAqLworICAgIERybVJpZ2h0cygKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgcmlnaHRzRGF0YSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQgPSBTdHJpbmc4KCJfTk9fVVNFUiIpLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgc3Vic2NyaXB0aW9uSWQgPSBTdHJpbmc4KCIiKSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1SaWdodHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1SaWdodHMoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJpZ2h0cyBkYXRhCisgICAgICovCisgICAgY29uc3QgRHJtQnVmZmVyJiBnZXREYXRhKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTUlNRSB0eXBlCisgICAgICovCisgICAgU3RyaW5nOCBnZXRNaW1lVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjY291bnQtaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjb3VudCBJZAorICAgICAqLworICAgIFN0cmluZzggZ2V0QWNjb3VudElkKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3Vic2NyaXB0aW9uLWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBTdWJzY3JpcHRpb24gSWQKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldFN1YnNjcmlwdGlvbklkKHZvaWQpIGNvbnN0OworCitwcml2YXRlOgorICAgIERybUJ1ZmZlciBtRGF0YTsKKyAgICBTdHJpbmc4IG1NaW1lVHlwZTsKKyAgICBTdHJpbmc4IG1BY2NvdW50SWQ7CisgICAgU3RyaW5nOCBtU3Vic2NyaXB0aW9uSWQ7CisgICAgY2hhciogbVJpZ2h0c0Zyb21GaWxlOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1JJR0hUU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtU3VwcG9ydEluZm8uaCBiL2luY2x1ZGUvZHJtL0RybVN1cHBvcnRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybVN1cHBvcnRJbmZvLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX1NVUFBPUlRfSU5GT19IX18KKyNkZWZpbmUgX19EUk1fU1VQUE9SVF9JTkZPX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgY2FwYWJpbGl0eSBvZiBlYWNoIHBsdWctaW4sCisgKiBzdWNoIGFzIG1pbWV0eXBlJ3MgYW5kIGZpbGUgc3VmZml4ZXMgaXQgY291bGQgaGFuZGxlLgorICoKKyAqIFBsdWctaW4gZGV2ZWxvcGVyIGNvdWxkIHJldHVybiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgcGx1Z2luIGJ5IHBhc3NpbmcKKyAqIERybVN1cHBvcnRJbmZvIGluc3RhbmNlLgorICoKKyAqLworY2xhc3MgRHJtU3VwcG9ydEluZm8geworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBtTWltZVR5cGVWZWN0b3IKKyAgICAgKi8KKyAgICBjbGFzcyBNaW1lVHlwZUl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybVN1cHBvcnRJbmZvOworICAgIHByaXZhdGU6CisgICAgICAgIE1pbWVUeXBlSXRlcmF0b3IoRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvKQorICAgICAgICAgICA6IG1Ecm1TdXBwb3J0SW5mbyhkcm1TdXBwb3J0SW5mbyksIG1JbmRleCgwKSB7fQorICAgIHB1YmxpYzoKKyAgICAgICAgTWltZVR5cGVJdGVyYXRvcihjb25zdCBNaW1lVHlwZUl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIE1pbWVUeXBlSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBNaW1lVHlwZUl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfk1pbWVUeXBlSXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtU3VwcG9ydEluZm8qIG1Ecm1TdXBwb3J0SW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIG1GaWxlU3VmZml4VmVjdG9yCisgICAgICovCisgICAgY2xhc3MgRmlsZVN1ZmZpeEl0ZXJhdG9yIHsKKyAgICAgICBmcmllbmQgY2xhc3MgRHJtU3VwcG9ydEluZm87CisKKyAgICBwcml2YXRlOgorICAgICAgICBGaWxlU3VmZml4SXRlcmF0b3IoRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvKQorICAgICAgICAgICAgOiBtRHJtU3VwcG9ydEluZm8oZHJtU3VwcG9ydEluZm8pLCBtSW5kZXgoMCkge30KKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGVTdWZmaXhJdGVyYXRvcihjb25zdCBGaWxlU3VmZml4SXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgRmlsZVN1ZmZpeEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgRmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdWZmaXhJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1TdXBwb3J0SW5mbyogbURybVN1cHBvcnRJbmZvOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICBEcm1TdXBwb3J0SW5mbygpOworCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICBEcm1TdXBwb3J0SW5mbyhjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1TdXBwb3J0SW5mbygpIHt9CisKKyAgICBEcm1TdXBwb3J0SW5mbyYgb3BlcmF0b3I9KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbyk7CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgRmlsZVN1ZmZpeEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggZmlsZSBzdWZmaXggdmFsdWVzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gRmlsZVN1ZmZpeEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEZpbGVTdWZmaXhJdGVyYXRvciBnZXRGaWxlU3VmZml4SXRlcmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTWltZVR5cGVJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIG1pbWV0eXBlIHZhbHVlcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1pbWVUeXBlSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgTWltZVR5cGVJdGVyYXRvciBnZXRNaW1lVHlwZUl0ZXJhdG9yKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWltZXR5cGVzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIG1pbWV0eXBlcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBpbnQgZ2V0TWltZVR5cGVDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIHR5cGVzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGZpbGUgdHlwZXMgc3VwcG9ydGVkCisgICAgICovCisgICAgaW50IGdldEZpbGVTdWZmaXhDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIG1pbWV0eXBlIHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBtaW1ldHlwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgbWltZXR5cGUgdG8gYmUgYWRkZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGFkZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGZpbGVzdWZmaXggdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgdHlwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZXN1ZmZpeCBmaWxlIHN1ZmZpeCB0byBiZSBhZGRlZAorICAgICAqIEByZXR1cm4gUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgYWRkRmlsZVN1ZmZpeChjb25zdCBTdHJpbmc4JiBmaWxlU3VmZml4KTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdW5pcXVlIGRlc2NyaXB0aW9uIGFib3V0IHRoZSBwbHVnaW4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVzY3JpcHRpb24gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICogQHJldHVybiBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnaW4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgU3RyaW5nOCBnZXREZXNjcmlwdGlvbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGdpdmVuIG1pbWV0eXBlIGlzIHN1cHBvcnRlZCBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICogQHJldHVybgorICAgICAqICAgICAgICB0cnVlIC0gaWYgbWltZS10eXBlIGlzIHN1cHBvcnRlZAorICAgICAqICAgICAgICBmYWxzZSAtIGlmIG1pbWUtdHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICovCisgICAgYm9vbCBpc1N1cHBvcnRlZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBnaXZlbiBmaWxlIHR5cGUgaXMgc3VwcG9ydGVkIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlVHlwZSBGaWxlIHR5cGUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgZmlsZSB0eXBlIGlzIHN1cHBvcnRlZAorICAgICAqICAgICBmYWxzZSBpZiBmaWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIGJvb2wgaXNTdXBwb3J0ZWRGaWxlU3VmZml4KGNvbnN0IFN0cmluZzgmIGZpbGVUeXBlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8U3RyaW5nOD4gbU1pbWVUeXBlVmVjdG9yOworICAgIFZlY3RvcjxTdHJpbmc4PiBtRmlsZVN1ZmZpeFZlY3RvcjsKKworICAgIFN0cmluZzggbURlc2NyaXB0aW9uOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1NVUFBPUlRfSU5GT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaCBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3NjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fCisjZGVmaW5lIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2RlZmluZSBJTlZBTElEX1ZBTFVFIC0xCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBFcnJvciBjb2RlIGZvciBEUk0gRnJhbWVvd3JrCisgKi8KK2VudW0geworICAgIERSTV9FUlJPUl9CQVNFID0gLTIwMDAsCisKKyAgICBEUk1fRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSwKKyAgICBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gMywKKyAgICBEUk1fRVJST1JfREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1LAorCisgICAgRFJNX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTk9fRVJST1IKK307CisKKy8qKgorICogRGVmaW5lcyBEUk0gQnVmZmVyCisgKi8KK2NsYXNzIERybUJ1ZmZlciB7CitwdWJsaWM6CisgICAgY2hhciogZGF0YTsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgRHJtQnVmZmVyKCkgOgorICAgICAgICBkYXRhKE5VTEwpLAorICAgICAgICBsZW5ndGgoMCkgeworICAgIH0KKworICAgIERybUJ1ZmZlcihjaGFyKiBkYXRhQnl0ZXMsIGludCBkYXRhTGVuZ3RoKSA6CisgICAgICAgIGRhdGEoZGF0YUJ5dGVzKSwKKyAgICAgICAgbGVuZ3RoKGRhdGFMZW5ndGgpIHsKKyAgICB9CisKK307CisKKy8qKgorICogRGVmaW5lcyBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgKi8KK2NsYXNzIEFjdGlvbkRlc2NyaXB0aW9uIHsKK3B1YmxpYzoKKyAgICBBY3Rpb25EZXNjcmlwdGlvbihpbnQgX291dHB1dFR5cGUsIGludCBfY29uZmlndXJhdGlvbikgOgorICAgICAgICBvdXRwdXRUeXBlKF9vdXRwdXRUeXBlKSwKKyAgICAgICAgY29uZmlndXJhdGlvbihfY29uZmlndXJhdGlvbikgeworICAgIH0KKworcHVibGljOgorICAgIGludCBvdXRwdXRUeXBlOyAgIC8qIEJMVUVUT09USCAsIEhETUkqLworICAgIGludCBjb25maWd1cmF0aW9uOyAvKiBSRVNPTFVUSU9OXzcyMF80ODAgLCBSRUNPUkRBQkxFIGV0Yy4qLworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIERSTSB0eXBlcworICovCitjbGFzcyBEcm1PYmplY3RUeXBlIHsKK3ByaXZhdGU6CisgICAgRHJtT2JqZWN0VHlwZSgpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSB1bmtub3duIHR5cGUKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAweDAwOworICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgQ09OVEVOVCA9IDB4MDE7CisgICAgLyoqCisgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSByaWdodHMgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19PQkpFQ1QgPSAweDAyOworICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgdHJpZ2dlciBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgVFJJR0dFUl9PQkpFQ1QgPSAweDAzOworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHBsYXkgYmFjaworICovCitjbGFzcyBQbGF5YmFjayB7Citwcml2YXRlOgorICAgIFBsYXliYWNrKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RhcnQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVJUID0gMHgwMDsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RvcAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgU1RPUCA9IDB4MDE7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHBsYXliYWNrIHBhdXNlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUEFVU0UgPSAweDAyOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayByZXN1bWVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSRVNVTUUgPSAweDAzOworfTsKKworLyoqCisgKiBEZWZpbmVzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHByb3RlY3RlZCBjb250ZW50CisgKi8KK2NsYXNzIEFjdGlvbiB7Citwcml2YXRlOgorICAgIEFjdGlvbigpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUID0gMHgwMDsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgcGxheWVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBQTEFZID0gMHgwMTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgc2V0IGFzIHJpbmcgdG9uZQorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklOR1RPTkUgPSAweDAyOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSB0cmFuc2ZlcmVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBUUkFOU0ZFUiA9IDB4MDM7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHNldCBhcyBvdXRwdXQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IE9VVFBVVCA9IDB4MDQ7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgcHJldmlldyBpcyBhbGxvd2VkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBQUkVWSUVXID0gMHgwNTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgZXhlY3V0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IEVYRUNVVEUgPSAweDA2OworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IERJU1BMQVkgPSAweDA3OworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHN0YXR1cyBvZiB0aGUgcmlnaHRzCisgKi8KK2NsYXNzIFJpZ2h0c1N0YXR1cyB7Citwcml2YXRlOgorICAgIFJpZ2h0c1N0YXR1cygpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19WQUxJRCA9IDB4MDA7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgaW52YWxpZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklHSFRTX0lOVkFMSUQgPSAweDAxOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIGV4cGlyZWQgZm9yIHRoZSBjb250ZW50CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSSUdIVFNfRVhQSVJFRCA9IDB4MDI7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgbm90IGFjcXVpcmVkIGZvciB0aGUgY29udGVudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklHSFRTX05PVF9BQ1FVSVJFRCA9IDB4MDM7Cit9OworCisvKioKKyAqIERlZmluZXMgQVBJIHNldCBmb3IgZGVjcnlwdGlvbgorICovCitjbGFzcyBEZWNyeXB0QXBpVHlwZSB7Citwcml2YXRlOgorICAgIERlY3J5cHRBcGlUeXBlKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBEZWNyeXB0IEFQSSBzZXQgZm9yIG5vbiBlbmNyeXB0ZWQgY29udGVudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgTk9OX0VOQ1JZUFRFRCA9IDB4MDA7CisgICAgLyoqCisgICAgICogRGVjcnlwdCBBUEkgc2V0IGZvciBFUyBiYXNlZCBEUk0KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IEVMRU1FTlRBUllfU1RSRUFNX0JBU0VEID0gMHgwMTsKKyAgICAvKioKKyAgICAgKiBQT1NJWCBiYXNlZCBEZWNyeXB0IEFQSSBzZXQgZm9yIGNvbnRhaW5lciBiYXNlZCBEUk0KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IENPTlRBSU5FUl9CQVNFRCA9IDB4MDI7Cit9OworCisvKioKKyAqIERlZmluZXMgZGVjcnlwdGlvbiBpbmZvcm1hdGlvbgorICovCitjbGFzcyBEZWNyeXB0SW5mbyB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogc2l6ZSBvZiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIHRvIGdldCB0aGUgZGVjcnlwdGVkIGNvbnRlbnQuCisgICAgICovCisgICAgaW50IGRlY3J5cHRCdWZmZXJMZW5ndGg7CisgICAgLyoqCisgICAgICogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwdXJwb3NlCisgICAgICovCit9OworCisvKioKKyAqIERlZmluZXMgZGVjcnlwdGlvbiBoYW5kbGUKKyAqLworY2xhc3MgRGVjcnlwdEhhbmRsZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogRGVjcnlwdGlvbiBzZXNzaW9uIEhhbmRsZQorICAgICAqLworICAgIGludCBkZWNyeXB0SWQ7CisgICAgLyoqCisgICAgICogTWltZXR5cGUgb2YgdGhlIGNvbnRlbnQgdG8gYmUgdXNlZCB0byBzZWxlY3QgdGhlIG1lZGlhIGV4dHJhY3RvcgorICAgICAqIEZvciBlLmcuLCAidmlkZW8vbXBlZyIgb3IgImF1ZGlvL21wMyIKKyAgICAgKi8KKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hpY2ggZGVjcnlwdGlvbiBwYXR0ZXJuIHNob3VsZCBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGdpdmVuIGNvbnRlbnQKKyAgICAgKiBEcm1GcmFtZXdvcmsgcHJvdmlkZXMgdHdvIGRpZmZlcmVudCBzZXQgb2YgZGVjcnlwdGlvbiBBUElzLgorICAgICAqICAgMS4gRGVjcnlwdCBBUElzIGZvciBlbGVtZW50YXJ5IHN0cmVhbSBiYXNlZCBEUk0KKyAgICAgKiAgICAgIChmaWxlIGZvcm1hdCBpcyBub3QgZW5jcnlwdGVkIGJ1dCBFUyBpcyBlbmNyeXB0ZWQpCisgICAgICogICAgICAgICBlLmcuLCBNYXJsaW4gRFJNIChNUDQgZmlsZSBmb3JtYXQpLCBXTS1EUk0gKGFzZiBmaWxlIGZvcm1hdCkKKyAgICAgKgorICAgICAqICAgICAgICAgRGVjcnlwdEFwaVR5cGU6OkVMRU1FTlRBUllfU1RSRUFNX0JBU0VECisgICAgICogICAgICAgICAgICAgRGVjcnlwdGlvbiBBUEkgc2V0IGZvciBFUyBiYXNlZCBEUk0KKyAgICAgKiAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURlY3J5cHRVbml0KCksIGRlY3J5cHQoKSwgYW5kIGZpbmFsaXplRGVjcnlwdFVuaXQoKQorICAgICAqICAgMi4gRGVjcnlwdCBBUElzIGZvciBjb250YWluZXIgYmFzZWQgRFJNIChmaWxlIGZvcm1hdCBpdHNlbGYgaXMgZW5jcnlwdGVkKQorICAgICAqICAgICAgICAgZS5nLiwgT01BIERSTSAoZGNmIGZpbGUgZm9ybWF0KQorICAgICAqCisgICAgICogICAgICAgICBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECisgICAgICogICAgICAgICAgICAgUE9TSVggYmFzZWQgRGVjcnlwdGlvbiBBUEkgc2V0IGZvciBjb250YWluZXIgYmFzZWQgRFJNCisgICAgICogICAgICAgICAgICAgICAgIHByZWFkKCkKKyAgICAgKi8KKyAgICBpbnQgZGVjcnlwdEFwaVR5cGU7CisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgbGlrZQorICAgICAqICAgICBSSUdIVFNfVkFMSUQsIFJJR0hUU19JTlZBTElELCBSSUdIVFNfRVhQSVJFRCBvciBSSUdIVFNfTk9UX0FDUVVJUkVECisgICAgICovCisgICAgaW50IHN0YXR1czsKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkZWNyeXB0IGNvbnRlbnQKKyAgICAgKiBlLmcuIHNpemUgb2YgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCB0byBnZXQgdGhlIGRlY3J5cHRlZCBjb250ZW50LgorICAgICAqLworICAgIERlY3J5cHRJbmZvKiBkZWNyeXB0SW5mbzsKKworcHVibGljOgorICAgIERlY3J5cHRIYW5kbGUoKToKKyAgICAgICAgICAgIGRlY3J5cHRJZChJTlZBTElEX1ZBTFVFKSwKKyAgICAgICAgICAgIG1pbWVUeXBlKCIiKSwKKyAgICAgICAgICAgIGRlY3J5cHRBcGlUeXBlKElOVkFMSURfVkFMVUUpLAorICAgICAgICAgICAgc3RhdHVzKElOVkFMSURfVkFMVUUpIHsKKworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlY3J5cHRIYW5kbGUmIGhhbmRsZSkgY29uc3QgeworICAgICAgICByZXR1cm4gKGRlY3J5cHRJZCA8IGhhbmRsZS5kZWNyeXB0SWQpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWNyeXB0SGFuZGxlJiBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChkZWNyeXB0SWQgPT0gaGFuZGxlLmRlY3J5cHRJZCk7CisgICAgfQorfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlLmggYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Y2U3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTdXJmYWNlVGV4dHVyZSB7CisgICAgc3RydWN0IEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHt9OworCisgICAgU3VyZmFjZVRleHR1cmUoR0x1aW50KSB7fQorICAgIHZvaWQgdXBkYXRlVGV4SW1hZ2UoKSB7fQorICAgIHZvaWQgZGVjU3Ryb25nKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2VUZXh0dXJlPiogY29uc3QpIHt9CisgICAgdm9pZCBpbmNTdHJvbmcoYW5kcm9pZDo6c3A8YW5kcm9pZDo6U3VyZmFjZVRleHR1cmU+KiBjb25zdCkge30KKyAgICB2b2lkIGdldFRyYW5zZm9ybU1hdHJpeChmbG9hdCBtdHhbMTZdKSB7fQorICAgIHZvaWQgc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYpIHt9Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEgYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQpjb3B5IHRvIGluY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmgKaW5kZXggODZkZTM2Ni4uYTgzNzU2ZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKKysrIGIvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE4ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKKyNpZm5kZWYgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRUNMSUVOVF9ICiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKKyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIAotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gU1RLIHNlcnZpY2UuCi0gKgotICoge0BoaWRlfQotICovCi1jbGFzcyBTdGtFeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgU3RrRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KK3N0cnVjdCBTdXJmYWNlVGV4dHVyZUNsaWVudCA6IHB1YmxpYyBBTmF0aXZlV2luZG93IHsKKyAgICBTdXJmYWNlVGV4dHVyZUNsaWVudChjb25zdCBzcDxTdXJmYWNlVGV4dHVyZT4mKXt9Cit9OworCiB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAppbmRleCBhM2RhM2VkLi5kMGI5ZmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzMsNiArNzQsMTMgQEAKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNuaWZmZXIoU25pZmZlckZ1bmMgZnVuYyk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKIAorICAgIC8vIGZvciBEUk0KKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKERybU1hbmFnZXJDbGllbnQgKmNsaWVudCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkge307CisKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDhhMjE1ZWEuLjQzMDcyNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsMTUgKzM4LDI5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmX3QgKnNpemUpOwogCisgICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBEcm1Jbml0aWFsaXphdGlvbihEcm1NYW5hZ2VyQ2xpZW50ICpjbGllbnQpOworCisgICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgRklMRSAqbUZpbGU7CisgICAgaW50IG1GZDsKICAgICBpbnQ2NF90IG1PZmZzZXQ7CiAgICAgaW50NjRfdCBtTGVuZ3RoOwogICAgIE11dGV4IG1Mb2NrOwogCisgICAgLypmb3IgRFJNKi8KKyAgICBEZWNyeXB0SGFuZGxlICptRGVjcnlwdEhhbmRsZTsKKyAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKKyAgICBpbnQ2NF90IG1Ecm1CdWZPZmZzZXQ7CisgICAgaW50NjRfdCBtRHJtQnVmU2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOworCisgICAgc3NpemVfdCByZWFkQXREUk0ob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKICAgICBGaWxlU291cmNlKGNvbnN0IEZpbGVTb3VyY2UgJik7CiAgICAgRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEZpbGVTb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IGU0NDEyMmQuLjZkZjRkODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTQwLDYgKzQwLDggQEAKICAgICAvLyBOb3QgdGVjaG5pY2FsbHkgYW4gZXJyb3IuCiAgICAgSU5GT19GT1JNQVRfQ0hBTkdFRCAgICA9IE1FRElBX0VSUk9SX0JBU0UgLSAxMiwKICAgICBJTkZPX0RJU0NPTlRJTlVJVFkgICAgID0gTUVESUFfRVJST1JfQkFTRSAtIDEzLAorCisgICAgRVJST1JfTk9fTElDRU5TRSAgICAgICA9IE1FRElBX0VSUk9SX0JBU0UgLSAxNCwKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKaW5kZXggMTZiMGE0Yy4uYTgyMTA2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtNTUsNiArNTUsMTIgQEAKICAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKIAorICAgIC8vIGZvciBEUk0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RHJtRmxhZyhib29sIGZsYWcpIHt9OworICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICBNZWRpYUV4dHJhY3RvcigpIHt9CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKSB7fQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IGJmZmI5ZTAuLmVhMmZhNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTU4LDYgKzU4LDggQEAKICAgICBrS2V5QnVmZmVySUQgICAgICAgICAgPSAnYmZJRCcsCiAgICAga0tleU1heElucHV0U2l6ZSAgICAgID0gJ2lucFMnLAogICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKKyAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQogCiAgICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZwogICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaCBiL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaAppbmRleCBjOTEzMzU1Li4yY2QwOTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmgKKysrIGIvaW5jbHVkZS91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CiAKKyNkZWZpbmUgTlVNX0ZSQU1FX0JVRkZFUlMgIDIKIAogZXh0ZXJuICJDIiBFR0xOYXRpdmVXaW5kb3dUeXBlIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2Uodm9pZCk7CiAKQEAgLTcyLDcgKzczLDcgQEAKICAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmJEZXY7CiAgICAgYWxsb2NfZGV2aWNlX3QqIGdyRGV2OwogCi0gICAgc3A8TmF0aXZlQnVmZmVyPiBidWZmZXJzWzJdOworICAgIHNwPE5hdGl2ZUJ1ZmZlcj4gYnVmZmVyc1tOVU1fRlJBTUVfQlVGRkVSU107CiAgICAgc3A8TmF0aXZlQnVmZmVyPiBmcm9udDsKICAgICAKICAgICBtdXRhYmxlIE11dGV4IG11dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dC5oIGIvaW5jbHVkZS91aS9JbnB1dC5oCmluZGV4IDhjNjAxOGIuLjRlODA5ZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXQuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0LmgKQEAgLTM4LDYgKzM4LDE1IEBACiAgICAgQUtFWV9FVkVOVF9GTEFHX1NUQVJUX1RSQUNLSU5HID0gMHg0MDAwMDAwMAogfTsKIAorZW51bSB7CisgICAgLyoKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBkZXZpY2UgaGFzIHN3aXRjaGVzLgorICAgICAqIFRoaXMgaW5wdXQgc291cmNlIGZsYWcgaXMgaGlkZGVuIGZyb20gdGhlIEFQSSBiZWNhdXNlIHN3aXRjaGVzIGFyZSBvbmx5IHVzZWQgYnkgdGhlIHN5c3RlbQorICAgICAqIGFuZCBhcHBsaWNhdGlvbnMgaGF2ZSBubyB3YXkgdG8gaW50ZXJhY3Qgd2l0aCB0aGVtLgorICAgICAqLworICAgIEFJTlBVVF9TT1VSQ0VfU1dJVENIID0gMHg4MDAwMDAwMCwKK307CisKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBwb2ludGVycyBzdXBwb3J0ZWQgcGVyIG1vdGlvbiBldmVudC4KICAqIFNtYWxsZXN0IG51bWJlciBvZiBwb2ludGVycyBpcyAxLgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEgYi9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKY29weSB0byBpbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaAppbmRleCA4NmRlMzY2Li41NmE3NTU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQorKysgYi9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE4ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKKyNpZm5kZWYgQU5EUk9JRF9GVU5DVE9SX0gKKyNkZWZpbmUgQU5EUk9JRF9GVU5DVE9SX0gKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOworbmFtZXNwYWNlICBhbmRyb2lkIHsKIAorc3RydWN0IEZ1bmN0b3J7fTsKIAotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gU1RLIHNlcnZpY2UuCi0gKgotICoge0BoaWRlfQotICovCi1jbGFzcyBTdGtFeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgU3RrRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KIH0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oIGIvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKaW5kZXggZGE4NmRhNC4uYWI3Yjk3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKKysrIGIvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKQEAgLTE5ODMsNiArMTk4Myw3IEBACiAKICNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiAgICAgdm9pZCBwcmludChib29sIGluY2xWYWx1ZXMpIGNvbnN0OworICAgIHN0YXRpYyBTdHJpbmc4IG5vcm1hbGl6ZUZvck91dHB1dChjb25zdCBjaGFyKiBpbnB1dCk7CiAjZW5kaWYKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAgYi9saWJzL2JpbmRlci9QYXJjZWwuY3BwCmluZGV4IGYzMjlhYzQuLmQ1N2YyYzkgMTAwNjQ0Ci0tLSBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKKysrIGIvbGlicy9iaW5kZXIvUGFyY2VsLmNwcApAQCAtNjE5LDcgKzYxOSwxMCBAQAogc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cmluZzgoY29uc3QgU3RyaW5nOCYgc3RyKQogewogICAgIHN0YXR1c190IGVyciA9IHdyaXRlSW50MzIoc3RyLmJ5dGVzKCkpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAvLyBvbmx5IHdyaXRlIHN0cmluZyBpZiBpdHMgbGVuZ3RoIGlzIG1vcmUgdGhhbiB6ZXJvIGNoYXJhY3RlcnMsCisgICAgLy8gYXMgcmVhZFN0cmluZzggd2lsbCBvbmx5IHJlYWQgaWYgdGhlIGxlbmd0aCBmaWVsZCBpcyBub24temVyby4KKyAgICAvLyB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGhvdyB3cml0ZVN0cmluZzE2IHdvcmtzLgorICAgIGlmIChzdHIuYnl0ZXMoKSA+IDAgJiYgZXJyID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGVyciA9IHdyaXRlKHN0ci5zdHJpbmcoKSwgc3RyLmJ5dGVzKCkrMSk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcAppbmRleCA3NjRkYzFhLi40YjY3NTg2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyBiL2xpYnMvcnMvcnNOb2lzZS5jcHAKQEAgLTI1Myw0ICsyNTMsNCBAQAogfQogCiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5jcHAgYi9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcAppbmRleCBhMzZkNTU1Li4wNGEwMTk1IDEwMDY0NAotLS0gYS9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcAorKysgYi9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcApAQCAtODMsNiArODMsNyBAQAogICAgIGlmIChod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKSA9PSAwKSB7CiAgICAgICAgIGludCBzdHJpZGU7CiAgICAgICAgIGludCBlcnI7CisgICAgICAgIGludCBpOwogICAgICAgICBlcnIgPSBmcmFtZWJ1ZmZlcl9vcGVuKG1vZHVsZSwgJmZiRGV2KTsKICAgICAgICAgTE9HRV9JRihlcnIsICJjb3VsZG4ndCBvcGVuIGZyYW1lYnVmZmVyIEhBTCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwogICAgICAgICAKQEAgLTk2LDI3ICs5NywzMyBAQAogICAgICAgICBtVXBkYXRlT25EZW1hbmQgPSAoZmJEZXYtPnNldFVwZGF0ZVJlY3QgIT0gMCk7CiAgICAgICAgIAogICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBidWZmZXIgRklGTwotICAgICAgICBtTnVtQnVmZmVycyA9IDI7Ci0gICAgICAgIG1OdW1GcmVlQnVmZmVycyA9IDI7CisgICAgICAgIG1OdW1CdWZmZXJzID0gTlVNX0ZSQU1FX0JVRkZFUlM7CisgICAgICAgIG1OdW1GcmVlQnVmZmVycyA9IE5VTV9GUkFNRV9CVUZGRVJTOwogICAgICAgICBtQnVmZmVySGVhZCA9IG1OdW1CdWZmZXJzLTE7Ci0gICAgICAgIGJ1ZmZlcnNbMF0gPSBuZXcgTmF0aXZlQnVmZmVyKAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgR1JBTExPQ19VU0FHRV9IV19GQik7Ci0gICAgICAgIGJ1ZmZlcnNbMV0gPSBuZXcgTmF0aXZlQnVmZmVyKAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgR1JBTExPQ19VU0FHRV9IV19GQik7Ci0gICAgICAgIAotICAgICAgICBlcnIgPSBnckRldi0+YWxsb2MoZ3JEZXYsCi0gICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LCAKLSAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0ZCLCAmYnVmZmVyc1swXS0+aGFuZGxlLCAmYnVmZmVyc1swXS0+c3RyaWRlKTsKIAotICAgICAgICBMT0dFX0lGKGVyciwgImZiIGJ1ZmZlciAwIGFsbG9jYXRpb24gZmFpbGVkIHc9JWQsIGg9JWQsIGVycj0lcyIsCi0gICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtQnVmZmVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyc1tpXSA9IG5ldyBOYXRpdmVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBmYkRldi0+d2lkdGgsIGZiRGV2LT5oZWlnaHQsIGZiRGV2LT5mb3JtYXQsIEdSQUxMT0NfVVNBR0VfSFdfRkIpOworICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gZ3JEZXYtPmFsbG9jKGdyRGV2LAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgCi0gICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19GQiwgJmJ1ZmZlcnNbMV0tPmhhbmRsZSwgJmJ1ZmZlcnNbMV0tPnN0cmlkZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtQnVmZmVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gZ3JEZXYtPmFsbG9jKGdyRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19GQiwgJmJ1ZmZlcnNbaV0tPmhhbmRsZSwgJmJ1ZmZlcnNbaV0tPnN0cmlkZSk7CiAKLSAgICAgICAgTE9HRV9JRihlcnIsICJmYiBidWZmZXIgMSBhbGxvY2F0aW9uIGZhaWxlZCB3PSVkLCBoPSVkLCBlcnI9JXMiLAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgIExPR0VfSUYoZXJyLCAiZmIgYnVmZmVyICVkIGFsbG9jYXRpb24gZmFpbGVkIHc9JWQsIGg9JWQsIGVycj0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBmYkRldi0+d2lkdGgsIGZiRGV2LT5oZWlnaHQsIHN0cmVycm9yKC1lcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZmZlcnMgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyZWVCdWZmZXJzID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJIZWFkID0gbU51bUJ1ZmZlcnMtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDMyX3QmPihBTmF0aXZlV2luZG93OjpmbGFncykgPSBmYkRldi0+ZmxhZ3M7IAogICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eGRwaSkgPSBmYkRldi0+eGRwaTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXRSZWFkZXIuY3BwIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKaW5kZXggODNiMzgyYi4uMzRlNDRlNCAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKKysrIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKQEAgLTgyNCw3ICs4MjQsNyBAQAogfQogCiB1aW50MzJfdCBTd2l0Y2hJbnB1dE1hcHBlcjo6Z2V0U291cmNlcygpIHsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQUlOUFVUX1NPVVJDRV9TV0lUQ0g7CiB9CiAKIHZvaWQgU3dpdGNoSW5wdXRNYXBwZXI6OnByb2Nlc3MoY29uc3QgUmF3RXZlbnQqIHJhd0V2ZW50KSB7CmRpZmYgLS1naXQgYS9saWJzL3VpL092ZXJsYXkuY3BwIGIvbGlicy91aS9PdmVybGF5LmNwcAppbmRleCAzYWE4OTUwLi5iMDgyYzUzIDEwMDY0NAotLS0gYS9saWJzL3VpL092ZXJsYXkuY3BwCisrKyBiL2xpYnMvdWkvT3ZlcmxheS5jcHAKQEAgLTk2LDcgKzk2LDYgQEAKIH0KIAogdm9pZCBPdmVybGF5OjpkZXN0cm95KCkgeyAgCi0gICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybjsKIAogICAgIC8vIE11c3QgZGVsZXRlIHRoZSBvYmplY3RzIGluIHJldmVyc2UgY3JlYXRpb24gb3JkZXIsIHRodXMgdGhlCiAgICAgLy8gIGRhdGEgc2lkZSBtdXN0IGJlIGNsb3NlZCBmaXJzdCBhbmQgdGhlbiB0aGUgZGVzdHJveSBzZW5kIHRvCkBAIC0xMDQsOSArMTAzLDE1IEBACiAgICAgaWYgKG1PdmVybGF5RGF0YSkgewogICAgICAgICBvdmVybGF5X2RhdGFfY2xvc2UobU92ZXJsYXlEYXRhKTsKICAgICAgICAgbU92ZXJsYXlEYXRhID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJPdmVybGF5OjpkZXN0cm95IG1PdmVybGF5RGF0YSBpcyBOVUxMIik7CiAgICAgfQogCi0gICAgbU92ZXJsYXlSZWYtPm1PdmVybGF5Q2hhbm5lbC0+ZGVzdHJveSgpOworICAgIGlmIChtT3ZlcmxheVJlZiAhPSAwKSB7CisgICAgICAgIG1PdmVybGF5UmVmLT5tT3ZlcmxheUNoYW5uZWwtPmRlc3Ryb3koKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJPdmVybGF5OjpkZXN0cm95IG1PdmVybGF5UmVmIGlzIE5VTEwiKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IE92ZXJsYXk6OmdldFN0YXR1cygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvdGVzdHMvSW5wdXRSZWFkZXJfdGVzdC5jcHAgYi9saWJzL3VpL3Rlc3RzL0lucHV0UmVhZGVyX3Rlc3QuY3BwCmluZGV4IGYzMWE2YmUuLjA5ZDE2ODAgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvdGVzdHMvSW5wdXRSZWFkZXJfdGVzdC5jcHAKKysrIGIvbGlicy91aS90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcApAQCAtMTM2OCw3ICsxMzY4LDcgQEAKICAgICBTd2l0Y2hJbnB1dE1hcHBlciogbWFwcGVyID0gbmV3IFN3aXRjaElucHV0TWFwcGVyKG1EZXZpY2UpOwogICAgIGFkZE1hcHBlckFuZENvbmZpZ3VyZShtYXBwZXIpOwogCi0gICAgQVNTRVJUX0VRKHVpbnQzMl90KDApLCBtYXBwZXItPmdldFNvdXJjZXMoKSk7CisgICAgQVNTRVJUX0VRKHVpbnQzMl90KEFJTlBVVF9TT1VSQ0VfU1dJVENIKSwgbWFwcGVyLT5nZXRTb3VyY2VzKCkpOwogfQogCiBURVNUX0YoU3dpdGNoSW5wdXRNYXBwZXJUZXN0LCBHZXRTd2l0Y2hTdGF0ZSkgewpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggODM0NWNjMy4uN2ZiN2FlMyAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC00MDM4LDYgKzQwMzgsMzggQEAKICAgICB9CiB9CiAKKy8vIE5vcm1hbGl6ZSBhIHN0cmluZyBmb3Igb3V0cHV0CitTdHJpbmc4IFJlc1RhYmxlOjpub3JtYWxpemVGb3JPdXRwdXQoIGNvbnN0IGNoYXIgKmlucHV0ICkKK3sKKyAgICBTdHJpbmc4IHJldDsKKyAgICBjaGFyIGJ1ZmZbMl07CisgICAgYnVmZlsxXSA9ICdcMCc7CisKKyAgICB3aGlsZSAoKmlucHV0ICE9ICdcMCcpIHsKKyAgICAgICAgc3dpdGNoICgqaW5wdXQpIHsKKyAgICAgICAgICAgIC8vIEFsbCBpbnRlcmVzdGluZyBjaGFyYWN0ZXJzIGFyZSBpbiB0aGUgQVNDSUkgem9uZSwgc28gd2UgYXJlIG1ha2luZyBvdXIgb3duIGxpdmVzCisgICAgICAgICAgICAvLyBlYXNpZXIgYnkgc2Nhbm5pbmcgdGhlIHN0cmluZyBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHJldCArPSAiXFxcXCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgcmV0ICs9ICJcXG4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgcmV0ICs9ICJcXFwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnVmZlswXSA9ICppbnB1dDsKKyAgICAgICAgICAgIHJldCArPSBidWZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dCsrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHZvaWQgUmVzVGFibGU6OnByaW50X3ZhbHVlKGNvbnN0IFBhY2thZ2UqIHBrZywgY29uc3QgUmVzX3ZhbHVlJiB2YWx1ZSkgY29uc3QKIHsKICAgICBpZiAodmFsdWUuZGF0YVR5cGUgPT0gUmVzX3ZhbHVlOjpUWVBFX05VTEwpIHsKQEAgLTQwNTEsMTMgKzQwODMsMTMgQEAKICAgICAgICAgY29uc3QgY2hhciogc3RyOCA9IHBrZy0+aGVhZGVyLT52YWx1ZXMuc3RyaW5nOEF0KAogICAgICAgICAgICAgICAgIHZhbHVlLmRhdGEsICZsZW4pOwogICAgICAgICBpZiAoc3RyOCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwcmludGYoIihzdHJpbmc4KSBcIiVzXCJcbiIsIHN0cjgpOworICAgICAgICAgICAgcHJpbnRmKCIoc3RyaW5nOCkgXCIlc1wiXG4iLCBub3JtYWxpemVGb3JPdXRwdXQoc3RyOCkuc3RyaW5nKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29uc3QgY2hhcjE2X3QqIHN0cjE2ID0gcGtnLT5oZWFkZXItPnZhbHVlcy5zdHJpbmdBdCgKICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZGF0YSwgJmxlbik7CiAgICAgICAgICAgICBpZiAoc3RyMTYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHByaW50ZigiKHN0cmluZzE2KSBcIiVzXCJcbiIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc3RyMTYsIGxlbikuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVGb3JPdXRwdXQoU3RyaW5nOChzdHIxNiwgbGVuKS5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwcmludGYoIihzdHJpbmcpIG51bGxcbiIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9HcHNOZXRJbml0aWF0ZWRIYW5kbGVyLmphdmEgYi9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQppbmRleCBkM2E3MWIzLi5mZmMzMzQ2IDEwMDc1NQotLS0gYS9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQorKysgYi9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQpAQCAtMjgsNiArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKKwogLyoqCiAgKiBBIEdQUyBOZXR3b3JrLWluaXRpYXRlZCBIYW5kbGVyIGNsYXNzIHVzZWQgYnkgTG9jYXRpb25NYW5hZ2VyLgogICoKQEAgLTE4Miw4ICsxODUsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0Tm90aWZUaXRsZShub3RpZik7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0Tm90aWZNZXNzYWdlKG5vdGlmKTsKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0Tm90aWZUaXRsZShub3RpZiwgbUNvbnRleHQpOworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGdldE5vdGlmTWVzc2FnZShub3RpZiwgbUNvbnRleHQpOwogCiAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0TmlOb3RpZmljYXRpb24sIG5vdGlmeUlkOiAiICsgbm90aWYubm90aWZpY2F0aW9uSWQgKwogICAgICAgICAgICAgICAgICIsIHRpdGxlOiAiICsgdGl0bGUgKwpAQCAtMjAzLDcgKzIwNiw3IEBACiAgICAgICAgIH0gICAgICAgIAogCiAgICAgICAgIG1OaU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQ7Ci0gICAgICAgIG1OaU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gZ2V0Tm90aWZUaWNrZXIobm90aWYpOworICAgICAgICBtTmlOb3RpZmljYXRpb24udGlja2VyVGV4dCA9IGdldE5vdGlmVGlja2VyKG5vdGlmLCBtQ29udGV4dCk7CiAKICAgICAgICAgLy8gaWYgbm90IHRvIHBvcHVwIGRpYWxvZyBpbW1lZGlhdGVseSwgcGVuZGluZyBpbnRlbnQgd2lsbCBvcGVuIHRoZSBkaWFsb2cKICAgICAgICAgSW50ZW50IGludGVudCA9ICFtUG9wdXBJbW1lZGlhdGVseSA/IGdldERsZ0ludGVudChub3RpZikgOiBuZXcgSW50ZW50KCk7CkBAIC0yMzQsOCArMjM3LDggQEAKICAgICBwcml2YXRlIEludGVudCBnZXREbGdJbnRlbnQoR3BzTmlOb3RpZmljYXRpb24gbm90aWYpCiAgICAgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBnZXREaWFsb2dUaXRsZShub3RpZik7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0RGlhbG9nTWVzc2FnZShub3RpZik7CisgICAgICAgIFN0cmluZyB0aXRsZSA9IGdldERpYWxvZ1RpdGxlKG5vdGlmLCBtQ29udGV4dCk7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0RGlhbG9nTWVzc2FnZShub3RpZiwgbUNvbnRleHQpOwogCiAgICAgICAgIC8vIGRpcmVjdGx5IGJyaW5nIHVwIHRoZSBOSSBhY3Rpdml0eQogICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwpAQCAtMjg2LDU4ICsyODksMzIgQEAKICAgICAgKi8KICAgICBzdGF0aWMgU3RyaW5nIGRlY29kZUdTTVBhY2tlZFN0cmluZyhieXRlW10gaW5wdXQpCiAgICAgewotICAgICAgICBmaW5hbCBjaGFyIENIQVJfQ1IgPSAweDBEOwotICAgICAgICBpbnQgblN0cmlkeCA9IDA7Ci0gICAgICAgIGludCBuUGNraWR4ID0gMDsKLSAgICAgICAgaW50IG51bV9ieXRlcyA9IGlucHV0Lmxlbmd0aDsKLSAgICAgICAgaW50IGNQcmV2ID0gMDsKLSAgICAgICAgaW50IGNDdXJyID0gMDsKLSAgICAgICAgYnl0ZSBuU2hpZnQ7Ci0gICAgICAgIGJ5dGUgbmV4dENoYXI7Ci0gICAgICAgIGJ5dGVbXSBzdHJpbmdCdWYgPSBuZXcgYnl0ZVtpbnB1dC5sZW5ndGggKiAyXTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICBmaW5hbCBjaGFyIFBBRERJTkdfQ0hBUiA9IDB4MDA7CisgICAgICAgIGludCBsZW5ndGhCeXRlcyA9IGlucHV0Lmxlbmd0aDsKKyAgICAgICAgaW50IGxlbmd0aFNlcHRldHMgPSAobGVuZ3RoQnl0ZXMgKiA4KSAvIDc7CisgICAgICAgIFN0cmluZyBkZWNvZGVkOwogCi0gICAgICAgIHdoaWxlKG5QY2tpZHggPCBudW1fYnl0ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5TaGlmdCA9IChieXRlKSAoblN0cmlkeCAmIDB4MDcpOwotICAgICAgICAgICAgY0N1cnIgPSBpbnB1dFtuUGNraWR4KytdOwotICAgICAgICAgICAgaWYgKGNDdXJyIDwgMCkgY0N1cnIgKz0gMjU2OwotCi0gICAgICAgICAgICAvKiBBIDctYml0IGNoYXJhY3RlciBjYW4gYmUgc3BsaXQgYXQgdGhlIG1vc3QgYmV0d2VlbiB0d28gYnl0ZXMgb2YgcGFja2VkCi0gICAgICAgICAgICAgKiogZGF0YS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbmV4dENoYXIgPSAoYnl0ZSkgKCggKGNDdXJyIDw8IG5TaGlmdCkgfCAoY1ByZXYgPj4gKDgtblNoaWZ0KSkgKSAmIDB4N0YpOwotICAgICAgICAgICAgc3RyaW5nQnVmW25TdHJpZHgrK10gPSBuZXh0Q2hhcjsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIHdoZXJlIHRoZSB3aG9sZSBvZiB0aGUgbmV4dCA3LWJpdCBjaGFyYWN0ZXIgZml0cyBpbnNpZGUKLSAgICAgICAgICAgICAqKiB0aGUgY3VycmVudCBieXRlIG9mIHBhY2tlZCBkYXRhLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihuU2hpZnQgPT0gNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgbmV4dCA3LWJpdCBjaGFyYWN0ZXIgaXMgYSBDUiAoMHgwRCkgYW5kIGl0IGlzIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICoqIGNoYXJhY3RlciwgdGhlbiBpdCBpbmRpY2F0ZXMgYSBwYWRkaW5nIGNoYXJhY3Rlci4gRHJvcCBpdC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoblBja2lkeCA9PSBudW1fYnl0ZXMgfHwgKGNDdXJyID4+IDEpID09IENIQVJfQ1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBsYXN0IDcgYml0cyBpbiB0aGUgbGFzdCBieXRlIGNvdWxkIGhvbGQgYSB2YWxpZAorICAgICAgICAgKiA3LWJpdCBjaGFyYWN0ZXIgb3IgYSBwYWRkaW5nIGNoYXJhY3Rlci4gRHJvcCB0aGUgbGFzdCA3LWJpdCBjaGFyYWN0ZXIKKyAgICAgICAgICogaWYgaXQgaXMgYSBwYWRkaW5nIGNoYXJhY3Rlci4KKyAgICAgICAgICovCisgICAgICAgIGlmIChsZW5ndGhCeXRlcyAlIDcgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aEJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgoaW5wdXRbbGVuZ3RoQnl0ZXMgLSAxXSA+PiAxKSA9PSBQQURESU5HX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoU2VwdGV0cyA9IGxlbmd0aFNlcHRldHMgLSAxOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5leHRDaGFyID0gKGJ5dGUpIChjQ3VyciA+PiAxKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCdWZbblN0cmlkeCsrXSA9IG5leHRDaGFyOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjUHJldiA9IGNDdXJyOwogICAgICAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmcoc3RyaW5nQnVmLCAwLCBuU3RyaWR4LCAiVVMtQVNDSUkiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgZGVjb2RlZCA9IEdzbUFscGhhYmV0LmdzbTdCaXRQYWNrZWRUb1N0cmluZyhpbnB1dCwgMCwgbGVuZ3RoU2VwdGV0cyk7CisKKyAgICAgICAgLy8gUmV0dXJuICIiIGlmIGRlY29kaW5nIG9mIEdTTSBwYWNrZWQgc3RyaW5nIGZhaWxzCisgICAgICAgIGlmIChudWxsID09IGRlY29kZWQpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRlY29kaW5nIG9mIEdTTSBwYWNrZWQgc3RyaW5nIGZhaWxlZCIpOworICAgICAgICAgICAgZGVjb2RlZCA9ICIiOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgfQogCiAgICAgc3RhdGljIFN0cmluZyBkZWNvZGVVVEY4U3RyaW5nKGJ5dGVbXSBpbnB1dCkKQEAgLTQxMiw0MSArMzg5LDQwIEBACiAgICAgfQogCiAgICAgLy8gY2hhbmdlIHRoaXMgdG8gY29uZmlndXJlIG5vdGlmaWNhdGlvbiBkaXNwbGF5Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldE5vdGlmVGlja2VyKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmKQorICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXROb3RpZlRpY2tlcihHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHRpY2tlciA9IFN0cmluZy5mb3JtYXQoIlBvc2l0aW9uIHJlcXVlc3QhIFJlcUlkOiBbJXNdIENsaWVudE5hbWU6IFslc10iLAorICAgICAgICBTdHJpbmcgdGlja2VyID0gU3RyaW5nLmZvcm1hdChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ncHNOb3RpZlRpY2tlciksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnJlcXVlc3RvcklkLCBtSXNIZXhJbnB1dCwgbm90aWYucmVxdWVzdG9ySWRFbmNvZGluZyksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnRleHQsIG1Jc0hleElucHV0LCBub3RpZi50ZXh0RW5jb2RpbmcpKTsKICAgICAgICAgcmV0dXJuIHRpY2tlcjsKICAgICB9CiAKICAgICAvLyBjaGFuZ2UgdGhpcyB0byBjb25maWd1cmUgbm90aWZpY2F0aW9uIGRpc3BsYXkKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90aWZUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZikKKyAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90aWZUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gU3RyaW5nLmZvcm1hdCgiUG9zaXRpb24gUmVxdWVzdCIpOworICAgICAgICBTdHJpbmcgdGl0bGUgPSBTdHJpbmcuZm9ybWF0KGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmdwc05vdGlmVGl0bGUpKTsKICAgICAgICAgcmV0dXJuIHRpdGxlOwogICAgIH0KIAogICAgIC8vIGNoYW5nZSB0aGlzIHRvIGNvbmZpZ3VyZSBub3RpZmljYXRpb24gZGlzcGxheQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXROb3RpZk1lc3NhZ2UoR3BzTmlOb3RpZmljYXRpb24gbm90aWYpCisgICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldE5vdGlmTWVzc2FnZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICJOSSBSZXF1ZXN0IHJlY2VpdmVkIGZyb20gWyVzXSBmb3IgY2xpZW50IFslc10hIiwKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmdwc05vdGlmTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnJlcXVlc3RvcklkLCBtSXNIZXhJbnB1dCwgbm90aWYucmVxdWVzdG9ySWRFbmNvZGluZyksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnRleHQsIG1Jc0hleElucHV0LCBub3RpZi50ZXh0RW5jb2RpbmcpKTsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgfSAgICAgICAKIAogICAgIC8vIGNoYW5nZSB0aGlzIHRvIGNvbmZpZ3VyZSBkaWFsb2cgZGlzcGxheSAoZm9yIHZlcmlmaWNhdGlvbikKLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXREaWFsb2dUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZikKKyAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXREaWFsb2dUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE5vdGlmVGl0bGUobm90aWYpOworICAgICAgICByZXR1cm4gZ2V0Tm90aWZUaXRsZShub3RpZiwgY29udGV4dCk7CiAgICAgfQogCiAgICAgLy8gY2hhbmdlIHRoaXMgdG8gY29uZmlndXJlIGRpYWxvZyBkaXNwbGF5IChmb3IgdmVyaWZpY2F0aW9uKQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmKQorICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmLCBDb250ZXh0IGNvbnRleHQpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Tm90aWZNZXNzYWdlKG5vdGlmKTsKKyAgICAgICAgcmV0dXJuIGdldE5vdGlmTWVzc2FnZShub3RpZiwgY29udGV4dCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCBkOWYyMzAyLi40ZTg3YzczIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICAgICAgZGVncmVlcyAhPSAyNzApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGFuZ2xlOiAiICsgZGVncmVlcyk7CiAgICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLXBhcmFtLXJvdGF0aW9uLWFuZ2xlLWRlZ3JlZXM9JWQiLCBkZWdyZWVzKSk7CisgICAgICAgIHNldFBhcmFtZXRlcigidmlkZW8tcGFyYW0tcm90YXRpb24tYW5nbGUtZGVncmVlcz0iICsgZGVncmVlcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzUsNyArNDM1LDcgQEAKICAgICAgICAgaWYgKHNhbXBsaW5nUmF0ZSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdWRpbyBzYW1wbGluZyByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1zYW1wbGluZy1yYXRlPSVkIiwgc2FtcGxpbmdSYXRlKSk7CisgICAgICAgIHNldFBhcmFtZXRlcigiYXVkaW8tcGFyYW0tc2FtcGxpbmctcmF0ZT0iICsgc2FtcGxpbmdSYXRlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPD0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1udW1iZXItb2YtY2hhbm5lbHM9JWQiLCBudW1DaGFubmVscykpOworICAgICAgICBzZXRQYXJhbWV0ZXIoImF1ZGlvLXBhcmFtLW51bWJlci1vZi1jaGFubmVscz0iICsgbnVtQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDY2LDcgKzQ2Niw3IEBACiAgICAgICAgIGlmIChiaXRSYXRlIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF1ZGlvIGVuY29kaW5nIGJpdCByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgYml0UmF0ZSkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoImF1ZGlvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGU9IiArIGJpdFJhdGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDgyLDcgKzQ4Miw3IEBACiAgICAgICAgIGlmIChiaXRSYXRlIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZpZGVvIGVuY29kaW5nIGJpdCByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgYml0UmF0ZSkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoInZpZGVvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGU9IiArIGJpdFJhdGUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCmluZGV4IDQ3ZTEwNTguLmFiMmM2ZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKQEAgLTEyMjAsOCArMTIyMCwxMiBAQAogICAgICAgICAgICAgcHJlc2NhbihwYXRoKTsKIAogICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisKKyAgICAgICAgICAgIC8vIGxhc3RNb2RpZmllZCBpcyBpbiBtaWxsaXNlY29uZHMgb24gRmlsZXMuCisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZFNlY29uZHMgPSBmaWxlLmxhc3RNb2RpZmllZCgpIC8gMTAwMDsKKwogICAgICAgICAgICAgLy8gYWx3YXlzIHNjYW4gdGhlIGZpbGUsIHNvIHdlIGNhbiByZXR1cm4gdGhlIGNvbnRlbnQ6Ly9tZWRpYSBVcmkgZm9yIGV4aXN0aW5nIGZpbGVzCi0gICAgICAgICAgICByZXR1cm4gbUNsaWVudC5kb1NjYW5GaWxlKHBhdGgsIG1pbWVUeXBlLCBmaWxlLmxhc3RNb2RpZmllZCgpLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBtQ2xpZW50LmRvU2NhbkZpbGUocGF0aCwgbWltZVR5cGUsIGxhc3RNb2RpZmllZFNlY29uZHMsIGZpbGUubGVuZ3RoKCksIHRydWUpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIE1lZGlhU2Nhbm5lci5zY2FuRmlsZSgpIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCmluZGV4IDZmNTgxZDMuLmM1MTEyYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtODEsMTMgKzgxLDEzIEBACiB9CiAKIHN0YXRpYyBib29sIGZpbGVNYXRjaGVzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKLSAgICBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7CisgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOwogICAgIGlmICghZXh0ZW5zaW9uKSByZXR1cm4gZmFsc2U7CiAgICAgKytleHRlbnNpb247ICAgIC8vIHNraXAgdGhlIGRvdAogICAgIGlmIChleHRlbnNpb25bMF0gPT0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgd2hpbGUgKGV4dGVuc2lvbnNbMF0pIHsKLSAgICAgICAgY2hhciogY29tbWEgPSBzdHJjaHIoZXh0ZW5zaW9ucywgJywnKTsKKyAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoZXh0ZW5zaW9ucywgJywnKTsKICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IChjb21tYSA/IGNvbW1hIC0gZXh0ZW5zaW9ucyA6IHN0cmxlbihleHRlbnNpb25zKSk7CiAgICAgICAgIGlmIChsZW5ndGggPT0gc3RybGVuKGV4dGVuc2lvbikgJiYgc3RybmNhc2VjbXAoZXh0ZW5zaW9uLCBleHRlbnNpb25zLCBsZW5ndGgpID09IDApIHJldHVybiB0cnVlOwogICAgICAgICBleHRlbnNpb25zICs9IGxlbmd0aDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDYxNWYzZTguLmQ2NzQ1NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTEsNiArMTEsNyBAQAogICAgICAgICBBd2Vzb21lUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgXAogICAgICAgICBDYW1lcmFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBEYXRhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEUk1FeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBFU0RTLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBGaWxlU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBIVFRQU3RyZWFtLmNwcCAgICAgICAgICAgICAgICAgICAgXApAQCAtNTksNyArNjAsOCBAQAogICAgICAgICBsaWJzb25pdm94ICAgICAgICBcCiAgICAgICAgIGxpYnZvcmJpc2lkZWMgICAgIFwKICAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKLSAgICAgICAgbGliY2FtZXJhX2NsaWVudAorICAgICAgICBsaWJjYW1lcmFfY2xpZW50IFwKKyAgICAgICAgbGliZHJtZnJhbWV3b3JrCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNkZWMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCBkOTk5OTBiLi42ZGM2MWM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMjQ3LDcgKzI0Nyw4IEBACiAgICAgICBtRXh0cmFjdG9yRmxhZ3MoMCksCiAgICAgICBtTGFzdFZpZGVvQnVmZmVyKE5VTEwpLAogICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAotICAgICAgbVN1c3BlbnNpb25TdGF0ZShOVUxMKSB7CisgICAgICBtU3VzcGVuc2lvblN0YXRlKE5VTEwpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCkgewogICAgIENIRUNLX0VRKG1DbGllbnQuY29ubmVjdCgpLCBPSyk7CiAKICAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwpAQCAtMzQ2LDYgKzM0NywxMiBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKCZtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTAorICAgICAgICAgICAgJiYgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBFUlJPUl9OT19MSUNFTlNFKTsKKyAgICB9CisKICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CiB9CiAKQEAgLTQyMSw2ICs0MjgsMTMgQEAKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpyZXNldF9sKCkgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVE9QLCAwKTsKKyAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7CiAgICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKICAgICAgICAgaWYgKG1Db25uZWN0aW5nRGF0YVNvdXJjZSAhPSBOVUxMKSB7CkBAIC03NjEsNiArNzc1LDEzIEBACiAKICAgICBib29sIGRlZmVycmVkQXVkaW9TZWVrID0gZmFsc2U7CiAKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgICAgICBnZXRQb3NpdGlvbigmcG9zaXRpb24pOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlNUQVJULCBwb3NpdGlvbiAvIDEwMDApOworICAgIH0KKwogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKQEAgLTc3OCw2ICs3OTksMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOwogCisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTA1LDYgKzkzMSwxMSBAQAogCiAgICAgbUZsYWdzICY9IH5QTEFZSU5HOwogCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMDIyLDYgKzEwNTMsMTMgQEAKICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7CiAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOworCisgICAgICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVEFSVCwgbVNlZWtUaW1lVXMgLyAxMDAwKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTI1NCw2ICsxMjkyLDEzIEBACiAKICAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7CiAKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVEFSVCwgdGltZVVzIC8gMTAwMCk7CisgICAgfQorCiAgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7CiAgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7CiAKQEAgLTE2NjUsNiArMTcxMCwxMiBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKCZtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTAorICAgICAgICAgICAgJiYgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBFUlJPUl9OT19MSUNFTlNFKTsKKyAgICB9CisKICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWFkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9BTVJFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL01QM0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0RybU1hbmFnZXJDbGllbnQqIGdEcm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKworY2xhc3MgRFJNU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICBEUk1Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZtZWRpYVNvdXJjZSwKKyAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludDMyX3QgdHJhY2tJZCwgRHJtQnVmZmVyKiBpcG1wQm94KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RFJNU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8TWVkaWFTb3VyY2U+IG1PcmlnaW5hbE1lZGlhU291cmNlOworICAgIERlY3J5cHRIYW5kbGUqIG1EZWNyeXB0SGFuZGxlOworICAgIHNpemVfdCBtVHJhY2tJZDsKKyAgICBtdXRhYmxlIE11dGV4IG1EUk1Mb2NrOworICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKKyAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKworICAgIERSTVNvdXJjZShjb25zdCBEUk1Tb3VyY2UgJik7CisgICAgRFJNU291cmNlICZvcGVyYXRvcj0oY29uc3QgRFJNU291cmNlICYpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRFJNU291cmNlOjpEUk1Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZtZWRpYVNvdXJjZSwKKyAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50MzJfdCB0cmFja0lkLCBEcm1CdWZmZXIqIGlwbXBCb3gpCisgICAgOiBtT3JpZ2luYWxNZWRpYVNvdXJjZShtZWRpYVNvdXJjZSksCisgICAgICBtRGVjcnlwdEhhbmRsZShkZWNyeXB0SGFuZGxlKSwKKyAgICAgIG1UcmFja0lkKHRyYWNrSWQpLAorICAgICAgbU5BTExlbmd0aFNpemUoMCksCisgICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpIHsKKyAgICBnRHJtTWFuYWdlckNsaWVudC0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgbURlY3J5cHRIYW5kbGUsIHRyYWNrSWQsIGlwbXBCb3gpOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBnZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgQ0hFQ0soZ2V0Rm9ybWF0KCktPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIENIRUNLKHNpemUgPj0gNyk7CisgICAgICAgIENIRUNLX0VRKHB0clswXSwgMSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCisgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICB9Cit9CisKK0RSTVNvdXJjZTo6fkRSTVNvdXJjZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURSTUxvY2spOworICAgIGdEcm1NYW5hZ2VyQ2xpZW50LT5maW5hbGl6ZURlY3J5cHRVbml0KG1EZWNyeXB0SGFuZGxlLCBtVHJhY2tJZCk7Cit9CisKK3N0YXR1c190IERSTVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGludDMyX3QgdmFsOworICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQorICAgICAgICAmJiB2YWwgIT0gMCkgeworICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOworICAgIH0KKworICAgcmV0dXJuIG1PcmlnaW5hbE1lZGlhU291cmNlLT5zdGFydChwYXJhbXMpOworfQorCitzdGF0dXNfdCBEUk1Tb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1PcmlnaW5hbE1lZGlhU291cmNlLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBEUk1Tb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbU9yaWdpbmFsTWVkaWFTb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBEUk1Tb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EUk1Mb2NrKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBtT3JpZ2luYWxNZWRpYVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNpemVfdCBsZW4gPSAoKmJ1ZmZlciktPnJhbmdlX2xlbmd0aCgpOworCisgICAgY2hhciAqc3JjID0gKGNoYXIgKikoKmJ1ZmZlciktPmRhdGEoKSArICgqYnVmZmVyKS0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBEcm1CdWZmZXIgZW5jcnlwdGVkRHJtQnVmZmVyKHNyYywgbGVuKTsKKyAgICBEcm1CdWZmZXIgZGVjcnlwdGVkRHJtQnVmZmVyOworICAgIGRlY3J5cHRlZERybUJ1ZmZlci5sZW5ndGggPSBsZW47CisgICAgZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEgPSBuZXcgY2hhcltsZW5dOworICAgIERybUJ1ZmZlciAqcERlY3J5cHRlZERybUJ1ZmZlciA9ICZkZWNyeXB0ZWREcm1CdWZmZXI7CisKKyAgICBpZiAoKGVyciA9IGdEcm1NYW5hZ2VyQ2xpZW50LT5kZWNyeXB0KG1EZWNyeXB0SGFuZGxlLCBtVHJhY2tJZCwKKyAgICAgICAgICAgICZlbmNyeXB0ZWREcm1CdWZmZXIsICZwRGVjcnlwdGVkRHJtQnVmZmVyKSkgIT0gRFJNX05PX0VSUk9SKSB7CisKKyAgICAgICAgaWYgKGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhKSB7CisgICAgICAgICAgICBkZWxldGUgW10gZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGE7CisgICAgICAgICAgICBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9OT19MSUNFTlNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgfQorICAgIENIRUNLKHBEZWNyeXB0ZWREcm1CdWZmZXIgPT0gJmRlY3J5cHRlZERybUJ1ZmZlcik7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKGdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSAmJiAhbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCopc3JjOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgbGVuID0gZGVjcnlwdGVkRHJtQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IGxlbikgeworICAgICAgICAgICAgQ0hFQ0soc3JjT2Zmc2V0ICsgbU5BTExlbmd0aFNpemUgPD0gbGVuKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IChjb25zdCB1aW50OF90KikoJmRlY3J5cHRlZERybUJ1ZmZlci5kYXRhW3NyY09mZnNldF0pOworCisgICAgICAgICAgICBzd2l0Y2ggKG1OQUxMZW5ndGhTaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSAqZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBVMTZfQVQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IFUzMl9BVChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisKKyAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxMZW5ndGggPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhOworICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGRzdE9mZnNldCArIDQgPD0gKCpidWZmZXIpLT5zaXplKCkpOworCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJmRlY3J5cHRlZERybUJ1ZmZlci5kYXRhW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgbGVuKTsKKyAgICAgICAgKCpidWZmZXIpLT5zZXRfcmFuZ2UoKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSwgZHN0T2Zmc2V0KTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShzcmMsIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhLCBkZWNyeXB0ZWREcm1CdWZmZXIubGVuZ3RoKTsKKyAgICAgICAgKCpidWZmZXIpLT5zZXRfcmFuZ2UoKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSwgZGVjcnlwdGVkRHJtQnVmZmVyLmxlbmd0aCk7CisgICAgfQorCisgICAgaWYgKGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhKSB7CisgICAgICAgIGRlbGV0ZSBbXSBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YTsKKyAgICAgICAgZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRFJNRXh0cmFjdG9yOjpEUk1FeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciogbWltZSkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSB7CisgICAgbU9yaWdpbmFsRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShzb3VyY2UsIG1pbWUpOworICAgIG1PcmlnaW5hbEV4dHJhY3Rvci0+c2V0RHJtRmxhZyh0cnVlKTsKKworICAgIERybU1hbmFnZXJDbGllbnQgKmNsaWVudDsKKyAgICBzb3VyY2UtPmdldERybUluZm8oJm1EZWNyeXB0SGFuZGxlLCAmY2xpZW50KTsKK30KKworRFJNRXh0cmFjdG9yOjp+RFJNRXh0cmFjdG9yKCkgeworfQorCitzaXplX3QgRFJNRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbU9yaWdpbmFsRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworfQorCitzcDxNZWRpYVNvdXJjZT4gRFJNRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBzcDxNZWRpYVNvdXJjZT4gb3JpZ2luYWxNZWRpYVNvdXJjZSA9IG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0VHJhY2soaW5kZXgpOworICAgIG9yaWdpbmFsTWVkaWFTb3VyY2UtPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SXNEUk0sIDEpOworCisgICAgaW50MzJfdCB0cmFja0lEOworICAgIENIRUNLKGdldFRyYWNrTWV0YURhdGEoaW5kZXgsIDApLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lEKSk7CisKKyAgICBEcm1CdWZmZXIgaXBtcEJveDsKKyAgICBpcG1wQm94LmRhdGEgPSBtT3JpZ2luYWxFeHRyYWN0b3ItPmdldERybVRyYWNrSW5mbyh0cmFja0lELCAmKGlwbXBCb3gubGVuZ3RoKSk7CisgICAgQ0hFQ0soaXBtcEJveC5sZW5ndGggPiAwKTsKKworICAgIHJldHVybiBuZXcgRFJNU291cmNlKG9yaWdpbmFsTWVkaWFTb3VyY2UsIG1EZWNyeXB0SGFuZGxlLCB0cmFja0lELCAmaXBtcEJveCk7Cit9CisKK3NwPE1ldGFEYXRhPiBEUk1FeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIHJldHVybiBtT3JpZ2luYWxFeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaW5kZXgsIGZsYWdzKTsKK30KKworc3A8TWV0YURhdGE+IERSTUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CisgICAgcmV0dXJuIG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKK30KKworc3RhdGljIE11dGV4IGdEUk1TbmlmZmVyTXV0ZXg7Citib29sIFNuaWZmRFJNKAorICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnRFJNU25pZmZlck11dGV4KTsKKyAgICAgICAgaWYgKGdEcm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdEcm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERlY3J5cHRIYW5kbGUgKmRlY3J5cHRIYW5kbGUgPSBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKGdEcm1NYW5hZ2VyQ2xpZW50KTsKKworICAgIGlmIChkZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID09IERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQpIHsKKyAgICAgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoImRybStjb250YWluZXJfYmFzZWQrIik7CisgICAgICAgIH0gZWxzZSBpZiAoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPT0gRGVjcnlwdEFwaVR5cGU6OkVMRU1FTlRBUllfU1RSRUFNX0JBU0VEKSB7CisgICAgICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KCJkcm0rZXNfYmFzZWQrIik7CisgICAgICAgIH0KKworICAgICAgICAqbWltZVR5cGUgKz0gZGVjcnlwdEhhbmRsZS0+bWltZVR5cGU7CisgICAgICAgICpjb25maWRlbmNlID0gMTAuMGY7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorfSAvL25hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggNDllYWM2Mi4uMGI4OTk3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlICJtYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIgogCkBAIC0zMSw2ICszMiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDE2KG9mZl90IG9mZnNldCwgdWludDE2X3QgKngpIHsKQEAgLTEwNCw2ICsxMDcsMTIgQEAKICAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZBTVIpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QRUcyVFMpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QMyk7CisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgiZHJtLnNlcnZpY2UuZW5hYmxlZCIsIHZhbHVlLCBOVUxMKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7CisgICAgICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZkRSTSk7CisgICAgfQogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggZGQyNTc5Yi4uYjQ2ZDhkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTIxLDE0ICsyMSwyNiBAQAogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJyYiIpKSwKKyAgICAgIG1GZChmaWxlbm8obUZpbGUpKSwKICAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSB7CisgICAgICBtTGVuZ3RoKC0xKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCisgICAgICBtRHJtQnVmT2Zmc2V0KDApLAorICAgICAgbURybUJ1ZlNpemUoMCksCisgICAgICBtRHJtQnVmKE5VTEwpewogfQogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogICAgIDogbUZpbGUoZmRvcGVuKGZkLCAicmIiKSksCisgICAgICBtRmQoZmQpLAogICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbUxlbmd0aChsZW5ndGgpIHsKKyAgICAgIG1MZW5ndGgobGVuZ3RoKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCisgICAgICBtRHJtQnVmT2Zmc2V0KDApLAorICAgICAgbURybUJ1ZlNpemUoMCksCisgICAgICBtRHJtQnVmKE5VTEwpewogICAgIENIRUNLKG9mZnNldCA+PSAwKTsKICAgICBDSEVDSyhsZW5ndGggPj0gMCk7CiB9CkBAIC0zOCw2ICs1MCwxNCBAQAogICAgICAgICBmY2xvc2UobUZpbGUpOwogICAgICAgICBtRmlsZSA9IE5VTEw7CiAgICAgfQorCisgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCkgeworICAgICAgICBkZWxldGVbXSBtRHJtQnVmOworICAgICAgICBtRHJtQnVmID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOworICAgIH0KIH0KIAogc3RhdHVzX3QgRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewpAQCAtNjEsMTMgKzgxLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQgZXJyID0gZnNlZWtvKG1GaWxlLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIG9mZnNldCArIG1PZmZzZXQpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwgJiYgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAorICAgICAgICAgICAgPT0gbURlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKSB7CisgICAgICAgIHJldHVybiByZWFkQXREUk0ob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgIH0gZWxzZSB7CisgICAgICAgIGludCBlcnIgPSBmc2Vla28obUZpbGUsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCBvZmZzZXQgKyBtT2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CiAKLSAgICByZXR1cm4gZnJlYWQoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOworICAgICAgICByZXR1cm4gZnJlYWQoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOworICAgIH0KIH0KIAogc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmZfdCAqc2l6ZSkgewpAQCAtODcsNCArMTEyLDUzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitEZWNyeXB0SGFuZGxlKiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbihEcm1NYW5hZ2VyQ2xpZW50KiBjbGllbnQpIHsKKyAgICBtRHJtTWFuYWdlckNsaWVudCA9IGNsaWVudDsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICAgICAgbUZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOworfQorCit2b2lkIEZpbGVTb3VyY2U6OmdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgeworICAgICpoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKworICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKK30KKworc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CisgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgeworICAgICAgICBtRHJtQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbRFJNX0NBQ0hFX1NJWkVdOworICAgIH0KKworICAgIGlmIChtRHJtQnVmICE9IE5VTEwgJiYgbURybUJ1ZlNpemUgPiAwICYmIChvZmZzZXQgKyBtT2Zmc2V0KSA+PSBtRHJtQnVmT2Zmc2V0CisgICAgICAgICAgICAmJiAob2Zmc2V0ICsgbU9mZnNldCArIHNpemUpIDw9IChtRHJtQnVmT2Zmc2V0ICsgbURybUJ1ZlNpemUpKSB7CisgICAgICAgIC8qIFVzZSBidWZmZXJlZCBkYXRhICovCisgICAgICAgIG1lbWNweShkYXRhLCAodm9pZCopKG1Ecm1CdWYrKG9mZnNldCttT2Zmc2V0LW1Ecm1CdWZPZmZzZXQpKSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSBEUk1fQ0FDSEVfU0laRSkgeworICAgICAgICAvKiBCdWZmZXIgbmV3IGRhdGEgKi8KKyAgICAgICAgbURybUJ1Zk9mZnNldCA9ICBvZmZzZXQgKyBtT2Zmc2V0OworICAgICAgICBtRHJtQnVmU2l6ZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5wcmVhZChtRGVjcnlwdEhhbmRsZSwgbURybUJ1ZiwKKyAgICAgICAgICAgICAgICBEUk1fQ0FDSEVfU0laRSwgb2Zmc2V0ICsgbU9mZnNldCk7CisgICAgICAgIGlmIChtRHJtQnVmU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YVJlYWQgPSAwOworICAgICAgICAgICAgZGF0YVJlYWQgPSBzaXplID4gbURybUJ1ZlNpemUgPyBtRHJtQnVmU2l6ZSA6IHNpemU7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgKHZvaWQqKW1Ecm1CdWYsIGRhdGFSZWFkKTsKKyAgICAgICAgICAgIHJldHVybiBkYXRhUmVhZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtRHJtQnVmU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRvbyBiaWcgY2h1bmsgdG8gY2FjaGUuIENhbGwgRFJNIGRpcmVjdGx5ICovCisgICAgICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudC0+cHJlYWQobURlY3J5cHRIYW5kbGUsIGRhdGEsIHNpemUsIG9mZnNldCArIG1PZmZzZXQpOworICAgIH0KK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggMzQwNjRjOGMuLjU0OTczMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTI2NCw3ICsyNjQsOSBAQAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSwKLSAgICAgIG1GaWxlTWV0YURhdGEobmV3IE1ldGFEYXRhKSB7CisgICAgICBtRmlsZU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtRmlyc3RTSU5GKE5VTEwpLAorICAgICAgbUlzRHJtKGZhbHNlKSB7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0yNzYsNiArMjc4LDE1IEBACiAgICAgICAgIHRyYWNrID0gbmV4dDsKICAgICB9CiAgICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gTlVMTDsKKworICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOworICAgIHdoaWxlIChzaW5mKSB7CisgICAgICAgIFNJTkYgKm5leHQgPSBzaW5mLT5uZXh0OworICAgICAgICBkZWxldGUgc2luZi0+SVBNUERhdGE7CisgICAgICAgIGRlbGV0ZSBzaW5mOworICAgICAgICBzaW5mID0gbmV4dDsKKyAgICB9CisgICAgbUZpcnN0U0lORiA9IE5VTEw7CiB9CiAKIHNwPE1ldGFEYXRhPiBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CkBAIC0zNzAsNiArMzgxLDE3OCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgTVBFRzRFeHRyYWN0b3I6OnNldERybUZsYWcoYm9vbCBmbGFnKSB7CisgICAgbUlzRHJtID0gZmxhZzsKK30KKworY2hhciogTVBFRzRFeHRyYWN0b3I6OmdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pIHsKKyAgICBpZiAobUZpcnN0U0lORiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOworICAgIHdoaWxlIChzaW5mICYmICh0cmFja0lEICE9IHNpbmYtPnRyYWNrSUQpKSB7CisgICAgICAgIHNpbmYgPSBzaW5mLT5uZXh0OworICAgIH0KKworICAgIGlmIChzaW5mID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKmxlbiA9IHNpbmYtPmxlbjsKKyAgICByZXR1cm4gc2luZi0+SVBNUERhdGE7Cit9CisKKy8vIFJlYWRzIGFuIGVuY29kZWQgaW50ZWdlciA3IGJpdHMgYXQgYSB0aW1lIHVudGlsIGl0IGVuY291bnRlcnMgdGhlIGhpZ2ggYml0IGNsZWFyLgoraW50MzJfdCByZWFkU2l6ZShvZmZfdCBvZmZzZXQsCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2UsIHVpbnQ4X3QgKm51bU9mQnl0ZXMpIHsKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICB1aW50OF90IGRhdGE7CisgICAgYm9vbCBtb3JlRGF0YSA9IHRydWU7CisgICAgKm51bU9mQnl0ZXMgPSAwOworCisgICAgd2hpbGUgKG1vcmVEYXRhKSB7CisgICAgICAgIGlmIChEYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmZGF0YSwgMSkgPCAxKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICBtb3JlRGF0YSA9IChkYXRhID49IDEyOCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIHNpemUgPSAoc2l6ZSA8PCA3KSB8IChkYXRhICYgMHg3Zik7IC8vIFRha2UgbGFzdCA3IGJpdHMKKyAgICAgICAgKCpudW1PZkJ5dGVzKSArKzsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRHJtU0lORihvZmZfdCAqb2Zmc2V0LCBvZmZfdCBkYXRhX29mZnNldCkgeworICAgIHVpbnQ4X3QgdXBkYXRlSWRUYWc7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ1cGRhdGVJZFRhZywgMSkgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICBpZiAoMHgwMS8qT0JKRUNUX0RFU0NSSVBUT1JfVVBEQVRFX0lEX1RBRyovICE9IHVwZGF0ZUlkVGFnKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCBudW1PZkJ5dGVzOworICAgIGludDMyX3Qgc2l6ZSA9IHJlYWRTaXplKGRhdGFfb2Zmc2V0LCBtRGF0YVNvdXJjZSwgJm51bU9mQnl0ZXMpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGludDMyX3QgY2xhc3NTaXplID0gc2l6ZTsKKyAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOworCisgICAgd2hpbGUoc2l6ZSA+PSAxMSApIHsKKyAgICAgICAgdWludDhfdCBkZXNjcmlwdG9yVGFnOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJmRlc2NyaXB0b3JUYWcsIDEpIDwgMSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIGRhdGFfb2Zmc2V0ICsrOworCisgICAgICAgIGlmICgweDExLypPQkpFQ1RfREVTQ1JJUFRPUl9JRF9UQUcqLyAhPSBkZXNjcmlwdG9yVGFnKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCBidWZmZXJbOF07CisgICAgICAgIC8vT2JqZWN0RGVzY3JpcHRvcklEIGFuZCBPYmplY3REZXNjcmlwdG9yIHVybCBmbGFnCisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBidWZmZXIsIDIpIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgaWYgKChidWZmZXJbMV0gPj4gNSkgJiAweDAwMDEpIHsgLy91cmwgZmxhZyBpcyBzZXQKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgYnVmZmVyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmICgoMHgwRi8qRVNfSURfUkVGX1RBRyovICE9IGJ1ZmZlclsxXSkKKyAgICAgICAgICAgICAgICB8fCAoIDB4MEEvKklQTVBfREVTQ1JJUFRPUl9QT0lOVEVSX0lEX1RBRyovICE9IGJ1ZmZlcls1XSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBTSU5GICpzaW5mID0gbmV3IFNJTkY7CisgICAgICAgIHNpbmYtPnRyYWNrSUQgPSBVMTZfQVQoJmJ1ZmZlclszXSk7CisgICAgICAgIHNpbmYtPklQTVBEZXNjcmlwdG9ySUQgPSBidWZmZXJbN107CisgICAgICAgIHNpbmYtPm5leHQgPSBtRmlyc3RTSU5GOworICAgICAgICBtRmlyc3RTSU5GID0gc2luZjsKKworICAgICAgICBzaXplIC09ICg4ICsgMiArIDEpOworICAgIH0KKworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnVwZGF0ZUlkVGFnLCAxKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBkYXRhX29mZnNldCArKzsKKworICAgIGlmKDB4MDUvKklQTVBfREVTQ1JJUFRPUl9VUERBVEVfSURfVEFHKi8gIT0gdXBkYXRlSWRUYWcpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBzaXplID0gcmVhZFNpemUoZGF0YV9vZmZzZXQsIG1EYXRhU291cmNlLCAmbnVtT2ZCeXRlcyk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgY2xhc3NTaXplID0gc2l6ZTsKKyAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIHVpbnQ4X3QgdGFnOworICAgICAgICBpbnQzMl90IGRhdGFMZW47CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdGFnLCAxKSA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArKzsKKworICAgICAgICBpZiAoMHgwQi8qSVBNUF9ERVNDUklQVE9SX0lEX1RBRyovID09IHRhZykgeworICAgICAgICAgICAgdWludDhfdCBpZDsKKyAgICAgICAgICAgIGRhdGFMZW4gPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChkYXRhTGVuIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUxlbiA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZpZCwgMSkgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICAgICAgICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOworICAgICAgICAgICAgd2hpbGUgKHNpbmYgJiYgKHNpbmYtPklQTVBEZXNjcmlwdG9ySUQgIT0gaWQpKSB7CisgICAgICAgICAgICAgICAgc2luZiA9IHNpbmYtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2luZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpbmYtPmxlbiA9IGRhdGFMZW4gLSAzOworICAgICAgICAgICAgc2luZi0+SVBNUERhdGEgPSBuZXcgY2hhcltzaW5mLT5sZW5dOworCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDIsIHNpbmYtPklQTVBEYXRhLCBzaW5mLT5sZW4pIDwgc2luZi0+bGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2luZi0+bGVuOworCisgICAgICAgICAgICBzaXplIC09IChkYXRhTGVuICsgbnVtT2ZCeXRlcyArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemUgIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCit9CisKIHN0YXRpYyB2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcykgewogICAgIHNbMF0gPSB4ID4+IDI0OwogICAgIHNbMV0gPSAoeCA+PiAxNikgJiAweGZmOwpAQCAtNTcyLDcgKzc1NSwxMSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7CiAgICAgICAgICAgICAgICAgbUhhdmVNZXRhZGF0YSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorICAgICAgICAgICAgICAgIGlmICghbUlzRHJtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDIwLDYgKzEyMDcsMjAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtSXNEcm0pIHsKKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBwYXJzZURybVNJTkYob2Zmc2V0LCBkYXRhX29mZnNldCk7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0xMDY5LDYgKzEyNzAsOCBAQAogICAgICAgICBkdXJhdGlvbiA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CiAgICAgfQogCisgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKKwogICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7CiAgICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKICAgICBpbnQzMl90IGEwMSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDRdKTsKQEAgLTE3MTIsOSArMTkxNSwxNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotCi0gICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKKyAgICAgICAgaW50MzJfdCBkcm0gPSAwOworICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQorICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgewogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMTcyMyw0MCArMTkzMiw0NiBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIGlmICh1c2VzRFJNKSB7CisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwogCi0gICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICBDSEVDSyhzcmNPZmZzZXQgKyBtTkFMTGVuZ3RoU2l6ZSA8PSBzaXplKTsKLSAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwogCi0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gc2l6ZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0soc3JjT2Zmc2V0ICsgbU5BTExlbmd0aFNpemUgPD0gc2l6ZSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxMZW5ndGggPiBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ0hFQ0soZHN0T2Zmc2V0ICsgNCA8PSBtQnVmZmVyLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGRzdE9mZnNldCArIDQgPD0gbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CiAgICAgICAgIH0KLSAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKIAotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWR0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggOGE1ZmIxMS4uOTY1YzM3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImluY2x1ZGUvV0FWRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKIApAQCAtNjMsNiArNjQsMTggQEAKICAgICAgICAgICAgICBtaW1lLCBjb25maWRlbmNlKTsKICAgICB9CiAKKyAgICBpZiAoIXN0cm5jbXAobWltZSwgImRybSIsIDMpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm9yaWdpbmFsTWltZSA9IHN0cnJjaHIobWltZSwgJysnKSArIDE7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJkcm0rZXNfYmFzZWQiLCAxMikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRFJNRXh0cmFjdG9yKHNvdXJjZSwgb3JpZ2luYWxNaW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChtaW1lLCAiZHJtK2NvbnRhaW5lcl9iYXNlZCIsIDE5KSkgeworICAgICAgICAgICAgbWltZSA9IG9yaWdpbmFsTWltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsICJhdWRpby9tcDQiKSkgewogICAgICAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCmluZGV4IDZkNGZiY2IuLmFmMjQ3ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIHBhdGgtPnNldFRvKHNsYXNoUG9zKTsKICAgICB9CiAKLSAgICBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5zdHJpbmcoKSwgJzonKTsKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5zdHJpbmcoKSwgJzonKTsKIAogICAgIGlmIChjb2xvblBvcyAhPSBOVUxMKSB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCAxMGM2ZTQxLi43YTYwMGQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0xMjcsMTAgKzEyNywxMSBAQAogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnJ0dHRsIikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5ydHgiKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm90YSIpKSB7Ci0gICAgICAgIHJldHVybiBIYW5kbGVNSURJKHBhdGgsICZjbGllbnQpOwotICAgIH0KLQotICAgIGlmIChtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHBhdGgpID09IE9LKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEhhbmRsZU1JREkocGF0aCwgJmNsaWVudCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UocGF0aCkgPT0gT0spIHsKICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICAgICAgIGlmICgodmFsdWUgPSBtUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUlNRVRZUEUpKSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCBhNjhjNjQxLi45MGYzZDZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICB9IGVsc2UgewotICAgICAgICBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKKyAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggYzA1OWU2MC4uZTM1MjkyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsNiArNDIsOSBAQAogc3RydWN0IEFSVFBTZXNzaW9uOwogc3RydWN0IFVEUFB1c2hlcjsKIAorY2xhc3MgRHJtTWFuYWdlckNsaW5ldDsKK2NsYXNzIERlY3J5cHRIYW5kbGU7CisKIHN0cnVjdCBBd2Vzb21lUmVuZGVyZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQXdlc29tZVJlbmRlcmVyKCkge30KIApAQCAtMjE2LDYgKzIyMCw5IEBACiAgICAgICAgIH0KICAgICB9ICptU3VzcGVuc2lvblN0YXRlOwogCisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisgICAgRGVjcnlwdEhhbmRsZSAqbURlY3J5cHRIYW5kbGU7CisKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmYzgxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRFJNX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIERSTV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlOworY2xhc3MgU2FtcGxlVGFibGU7CitjbGFzcyBTdHJpbmc4OworY2xhc3MgRGVjcnlwdEhhbmRsZTsKKworY2xhc3MgRFJNRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBEUk1FeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RFJNRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisKKyAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gbU9yaWdpbmFsRXh0cmFjdG9yOworICAgIERlY3J5cHRIYW5kbGUqIG1EZWNyeXB0SGFuZGxlOworCisgICAgRFJNRXh0cmFjdG9yKGNvbnN0IERSTUV4dHJhY3RvciAmKTsKKyAgICBEUk1FeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBEUk1FeHRyYWN0b3IgJik7Cit9OworCitib29sIFNuaWZmRFJNKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gKik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRFJNX0VYVFJBQ1RPUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggMjYxMGIwZS4uYmMyZTRkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtMzksNiArMzksMTAgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCB2b2lkIHNldERybUZsYWcoYm9vbCBmbGFnKTsKKyAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TVBFRzRFeHRyYWN0b3IoKTsKIApAQCAtNzEsNiArNzUsMTkgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCB2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spOwogCisgICAgc3RydWN0IFNJTkYgeworICAgICAgICBTSU5GICpuZXh0OworICAgICAgICB1aW50MTZfdCB0cmFja0lEOworICAgICAgICB1aW50OF90IElQTVBEZXNjcmlwdG9ySUQ7CisgICAgICAgIHNzaXplX3QgbGVuOworICAgICAgICBjaGFyICpJUE1QRGF0YTsKKyAgICB9OworCisgICAgU0lORiAqbUZpcnN0U0lORjsKKworICAgIGJvb2wgbUlzRHJtOworICAgIHN0YXR1c190IHBhcnNlRHJtU0lORihvZmZfdCAqb2Zmc2V0LCBvZmZfdCBkYXRhX29mZnNldCk7CisKICAgICBzdGF0dXNfdCBwYXJzZVRyYWNrSGVhZGVyKG9mZl90IGRhdGFfb2Zmc2V0LCBvZmZfdCBkYXRhX3NpemUpOwogCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCBhYTI2MThlLi5mMDNmN2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIEFTdHJpbmcgZm9ybWF0OwogICAgIGdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CiAKLSAgICBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOworICAgIGNvbnN0IGNoYXIgKmxhc3RTcGFjZVBvcyA9IHN0cnJjaHIoZm9ybWF0LmNfc3RyKCksICcgJyk7CiAgICAgQ0hFQ0sobGFzdFNwYWNlUG9zICE9IE5VTEwpOwogCiAgICAgY2hhciAqZW5kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggN2JmNTM0ZC4uNzJhMmZkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0xMTk3LDcgKzExOTcsNyBAQAogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgewogICAgICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rCmluZGV4IDc4MDJlZmQuLjgxYzYxNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5tawpAQCAtMjIsMTEgKzIyLDYgQEAKICAgICAgICAgU2tPbXhQaXhlbFJlZi5jcHAgXAogICAgICAgICBTdHJlYW1Tb3VyY2UuY3BwCiAKLQotIyBhZGQgZXh0ZXJuYWwvc2tpYS9zcmMvaW1hZ2VzL1NrSW1hZ2VEZWNvZGVyX2xpYmpwZWcuY3BwCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICAgICAuLi8uLi8uLi8uLi8uLi9leHRlcm5hbC9za2lhL3NyYy9pbWFnZXMvU2tJbWFnZURlY29kZXJfbGlianBlZy5jcHAKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJza2lhIFwKZGlmZiAtLWdpdCBhL29iZXgvamF2YXgvb2JleC9TZXJ2ZXJPcGVyYXRpb24uamF2YSBiL29iZXgvamF2YXgvb2JleC9TZXJ2ZXJPcGVyYXRpb24uamF2YQppbmRleCAwN2EzYTUzLi5kMTQ3NmQyIDEwMDY0NAotLS0gYS9vYmV4L2phdmF4L29iZXgvU2VydmVyT3BlcmF0aW9uLmphdmEKKysrIGIvb2JleC9qYXZheC9vYmV4L1NlcnZlck9wZXJhdGlvbi5qYXZhCkBAIC0zOTcsMTEgKzM5NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAoaGVhZGVySUQgIT0gT2JleEhlbHBlci5PQkVYX09QQ09ERV9HRVRfRklOQUwpKSB7CiAKICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gdGVtcCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbbGVuZ3RoIC0gM107CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRocmVlIGJ5dGVzIGFscmVhZHkgcmVhZCwgY29tcGVuc2F0aW5nIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVjZWl2ZWQgPSBtSW5wdXQucmVhZCh0ZW1wKTsKIAotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWNlaXZlZCAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVjZWl2ZWQgKz0gbUlucHV0LnJlYWQodGVtcCwgYnl0ZXNSZWNlaXZlZCwgbGVuZ3RoIC0gYnl0ZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc1JlY2VpdmVkICE9IHRlbXAubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1JlY2VpdmVkICs9IG1JbnB1dC5yZWFkKHRlbXAsIGJ5dGVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAubGVuZ3RoIC0gYnl0ZXNSZWNlaXZlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcCBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcAppbmRleCA2NjJhMWZhLi41YzA5ZGNjIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCkBAIC00ODAsMTMgKzQ4MCwxMyBAQAogICAgIGNvcHliaXRfZGV2aWNlX3QqIGNvbnN0IGNvcHliaXQgPSBibGl0ZW5naW5lOwogICAgIGlmIChjb3B5Yml0KSAgewogICAgICAgICBjb3B5Yml0X2ltYWdlX3Qgc2ltZzsKLSAgICAgICAgc2ltZy53ID0gc3JjLT53aWR0aDsKKyAgICAgICAgc2ltZy53ID0gc3JjLT5zdHJpZGU7CiAgICAgICAgIHNpbWcuaCA9IHNyYy0+aGVpZ2h0OwogICAgICAgICBzaW1nLmZvcm1hdCA9IHNyYy0+Zm9ybWF0OwogICAgICAgICBzaW1nLmhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oc3JjLT5oYW5kbGUpOwogCiAgICAgICAgIGNvcHliaXRfaW1hZ2VfdCBkaW1nOwotICAgICAgICBkaW1nLncgPSBkc3QtPndpZHRoOworICAgICAgICBkaW1nLncgPSBkc3QtPnN0cmlkZTsKICAgICAgICAgZGltZy5oID0gZHN0LT5oZWlnaHQ7CiAgICAgICAgIGRpbWcuZm9ybWF0ID0gZHN0LT5mb3JtYXQ7CiAgICAgICAgIGRpbWcuaGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihkc3QtPmhhbmRsZSk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCmluZGV4IDdlMGMxNjkuLmQyNmQxM2UgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC0xODQzLDMgKzE4NDMsOCBAQAogICAgIH0KICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBOVUxMKTsKIH0KKworRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jKSB7IHJldHVybiAwOyB9CitFR0xTeW5jS0hSIGVnbENyZWF0ZVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkgeyByZXR1cm4gMDsgfQorRUdMaW50IGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KSB7IHJldHVybiAwOyB9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9qbmkvZ2xfY29kZS5jcHAKaW5kZXggZjAzMWM3OS4uZWY2Njg0MSAxMDA2NDQKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9qbmkvZ2xfY29kZS5jcHAKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9qbmkvZ2xfY29kZS5jcHAKQEAgLTE4MSw0ICsxODEsMyBAQAogewogICAgIGJhY2tncm91bmQgPSAxLjBmIC0gYmFja2dyb3VuZDsKIH0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkOGY0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorIyBDb3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBXQVBQdXNoTWFuYWdlcgorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1jb21tb24KKworTE9DQUxfUFJPR1VBUkRfRkxBR1MgOj0gLWluY2x1ZGUgJChMT0NBTF9QQVRIKS9wcm9ndWFyZC5mbGFncworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyBUaGlzIGZpbmRzIGFuZCBidWlsZHMgdGhlIHRlc3QgYXBrIGFzIHdlbGwsIHNvIGEgc2luZ2xlIG1ha2UgZG9lcyBib3RoLgoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllOWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zbXNwdXNoIj4KKworICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc21zcHVzaC5XQVBQVVNIX01BTkFHRVJfQklORCIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZU9yU3lzdGVtIiAvPgorCisgICAgPG9yaWdpbmFsLXBhY2thZ2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zbXNwdXNoIiAvPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuV2FwUHVzaE1hbmFnZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImNvbS5hbmRyb2lkLnNtc3B1c2guV0FQUFVTSF9NQU5BR0VSX0JJTkQiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVdhcFB1c2hNYW5hZ2VyIj48L2FjdGlvbj4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0NsZWFuU3BlYy5tayBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIHBhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL05PVElDRSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9OT1RJQ0UKcmVuYW1lIHRvIHBhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL05PVElDRQppbmRleCA5ZGYyNTU0Li5jNWIxZWZhIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9OT1RJQ0UKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvTk9USUNFCkBAIC0xLDUgKzEsNSBAQAogCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9wcm9ndWFyZC5mbGFncyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Byb2d1YXJkLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTg4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9wcm9ndWFyZC5mbGFncwpAQCAtMCwwICsxLDE4IEBACisKKyNhcHBseSBtZXRob2QgaXMgZHluYW1pY2FsbHkgcmVmZXJlbmNlZCBieSB0aGUgcmVmbGVjdGlvbiBjbGFzcy4KKy1rZWVwIGNsYXNzIGFuZHJvaWQuYXBwLkNvbnRleHRJbXBsJFNoYXJlZFByZWZlcmVuY2VzSW1wbCRFZGl0b3JJbXBsIHsKKyAgICB2b2lkIGFwcGx5KCk7Cit9Cista2VlcCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHsKKyAgICB2b2lkIGFwcGx5KCk7Cit9CisKKyNXYXBQdXNoTWFuYWdlciBpcyByZWZlcmVuY2VkIG9ubHkgYnkgQW5kcm9pZE1hbmlmZXN0LnhtbAorLWtlZXAgY2xhc3MgY29tLmFuZHJvaWQuc21zcHVzaC5XYXBQdXNoTWFuYWdlciB7CisjQ1RTIG1vZHVsZSBtZXRob2QKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFFeGlzdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAorICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7CisgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5RGF0YShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAorICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuLCBib29sZWFuKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvV2FwUHVzaE1hbmFnZXIuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL1dhcFB1c2hNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlMDM3NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL1dhcFB1c2hNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2g7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVdhcFB1c2hNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5XYXBQdXNoTWFuYWdlclBhcmFtczsKKworLyoqCisgKiBUaGUgV2FwUHVzaE1hbmFnZXIgc2VydmljZSBpcyBpbXBsZW1lbnRlZCB0byBwcm9jZXNzIGluY29taW5nCisgKiBXQVAgUHVzaCBtZXNzYWdlcyBhbmQgdG8gbWFpbnRhaW4gdGhlIFJlY2VpdmVyIEFwcGxpY2F0aW9uL0FwcGxpY2F0aW9uCisgKiBJRCBtYXBwaW5nLiBUaGUgV2FwUHVzaE1hbmFnZXIgcnVucyBhcyBhIHN5c3RlbSBzZXJ2aWNlLCBhbmQgb25seSB0aGUKKyAqIFdhcFB1c2hNYW5hZ2VyIGNhbiB1cGRhdGUgdGhlIFdBUCBQdXNoIG1lc3NhZ2UgYW5kIFJlY2VpdmVyIEFwcGxpY2F0aW9uCisgKiBtYXBwaW5nIChBcHBsaWNhdGlvbiBJRCBUYWJsZSkuIFdoZW4gdGhlIGRldmljZSByZWNlaXZlcyBhbiBTTVMgV0FQIFB1c2gKKyAqIG1lc3NhZ2UsIHRoZSBXYXBQdXNoTWFuYWdlciBsb29rcyB1cCB0aGUgUmVjZWl2ZXIgQXBwbGljYXRpb24gbmFtZSBpbgorICogQXBwbGljYXRpb24gSUQgVGFibGUuIElmIGFuIGFwcGxpY2F0aW9uIGlzIGZvdW5kLCB0aGUgYXBwbGljYXRpb24gaXMKKyAqIGxhdW5jaGVkIHVzaW5nIGl0cyBmdWxsIGNvbXBvbmVudCBuYW1lIGluc3RlYWQgb2YgYnJvYWRjYXN0aW5nIGFuIGltcGxpY2l0CisgKiBJbnRlbnQuIElmIGEgUmVjZWl2ZXIgQXBwbGljYXRpb24gaXMgbm90IGZvdW5kIGluIHRoZSBBcHBsaWNhdGlvbiBJRAorICogVGFibGUgb3IgdGhlIFdhcFB1c2hNYW5hZ2VyIHJldHVybnMgYSBwcm9jZXNzLWZ1cnRoZXIgdmFsdWUsIHRoZQorICogdGVsZXBob255IHN0YWNrIHdpbGwgcHJvY2VzcyB0aGUgbWVzc2FnZSB1c2luZyBleGlzdGluZyBtZXNzYWdlIHByb2Nlc3NpbmcKKyAqIGZsb3csIGFuZCBicm9hZGNhc3QgYW4gaW1wbGljaXQgSW50ZW50LgorICovCitwdWJsaWMgY2xhc3MgV2FwUHVzaE1hbmFnZXIgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldBUCBQVVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfTkFNRSA9ICJ3YXBwdXNoLmRiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQSURfVEFCTEVfTkFNRSA9ICJhcHBpZF90YmwiOworCisgICAgLyoqCisgICAgICogVmVyc2lvbiBudW1iZXIgbXVzdCBiZSBpbmNyZW1lbnRlZCB3aGVuIHRhYmxlIHN0cnVjdHVyZSBpcyBjaGFuZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVBfUFVTSF9NQU5BR0VSX1ZFUlNJT04gPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1FMID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyB0aGF0IGRlYWxzIHdpdGggYXBwbGljYXRpb24gSUQgdGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFdhcFB1c2hNYW5EQkhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBEQVRBQkFTRV9OQU1FLCBudWxsLCBXQVBfUFVTSF9NQU5BR0VSX1ZFUlNJT04pOworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJoZWxwZXIgaW5zdGFuY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJkYiBvbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIFN0cmluZyBzcWwgPSAiQ1JFQVRFIFRBQkxFICIgKyBBUFBJRF9UQUJMRV9OQU1FICsgIiAoIgorICAgICAgICAgICAgICAgICAgICArICJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCAiCisgICAgICAgICAgICAgICAgICAgICsgInhfd2FwX2FwcGxpY2F0aW9uIFRFWFQsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29udGVudF90eXBlIFRFWFQsICIKKyAgICAgICAgICAgICAgICAgICAgKyAicGFja2FnZV9uYW1lIFRFWFQsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiY2xhc3NfbmFtZSBURVhULCAiCisgICAgICAgICAgICAgICAgICAgICsgImFwcF90eXBlIElOVEVHRVIsICIKKyAgICAgICAgICAgICAgICAgICAgKyAibmVlZF9zaWduYXR1cmUgSU5URUdFUiwgIgorICAgICAgICAgICAgICAgICAgICArICJmdXJ0aGVyX3Byb2Nlc3NpbmcgSU5URUdFUiwgIgorICAgICAgICAgICAgICAgICAgICArICJpbnN0YWxsX29yZGVyIElOVEVHRVIgIgorICAgICAgICAgICAgICAgICAgICArICIpIjsKKworICAgICAgICAgICAgaWYgKERFQlVHX1NRTCkgTG9nLnYoTE9HX1RBRywgInNxbDogIiArIHNxbCk7CisgICAgICAgICAgICBkYi5leGVjU1FMKHNxbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgICAgICAgICBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHdoZW4gdGFibGUgc3RydWN0dXJlIGlzIGNoYW5nZWQsIG5lZWQgdG8gZHVtcCBhbmQgcmVzdG9yZSBkYXRhLgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgZGIuZXhlY1NRTCgKKyAgICAgICAgICAgICAgImRyb3AgdGFibGUgaWYgZXhpc3RzICIrQVBQSURfVEFCTEVfTkFNRSk7CisgICAgICAgICAgICAgIG9uQ3JlYXRlKGRiKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAib25VcGdyYWRlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIGRvIG5vdGhpbmcuIik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgcXVlcnlEYXRhIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcGFja2FnZU5hbWU7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICAgICAgICAgIGludCBhcHBUeXBlOworICAgICAgICAgICAgaW50IG5lZWRTaWduYXR1cmU7CisgICAgICAgICAgICBpbnQgZnVydGhlclByb2Nlc3Npbmc7CisgICAgICAgICAgICBpbnQgaW5zdGFsbE9yZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJ5IHRoZSBsYXRlc3QgcmVjZWl2ZXIgYXBwbGljYXRpb24gaW5mbyB3aXRoIHN1cHBsaWVkIGFwcGxpY2F0aW9uIElEIGFuZAorICAgICAgICAgKiBjb250ZW50IHR5cGUuCisgICAgICAgICAqIEBwYXJhbSBhcHBfaWQgICAgYXBwbGljYXRpb24gSUQgdG8gbG9vayB1cAorICAgICAgICAgKiBAcGFyYW0gY29udGVudF90eXBlICAgIGNvbnRlbnQgdHlwZSB0byBsb29rIHVwCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgcXVlcnlEYXRhIHF1ZXJ5TGFzdEFwcChTUUxpdGVEYXRhYmFzZSBkYiwKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlKSB7CisgICAgICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBpbnN0YWxsX29yZGVyLCBwYWNrYWdlX25hbWUsIGNsYXNzX25hbWUsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFwcF90eXBlLCBuZWVkX3NpZ25hdHVyZSwgZnVydGhlcl9wcm9jZXNzaW5nIgorICAgICAgICAgICAgICAgICAgICArICIgZnJvbSAiICsgQVBQSURfVEFCTEVfTkFNRQorICAgICAgICAgICAgICAgICAgICArICIgd2hlcmUgeF93YXBfYXBwbGljYXRpb249XCciICsgYXBwX2lkICsgIlwnIgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGNvbnRlbnRfdHlwZT1cJyIgKyBjb250ZW50X3R5cGUgKyAiXCciCisgICAgICAgICAgICAgICAgICAgICsgIiBvcmRlciBieSBpbnN0YWxsX29yZGVyIGRlc2MiOworICAgICAgICAgICAgaWYgKERFQlVHX1NRTCkgTG9nLnYoTE9HX1RBRywgInNxbDogIiArIHNxbCk7CisgICAgICAgICAgICBDdXJzb3IgY3VyID0gZGIucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgICAgIHF1ZXJ5RGF0YSByZXQgPSBudWxsOworCisgICAgICAgICAgICBpZiAoY3VyLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBxdWVyeURhdGEoKTsKKyAgICAgICAgICAgICAgICByZXQuaW5zdGFsbE9yZGVyID0gY3VyLmdldEludChjdXIuZ2V0Q29sdW1uSW5kZXgoImluc3RhbGxfb3JkZXIiKSk7CisgICAgICAgICAgICAgICAgcmV0LnBhY2thZ2VOYW1lID0gY3VyLmdldFN0cmluZyhjdXIuZ2V0Q29sdW1uSW5kZXgoInBhY2thZ2VfbmFtZSIpKTsKKyAgICAgICAgICAgICAgICByZXQuY2xhc3NOYW1lID0gY3VyLmdldFN0cmluZyhjdXIuZ2V0Q29sdW1uSW5kZXgoImNsYXNzX25hbWUiKSk7CisgICAgICAgICAgICAgICAgcmV0LmFwcFR5cGUgPSBjdXIuZ2V0SW50KGN1ci5nZXRDb2x1bW5JbmRleCgiYXBwX3R5cGUiKSk7CisgICAgICAgICAgICAgICAgcmV0Lm5lZWRTaWduYXR1cmUgPSBjdXIuZ2V0SW50KGN1ci5nZXRDb2x1bW5JbmRleCgibmVlZF9zaWduYXR1cmUiKSk7CisgICAgICAgICAgICAgICAgcmV0LmZ1cnRoZXJQcm9jZXNzaW5nID0gY3VyLmdldEludChjdXIuZ2V0Q29sdW1uSW5kZXgoImZ1cnRoZXJfcHJvY2Vzc2luZyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ci5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGV4cG9ydGVkIEFQSSBpbXBsZW1lbnRhdGlvbnMgY2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIElXYXBQdXNoTWFuYWdlclN0dWIgZXh0ZW5kcyBJV2FwUHVzaE1hbmFnZXIuU3R1YiB7CisgICAgICAgIHB1YmxpYyBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIHB1YmxpYyBJV2FwUHVzaE1hbmFnZXJTdHViKCkgeworCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyZSB0aGUgcGFja2FnZSBzaWduYXR1cmUgd2l0aCBXYXBQdXNoTWFuYWdlciBwYWNrYWdlCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaWduYXR1cmVDaGVjayhTdHJpbmcgcGFja2FnZV9uYW1lKSB7CisgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICBpbnQgbWF0Y2ggPSBwbS5jaGVja1NpZ25hdHVyZXMobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgcGFja2FnZV9uYW1lKTsKKworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJjb21wYXJlIHNpZ25hdHVyZSAiICsgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgYW5kICIgKyAgcGFja2FnZV9uYW1lICsgIiwgbWF0Y2g9IiArIG1hdGNoKTsKKworICAgICAgICAgICAgcmV0dXJuIG1hdGNoID09IFBhY2thZ2VNYW5hZ2VyLlNJR05BVFVSRV9NQVRDSDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZy4KKyAgICAgICAgICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBwcm9jZXNzZWQgYXMgZm9sbG93czoKKyAgICAgICAgICogMS5Mb29rIHVwIEFwcGxpY2F0aW9uIElEIFRhYmxlIHdpdGggeC13YXAtYXBwbGljYXRpb24taWQgKyBjb250ZW50IHR5cGUKKyAgICAgICAgICogMi5DaGVjayB0aGUgc2lnbmF0dXJlIG9mIHBhY2thZ2UgbmFtZSB0aGF0IGlzIGZvdW5kIGluIHRoZQorICAgICAgICAgKiAgIEFwcGxpY2F0aW9uIElEIFRhYmxlIGJ5IHVzaW5nIFBhY2thZ2VNYW5hZ2VyLmNoZWNrU2lnbmF0dXJlCisgICAgICAgICAqIDMuVHJpZ2dlciB0aGUgQXBwbGljYXRpb24KKyAgICAgICAgICogNC5SZXR1cm5zIHRoZSBwcm9jZXNzIHN0YXR1cyB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgcHJvY2Vzc01lc3NhZ2UoU3RyaW5nIGFwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwgSW50ZW50IGludGVudCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIndwbWFuIHByb2Nlc3NNc2cgIiArIGFwcF9pZCArICI6IiArIGNvbnRlbnRfdHlwZSk7CisKKyAgICAgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlciBkYmggPSBnZXREYXRhYmFzZShtQ29udGV4dCk7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIucXVlcnlEYXRhIGxhc3RhcHAgPSBkYmgucXVlcnlMYXN0QXBwKGRiLCBhcHBfaWQsIGNvbnRlbnRfdHlwZSk7CisgICAgICAgICAgICBkYi5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAobGFzdGFwcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIm5vIHJlY2VpdmVyIGFwcCBmb3VuZCBmb3IgIiArIGFwcF9pZCArICI6IiArIGNvbnRlbnRfdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9RVUVSWV9GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoTE9HX1RBRywgInN0YXJ0aW5nICIgKyBsYXN0YXBwLnBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi8iICsgbGFzdGFwcC5jbGFzc05hbWUpOworCisgICAgICAgICAgICBpZiAobGFzdGFwcC5uZWVkU2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZUNoZWNrKGxhc3RhcHAucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXYXBQdXNoTWFuYWdlclBhcmFtcy5TSUdOQVRVUkVfTk9fTUFUQ0g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGFzdGFwcC5hcHBUeXBlID09IFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZKSB7CisgICAgICAgICAgICAgICAgLy9JbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUobGFzdGFwcC5wYWNrYWdlTmFtZSwgbGFzdGFwcC5jbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJpbnZhbGlkIG5hbWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGFwcC5wYWNrYWdlTmFtZSArICIvIiArIGxhc3RhcHAuY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLklOVkFMSURfUkVDRUlWRVJfTkFNRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUobUNvbnRleHQsIGxhc3RhcHAuY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKGxhc3RhcHAucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0YXBwLmNsYXNzTmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dC5zdGFydFNlcnZpY2UoaW50ZW50KSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJpbnZhbGlkIG5hbWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGFwcC5wYWNrYWdlTmFtZSArICIvIiArIGxhc3RhcHAuY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLklOVkFMSURfUkVDRUlWRVJfTkFNRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQKKyAgICAgICAgICAgICAgICAgICAgfCAobGFzdGFwcC5mdXJ0aGVyUHJvY2Vzc2luZyA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5GVVJUSEVSX1BST0NFU1NJTkcgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGFwcFR5cGVDaGVjayhpbnQgYXBwX3R5cGUpIHsKKyAgICAgICAgICAgIGlmIChhcHBfdHlwZSA9PSBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSB8fAorICAgICAgICAgICAgICAgICAgICBhcHBfdHlwZSA9PSBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWRkaW5nIHRoZSBwYWNrYWdlIHN1Y2NlZWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZFBhY2thZ2UoU3RyaW5nIHhfYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLAorICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlX25hbWUsIFN0cmluZyBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgIGludCBhcHBfdHlwZSwgYm9vbGVhbiBuZWVkX3NpZ25hdHVyZSwgYm9vbGVhbiBmdXJ0aGVyX3Byb2Nlc3NpbmcpIHsKKyAgICAgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlciBkYmggPSBnZXREYXRhYmFzZShtQ29udGV4dCk7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIucXVlcnlEYXRhIGxhc3RhcHAgPSBkYmgucXVlcnlMYXN0QXBwKGRiLCB4X2FwcF9pZCwgY29udGVudF90eXBlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGluc2VydCA9IGZhbHNlOworICAgICAgICAgICAgaW50IHNxID0gMDsKKworICAgICAgICAgICAgaWYgKCFhcHBUeXBlQ2hlY2soYXBwX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImludmFsaWQgYXBwX3R5cGUgIiArIGFwcF90eXBlICsgIi4gYXBwX3R5cGUgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZICsgIiBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3RhcHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluc2VydCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3EgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICghbGFzdGFwcC5wYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZV9uYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAhbGFzdGFwcC5jbGFzc05hbWUuZXF1YWxzKGNsYXNzX25hbWUpKSB7CisgICAgICAgICAgICAgICAgaW5zZXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcSA9IGxhc3RhcHAuaW5zdGFsbE9yZGVyICsgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluc2VydCkgeworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoInhfd2FwX2FwcGxpY2F0aW9uIiwgeF9hcHBfaWQpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImNvbnRlbnRfdHlwZSIsIGNvbnRlbnRfdHlwZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgicGFja2FnZV9uYW1lIiwgcGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJjbGFzc19uYW1lIiwgY2xhc3NfbmFtZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiYXBwX3R5cGUiLCBhcHBfdHlwZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgibmVlZF9zaWduYXR1cmUiLCBuZWVkX3NpZ25hdHVyZSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJmdXJ0aGVyX3Byb2Nlc3NpbmciLCBmdXJ0aGVyX3Byb2Nlc3NpbmcgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaW5zdGFsbF9vcmRlciIsIHNxKTsKKyAgICAgICAgICAgICAgICBkYi5pbnNlcnQoQVBQSURfVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoTE9HX1RBRywgImFkZDoiICsgeF9hcHBfaWQgKyAiOiIgKyBjb250ZW50X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgcGFja2FnZV9uYW1lICsgIi4iICsgY2xhc3NfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBuZXdzcToiICsgc3EpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHVwZGF0aW5nIHRoZSBwYWNrYWdlIHN1Y2NlZWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVBhY2thZ2UoU3RyaW5nIHhfYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLAorICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlX25hbWUsIFN0cmluZyBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgIGludCBhcHBfdHlwZSwgYm9vbGVhbiBuZWVkX3NpZ25hdHVyZSwgYm9vbGVhbiBmdXJ0aGVyX3Byb2Nlc3NpbmcpIHsKKworICAgICAgICAgICAgaWYgKCFhcHBUeXBlQ2hlY2soYXBwX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImludmFsaWQgYXBwX3R5cGUgIiArIGFwcF90eXBlICsgIi4gYXBwX3R5cGUgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZICsgIiBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyIGRiaCA9IGdldERhdGFiYXNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gZGJoLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlci5xdWVyeURhdGEgbGFzdGFwcCA9IGRiaC5xdWVyeUxhc3RBcHAoZGIsIHhfYXBwX2lkLCBjb250ZW50X3R5cGUpOworCisgICAgICAgICAgICBpZiAobGFzdGFwcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIFN0cmluZyB3aGVyZSA9ICJ4X3dhcF9hcHBsaWNhdGlvbj1cJyIgKyB4X2FwcF9pZCArICJcJyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBjb250ZW50X3R5cGU9XCciICsgY29udGVudF90eXBlICsgIlwnIgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGluc3RhbGxfb3JkZXI9IiArIGxhc3RhcHAuaW5zdGFsbE9yZGVyOworCisgICAgICAgICAgICB2YWx1ZXMucHV0KCJwYWNrYWdlX25hbWUiLCBwYWNrYWdlX25hbWUpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiY2xhc3NfbmFtZSIsIGNsYXNzX25hbWUpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiYXBwX3R5cGUiLCBhcHBfdHlwZSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJuZWVkX3NpZ25hdHVyZSIsIG5lZWRfc2lnbmF0dXJlID8gMSA6IDApOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiZnVydGhlcl9wcm9jZXNzaW5nIiwgZnVydGhlcl9wcm9jZXNzaW5nID8gMSA6IDApOworCisgICAgICAgICAgICBpbnQgbnVtID0gZGIudXBkYXRlKEFQUElEX1RBQkxFX05BTUUsIHZhbHVlcywgd2hlcmUsIG51bGwpOworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJ1cGRhdGU6IiArIHhfYXBwX2lkICsgIjoiICsgY29udGVudF90eXBlICsgIiAiCisgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZV9uYW1lICsgIi4iICsgY2xhc3NfbmFtZQorICAgICAgICAgICAgICAgICAgICArICIsIHNxOiIgKyBsYXN0YXBwLmluc3RhbGxPcmRlcik7CisKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBudW0gPiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkZWxldGluZyB0aGUgcGFja2FnZSBzdWNjZWVkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVQYWNrYWdlKFN0cmluZyB4X2FwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSkgeworICAgICAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyIGRiaCA9IGdldERhdGFiYXNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gZGJoLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB3aGVyZSA9ICJ4X3dhcF9hcHBsaWNhdGlvbj1cJyIgKyB4X2FwcF9pZCArICJcJyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBjb250ZW50X3R5cGU9XCciICsgY29udGVudF90eXBlICsgIlwnIgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIHBhY2thZ2VfbmFtZT1cJyIgKyBwYWNrYWdlX25hbWUgKyAiXCciCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgY2xhc3NfbmFtZT1cJyIgKyBjbGFzc19uYW1lICsgIlwnIjsKKyAgICAgICAgICAgIGludCBudW1fcmVtb3ZlZCA9IGRiLmRlbGV0ZShBUFBJRF9UQUJMRV9OQU1FLCB3aGVyZSwgbnVsbCk7CisKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoTE9HX1RBRywgImRlbGV0ZWQgIiArIG51bV9yZW1vdmVkICsgIiByb3dzOiIKKyAgICAgICAgICAgICAgICAgICAgKyB4X2FwcF9pZCArICI6IiArIGNvbnRlbnRfdHlwZSArICIgIgorICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VfbmFtZSArICIuIiArIGNsYXNzX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bV9yZW1vdmVkID4gMDsKKyAgICAgICAgfQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIExpbnV4IElQQyBCaW5kZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIElXYXBQdXNoTWFuYWdlclN0dWIgbUJpbmRlciA9IG5ldyBJV2FwUHVzaE1hbmFnZXJTdHViKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIFdhcFB1c2hNYW5hZ2VyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtQmluZGVyLm1Db250ZXh0ID0gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1CaW5kZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gSUQgZGF0YWJhc2UgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFdhcFB1c2hNYW5EQkhlbHBlciBtRGJIZWxwZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBXYXBQdXNoTWFuREJIZWxwZXIgZ2V0RGF0YWJhc2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChtRGJIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJjcmVhdGUgbmV3IGRiIGluc3QuIik7CisgICAgICAgICAgICBtRGJIZWxwZXIgPSBuZXcgV2FwUHVzaE1hbkRCSGVscGVyKGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGJIZWxwZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB0ZXN0aW5nCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5RGF0YShTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgIGludCBhcHBfdHlwZSwgYm9vbGVhbiBuZWVkX3NpZ25hdHVyZSwgYm9vbGVhbiBmdXJ0aGVyX3Byb2Nlc3NpbmcpIHsKKyAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyIGRiaCA9IGdldERhdGFiYXNlKHRoaXMpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlci5xdWVyeURhdGEgbGFzdGFwcCA9IGRiaC5xdWVyeUxhc3RBcHAoZGIsIHhfYXBwX2lkLCBjb250ZW50X3R5cGUpOworCisgICAgICAgIGRiLmNsb3NlKCk7CisKKyAgICAgICAgaWYgKGxhc3RhcHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChsYXN0YXBwLnBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlX25hbWUpCisgICAgICAgICAgICAgICAgJiYgbGFzdGFwcC5jbGFzc05hbWUuZXF1YWxzKGNsYXNzX25hbWUpCisgICAgICAgICAgICAgICAgJiYgbGFzdGFwcC5hcHBUeXBlID09IGFwcF90eXBlCisgICAgICAgICAgICAgICAgJiYgIGxhc3RhcHAubmVlZFNpZ25hdHVyZSA9PSAobmVlZF9zaWduYXR1cmUgPyAxIDogMCkKKyAgICAgICAgICAgICAgICAmJiAgbGFzdGFwcC5mdXJ0aGVyUHJvY2Vzc2luZyA9PSAoZnVydGhlcl9wcm9jZXNzaW5nID8gMSA6IDApKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHRlc3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFFeGlzdChTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSkgeworICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIgZGJoID0gZ2V0RGF0YWJhc2UodGhpcyk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gZGJoLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBkYmgucXVlcnlMYXN0QXBwKGRiLCB4X2FwcF9pZCwgY29udGVudF90eXBlKSAhPSBudWxsOworCisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOTViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBXZSBvbmx5IHdhbnQgdGhpcyBhcGsgYnVpbGQgZm9yIHRlc3RzLgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCisjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgICAgIHNyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9JRGF0YVZlcmlmeS5haWRsCisKKworIyBOb3RpY2UgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGluY2x1ZGUgdGhlIHNyYyBmaWxlcyBvZiBFbWFpbCBiZWNhdXNlLCBieQorIyBydW5uaW5nIHRoZSB0ZXN0cyB1c2luZyBhbiBpbnN0cnVtZW50YXRpb24gdGFyZ2V0aW5nIEVhbWlsLCB3ZQorIyBhdXRvbWF0aWNhbGx5IGdldCBhbGwgb2YgaXRzIGNsYXNzZXMgbG9hZGVkIGludG8gb3VyIGVudmlyb25tZW50LgorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gV0FQUHVzaE1hbmFnZXJUZXN0cworCitMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9IFdBUFB1c2hNYW5hZ2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc2MzRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKworPCEtLSBwYWNrYWdlIG5hbWUgbXVzdCBiZSB1bmlxdWUgc28gc3VmZml4IHdpdGggInRlc3RzIiBzbyBwYWNrYWdlIGxvYWRlciBkb2Vzbid0IGlnbm9yZSB1cyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMiPgorCisKKyAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNtc3B1c2guV0FQUFVTSF9NQU5BR0VSX0JJTkQiIC8+CisgICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCIgLz4KKyAgICAgPCEtLXRlc3RpbmcuLi4vLS0+CisgICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY29uIiBhbmRyb2lkOmxhYmVsPSJ3YXBwdXNoIHRlc3QiPgorICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQ2xpZW50VGVzdCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJ3YXBwdXNoIHRlc3QiPgorICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5Ecm1SZWNlaXZlciIgYW5kcm9pZDplbmFibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LldBUF9QVVNIX1JFQ0VJVkVEIiAvPgorICAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOm1pbWVUeXBlPSJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIiAvPgorICAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnZhbHVlPSJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMrd2J4bWwiIC8+CisgICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDplbmFibGVkPSJ0cnVlIiBhbmRyb2lkOm5hbWU9Ii5SZWNlaXZlclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CisKKyAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5SZWNlaXZlckFjdGl2aXR5IgorICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIGFuZHJvaWQ6bGFiZWw9InRlc3QgcmVjZWl2ZXIiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuRGF0YVZlcmlmeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLklEYXRhVmVyaWZ5IiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgPC9hcHBsaWNhdGlvbj4KKworICAgICA8IS0tCisgICAgIFRoaXMgZGVjbGFyZXMgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiB0ZXN0IHJ1bm5lciB0YXJnZXRpbmcKKyAgICAgdGhlIHBhY2thZ2Ugb2YgY29tLmFuZHJvaWQuc21zcHVzaC4gIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgorICAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcKKyAgICAgICAgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgIC0tPgorICAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnNtc3B1c2giCisgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cyBmb3IgV0FQUHVzaE1hbmFnZXIiLz4KKworPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc0YzRjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9yZXMvZHJhd2FibGUtbGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk1NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9yZXMvZHJhd2FibGUtbWRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdjNjlmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2xheW91dC9tYWluLnhtbCBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZGJiMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTAsMCArMSwxNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8QWJzb2x1dGVMYXlvdXQKK2FuZHJvaWQ6aWQ9IkAraWQvd2lkZ2V0MTMzIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKK3htbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKz4KKzxFZGl0VGV4dAorYW5kcm9pZDppZD0iQCtpZC9hcHBfaWQiCithbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9IjEwIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjBweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjI2cHgiCis+Cis8L0VkaXRUZXh0PgorPEVkaXRUZXh0CithbmRyb2lkOmlkPSJAK2lkL2NvbnQiCithbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9IjIwIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjQ3cHgiCithbmRyb2lkOmxheW91dF95PSIyNnB4IgorPgorPC9FZGl0VGV4dD4KKzxFZGl0VGV4dAorYW5kcm9pZDppZD0iQCtpZC9wa2ciCithbmRyb2lkOmxheW91dF93aWR0aD0iMTI1cHgiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0icGtnIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjBweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjgxcHgiCis+Cis8L0VkaXRUZXh0PgorPEVkaXRUZXh0CithbmRyb2lkOmlkPSJAK2lkL2NscyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNzNweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJjbHMiCithbmRyb2lkOnRleHRTaXplPSIxOHNwIgorYW5kcm9pZDpsYXlvdXRfeD0iMTQ3cHgiCithbmRyb2lkOmxheW91dF95PSI4MXB4IgorPgorPC9FZGl0VGV4dD4KKzxCdXR0b24KK2FuZHJvaWQ6aWQ9IkAraWQvYWRkcGtnIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE4MnB4IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9ImFkZC91cGRhdGUgcGFja2FnZSIKK2FuZHJvaWQ6bGF5b3V0X3g9IjE1cHgiCithbmRyb2lkOmxheW91dF95PSIyMjVweCIKKz4KKzwvQnV0dG9uPgorPFRleHRWaWV3CithbmRyb2lkOmlkPSJAK2lkL3dpZGdldDUyIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJpbnB1dCBhcHBfaWQsIGNvbnRfdHlwZSwgcGtnLCBjbHMiCithbmRyb2lkOnRleHRTaXplPSIxOHNwIgorYW5kcm9pZDpsYXlvdXRfeD0iMHB4IgorYW5kcm9pZDpsYXlvdXRfeT0iMHB4IgorPgorPC9UZXh0Vmlldz4KKzxCdXR0b24KK2FuZHJvaWQ6aWQ9IkAraWQvcHJvY21zZyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDlweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJwcm9jZXNzIG1zZyIKK2FuZHJvaWQ6bGF5b3V0X3g9IjE5N3B4IgorYW5kcm9pZDpsYXlvdXRfeT0iMzYxcHgiCis+Cis8L0J1dHRvbj4KKzxSYWRpb0dyb3VwCithbmRyb2lkOmlkPSJAK2lkL3dpZGdldDEzNyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4M3B4IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4MHB4IgorYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCithbmRyb2lkOmxheW91dF94PSIxOXB4IgorYW5kcm9pZDpsYXlvdXRfeT0iMTM3cHgiCis+Cis8UmFkaW9CdXR0b24KK2FuZHJvaWQ6aWQ9IkAraWQvYWN0IgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE4MnB4IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9ImFjdCIKK2FuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKz4KKzwvUmFkaW9CdXR0b24+Cis8UmFkaW9CdXR0b24KK2FuZHJvaWQ6aWQ9IkAraWQvc3ZjIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJzdmMiCis+Cis8L1JhZGlvQnV0dG9uPgorPC9SYWRpb0dyb3VwPgorPEJ1dHRvbgorYW5kcm9pZDppZD0iQCtpZC9kZWxwa2ciCithbmRyb2lkOmxheW91dF93aWR0aD0iMTc0cHgiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0iZGVsZXRlIHBrZyIKK2FuZHJvaWQ6bGF5b3V0X3g9IjE0cHgiCithbmRyb2lkOmxheW91dF95PSIyODNweCIKKz4KKzwvQnV0dG9uPgorPEVkaXRUZXh0CithbmRyb2lkOmlkPSJAK2lkL3BkdSIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxODZweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0iODNweCIKK2FuZHJvaWQ6dGV4dD0iMDAwNjA4MDMwMjAzMGFhZjAyOTA1YzAzMGQ2YTAwODUwNzAzNzM2MTZkNzA2YzY1NDA2NDZmNjM2ZjZkNmYyZTZlNjUyZTZhNzAwMDA1YzMwNzIwMDkxMDIwMTIzNDU2MDEiCithbmRyb2lkOnRleHRTaXplPSIxOHNwIgorYW5kcm9pZDpsYXlvdXRfeD0iMTBweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjM0MXB4IgorPgorPC9FZGl0VGV4dD4KKzxDaGVja0JveAorYW5kcm9pZDppZD0iQCtpZC9mdHIiCithbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9ImZ0cl9wcm9jIgorYW5kcm9pZDpsYXlvdXRfeD0iMTQzcHgiCithbmRyb2lkOmxheW91dF95PSIxODFweCIKKz4KKzwvQ2hlY2tCb3g+Cis8Q2hlY2tCb3gKK2FuZHJvaWQ6aWQ9IkAraWQvc2lnIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJuZF9zaWciCithbmRyb2lkOmNoZWNrZWQ9InRydWUiCithbmRyb2lkOmxheW91dF94PSIxNDJweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjE0MHB4IgorPgorPC9DaGVja0JveD4KKzwvQWJzb2x1dGVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvQ2xpZW50VGVzdC5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0NsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZkMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0NsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmFkaW9CdXR0b247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVdhcFB1c2hNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5XYXBQdXNoTWFuYWdlclBhcmFtczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuV2FwUHVzaE92ZXJTbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOworaW1wb3J0IGNvbS5hbmRyb2lkLnNtc3B1c2guV2FwUHVzaE1hbmFnZXI7CisKKy8qKgorICogV2FwUHVzaE1hbmFnZXIgdGVzdCBhcHBsaWNhdGlvbgorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50VGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKworICAgICAgICBCdXR0b24gYWRkcGJ0biA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmFkZHBrZyk7CisgICAgICAgIEJ1dHRvbiBwcm9jYnRuID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQucHJvY21zZyk7CisgICAgICAgIEJ1dHRvbiBkZWxidG4gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5kZWxwa2cpOworCisgICAgICAgIExvZy52KExPR19UQUcsICJhY3Rpdml0eSBjcmVhdGVkISEiKTsKKworICAgICAgICBhZGRwYnRuLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgYXBwX2lkID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5hcHBfaWQpOworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBjb250ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250KTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgcGtnID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wa2cpOworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBjbHMgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmNscyk7CisgICAgICAgICAgICAgICAgICAgIFJhZGlvQnV0dG9uIGFjdCA9IChSYWRpb0J1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tCb3ggc2lnID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5zaWcpOworICAgICAgICAgICAgICAgICAgICBDaGVja0JveCBmdHIgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmZ0cik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVdhcFB1c2hNYW4uYWRkUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX2lkLmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250LmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2cuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0LmlzQ2hlY2tlZCgpID8gV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcuaXNDaGVja2VkKCksIGZ0ci5pc0NoZWNrZWQoKSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZW1vdGUgYWRkIHBrZyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FwUHVzaE1hbi51cGRhdGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX2lkLmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdC5pc0NoZWNrZWQoKSA/IFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcuaXNDaGVja2VkKCksIGZ0ci5pc0NoZWNrZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInJlbW90ZSBmdW5jIGZhaWxlZC4uLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgZGVsYnRuLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgYXBwX2lkID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5hcHBfaWQpOworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBjb250ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250KTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgcGtnID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wa2cpOworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBjbHMgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmNscyk7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrQm94IGRlbGFsbCA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuZGVsYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgImJ1dHRvbiBjbGlja2VkIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XYXBQdXNoTWFuLmRlbGV0ZVBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYWxsLmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZW1vdGUgZnVuYyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHByb2NidG4uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBwZHUgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnBkdSk7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IGFwcF9pZCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuYXBwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgY29udCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FwUHVzaE92ZXJTbXMgd2FwID0gbmV3IFdhcFB1c2hPdmVyU21zKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcC5kaXNwYXRjaFdhcFBkdShzdHJUb0hleChwZHUuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJoZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXhEdW1wLmhleFN0cmluZ1RvQnl0ZUFycmF5KHBkdS5nZXRUZXh0KCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4RHVtcC5oZXhTdHJpbmdUb0J5dGVBcnJheShwZHUuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVdhcFB1c2hNYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSGV4RHVtcC5oZXhTdHJpbmdUb0J5dGVBcnJheShwZHUuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpLCAwLCA2LCA1LCA1KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZW1vdGUgZnVuYyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgSVdhcFB1c2hNYW5hZ2VyIG1XYXBQdXNoTWFuOworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gY29ubiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgbVdhcFB1c2hNYW4gPSBudWxsOworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgInNlcnZpY2UgZGlzY29ubmVjdGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtV2FwUHVzaE1hbiA9IElXYXBQdXNoTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgInNlcnZpY2UgY29ubmVjdGVkLiIpOworICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIExvZy52KExPR19UQUcsICJvblN0YXJ0IGJpbmQgV0FQUHVzaE1hbmFnZXIgc2VydmljZSAiCisgICAgICAgICAgICAgICAgKyBJV2FwUHVzaE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgdGhpcy5iaW5kU2VydmljZShuZXcgSW50ZW50KElXYXBQdXNoTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpLCBjb25uLAorICAgICAgICAgICAgICAgIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIExvZy52KExPR19UQUcsICJiaW5kIHNlcnZpY2UgZG9uZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICB0aGlzLnVuYmluZFNlcnZpY2UoY29ubik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvRGF0YVZlcmlmeS5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0RhdGFWZXJpZnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ5MWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0RhdGFWZXJpZnkuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKKy8qKgorICogVG8gdmVyaWZ5IHRoYXQgcmVjZWl2ZXIgYXBwbGljYXRpb24gcmVjZWl2ZXMgY29ycmVjdCBib2R5IGRhdGEuCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhVmVyaWZ5IGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiV0FQIFBVU0giOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1dBSVQgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfQ09VTlQgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1MYXN0UmVjZWl2ZWRQZHUgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0RhdGFTZXQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgY2xhc3MgSURhdGFWZXJpZnlTdHViIGV4dGVuZHMgSURhdGFWZXJpZnkuU3R1YiB7CisgICAgICAgIHB1YmxpYyBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIHB1YmxpYyBJRGF0YVZlcmlmeVN0dWIoKSB7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGFycmF5Q29tcGFyZShieXRlW10gYXJyMSwgYnl0ZVtdIGFycjIpIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBpZiAoYXJyMSA9PSBudWxsIHx8IGFycjIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChhcnIxID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImFycjEgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJhcnIyIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXJyMS5sZW5ndGggIT0gYXJyMi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycjFbaV0gIT0gYXJyMltpXSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyZSBwZHUgYW5kIHJlY2VpdmVkIHBkdQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHZlcmlmeURhdGEoYnl0ZVtdIHBkdSkgeworICAgICAgICAgICAgaW50IGNudCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICghc0RhdGFTZXQpIHsKKyAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgYWN0aXZpdHkgcmVjZWl2ZSBkYXRhLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChUSU1FX1dBSVQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY250KysgPiBXQUlUX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3YWl0IG1vcmUgdGhhbiAxMCBzZWMuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2cudihMT0dfVEFHLCAidmVyaWZ5IHBkdSIpOworICAgICAgICAgICAgYm9vbGVhbiByZXQgPSBhcnJheUNvbXBhcmUocGR1LCBtTGFzdFJlY2VpdmVkUGR1KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXIgdGhlIG9sZCBkYXRhLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0RGF0YSgpIHsKKyAgICAgICAgICAgIG1MYXN0UmVjZWl2ZWRQZHUgPSBudWxsOworICAgICAgICAgICAgc0RhdGFTZXQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSURhdGFWZXJpZnlTdHViIGJpbmRlciA9IG5ldyBJRGF0YVZlcmlmeVN0dWIoKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIERhdGFWZXJpZnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZXIgYXBwbGljYXRpb24gbXVzdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gaXQgcmVjZWl2ZXMgdGhlIHdhcCBwdXNoIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2V0TGFzdFJlY2VpdmVkUGR1KGJ5dGVbXSBwZHUpIHsKKyAgICAgICAgbUxhc3RSZWNlaXZlZFBkdSA9IHBkdTsKKyAgICAgICAgc0RhdGFTZXQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgYXJnMCkgeworICAgICAgICByZXR1cm4gYmluZGVyOworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9Ecm1SZWNlaXZlci5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0RybVJlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZjEyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9Ecm1SZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKKworLyoqCisgKiBBIHNhbXBsZSB3YXAgcHVzaCByZWNlaXZlciBhcHBsaWNhdGlvbiBmb3IgZXhpc3RpbmcgZnJhbWV3b3JrCisgKiBUaGlzIGNsYXNzIGlzIGxpc3RlbmluZyBmb3IgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt4bWwiIG1lc3NhZ2UKKyAqLworcHVibGljIGNsYXNzIERybVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldBUCBQVVNIIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIkRybVJlY2VpdmVyIHJlY2VpdmVkLiIpOworCisgICAgICAgIGJ5dGVbXSBib2R5OworICAgICAgICBieXRlW10gaGVhZGVyOworCisgICAgICAgIGJvZHkgPSBpbnRlbnQuZ2V0Qnl0ZUFycmF5RXh0cmEoImRhdGEiKTsKKyAgICAgICAgaGVhZGVyID0gaW50ZW50LmdldEJ5dGVBcnJheUV4dHJhKCJoZWFkZXIiKTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAiaGVhZGVyOiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoaGVhZGVyKSk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJib2R5OiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoYm9keSkpOworCisgICAgICAgIERhdGFWZXJpZnkuU2V0TGFzdFJlY2VpdmVkUGR1KGJvZHkpOworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0lEYXRhVmVyaWZ5LmFpZGwKc2ltaWxhcml0eSBpbmRleCA2NCUKY29weSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCmNvcHkgdG8gcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0lEYXRhVmVyaWZ5LmFpZGwKaW5kZXggODZkZTM2Ni4uZjA2NzBmYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0lEYXRhVmVyaWZ5LmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKLQorcGFja2FnZSBjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0czsKIAogLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gU1RLIHNlcnZpY2UuCi0gKgotICoge0BoaWRlfQorICogSW50ZXJmYWNlIHRvIHJlY2VpdmVyIGFwcGxpY2F0aW9uIGRhdGEgdmVyaWZ5ZXIgY2xhc3MKICAqLwotY2xhc3MgU3RrRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFN0a0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CitpbnRlcmZhY2UgSURhdGFWZXJpZnkgeworICAgIC8qKgorICAgICAqIFZlcmlmeSBkYXRhCisgICAgICovCisgICAgYm9vbGVhbiB2ZXJpZnlEYXRhKGluIGJ5dGVbXSBwZHUpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBkYXRhCisgICAgICovCisgICAgdm9pZCByZXNldERhdGEoKTsKIH0KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL1JlY2VpdmVyQWN0aXZpdHkuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9SZWNlaXZlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmNTVlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9SZWNlaXZlckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKKy8qKgorICogQWN0aXZpdHkgdHlwZSByZWNlaXZlciBhcHBsaWNhdGlvbgorICovCitwdWJsaWMgY2xhc3MgUmVjZWl2ZXJBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJhY3Rpdml0eSBjcmVhdGVkISEiKTsKKworICAgICAgICBJbnRlbnQgaW4gPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgYnl0ZVtdIGJvZHk7CisgICAgICAgIGJ5dGVbXSBoZWFkZXI7CisKKyAgICAgICAgYm9keSA9IGluLmdldEJ5dGVBcnJheUV4dHJhKCJkYXRhIik7CisgICAgICAgIGhlYWRlciA9IGluLmdldEJ5dGVBcnJheUV4dHJhKCJoZWFkZXIiKTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAiaGVhZGVyOiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoaGVhZGVyKSk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJib2R5OiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoYm9keSkpOworCisgICAgICAgIERhdGFWZXJpZnkuU2V0TGFzdFJlY2VpdmVkUGR1KGJvZHkpOworCisgICAgICAgIGZpbmlzaCgpOworCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvUmVjZWl2ZXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvUmVjZWl2ZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNGJmNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9SZWNlaXZlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKKworLyoqCisgKiBTZXJ2aWNlIHR5cGUgcmVjZWl2ZXIgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIFJlY2VpdmVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldBUCBQVVNIIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiUmVjZWl2ZXIgc2VydmljZSBjcmVhdGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJSZWNlaXZlciBzZXJ2aWNlIHN0YXJ0ZWQiKTsKKworICAgICAgICBieXRlW10gYm9keTsKKyAgICAgICAgYnl0ZVtdIGhlYWRlcjsKKyAgICAgICAgYm9keSA9IGludGVudC5nZXRCeXRlQXJyYXlFeHRyYSgiZGF0YSIpOworICAgICAgICBoZWFkZXIgPSBpbnRlbnQuZ2V0Qnl0ZUFycmF5RXh0cmEoImhlYWRlciIpOworCisgICAgICAgIExvZy5kKExPR19UQUcsICJoZWFkZXI6Iik7CisgICAgICAgIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhoZWFkZXIpKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImJvZHk6Iik7CisgICAgICAgIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhib2R5KSk7CisKKyAgICAgICAgRGF0YVZlcmlmeS5TZXRMYXN0UmVjZWl2ZWRQZHUoYm9keSk7CisgICAgICAgIHJldHVybiBTVEFSVF9TVElDS1k7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9XYXBQdXNoVGVzdC5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL1dhcFB1c2hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYTM2YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9XYXBQdXNoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7CitpbXBvcnQgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklXYXBQdXNoTWFuYWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuV2FwUHVzaE1hbmFnZXJQYXJhbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LldzcFR5cGVEZWNvZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zbXNwdXNoLldhcFB1c2hNYW5hZ2VyOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGZyYW1ld29yayBmb3IgYSB0ZXN0IG9mIGEgU2VydmljZS4gIFNlZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZQorICogU2VydmljZVRlc3RDYXNlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gd3JpdGUgYW5kIGV4dGVuZCBzZXJ2aWNlIHRlc3RzLgorICoKKyAqIFRvIHJ1biB0aGlzIHRlc3QsIHlvdSBjYW4gdHlwZToKKyAqIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IFwKKyAqIC1lIGNsYXNzIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLldhcFB1c2hUZXN0IFwKKyAqIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCisgKi8KK3B1YmxpYyBjbGFzcyBXYXBQdXNoVGVzdCBleHRlbmRzIFNlcnZpY2VUZXN0Q2FzZTxXYXBQdXNoTWFuYWdlcj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldBUCBQVVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9XQUlUID0gMTAwOworCisgICAgcHJvdGVjdGVkIGludCBtQXBwSWRWYWx1ZSA9IDB4ODAwMjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1BcHBJZE5hbWUgPSAieC13YXAtYXBwbGljYXRpb246KiI7CisgICAgcHJvdGVjdGVkIGludCBtQ29udGVudFR5cGVWYWx1ZSA9IDB4MDMwYTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1Db250ZW50VHlwZU5hbWUgPSAiYXBwbGljYXRpb24vdm5kLndhcC5zaWMiOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtQ2xhc3NOYW1lOworCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBtR3NtSGVhZGVyID0geworICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIC8vIHNjIGFkZHJlc3MKKyAgICAgICAgICAgIChieXRlKSAweDQwLCAvLyBUUC1NVEkKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAvLyBzZW5kZXIgYWRkcmVzcyBsZW5ndGg/CisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDQ1LCAvLyBzZW5kZXIgYWRkcmVzcz8KKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBkYXRhIHNjaGVtYQorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIC8vIHByb3RvIElECisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjAsIChieXRlKSAweDEyLCAoYnl0ZSkgMHgzMSwKKyAgICAgICAgICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4NjMgLy8gdGltZSBzdGFtcAorICAgIH07CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIG1Vc2VyRGF0YUhlYWRlciA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAvLyBVREggbGVuCisgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgLy8gaGVhZGVyIGxlbgorICAgICAgICAgICAgKGJ5dGUpIDB4MDUsIC8vIHBvcnQgYWRkcmVzc2luZyB0eXBlPworICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIC8vIGR1bW15CisgICAgICAgICAgICAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4ODQsIC8vIGRlc3QgcG9ydAorICAgICAgICAgICAgKGJ5dGUpIDB4MjMsIChieXRlKSAweEYwIC8vIHNyYyBwb3J0CisgICAgfTsKKworICAgIHByb3RlY3RlZCBieXRlW10gbVdzcEhlYWRlcjsKKworICAgIHByb3RlY3RlZCBieXRlW10gbU1lc3NhZ2VCb2R5ID0geworICAgICAgICAgICAgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwKKyAgICAgICAgICAgIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNywKKyAgICAgICAgICAgIChieXRlKSAweDA4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksCisgICAgICAgICAgICAoYnl0ZSkgMHgwYSwKKyAgICAgICAgICAgIChieXRlKSAweDBiLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGMsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZCwKKyAgICAgICAgICAgIChieXRlKSAweDBlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGYKKyAgICB9OworCisgICAgcHJvdGVjdGVkIGludCBtV3NwSGVhZGVyU3RhcnQ7CisgICAgcHJvdGVjdGVkIGludCBtV3NwSGVhZGVyTGVuOworICAgIHByb3RlY3RlZCBpbnQgbVdzcENvbnRlbnRUeXBlU3RhcnQ7CisKKyAgICAvKioKKyAgICAgKiBPTUEgYXBwbGljYXRpb24gSUQgaW4gYmluYXJ5IGZvcm0KKyAgICAgKiBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9vbW5hL29tbmEtcHVzaC1hcHAtaWQuYXNweAorICAgICAqLworICAgIGZpbmFsIGludFtdIE9NQV9BUFBMSUNBVElPTl9JRF9WQUxVRVMgPSBuZXcgaW50W10geworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMywKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDA1LAorICAgICAgICAgICAgMHgwNiwKKyAgICAgICAgICAgIDB4MDcsCisgICAgICAgICAgICAweDA4LAorICAgICAgICAgICAgMHgwOSwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgICAgICAweDgwMDAsCisgICAgICAgICAgICAweDgwMDEsCisgICAgICAgICAgICAweDgwMDIsCisgICAgICAgICAgICAweDgwMDMsCisgICAgICAgICAgICAweDgwMDQsCisgICAgICAgICAgICAweDgwMDUsCisgICAgICAgICAgICAweDgwMDYsCisgICAgICAgICAgICAweDgwMDcsCisgICAgICAgICAgICAweDgwMDgsCisgICAgICAgICAgICAweDgwMDksCisgICAgICAgICAgICAweDgwMEIsCisgICAgICAgICAgICAweDgwMTAKKyAgICB9OworCisgICAgLyoqCisgICAgICogT01BIGFwcGxpY2F0aW9uIElEIGluIHN0cmluZyBmb3JtCisgICAgICogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvb21uYS9vbW5hLXB1c2gtYXBwLWlkLmFzcHgKKyAgICAgKi8KKyAgICBmaW5hbCBTdHJpbmdbXSBPTUFfQVBQTElDQVRJT05fSURfTkFNRVMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOioiLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOnB1c2guc2lhIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjp3bWwudWEiLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOnd0YS51YSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246bW1zLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjpwdXNoLnN5bmNtbCIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246bG9jLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjpzeW5jbWwuZG0iLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOmRybS51YSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246ZW1uLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjp3di51YSIsCisgICAgICAgICAgICAieC13YXAtbWljcm9zb2Z0OmxvY2FsY29udGVudC51YSIsCisgICAgICAgICAgICAieC13YXAtbWljcm9zb2Z0OklNY2xpZW50LnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1kb2NvbW86aW1vZGUubWFpbC51YSIsCisgICAgICAgICAgICAieC13YXAtZG9jb21vOmltb2RlLm1yLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1kb2NvbW86aW1vZGUubWYudWEiLAorICAgICAgICAgICAgIngtbW90b3JvbGE6bG9jYXRpb24udWEiLAorICAgICAgICAgICAgIngtbW90b3JvbGE6bm93LnVhIiwKKyAgICAgICAgICAgICJ4LW1vdG9yb2xhOm90YXByb3YudWEiLAorICAgICAgICAgICAgIngtbW90b3JvbGE6YnJvd3Nlci51YSIsCisgICAgICAgICAgICAieC1tb3Rvcm9sYTpzcGxhc2gudWEiLAorICAgICAgICAgICAgIngtd2FwLW5haTptdnN3LmNvbW1hbmQiLAorICAgICAgICAgICAgIngtd2FwLW9wZW53YXZlOmlvdGEudWEiCisgICAgfTsKKworICAgIC8qKgorICAgICAqIE9NQSBjb250ZW50IHR5cGUgaW4gYmluYXJ5IGZvcm0KKyAgICAgKiBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9vbW5hL29tbmEtd3NwLWNvbnRlbnQtdHlwZS5hc3B4CisgICAgICovCisgICAgZmluYWwgaW50W10gT01BX0NPTlRFTlRfVFlQRV9WQUxVRVMgPSBuZXcgaW50W10geworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMywKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDA1LAorICAgICAgICAgICAgMHgwNiwKKyAgICAgICAgICAgIDB4MDcsCisgICAgICAgICAgICAweDA4LAorICAgICAgICAgICAgMHgwOSwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgICAgICAweDBCLAorICAgICAgICAgICAgMHgwQywKKyAgICAgICAgICAgIDB4MEQsCisgICAgICAgICAgICAweDBFLAorICAgICAgICAgICAgMHgwRiwKKyAgICAgICAgICAgIDB4MTAsCisgICAgICAgICAgICAweDExLAorICAgICAgICAgICAgMHgxMiwKKyAgICAgICAgICAgIDB4MTMsCisgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgMHgxNSwKKyAgICAgICAgICAgIDB4MTYsCisgICAgICAgICAgICAweDE3LAorICAgICAgICAgICAgMHgxOCwKKyAgICAgICAgICAgIDB4MTksCisgICAgICAgICAgICAweDFBLAorICAgICAgICAgICAgMHgxQiwKKyAgICAgICAgICAgIDB4MUMsCisgICAgICAgICAgICAweDFELAorICAgICAgICAgICAgMHgxRSwKKyAgICAgICAgICAgIDB4MUYsCisgICAgICAgICAgICAweDIwLAorICAgICAgICAgICAgMHgyMSwKKyAgICAgICAgICAgIDB4MjIsCisgICAgICAgICAgICAweDIzLAorICAgICAgICAgICAgMHgyNCwKKyAgICAgICAgICAgIDB4MjUsCisgICAgICAgICAgICAweDI2LAorICAgICAgICAgICAgMHgyNywKKyAgICAgICAgICAgIDB4MjgsCisgICAgICAgICAgICAweDI5LAorICAgICAgICAgICAgMHgyQSwKKyAgICAgICAgICAgIDB4MkIsCisgICAgICAgICAgICAweDJDLAorICAgICAgICAgICAgMHgyRCwKKyAgICAgICAgICAgIDB4MkUsCisgICAgICAgICAgICAweDJGLAorICAgICAgICAgICAgMHgzMCwKKyAgICAgICAgICAgIDB4MzEsCisgICAgICAgICAgICAweDMyLAorICAgICAgICAgICAgMHgzMywKKyAgICAgICAgICAgIDB4MzQsCisgICAgICAgICAgICAweDM1LAorICAgICAgICAgICAgMHgzNiwKKyAgICAgICAgICAgIDB4MzcsCisgICAgICAgICAgICAweDM4LAorICAgICAgICAgICAgMHgzOSwKKyAgICAgICAgICAgIDB4M0EsCisgICAgICAgICAgICAweDNCLAorICAgICAgICAgICAgMHgzQywKKyAgICAgICAgICAgIDB4M0QsCisgICAgICAgICAgICAweDNFLAorICAgICAgICAgICAgMHgzRiwKKyAgICAgICAgICAgIDB4NDAsCisgICAgICAgICAgICAweDQxLAorICAgICAgICAgICAgMHg0MiwKKyAgICAgICAgICAgIDB4NDMsCisgICAgICAgICAgICAweDQ0LAorICAgICAgICAgICAgMHg0NSwKKyAgICAgICAgICAgIDB4NDYsCisgICAgICAgICAgICAweDQ3LAorICAgICAgICAgICAgMHg0OCwKKyAgICAgICAgICAgIDB4NDksCisgICAgICAgICAgICAweDRBLAorICAgICAgICAgICAgMHg0QiwKKyAgICAgICAgICAgIDB4NEMsCisgICAgICAgICAgICAweDRELAorICAgICAgICAgICAgMHg0RSwKKyAgICAgICAgICAgIDB4NEYsCisgICAgICAgICAgICAweDUwLAorICAgICAgICAgICAgMHg1MSwKKyAgICAgICAgICAgIDB4NTIsCisgICAgICAgICAgICAweDUzLAorICAgICAgICAgICAgMHg1NCwKKy8vICAgICAgICAgICAgMHg1NSwKKy8vICAgICAgICAgICAgMHg1NiwKKy8vICAgICAgICAgICAgMHg1NywKKy8vICAgICAgICAgICAgMHg1OCwKKyAgICAgICAgICAgIDB4MDIwMSwKKyAgICAgICAgICAgIDB4MDIwMiwKKyAgICAgICAgICAgIDB4MDIwMywKKyAgICAgICAgICAgIDB4MDIwNCwKKyAgICAgICAgICAgIDB4MDIwNSwKKyAgICAgICAgICAgIDB4MDIwNiwKKyAgICAgICAgICAgIDB4MDIwNywKKyAgICAgICAgICAgIDB4MDIwOCwKKyAgICAgICAgICAgIDB4MDIwOSwKKyAgICAgICAgICAgIDB4MDIwQSwKKyAgICAgICAgICAgIDB4MDIwQiwKKyAgICAgICAgICAgIDB4MDIwQywKKyAgICAgICAgICAgIDB4MDMwMCwKKyAgICAgICAgICAgIDB4MDMwMSwKKyAgICAgICAgICAgIDB4MDMwMiwKKyAgICAgICAgICAgIDB4MDMwMywKKyAgICAgICAgICAgIDB4MDMwNCwKKyAgICAgICAgICAgIDB4MDMwNSwKKyAgICAgICAgICAgIDB4MDMwNiwKKyAgICAgICAgICAgIDB4MDMwNywKKyAgICAgICAgICAgIDB4MDMwOCwKKyAgICAgICAgICAgIDB4MDMwOSwKKyAgICAgICAgICAgIDB4MDMwQSwKKyAgICAgICAgICAgIDB4MDMwQiwKKyAgICAgICAgICAgIDB4MDMwQywKKyAgICAgICAgICAgIDB4MDMwRCwKKyAgICAgICAgICAgIDB4MDMwRSwKKyAgICAgICAgICAgIDB4MDMwRiwKKyAgICAgICAgICAgIDB4MDMxMCwKKyAgICAgICAgICAgIDB4MDMxMSwKKyAgICAgICAgICAgIDB4MDMxMiwKKyAgICAgICAgICAgIDB4MDMxMywKKyAgICAgICAgICAgIDB4MDMxNCwKKyAgICAgICAgICAgIDB4MDMxNSwKKyAgICAgICAgICAgIDB4MDMxNiwKKyAgICAgICAgICAgIDB4MDMxNywKKyAgICAgICAgICAgIDB4MDMxOCwKKyAgICAgICAgICAgIDB4MDMxOSwKKyAgICAgICAgICAgIDB4MDMxQSwKKyAgICAgICAgICAgIDB4MDMxQgorICAgICAgICAgICAgLyoweDAzMUMsCisgICAgICAgICAgICAgIDB4MDMxRCovCisgICAgfTsKKworICAgIC8qKgorICAgICAqIE9NQSBjb250ZW50IHR5cGUgaW4gc3RyaW5nIGZvcm0KKyAgICAgKiBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9vbW5hL29tbmEtd3NwLWNvbnRlbnQtdHlwZS5hc3B4CisgICAgICovCisgICAgZmluYWwgU3RyaW5nW10gT01BX0NPTlRFTlRfVFlQRV9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiKi8qIiwKKyAgICAgICAgICAgICJ0ZXh0LyoiLAorICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAidGV4dC9wbGFpbiIsCisgICAgICAgICAgICAidGV4dC94LWhkbWwiLAorICAgICAgICAgICAgInRleHQveC10dG1sIiwKKyAgICAgICAgICAgICJ0ZXh0L3gtdkNhbGVuZGFyIiwKKyAgICAgICAgICAgICJ0ZXh0L3gtdkNhcmQiLAorICAgICAgICAgICAgInRleHQvdm5kLndhcC53bWwiLAorICAgICAgICAgICAgInRleHQvdm5kLndhcC53bWxzY3JpcHQiLAorICAgICAgICAgICAgInRleHQvdm5kLndhcC53dGEtZXZlbnQiLAorICAgICAgICAgICAgIm11bHRpcGFydC8qIiwKKyAgICAgICAgICAgICJtdWx0aXBhcnQvbWl4ZWQiLAorICAgICAgICAgICAgIm11bHRpcGFydC9mb3JtLWRhdGEiLAorICAgICAgICAgICAgIm11bHRpcGFydC9ieXRlcmFudGVzIiwKKyAgICAgICAgICAgICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uLyoiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL2phdmEtdm0iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veC1oZG1sYyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC53bWxjIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAud3RhLWV2ZW50YyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC51YXByb2YiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAud3Rscy1jYS1jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC53dGxzLXVzZXItY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXg1MDktdXNlci1jZXJ0IiwKKyAgICAgICAgICAgICJpbWFnZS8qIiwKKyAgICAgICAgICAgICJpbWFnZS9naWYiLAorICAgICAgICAgICAgImltYWdlL2pwZWciLAorICAgICAgICAgICAgImltYWdlL3RpZmYiLAorICAgICAgICAgICAgImltYWdlL3BuZyIsCisgICAgICAgICAgICAiaW1hZ2Uvdm5kLndhcC53Ym1wIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC4qIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5taXhlZCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuZm9ybS1kYXRhIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5ieXRlcmFuZ2VzIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5hbHRlcm5hdGl2ZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICJ0ZXh0L3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC53YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veC14OTY4LWNyb3NzLWNlcnQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gteDk2OC1jYS1jZXJ0IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXg5NjgtdXNlci1jZXJ0IiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAuc2kiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAuc2wiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2xjIiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAuY28iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuY29jIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5yZWxhdGVkIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYSIsCisgICAgICAgICAgICAidGV4dC92bmQud2FwLmNvbm5lY3Rpdml0eS14bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuY29ubmVjdGl2aXR5LXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLmhhc2hlZC1jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5zaWduZWQtY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuY2VydC1yZXNwb25zZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi93bWwreG1sIiwKKyAgICAgICAgICAgICJ0ZXh0L2NzcyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tbXMtbWVzc2FnZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5yb2xsb3Zlci1jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5sb2NjK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLmxvYyt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0rd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sLm5vdGlmaWNhdGlvbiIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC54aHRtbCt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53di5jc3AuY2lyIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRkK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnd2LmNzcCt3YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kcy5ub3RpZmljYXRpb24iLAorICAgICAgICAgICAgImF1ZGlvLyoiLAorICAgICAgICAgICAgInZpZGVvLyoiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vbWlrZXkiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRjZGMiLAorLy8gICAgICAgICAgICAidGV4dC94LXZNZXNzYWdlIiwKKy8vICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt3YnhtbCIsCisvLyAgICAgICAgICAgICJ0ZXh0L3gtdkJvb2ttYXJrIiwKKy8vICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0ubm90aWZpY2F0aW9uIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmFsZXJ0LXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0LXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5wcm92aXNpb25pbmctc3RhdHVzLXVyaSIsCisgICAgICAgICAgICAieC13YXAubXVsdGlwYXJ0L3ZuZC51cGxhbmV0LmhlYWRlci1zZXQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2Utd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5waG9uZWNvbS5tbWMtd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5zeW5jc2V0K3dieG1sIiwKKyAgICAgICAgICAgICJpbWFnZS94LXVwLXdwbmciLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL2lvdGEubW1jLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9pb3RhLm1tYy14bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sK3dieG1sIiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAuZW1uK3htbCIsCisgICAgICAgICAgICAidGV4dC9jYWxlbmRhciIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWVtYWlsK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZpbGUreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hZHMtZm9sZGVyK3htbCIsCisgICAgICAgICAgICAidGV4dC9kaXJlY3Rvcnk7cHJvZmlsZT12Q2FyZCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5lbW4rd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5pcGRjLXB1cmNoYXNlLXJlc3BvbnNlIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuc2NyZWVuMyt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5zY3JlZW4zK2d6aXAiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5jbWNjLnNldHRpbmcrd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5jbWNjLmJvbWJpbmcrd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5kb2NvbW8ucGYiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5kb2NvbW8udWIiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmdyb3VwLXVzYWdlLWxpc3QreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9vbWEtZGlyZWN0b3J5K3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLmRvY29tby5wZjIiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJvYXAtdHJpZ2dlcit3YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnNibS5taWQyIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5jLmNtY2MuZGNkK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnNibS5jaWQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QucHJvdmlzaW9uaW5ndHJpZ2dlciIsCisgICAgICAgICAgICAvKiJhcHBsaWNhdGlvbi92bmQuZG9jb21vLmRtIiwKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuc2NpZG0ubWVzc2FnZXMreG1sIiovCisgICAgfTsKKworICAgIHByaXZhdGUgSURhdGFWZXJpZnkgbUlWZXJpZnkgPSBudWxsOworCisgICAgU2VydmljZUNvbm5lY3Rpb24gbUNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICBMb2cudihMT0dfVEFHLCAiZGF0YSB2ZXJpZnkgaW50ZXJmYWNlIGNvbm5lY3RlZC4iKTsKKyAgICAgICAgICAgICAgICBtSVZlcmlmeSA9IElEYXRhVmVyaWZ5LlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNYWluIFdhcFB1c2hNYW5hZ2VyIHRlc3QgbW9kdWxlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIFdhcFB1c2hUZXN0KCkgeworICAgICAgICBzdXBlcihXYXBQdXNoTWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1DbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICBtUGFja2FnZU5hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSB2ZXJpZmllcgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgICAgIC8vIGdldCB2ZXJpZmllcgorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKG5ldyBJbnRlbnQoSURhdGFWZXJpZnkuY2xhc3MuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm4sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAic3VwZXIgZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInRlc3Qgc2V0dXAiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIElXYXBQdXNoTWFuYWdlciBtV2FwUHVzaCA9IG51bGw7CisgICAgSVdhcFB1c2hNYW5hZ2VyIGdldEludGVyZmFjZSgpIHsKKyAgICAgICAgaWYgKG1XYXBQdXNoICE9IG51bGwpIHJldHVybiBtV2FwUHVzaDsKKyAgICAgICAgSW50ZW50IHN0YXJ0SW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBzdGFydEludGVudC5zZXRDbGFzcyhnZXRDb250ZXh0KCksIFdhcFB1c2hNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgSUJpbmRlciBzZXJ2aWNlID0gYmluZFNlcnZpY2Uoc3RhcnRJbnRlbnQpOworCisgICAgICAgIG1XYXBQdXNoID0gSVdhcFB1c2hNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgIHJldHVybiBtV2FwUHVzaDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFsbCBtZXRob2RzIG5lZWQgdG8gc3RhcnQgd2l0aCAndGVzdCcuCisgICAgICogVXNlIHZhcmlvdXMgYXNzZXJ0IG1ldGhvZHMgdG8gcGFzcy9mYWlsIHRoZSB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXRBZGRQYWNrYWdlKGJvb2xlYW4gbmVlZF9zaWcsIGJvb2xlYW4gbW9yZV9wcm9jKSB7CisgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgLy8gaW5zZXJ0IG5ldyBkYXRhCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGl3YXBtYW4uYWRkUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIG5lZWRfc2lnLCBtb3JlX3Byb2MpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBkYXRhCisgICAgICAgIFdhcFB1c2hNYW5hZ2VyIHdwbWFuID0gZ2V0U2VydmljZSgpOworICAgICAgICBhc3NlcnRUcnVlKHdwbWFuLnZlcmlmeURhdGEoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIG5lZWRfc2lnLCBtb3JlX3Byb2MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcGFja2FnZSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2UxKCkgeworICAgICAgICBpbnQgb3JpZ2luYWxBcHBJZFZhbHVlID0gbUFwcElkVmFsdWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisKKyAgICAgICAgdXRBZGRQYWNrYWdlKHRydWUsIHRydWUpOworICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgdXRBZGRQYWNrYWdlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgIHV0QWRkUGFja2FnZShmYWxzZSwgdHJ1ZSk7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICB1dEFkZFBhY2thZ2UoZmFsc2UsIGZhbHNlKTsKKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisKKyAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGR1cHJlY2F0ZWQgcGFja2FnZSB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYWNrYWdlMigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSArIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSArIDEwKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlICsgMTApLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlICsgMTApLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1dFVwZGF0ZVBhY2thZ2UoYm9vbGVhbiBuZWVkX3NpZywgYm9vbGVhbiBtb3JlX3Byb2MpIHsKKyAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAvLyBpbnNlcnQgbmV3IGRhdGEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXdhcG1hbi51cGRhdGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgbmVlZF9zaWcsIG1vcmVfcHJvYykpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhlIGRhdGEKKyAgICAgICAgV2FwUHVzaE1hbmFnZXIgd3BtYW4gPSBnZXRTZXJ2aWNlKCk7CisgICAgICAgIGFzc2VydFRydWUod3BtYW4udmVyaWZ5RGF0YSgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgbmVlZF9zaWcsIG1vcmVfcHJvYykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0aW5nIHBhY2thZ2UgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQYWNrYWdlMSgpIHsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworCisgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgdXRVcGRhdGVQYWNrYWdlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1BcHBJZFZhbHVlICs9IDEwOworICAgICAgICB1dFVwZGF0ZVBhY2thZ2UoZmFsc2UsIHRydWUpOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgdXRVcGRhdGVQYWNrYWdlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgIHV0VXBkYXRlUGFja2FnZSh0cnVlLCB0cnVlKTsKKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisKKyAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG1BcHBJZFZhbHVlICs9IDEwOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGluZyBpbnZhbGlkIHBhY2thZ2UgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQYWNrYWdlMigpIHsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi51cGRhdGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4udXBkYXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwgMCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGl3YXBtYW4udXBkYXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUgKyAiZHVtbXlfZGF0YSIsIG1DbGFzc05hbWUsIDAsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpd2FwbWFuLnVwZGF0ZVBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lICsgImR1bW15X2RhdGEiLCAwLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1DbGFzc05hbWUgKyAiZHVtbXlfZGF0YSIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1dERlbGV0ZVBhY2thZ2UoKSB7CisgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXdhcG1hbi5kZWxldGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhlIGRhdGEKKyAgICAgICAgV2FwUHVzaE1hbmFnZXIgd3BtYW4gPSBnZXRTZXJ2aWNlKCk7CisgICAgICAgIGFzc2VydFRydWUoIXdwbWFuLmlzRGF0YUV4aXN0KAorICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0aW5nIHBhY2thZ2UgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVQYWNrYWdlMSgpIHsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworCisgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgdXREZWxldGVQYWNrYWdlKCk7CisgICAgICAgIG1BcHBJZFZhbHVlICs9IDEwOworICAgICAgICB1dERlbGV0ZVBhY2thZ2UoKTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgIHV0RGVsZXRlUGFja2FnZSgpOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgdXREZWxldGVQYWNrYWdlKCk7CisKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0aW5nIGludmFsaWQgcGFja2FnZSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVBhY2thZ2UyKCkgeworICAgICAgICBpbnQgb3JpZ2luYWxBcHBJZFZhbHVlID0gbUFwcElkVmFsdWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUgKyAyMCksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUgKyAyMCksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSkpOworCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIGludCBlbmNvZGVVaW50MzIoaW50IHVpbnQzMlZhbCwgYnl0ZVtdIGFyciwgaW50IHN0YXJ0KSB7CisgICAgICAgIGludCBiaXQgPSAxOworICAgICAgICBpbnQgdG9wYml0ID0gMDsKKyAgICAgICAgaW50IGVuY29kZUxlbjsKKyAgICAgICAgaW50IHRtcFZhbDsKKworICAgICAgICBhc3NlcnRUcnVlKHVpbnQzMlZhbCA+PSAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGJpdCAmIHVpbnQzMlZhbCkgPiAwKSB0b3BiaXQgPSBpOworICAgICAgICAgICAgYml0ID0gKGJpdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbmNvZGVMZW4gPSB0b3BiaXQvNyArIDE7CisgICAgICAgIGlmIChhcnIgPT0gbnVsbCkgcmV0dXJuIGVuY29kZUxlbjsKKworICAgICAgICAvL0xvZy5kKExPR19UQUcsICJ1aW50MzJWYWwgPSAiICsgSW50ZWdlci50b0hleFN0cmluZyh1aW50MzJWYWwpICsgIiwgdG9wYml0ID0gIgorICAgICAgICAvLyAgICAgICsgdG9wYml0ICsgIiwgZW5jb2RlTGVuID0gIiArIGVuY29kZUxlbik7CisKKyAgICAgICAgdG1wVmFsID0gdWludDMyVmFsOworICAgICAgICBmb3IgKGludCBpID0gZW5jb2RlTGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGxvbmcgdmFsID0gMDsKKyAgICAgICAgICAgIGlmIChpIDwgZW5jb2RlTGVuIC0gMSkgdmFsID0gMHg4MDsKKyAgICAgICAgICAgIHZhbCB8PSB0bXBWYWwgJiAweDdmOworICAgICAgICAgICAgYXJyW3N0YXJ0ICsgaV0gPSAoYnl0ZSkgKHZhbCAmIDB4RkYpOworICAgICAgICAgICAgdG1wVmFsID0gKHRtcFZhbCA+PiA3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5jb2RlTGVuOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZW5jb2RlU2hvcnRJbnQoaW50IHNpbnRWYWwsIGJ5dGVbXSBhcnIsIGludCBzdGFydCkgeworICAgICAgICBpbnQgZW5jb2RlTGVuID0gMDsKKworICAgICAgICBpZiAoc2ludFZhbCA+PSAweDgwKSByZXR1cm4gZW5jb2RlTGVuOworICAgICAgICBlbmNvZGVMZW4gPSAxOworICAgICAgICBhcnJbc3RhcnRdID0gKGJ5dGUpIChzaW50VmFsIHwgMHg4MCk7CisgICAgICAgIHJldHVybiBlbmNvZGVMZW47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBSYW5kb20gV1NQIGhlYWRlciB3aXRoIGludGVnZXIgYXBwbGljYXRpb24gSUQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSYW5kb21Xc3BIZWFkZXIoYnl0ZVtdIGFyciwgUmFuZG9tIHJkLCBpbnQgaGVhZGVyU3RhcnQsCisgICAgICAgICAgICBib29sZWFuIG5vQXBwSWQpIHsKKworICAgICAgICBib29sZWFuIGFwcElkQWRkZWQgPSBmYWxzZTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAiaGVhZGVyU3RhcnQgPSAiICsgaGVhZGVyU3RhcnQgKyAiLCBhcHBJZCA9ICIgKyBtQXBwSWRWYWx1ZQorICAgICAgICAgICAgICAgICsgIigiICsgSW50ZWdlci50b0hleFN0cmluZyhtQXBwSWRWYWx1ZSkgKyAiKSIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAicmFuZG9tIGFyciBsZW5ndGg6IiArIGFyci5sZW5ndGgpOworICAgICAgICBTdHJpbmcgdHlwZW5hbWVbXSA9IG5ldyBTdHJpbmdbXSB7ICJzaG9ydCBpbnQiLCAibG9uZyBpbnQiLCAic3RyaW5nIiwgInVpbnQzMiJ9OworCisgICAgICAgIHdoaWxlICghYXBwSWRBZGRlZCkgeworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBoZWFkZXJTdGFydDsKKyAgICAgICAgICAgIGludCBsZW4gPSBhcnIubGVuZ3RoOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBib29sZWFuIGFkZEFwcGlkID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgdG1wVmFsID0gMDsKKyAgICAgICAgICAgIGludCB0bXBWYWwyID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYWRkOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBmaWVsZCBuYW1lCisgICAgICAgICAgICAgICAgICogMDogc2hvcnQgaW50CisgICAgICAgICAgICAgICAgICogMTogbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgKiAyOiB0ZXh0CisgICAgICAgICAgICAgICAgICogKG5vIHVpbnQgZm9yIHBhcmFtIHZhbHVlKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHR5cGUgPSByZC5uZXh0SW50KDMpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMTAwICYmICFhcHBJZEFkZGVkKSBhZGRBcHBpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyByZC5uZXh0SW50KDI5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBhZGQgPSAyICsgcmQubmV4dEludCgxMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyBhZGQgPj0gbGVuKSBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIGZpbGwgaGVhZGVyIG5hbWUKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIGhlYWRlciBzaG9ydCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGlmICghYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpICgweDgwIHwgcmQubmV4dEludCgxMjgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGFycltpbmRleF0gPT0gKGJ5dGUpIDB4YWYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImFwcElkIGFkZGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAweGFmOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm9BcHBJZCBjYXNlLCBhcHBJZCBmbGQgbXVzdCBiZSBkZWNpZXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub0FwcElkKSBhcnJbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoYWRkIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHRtcFZhbDIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9IHJkLm5leHRJbnQoMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbDIgPSAodG1wVmFsMiA8PCA4KSB8IHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgYXBwbGljYXRpb24gaWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbDIgPT0gMHgyZikgYXJyW2luZGV4ICsgMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wVmFsIDwgMzIpIHRtcFZhbD0gKDMyICsgdG1wVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJmaWVsZCBuYW1lIGluZGV4OiIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ0eXBlOiIgKyB0eXBlbmFtZVt0eXBlXSArICIsIGFkZDoiICsgYWRkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGk8IGluZGV4ICsgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoSW50ZWdlci50b0hleFN0cmluZygweGZmICYgYXJyW2luZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoYXJyLCBpbmRleCArIDEsIGFkZCAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChzdHIuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnXG4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggKz0gYWRkOworCisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZpZWxkIHZhbHVlCisgICAgICAgICAgICAgICAgICogMDogc2hvcnQgaW50CisgICAgICAgICAgICAgICAgICogMTogbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgKiAyOiB0ZXh0CisgICAgICAgICAgICAgICAgICogMzogdWludAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChhZGRBcHBpZCkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gcmQubmV4dEludCg0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBoZWFkZXIgc2hvcnQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBhZGQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGhlYWRlciBsb25nIGludAorICAgICAgICAgICAgICAgICAgICBpZiAoYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcEJpdCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtQXBwSWRWYWx1ZSAmIGJpdCkgPiAwKSB0b3BCaXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IChiaXQgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAyICsgdG9wQml0Lzg7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAxICsgcmQubmV4dEludCgyOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBoZWFkZXIgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDIgKyByZC5uZXh0SW50KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdWludDMyCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCArIGFkZCA+PSBsZW4pIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gZmlsbCBmaWVsZCB2YWx1ZQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludAorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpICgweDgwIHwgcmQubmV4dEludCgxMjgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRBcHBpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWRBZGRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgKGFkZCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gbUFwcElkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBhZGQ7IGkgPiAxOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpIC0gMV0gPSAoYnl0ZSkgKHRtcFZhbCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9ICh0bXBWYWwgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpIChhZGQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhZGQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHJkLm5leHRJbnQoMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6Ly8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wVmFsIDwgMzIpIHRtcFZhbD0gKDMyICsgdG1wVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGhlYWRlciB1dmFyaW50CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgMzE7CisgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9IHJkLm5leHRJbnQoMHgwRkZGRkZGRik7CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyBlbmNvZGVVaW50MzIodG1wVmFsLCBudWxsLCBpbmRleCArIDEpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVVaW50MzIodG1wVmFsLCBhcnIsIGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImZpZWxkIHZhbHVlIGluZGV4OiIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ0eXBlOiIgKyB0eXBlbmFtZVt0eXBlXSArICIsIGFkZDoiICsgYWRkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGk8IGluZGV4ICsgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoSW50ZWdlci50b0hleFN0cmluZygweGZmICYgYXJyW2luZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoYXJyLCBpbmRleCArIDEsIGFkZCAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChzdHIuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnXG4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggKz0gYWRkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vQXBwSWQpIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGFycikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIFJhbmRvbSBXU1AgaGVhZGVyIHdpdGggc3RyaW5nIGFwcGxpY2F0aW9uIElECisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmFuZG9tV3NwSGVhZGVyU3RyQXBwSWQoYnl0ZVtdIGFyciwgUmFuZG9tIHJkLCBpbnQgaGVhZGVyU3RhcnQsCisgICAgICAgICAgICBib29sZWFuIHJhbmRvbVN0cikgeworCisgICAgICAgIGJvb2xlYW4gYXBwSWRBZGRlZCA9IGZhbHNlOworCisgICAgICAgIExvZy5kKExPR19UQUcsICJyYW5kb20gYXJyIGxlbmd0aDoiICsgYXJyLmxlbmd0aCk7CisgICAgICAgIFN0cmluZyB0eXBlbmFtZVtdID0gbmV3IFN0cmluZ1tdIHsgInNob3J0IGludCIsICJsb25nIGludCIsICJzdHJpbmciLCAidWludDMyIn07CisKKyAgICAgICAgd2hpbGUgKCFhcHBJZEFkZGVkKSB7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGhlYWRlclN0YXJ0OworICAgICAgICAgICAgaW50IGxlbiA9IGFyci5sZW5ndGg7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWRkQXBwaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCB0bXBWYWwgPSAwOworICAgICAgICAgICAgaW50IHRtcFZhbDIgPSAwOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBhZGQ7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZpZWxkIG5hbWUKKyAgICAgICAgICAgICAgICAgKiAwOiBzaG9ydCBpbnQKKyAgICAgICAgICAgICAgICAgKiAxOiBsb25nIGludAorICAgICAgICAgICAgICAgICAqIDI6IHRleHQKKyAgICAgICAgICAgICAgICAgKiAobm8gdWludCBmb3IgcGFyYW0gdmFsdWUpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdHlwZSA9IHJkLm5leHRJbnQoMyk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBoZWFkZXIgc2hvcnQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAxMDAgJiYgIWFwcElkQWRkZWQpIGFkZEFwcGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMSArIHJkLm5leHRJbnQoMjkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBoZWFkZXIgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDIgKyByZC5uZXh0SW50KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCArIGFkZCA+PSBsZW4pIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gZmlsbCBoZWFkZXIgbmFtZQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRBcHBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgKDB4ODAgfCByZC5uZXh0SW50KDEyOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYXJyW2luZGV4XSA9PSAoYnl0ZSkgMHhhZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiYXBwSWQgYWRkZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpIDB4YWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoYWRkIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHRtcFZhbDIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9IHJkLm5leHRJbnQoMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbDIgPSAodG1wVmFsMiA8PCA4KSB8IHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgYXBwbGljYXRpb24gaWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbDIgPT0gMHgyZikgYXJyW2luZGV4ICsgMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wVmFsIDwgMzIpIHRtcFZhbD0gKDMyICsgdG1wVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJmaWVsZCBuYW1lIGluZGV4OiIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ0eXBlOiIgKyB0eXBlbmFtZVt0eXBlXSArICIsIGFkZDoiICsgYWRkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBpbmRleCArIGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4ZmYgJiBhcnJbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKGFyciwgaW5kZXggKyAxLCBhZGQgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoc3RyLmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGFkZDsKKworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBmaWVsZCB2YWx1ZQorICAgICAgICAgICAgICAgICAqIDA6IHNob3J0IGludAorICAgICAgICAgICAgICAgICAqIDE6IGxvbmcgaW50CisgICAgICAgICAgICAgICAgICogMjogdGV4dAorICAgICAgICAgICAgICAgICAqIDM6IHVpbnQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJkLm5leHRJbnQoNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMSArIHJkLm5leHRJbnQoMjkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZG9tU3RyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gMSArIHJkLm5leHRJbnQoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByYW5kU3RyPSBuZXcgYnl0ZVthZGRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWYWwgPCAzMikgdG1wVmFsPSAoMzIgKyB0bXBWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kU3RyW2ldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFwcElkTmFtZSA9IG5ldyBTdHJpbmcocmFuZFN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSBtQXBwSWROYW1lLmxlbmd0aCgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IDIgKyByZC5uZXh0SW50KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1aW50MzIKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgYWRkID49IGxlbikgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGZpZWxkIHZhbHVlCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBoZWFkZXIgc2hvcnQgaW50CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgKDB4ODAgfCByZC5uZXh0SW50KDEyOCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGhlYWRlciBsb25nIGludAorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpIChhZGQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGFkZDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgcmQubmV4dEludCgyNTUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6Ly8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFwcGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBJZEFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGQgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSAobUFwcElkTmFtZS5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1BcHBJZE5hbWUgYWRkZWQgWyIgKyBtQXBwSWROYW1lICsgIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGQgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbCA8IDMyKSB0bXBWYWw9ICgzMiArIHRtcFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgdG1wVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIDB4MDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gaGVhZGVyIHV2YXJpbnQKKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAzMTsKKyAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgweDBGRkZGRkZGKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMSArIGVuY29kZVVpbnQzMih0bXBWYWwsIG51bGwsIGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZVVpbnQzMih0bXBWYWwsIGFyciwgaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZmllbGQgdmFsdWUgaW5kZXg6IiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInR5cGU6IiArIHR5cGVuYW1lW3R5cGVdICsgIiwgYWRkOiIgKyBhZGQpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbmRleDsgaSA8IGluZGV4ICsgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoSW50ZWdlci50b0hleFN0cmluZygweGZmICYgYXJyW2luZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoYXJyLCBpbmRleCArIDEsIGFkZCAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChzdHIuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnXG4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggKz0gYWRkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImhlYWRlclN0YXJ0ID0gIiArIGhlYWRlclN0YXJ0ICsgIiwgbUFwcElkTmFtZSA9ICIgKyBtQXBwSWROYW1lKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGFycikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gY3JlYXRlUERVKGludCB0ZXN0TnVtKSB7CisgICAgICAgIGJ5dGVbXSBhcnJheSA9IG51bGw7CisgICAgICAgIC8vIGJ5dGVbXSB3c3AgPSBudWxsOworCisgICAgICAgIHN3aXRjaCAodGVzdE51bSkgeworICAgICAgICAgICAgLy8gc2FtcGxlIHBkdQorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBieXRlW10gYXJyYXkxID0geworICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gVElECisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDA2LCAvLyBUeXBlID0gd2FwIHB1c2gKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIC8vIExlbmd0aCB0byBiZSBzZXQgbGF0ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpICgobUNvbnRlbnRUeXBlVmFsdWUgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChtQ29udGVudFR5cGVWYWx1ZSAmIDB4ZmYpLAorCisgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uLWlkCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGFmLCAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpICgobUFwcElkVmFsdWUgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChtQXBwSWRWYWx1ZSYgMHhmZikKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBhcnJheTFbMl0gPSAoYnl0ZSkgKGFycmF5MS5sZW5ndGggLSAzKTsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTE7CisgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgPSBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyA3OworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5MS5sZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gaW52YWxpZCB3c3AgaGVhZGVyCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJ5dGVbXSBhcnJheTIgPSB7CisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBpbnZhbGlkIGRhdGEKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtV3NwSGVhZGVyID0gYXJyYXkyOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoOworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5Mi5sZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gcmFuZG9tIHdzcCBoZWFkZXIKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgaW50IGFyclNpemUgPSAxNTAgKyByZC5uZXh0SW50KDEwMCk7CisgICAgICAgICAgICBieXRlW10gYXJyYXkzID0gbmV3IGJ5dGVbYXJyU2l6ZV07CisgICAgICAgICAgICBpbnQgaGRyRW5jb2RlTGVuOworCisgICAgICAgICAgICBhcnJheTNbMF0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgYXJyYXkzWzFdID0gKGJ5dGUpIDB4NjsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoLCBudWxsLCAyKTsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoIC0gaGRyRW5jb2RlTGVuIC0gMiwgYXJyYXkzLCAyKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAyXSA9IChieXRlKSAweDM7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgM10gPSAoYnl0ZSkgMHgyOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDRdID0gKGJ5dGUpICgobUNvbnRlbnRUeXBlVmFsdWUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyA1XSA9IChieXRlKSAobUNvbnRlbnRUeXBlVmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIGNyZWF0ZVJhbmRvbVdzcEhlYWRlcihhcnJheTMsIHJkLCBoZHJFbmNvZGVMZW4gKyA2LCBmYWxzZSk7CisgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgPSBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBoZHJFbmNvZGVMZW4gKyA2OworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5My5sZW5ndGg7CisKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQ29udGVudFR5cGVWYWx1ZSA9ICIgKyBtQ29udGVudFR5cGVWYWx1ZQorICAgICAgICAgICAgICAgICAgICArICIoIiArIEludGVnZXIudG9IZXhTdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpICsgIikiKTsKKworICAgICAgICAgICAgbVdzcEhlYWRlciA9IGFycmF5MzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyByYW5kb20gd3NwIGhlYWRlciB3L28gYXBwaWQKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBhcnJTaXplID0gMTUwICsgcmQubmV4dEludCgxMDApOworICAgICAgICAgICAgYXJyYXkzID0gbmV3IGJ5dGVbYXJyU2l6ZV07CisKKyAgICAgICAgICAgIGFycmF5M1swXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICBhcnJheTNbMV0gPSAoYnl0ZSkgMHg2OworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGgsIG51bGwsIDIpOworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGggLSBoZHJFbmNvZGVMZW4gLSAyLCBhcnJheTMsIDIpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDJdID0gKGJ5dGUpIDB4MzsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAzXSA9IChieXRlKSAweDI7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgNF0gPSAoYnl0ZSkgKChtQ29udGVudFR5cGVWYWx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDVdID0gKGJ5dGUpIChtQ29udGVudFR5cGVWYWx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgY3JlYXRlUmFuZG9tV3NwSGVhZGVyKGFycmF5MywgcmQsIGhkckVuY29kZUxlbiArIDYsIHRydWUpOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgaGRyRW5jb2RlTGVuICsgNjsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJMZW4gPSBhcnJheTMubGVuZ3RoOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlVmFsdWUgPSAiICsgbUNvbnRlbnRUeXBlVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiKCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSArICIpIik7CisKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gcmFuZG9tIHdzcCBoZWFkZXIgdy8gcmFuZG9tIGFwcGlkIHN0cmluZworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICByZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGFyclNpemUgPSAxNTAgKyByZC5uZXh0SW50KDEwMCk7CisgICAgICAgICAgICBhcnJheTMgPSBuZXcgYnl0ZVthcnJTaXplXTsKKworICAgICAgICAgICAgYXJyYXkzWzBdID0gKGJ5dGUpIDB4MDsKKyAgICAgICAgICAgIGFycmF5M1sxXSA9IChieXRlKSAweDY7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCwgbnVsbCwgMik7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCAtIGhkckVuY29kZUxlbiAtIDIsIGFycmF5MywgMik7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgMl0gPSAoYnl0ZSkgMHgzOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDNdID0gKGJ5dGUpIDB4MjsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyA0XSA9IChieXRlKSAoKG1Db250ZW50VHlwZVZhbHVlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgNV0gPSAoYnl0ZSkgKG1Db250ZW50VHlwZVZhbHVlICYgMHhmZik7CisgICAgICAgICAgICBjcmVhdGVSYW5kb21Xc3BIZWFkZXJTdHJBcHBJZChhcnJheTMsIHJkLCBoZHJFbmNvZGVMZW4gKyA2LCB0cnVlKTsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIGhkckVuY29kZUxlbiArIDY7CisgICAgICAgICAgICBtV3NwSGVhZGVyTGVuID0gYXJyYXkzLmxlbmd0aDsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZVZhbHVlID0gIiArIG1Db250ZW50VHlwZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICsgIigiICsgSW50ZWdlci50b0hleFN0cmluZyhtQ29udGVudFR5cGVWYWx1ZSkgKyAiKSIpOworCisgICAgICAgICAgICBtV3NwSGVhZGVyID0gYXJyYXkzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSB3c3AgaGVhZGVyIHcvIE9NQSBhcHBpZCBzdHJpbmcKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgcmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBhcnJTaXplID0gMTUwICsgcmQubmV4dEludCgxMDApOworICAgICAgICAgICAgYXJyYXkzID0gbmV3IGJ5dGVbYXJyU2l6ZV07CisKKyAgICAgICAgICAgIGFycmF5M1swXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICBhcnJheTNbMV0gPSAoYnl0ZSkgMHg2OworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGgsIG51bGwsIDIpOworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGggLSBoZHJFbmNvZGVMZW4gLSAyLCBhcnJheTMsIDIpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDJdID0gKGJ5dGUpIDB4MzsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAzXSA9IChieXRlKSAweDI7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgNF0gPSAoYnl0ZSkgKChtQ29udGVudFR5cGVWYWx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDVdID0gKGJ5dGUpIChtQ29udGVudFR5cGVWYWx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgY3JlYXRlUmFuZG9tV3NwSGVhZGVyU3RyQXBwSWQoYXJyYXkzLCByZCwgaGRyRW5jb2RlTGVuICsgNiwgZmFsc2UpOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgaGRyRW5jb2RlTGVuICsgNjsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJMZW4gPSBhcnJheTMubGVuZ3RoOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlVmFsdWUgPSAiICsgbUNvbnRlbnRUeXBlVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiKCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSArICIpIik7CisKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gcmFuZG9tIHdzcCBoZWFkZXIgdy8gT01BIGNvbnRlbnQgdHlwZQorICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICByZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGFyclNpemUgPSAxNTAgKyByZC5uZXh0SW50KDEwMCk7CisgICAgICAgICAgICBhcnJheTMgPSBuZXcgYnl0ZVthcnJTaXplXTsKKworICAgICAgICAgICAgYXJyYXkzWzBdID0gKGJ5dGUpIDB4MDsKKyAgICAgICAgICAgIGFycmF5M1sxXSA9IChieXRlKSAweDY7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCwgbnVsbCwgMik7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCAtIGhkckVuY29kZUxlbiAtIDIsIGFycmF5MywgMik7CisKKyAgICAgICAgICAgIC8vIGVuY29kZSBjb250ZW50IHR5cGUKKyAgICAgICAgICAgIGludCBjb250ZW50TGVuID0gbUNvbnRlbnRUeXBlTmFtZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGludCBuZXh0ID0gMiArIGhkckVuY29kZUxlbjsKKyAgICAgICAgICAgIG1Xc3BDb250ZW50VHlwZVN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbmV4dDsKKyAgICAgICAgICAgIC8vIG5leHQgKz0gZW5jb2RlVWludDMyKGNvbnRlbnRMZW4sIGFycmF5MywgbmV4dCk7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQ29udGVudFR5cGVOYW1lID0gIiArIG1Db250ZW50VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250ZW50TGVuID0gIiArIGNvbnRlbnRMZW4pOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudExlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXJyYXkzW25leHQgKyBpXSA9IChieXRlKSBtQ29udGVudFR5cGVOYW1lLmNoYXJBdChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5M1tuZXh0ICsgaV0gPSAoYnl0ZSkgMHgwOworCisgICAgICAgICAgICBjcmVhdGVSYW5kb21Xc3BIZWFkZXIoYXJyYXkzLCByZCwgbmV4dCArIGNvbnRlbnRMZW4gKyAxLCBmYWxzZSk7CisgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgPSBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgKyBuZXh0ICsgY29udGVudExlbiArIDE7CisgICAgICAgICAgICBtV3NwSGVhZGVyTGVuID0gYXJyYXkzLmxlbmd0aDsKKworICAgICAgICAgICAgbVdzcEhlYWRlciA9IGFycmF5MzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyByYW5kb20gd3NwIGhlYWRlciB3LyBPTUEgY29udGVudCB0eXBlLCBPTUEgYXBwIElECisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHJkID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgYXJyU2l6ZSA9IDE1MCArIHJkLm5leHRJbnQoMTAwKTsKKyAgICAgICAgICAgIGFycmF5MyA9IG5ldyBieXRlW2FyclNpemVdOworCisgICAgICAgICAgICBhcnJheTNbMF0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgYXJyYXkzWzFdID0gKGJ5dGUpIDB4NjsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoLCBudWxsLCAyKTsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoIC0gaGRyRW5jb2RlTGVuIC0gMiwgYXJyYXkzLCAyKTsKKworICAgICAgICAgICAgLy8gZW5jb2RlIGNvbnRlbnQgdHlwZQorICAgICAgICAgICAgY29udGVudExlbiA9IG1Db250ZW50VHlwZU5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICBuZXh0ID0gMiArIGhkckVuY29kZUxlbjsKKyAgICAgICAgICAgIG1Xc3BDb250ZW50VHlwZVN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbmV4dDsKKyAgICAgICAgICAgIC8vIG5leHQgKz0gZW5jb2RlVWludDMyKGNvbnRlbnRMZW4sIGFycmF5MywgbmV4dCk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlTmFtZSA9ICIgKyBtQ29udGVudFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiwgY29udGVudExlbiA9ICIgKyBjb250ZW50TGVuKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnRMZW47IGkrKykgeworICAgICAgICAgICAgICAgIGFycmF5M1tuZXh0ICsgaV0gPSAoYnl0ZSkgbUNvbnRlbnRUeXBlTmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheTNbbmV4dCArIGldID0gKGJ5dGUpIDB4MDsKKworICAgICAgICAgICAgY3JlYXRlUmFuZG9tV3NwSGVhZGVyU3RyQXBwSWQoYXJyYXkzLCByZCwgbmV4dCArIGNvbnRlbnRMZW4gKyAxLCBmYWxzZSk7CisgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgPSBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgKyBuZXh0ICsgY29udGVudExlbiArIDE7CisgICAgICAgICAgICBtV3NwSGVhZGVyTGVuID0gYXJyYXkzLmxlbmd0aDsKKworICAgICAgICAgICAgbVdzcEhlYWRlciA9IGFycmF5MzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhcnJheSA9IG5ldyBieXRlW21Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG1Xc3BIZWFkZXIubGVuZ3RoCisgICAgICAgICAgICAgICAgKyBtTWVzc2FnZUJvZHkubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtR3NtSGVhZGVyLCAwLCBhcnJheSwgMCwgbUdzbUhlYWRlci5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Vc2VyRGF0YUhlYWRlciwgMCwgYXJyYXksCisgICAgICAgICAgICAgICAgbUdzbUhlYWRlci5sZW5ndGgsIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Xc3BIZWFkZXIsIDAsIGFycmF5LAorICAgICAgICAgICAgICAgIG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCwgbVdzcEhlYWRlci5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NZXNzYWdlQm9keSwgMCwgYXJyYXksCisgICAgICAgICAgICAgICAgbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbVdzcEhlYWRlci5sZW5ndGgsIAorICAgICAgICAgICAgICAgIG1NZXNzYWdlQm9keS5sZW5ndGgpOworICAgICAgICByZXR1cm4gYXJyYXk7CisKKyAgICB9CisKKyAgICBJbnRlbnQgY3JlYXRlSW50ZW50KGludCBwZHVUeXBlLCBpbnQgdHJhbklkKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgidHJhbnNhY3Rpb25JZCIsIHRyYW5JZCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIHBkdVR5cGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImhlYWRlciIsIG1Hc21IZWFkZXIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRhdGEiLCBtTWVzc2FnZUJvZHkpOworICAgICAgICAvLyBpbnRlbnQucHV0RXh0cmEoImNvbnRlbnRUeXBlUGFyYW1ldGVycyIsIG51bGwpOworICAgICAgICByZXR1cm4gaW50ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgcHJvY2Vzc2luZyB0ZXN0LCBzdGFydCBhY3Rpdml0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzTXNnMSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgxKTsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IHBkdS5sZW5ndGggLQorICAgICAgICAgICAgICAgIChtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgaW50IHBkdVR5cGUgPSA2OworICAgICAgICBpbnQgdHJhbklkID0gMDsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUGFja2FnZU5hbWUgPSBtUGFja2FnZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5SZWNlaXZlckFjdGl2aXR5IjsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKChpd2FwbWFuLnByb2Nlc3NNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVudChwZHVUeXBlLCB0cmFuSWQpKQorICAgICAgICAgICAgICAgICAgICAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCkgPT0KKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtUGFja2FnZU5hbWUgPSBvcmlnaW5hbFBhY2thZ2VOYW1lOworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVzc2FnZSBwcm9jZXNzaW5nIHRlc3QsIHN0YXJ0IHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc01zZzIoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBwZHUubGVuZ3RoIC0gKG1Hc21IZWFkZXIubGVuZ3RoICsKKyAgICAgICAgICAgICAgICBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIGludCBwZHVUeXBlID0gNjsKKyAgICAgICAgaW50IHRyYW5JZCA9IDA7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2VOYW1lID0gbVBhY2thZ2VOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJTZXJ2aWNlIjsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSkKKyAgICAgICAgICAgICAgICAgICAgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID09CisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gb3JpZ2luYWxQYWNrYWdlTmFtZTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgcHJvY2Vzc2luZyB0ZXN0LCBubyBzaWduYXR1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc01zZzMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBwZHUubGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAobUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIGludCBwZHVUeXBlID0gNjsKKyAgICAgICAgaW50IHRyYW5JZCA9IDA7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2VOYW1lID0gbVBhY2thZ2VOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9ICJjb20uYW5kcm9pZC5kZXZlbG9wbWVudCI7CisgICAgICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLmRldmVsb3BtZW50LkRldmVsb3BtZW50IjsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgoaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSkKKyAgICAgICAgICAgICAgICAgICAgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID09CisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gb3JpZ2luYWxQYWNrYWdlTmFtZTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgIH0KKworICAgIElEYXRhVmVyaWZ5IGdldFZlcmlmeUludGVyZmFjZSgpIHsKKyAgICAgICAgd2hpbGUgKG1JVmVyaWZ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBhY3Rpdml0eSByZWNlaXZlIGRhdGEuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChUSU1FX1dBSVQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlWZXJpZnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHByb2Nlc3NpbmcgdGVzdCwgcmVjZWl2ZWQgYm9keSBkYXRhIHZlcmlmaWNhdGlvbiB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NNc2c0KCkgeworICAgICAgICBieXRlW10gb3JpZ2luYWxNZXNzYWdlQm9keSA9IG1NZXNzYWdlQm9keTsKKyAgICAgICAgbU1lc3NhZ2VCb2R5ID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsCisgICAgICAgIH07CisKKyAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgxKTsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IHBkdS5sZW5ndGggLQorICAgICAgICAgICAgICAgIChtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgaW50IHBkdVR5cGUgPSA2OworICAgICAgICBpbnQgdHJhbklkID0gMDsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUGFja2FnZU5hbWUgPSBtUGFja2FnZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBJRGF0YVZlcmlmeSBkYXRhdmVyaWZ5ID0gZ2V0VmVyaWZ5SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyQWN0aXZpdHkiOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworCisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgZGF0YXZlcmlmeS5yZXNldERhdGEoKTsKKyAgICAgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1NZXNzYWdlQm9keSA9IG5ldyBieXRlW10geworICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhYSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YmIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDExLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgyMiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGJiLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MjIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGFhLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhiYiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MTEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDIyLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhYSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YmIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDExLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgyMiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGJiLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MjIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGFhLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhiYiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MTEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDIyLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHBkdSA9IGNyZWF0ZVBEVSgxKTsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIC8vIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtUGFja2FnZU5hbWUgPSBvcmlnaW5hbFBhY2thZ2VOYW1lOworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG9yaWdpbmFsTWVzc2FnZUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVzc2FnZSBwcm9jZXNzaW5nIHRlc3QsIHNlbmQgaW52YWxpZCBzbXMgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzTXNnNSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgyKTsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IHBkdS5sZW5ndGggLQorICAgICAgICAgICAgICAgIChtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgaW50IHBkdVR5cGUgPSA2OworICAgICAgICBpbnQgdHJhbklkID0gMDsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUGFja2FnZU5hbWUgPSBtUGFja2FnZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5SZWNlaXZlckFjdGl2aXR5IjsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKChpd2FwbWFuLnByb2Nlc3NNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVudChwZHVUeXBlLCB0cmFuSWQpKQorICAgICAgICAgICAgICAgICAgICAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCkgPT0KKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtUGFja2FnZU5hbWUgPSBvcmlnaW5hbFBhY2thZ2VOYW1lOworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVzc2FnZSBwcm9jZXNzaW5nIHRlc3QsIG5vIHJlY2VpdmVyIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NNc2c2KCkgeworICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDEpOworICAgICAgICBpbnQgaGVhZGVyTGVuID0gcGR1Lmxlbmd0aCAtCisgICAgICAgICAgICAgICAgKG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG1NZXNzYWdlQm9keS5sZW5ndGgpOworICAgICAgICBpbnQgcGR1VHlwZSA9IDY7CisgICAgICAgIGludCB0cmFuSWQgPSAwOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxQYWNrYWdlTmFtZSA9IG1QYWNrYWdlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLk5vUmVjZWl2ZXIiOworCisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFksIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKChpd2FwbWFuLnByb2Nlc3NNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVudChwZHVUeXBlLCB0cmFuSWQpKQorICAgICAgICAgICAgICAgICAgICAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCkgPT0KKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKGl3YXBtYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHBkdVR5cGUsIHRyYW5JZCkpCisgICAgICAgICAgICAgICAgICAgICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKSA9PQorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QYWNrYWdlTmFtZSA9IG9yaWdpbmFsUGFja2FnZU5hbWU7CisgICAgICAgIG1DbGFzc05hbWUgPSBvcmlnaW5hbENsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXc3BUeXBlRGVjb2RlciB0ZXN0LCBub3JtYWwgcGR1CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXIxKCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSA9IHJkLm5leHRJbnQoMHhGRkZGKTsKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKHBkdSk7CisKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuc2Vla1hXYXBBcHBsaWNhdGlvbklkKG1Xc3BIZWFkZXJTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ICsgbVdzcEhlYWRlckxlbiAtIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKTsKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuZGVjb2RlWFdhcEFwcGxpY2F0aW9uSWQoaW5kZXgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUFwcElkVmFsdWU6ICIgKyBtQXBwSWRWYWx1ZQorICAgICAgICAgICAgICAgICAgICArICIsIHZhbDogIiArIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFwcElkVmFsdWUgPT0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCkpOworICAgICAgICB9CisKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3NwVHlwZURlY29kZXIgdGVzdCwgbm8gaGVhZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXIyKCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4RkZGRik7CisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMik7CisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHBkdURlY29kZXIgPSBuZXcgV3NwVHlwZURlY29kZXIocGR1KTsKKworICAgICAgICByZXMgPSBwZHVEZWNvZGVyLnNlZWtYV2FwQXBwbGljYXRpb25JZChtV3NwSGVhZGVyU3RhcnQsCisgICAgICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ICsgbVdzcEhlYWRlckxlbiAtIDEpOworICAgICAgICBhc3NlcnRGYWxzZShyZXMpOworCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdzcFR5cGVEZWNvZGVyIHRlc3QsIGRlY29kZSBhcHBpZCB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXIzKCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRkZGRkYpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRik7CisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDMpOworICAgICAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLnNlZWtYV2FwQXBwbGljYXRpb25JZChtV3NwSGVhZGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCArIG1Xc3BIZWFkZXJMZW4gLSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLmRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGluZGV4KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1BcHBJZFZhbHVlOiAiICsgbUFwcElkVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB2YWw6ICIgKyBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BcHBJZFZhbHVlID09IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAgcHVibGljIHZvaWQgdGVzdEVuYygpIHsKKyAgICAgIGJ5dGVbXSBhcnIgPSBuZXcgYnl0ZVsyMF07CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgaW5kZXggKz0gZW5jb2RlVWludDMyKDB4ODdhNSwgYXJyLCBpbmRleCk7CisgICAgICBpbmRleCArPSBlbmNvZGVVaW50MzIoMHgxLCBhcnIsIGluZGV4KTsKKyAgICAgIGluZGV4ICs9IGVuY29kZVVpbnQzMigweDliLCBhcnIsIGluZGV4KTsKKyAgICAgIGluZGV4ICs9IGVuY29kZVVpbnQzMigweDEwLCBhcnIsIGluZGV4KTsKKyAgICAgIGluZGV4ICs9IGVuY29kZVVpbnQzMigweGUwODg3LCBhcnIsIGluZGV4KTsKKyAgICAgIGluZGV4ICs9IGVuY29kZVVpbnQzMigweDc5MWEyM2QwLCBhcnIsIGluZGV4KTsKKworICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGFycikpOworICAgICAgfQorICAgICovCisKKyAgICAvKioKKyAgICAgKiBXc3BUeXBlRGVjb2RlciB0ZXN0LCBubyBhcHBpZCB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXI0KCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRkZGRkYpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRik7CisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDQpOworICAgICAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLnNlZWtYV2FwQXBwbGljYXRpb25JZChtV3NwSGVhZGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCArIG1Xc3BIZWFkZXJMZW4gLSAxKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlcyk7CisKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXc3BUeXBlRGVjb2RlciB0ZXN0LCBkZWNvZGUgc3RyaW5nIGFwcGlkIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlcjUoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSA9IHJkLm5leHRJbnQoMHgwRkZGRkZGRik7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IHJkLm5leHRJbnQoMHgwRkZGKTsKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoNSk7CisgICAgICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKHBkdSk7CisKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuc2Vla1hXYXBBcHBsaWNhdGlvbklkKG1Xc3BIZWFkZXJTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ICsgbVdzcEhlYWRlckxlbiAtIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKTsKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuZGVjb2RlWFdhcEFwcGxpY2F0aW9uSWQoaW5kZXgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUFwcElkVmFsdWU6IFsiICsgbUFwcElkTmFtZSArICJdLCB2YWw6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpICsgIl0iKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFwcElkTmFtZS5lcXVhbHMocGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdzcFR5cGVEZWNvZGVyIHRlc3QsIGRlY29kZSBzdHJpbmcgYXBwaWQgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyNigpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbEFwcElkTmFtZSA9IG1BcHBJZE5hbWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9NQV9BUFBMSUNBVElPTl9JRF9OQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbUFwcElkTmFtZSA9IE9NQV9BUFBMSUNBVElPTl9JRF9OQU1FU1tpXTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gcmQubmV4dEludCgweDBGRkYpOworICAgICAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSg2KTsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHBkdURlY29kZXIgPSBuZXcgV3NwVHlwZURlY29kZXIocGR1KTsKKworICAgICAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQobVdzcEhlYWRlclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgKyBtV3NwSGVhZGVyTGVuIC0gMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcyk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5kZWNvZGVYV2FwQXBwbGljYXRpb25JZChpbmRleCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcyk7CisKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQXBwSWRWYWx1ZTogWyIgKyBtQXBwSWROYW1lICsgIl0sIHZhbDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCkgKyAiXSIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQXBwSWROYW1lLmVxdWFscyhwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3NwVHlwZURlY29kZXIgdGVzdCwgZGVjb2RlIE9NQSBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlcjcoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPTUFfQ09OVEVOVF9UWVBFX05BTUVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gT01BX0NPTlRFTlRfVFlQRV9OQU1FU1tpXTsKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoNyk7CisgICAgICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKHBkdSk7CisKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuZGVjb2RlQ29udGVudFR5cGUobVdzcENvbnRlbnRUeXBlU3RhcnQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlTmFtZTogWyIgKyBtQ29udGVudFR5cGVOYW1lICsgIl0sIHZhbDogWyIKKyAgICAgICAgICAgICAgICAgICAgKyBwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCkgKyAiXSIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ29udGVudFR5cGVOYW1lLmVxdWFscyhwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3BpZWQgZnJvbSBXYXBQdXNoT3ZlclNtcy4KKyAgICAgKiBUaGUgY29kZSBmbG93IGlzIG5vdCBjaGFuZ2VkIGZyb20gdGhlIG9yaWdpbmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGlzcGF0Y2hXYXBQZHUoYnl0ZVtdIHBkdSwgSVdhcFB1c2hNYW5hZ2VyIHdhcFB1c2hNYW4pIHsKKworICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cuZChMT0dfVEFHLCAiUng6ICIgKyBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKHBkdSkpOworCisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCB0cmFuc2FjdGlvbklkID0gcGR1W2luZGV4KytdICYgMHhGRjsKKyAgICAgICAgaW50IHBkdVR5cGUgPSBwZHVbaW5kZXgrK10gJiAweEZGOworICAgICAgICBpbnQgaGVhZGVyTGVuZ3RoID0gMDsKKworICAgICAgICBpZiAoKHBkdVR5cGUgIT0gV3NwVHlwZURlY29kZXIuUERVX1RZUEVfUFVTSCkgJiYKKyAgICAgICAgICAgICAgICAocGR1VHlwZSAhPSBXc3BUeXBlRGVjb2Rlci5QRFVfVFlQRV9DT05GSVJNRURfUFVTSCkpIHsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBub24tUFVTSCBXQVAgUERVLiBUeXBlID0gIiArIHBkdVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19IQU5ETEVEOworICAgICAgICB9CisKKyAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZSBIZWFkZXJMZW4odW5zaWduZWQgaW50ZWdlcikuCisgICAgICAgICAqIEZyb20gd2FwLTIzMC13c3AtMjAwMTA3MDUtYSBzZWN0aW9uIDguMS4yCisgICAgICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSB1aW50dmFyIGlzIDMyIGJpdHMuCisgICAgICAgICAqIFNvIGl0IHdpbGwgYmUgZW5jb2RlZCBpbiBubyBtb3JlIHRoYW4gNSBvY3RldHMuCisgICAgICAgICAqLworICAgICAgICBpZiAocGR1RGVjb2Rlci5kZWNvZGVVaW50dmFySW50ZWdlcihpbmRleCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBQRFUuIEhlYWRlciBMZW5ndGggZXJyb3IuIik7CisgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0dFTkVSSUNfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyTGVuZ3RoID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgIGluZGV4ICs9IHBkdURlY29kZXIuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKTsKKworICAgICAgICBpbnQgaGVhZGVyU3RhcnRJbmRleCA9IGluZGV4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZSBDb250ZW50LVR5cGUuCisgICAgICAgICAqIEZyb20gd2FwLTIzMC13c3AtMjAwMTA3MDUtYSBzZWN0aW9uIDguNC4yLjI0CisgICAgICAgICAqCisgICAgICAgICAqIENvbnRlbnQtdHlwZS12YWx1ZSA9IENvbnN0cmFpbmVkLW1lZGlhIHwgQ29udGVudC1nZW5lcmFsLWZvcm0KKyAgICAgICAgICogQ29udGVudC1nZW5lcmFsLWZvcm0gPSBWYWx1ZS1sZW5ndGggTWVkaWEtdHlwZQorICAgICAgICAgKiBNZWRpYS10eXBlID0gKFdlbGwta25vd24tbWVkaWEgfCBFeHRlbnNpb24tTWVkaWEpICooUGFyYW1ldGVyKQorICAgICAgICAgKiBWYWx1ZS1sZW5ndGggPSBTaG9ydC1sZW5ndGggfCAoTGVuZ3RoLXF1b3RlIExlbmd0aCkKKyAgICAgICAgICogU2hvcnQtbGVuZ3RoID0gPEFueSBvY3RldCAwLTMwPiAgIChvY3RldCA8PSBXQVBfUERVX1NIT1JUX0xFTkdUSF9NQVgpCisgICAgICAgICAqIExlbmd0aC1xdW90ZSA9IDxPY3RldCAzMT4gICAgICAgICAoV0FQX1BEVV9MRU5HVEhfUVVPVEUpCisgICAgICAgICAqIExlbmd0aCA9IFVpbnR2YXItaW50ZWdlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBkdURlY29kZXIuZGVjb2RlQ29udGVudFR5cGUoaW5kZXgpID09IGZhbHNlKSB7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBIZWFkZXIgQ29udGVudC1UeXBlIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19HRU5FUklDX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gcGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICBsb25nIGJpbmFyeUNvbnRlbnRUeXBlID0gcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgIGluZGV4ICs9IHBkdURlY29kZXIuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKTsKKworICAgICAgICBieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbaGVhZGVyTGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGhlYWRlclN0YXJ0SW5kZXgsIGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCk7CisKKyAgICAgICAgYnl0ZVtdIGludGVudERhdGE7CisKKyAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICBpbnRlbnREYXRhID0gcGR1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRhdGFJbmRleCA9IGhlYWRlclN0YXJ0SW5kZXggKyBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBpbnRlbnREYXRhID0gbmV3IGJ5dGVbcGR1Lmxlbmd0aCAtIGRhdGFJbmRleF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBkdSwgZGF0YUluZGV4LCBpbnRlbnREYXRhLCAwLCBpbnRlbnREYXRhLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VlayBmb3IgYXBwbGljYXRpb24gSUQgZmllbGQgaW4gV1NQIGhlYWRlci4KKyAgICAgICAgICogSWYgYXBwbGljYXRpb24gSUQgaXMgZm91bmQsIFdhcFB1c2hNYW5hZ2VyIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogcHJvY2Vzc2luZy4gU2luY2UgV2FwUHVzaE1hbmFnZXIgaXMgb3B0aW9uYWwgbW9kdWxlLCBpZiBXYXBQdXNoTWFuYWdlcgorICAgICAgICAgKiBpcyBub3QgZm91bmQsIGxlZ2FjeSBtZXNzYWdlIHByb2Nlc3Npbmcgd2lsbCBiZSBjb250aW51ZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQoaW5kZXgsIGluZGV4ICsgaGVhZGVyTGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICBwZHVEZWNvZGVyLmRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGluZGV4KTsKKyAgICAgICAgICAgIFN0cmluZyB3YXBBcHBJZCA9IHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICh3YXBBcHBJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2FwQXBwSWQgPSBJbnRlZ2VyLnRvU3RyaW5nKChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gKChtaW1lVHlwZSA9PSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoYmluYXJ5Q29udGVudFR5cGUpIDogbWltZVR5cGUpOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLnYoTE9HX1RBRywgImFwcGlkIGZvdW5kOiAiICsgd2FwQXBwSWQgKyAiOiIgKyBjb250ZW50VHlwZSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzRnVydGhlciA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gSVdhcFB1c2hNYW5hZ2VyIHdhcFB1c2hNYW4gPSBtV2FwQ29ubi5nZXRXYXBQdXNoTWFuYWdlcigpOworICAgICAgICAgICAgICAgIGlmICh3YXBQdXNoTWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIndhcCBwdXNoIG1hbmFnZXIgbm90IGZvdW5kISIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgidHJhbnNhY3Rpb25JZCIsIHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdVR5cGUiLCBwZHVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJoZWFkZXIiLCBoZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRhdGEiLCBpbnRlbnREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJjb250ZW50VHlwZVBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdURlY29kZXIuZ2V0Q29udGVudFBhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHByb2NSZXQgPSB3YXBQdXNoTWFuLnByb2Nlc3NNZXNzYWdlKHdhcEFwcElkLCBjb250ZW50VHlwZSwgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLnYoTE9HX1RBRywgInByb2NSZXQ6IiArIHByb2NSZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2NSZXQgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwcm9jUmV0ICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuRlVSVEhFUl9QUk9DRVNTSU5HKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRnVydGhlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc0Z1cnRoZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgInJlbW90ZSBmdW5jIGZhaWxlZC4uLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJmYWxsIGJhY2sgdG8gZXhpc3RpbmcgaGFuZGxlciIpOworCisgICAgICAgIHJldHVybiBBY3Rpdml0eS5SRVNVTFRfT0s7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJ5dGVbXSByZXRyaWV2ZVdzcEJvZHkoKSB7CisgICAgICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW21Xc3BIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aF07CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtV3NwSGVhZGVyLCAwLCBhcnJheSwgMCwgbVdzcEhlYWRlci5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NZXNzYWdlQm9keSwgMCwgYXJyYXksIG1Xc3BIZWFkZXIubGVuZ3RoLCBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVOYW1lKGludCBjdHlwZVZhbCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgT01BX0NPTlRFTlRfVFlQRV9WQUxVRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHlwZVZhbCA9PSBPTUFfQ09OVEVOVF9UWVBFX1ZBTFVFU1tpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTUFfQ09OVEVOVF9UWVBFX05BTUVTW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29udGVudFR5cGVNYXBwZWQoaW50IGN0eXBlVmFsKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBPTUFfQ09OVEVOVF9UWVBFX1ZBTFVFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGN0eXBlVmFsID09IE9NQV9DT05URU5UX1RZUEVfVkFMVUVTW2ldKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdyYXRpb24gdGVzdCAxLCBzaW1wbGUgY2FzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ3JhdGlvbjEoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBpbnQgb3JpZ2luYWxBcHBJZFZhbHVlID0gbUFwcElkVmFsdWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbEFwcElkTmFtZSA9IG1BcHBJZE5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZSA9IG1Db250ZW50VHlwZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisgICAgICAgIGJ5dGVbXSBvcmlnaW5hbE1lc3NhZ2VCb2R5ID0gbU1lc3NhZ2VCb2R5OworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgbU1lc3NhZ2VCb2R5ID0gbmV3IGJ5dGVbMTAwICsgcmQubmV4dEludCgxMDApXTsKKyAgICAgICAgcmQubmV4dEJ5dGVzKG1NZXNzYWdlQm9keSk7CisKKyAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgxKTsKKyAgICAgICAgYnl0ZVtdIHdhcHB1c2hQZHUgPSByZXRyaWV2ZVdzcEJvZHkoKTsKKworCisgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJBY3Rpdml0eSI7CisgICAgICAgIC8vIFBob25lIGR1bW15ID0gbmV3IER1bW15UGhvbmUoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgLy8gUGhvbmUgZ3NtID0gUGhvbmVGYWN0b3J5LmdldEdzbVBob25lKCk7CisgICAgICAgIC8vIEdTTVBob25lIGdzbSA9IG5ldyBHU01QaG9uZShnZXRDb250ZXh0KCksIG5ldyBTaW11bGF0ZWRDb21tYW5kcygpLCBudWxsLCB0cnVlKTsKKyAgICAgICAgLy8gV2FwUHVzaE92ZXJTbXMgZGlzcGF0Y2hlciA9IG5ldyBXYXBQdXNoT3ZlclNtcyhkdW1teSwgbnVsbCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICAgICAgSURhdGFWZXJpZnkgZGF0YXZlcmlmeSA9IGdldFZlcmlmeUludGVyZmFjZSgpOworCisgICAgICAgICAgICBkYXRhdmVyaWZ5LnJlc2V0RGF0YSgpOworCisgICAgICAgICAgICBpZiAoaXNDb250ZW50VHlwZU1hcHBlZChtQ29udGVudFR5cGVWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBjb250ZW50IHR5cGUgaXMgbWFwcGVkCisgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IGdldENvbnRlbnRUeXBlTmFtZShtQ29udGVudFR5cGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZVZhbHVlIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udGVudFR5cGVOYW1lICsgIjoiICsgbUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFksIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGRpc3BhdGNoV2FwUGR1KHdhcHB1c2hQZHUsIGl3YXBtYW4pOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IG9yaWdpbmFsQ29udGVudFR5cGVOYW1lOworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG9yaWdpbmFsTWVzc2FnZUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdyYXRpb24gdGVzdCAyLCByYW5kb20gbUFwcElkVmFsdWUoaW50KSwgYWxsIE9NQSBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdyYXRpb24yKCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDb250ZW50VHlwZU5hbWUgPSBtQ29udGVudFR5cGVOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworICAgICAgICBieXRlW10gb3JpZ2luYWxNZXNzYWdlQm9keSA9IG1NZXNzYWdlQm9keTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgIElEYXRhVmVyaWZ5IGRhdGF2ZXJpZnkgPSBnZXRWZXJpZnlJbnRlcmZhY2UoKTsKKyAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5SZWNlaXZlckFjdGl2aXR5IjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9NQV9DT05URU5UX1RZUEVfTkFNRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBPTUFfQ09OVEVOVF9UWVBFX05BTUVTW2ldOworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRkZGRkYpOworCisgICAgICAgICAgICBtTWVzc2FnZUJvZHkgPSBuZXcgYnl0ZVsxMDAgKyByZC5uZXh0SW50KDEwMCldOworICAgICAgICAgICAgcmQubmV4dEJ5dGVzKG1NZXNzYWdlQm9keSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoNyk7CisgICAgICAgICAgICBieXRlW10gd2FwcHVzaFBkdSA9IHJldHJpZXZlV3NwQm9keSgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIGRpc3BhdGNoV2FwUGR1KHdhcHB1c2hQZHUsIGl3YXBtYW4pOworCisgICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfUFVTSF9DTykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhdmVyaWZ5LnZlcmlmeURhdGEod2FwcHVzaFBkdSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIG1DbGFzc05hbWUgPSBvcmlnaW5hbENsYXNzTmFtZTsKKyAgICAgICAgbUFwcElkTmFtZSA9IG9yaWdpbmFsQXBwSWROYW1lOworICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gb3JpZ2luYWxDb250ZW50VHlwZU5hbWU7CisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgbU1lc3NhZ2VCb2R5ID0gb3JpZ2luYWxNZXNzYWdlQm9keTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ3JhdGlvbiB0ZXN0IDMsIGl0ZXJhdGUgT21hQXBwbGljYXRpb24gSUQsIHJhbmRvbSBiaW5hcnkgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludGVncmF0aW9uMygpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ29udGVudFR5cGVOYW1lID0gbUNvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKyAgICAgICAgYnl0ZVtdIG9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtTWVzc2FnZUJvZHk7CisgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICBJRGF0YVZlcmlmeSBkYXRhdmVyaWZ5ID0gZ2V0VmVyaWZ5SW50ZXJmYWNlKCk7CisgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJTZXJ2aWNlIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9NQV9BUFBMSUNBVElPTl9JRF9OQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbUFwcElkTmFtZSA9IE9NQV9BUFBMSUNBVElPTl9JRF9OQU1FU1tpXTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gcmQubmV4dEludCgweDBGRkYpOworCisgICAgICAgICAgICBtTWVzc2FnZUJvZHkgPSBuZXcgYnl0ZVsxMDAgKyByZC5uZXh0SW50KDEwMCldOworICAgICAgICAgICAgcmQubmV4dEJ5dGVzKG1NZXNzYWdlQm9keSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoNik7CisgICAgICAgICAgICBieXRlW10gd2FwcHVzaFBkdSA9IHJldHJpZXZlV3NwQm9keSgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpZiAoaXNDb250ZW50VHlwZU1hcHBlZChtQ29udGVudFR5cGVWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCB0eXBlIGlzIG1hcHBlZCB0byBpbnRlZ2VyIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBnZXRDb250ZW50VHlwZU5hbWUobUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlVmFsdWUgbWFwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udGVudFR5cGVWYWx1ZSArICI6IiArIG1Db250ZW50VHlwZU5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UobUFwcElkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdSh3YXBwdXNoUGR1LCBpd2FwbWFuKTsKKworICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UobUFwcElkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfUFVTSF9DTykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhdmVyaWZ5LnZlcmlmeURhdGEod2FwcHVzaFBkdSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IG9yaWdpbmFsQ29udGVudFR5cGVOYW1lOworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG9yaWdpbmFsTWVzc2FnZUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdyYXRpb24gdGVzdCA0LCBpdGVyYXRlIE9tYUFwcGxpY2F0aW9uIElELCBPbWEgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludGVncmF0aW9uNCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ29udGVudFR5cGVOYW1lID0gbUNvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKyAgICAgICAgYnl0ZVtdIG9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtTWVzc2FnZUJvZHk7CisgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICBJRGF0YVZlcmlmeSBkYXRhdmVyaWZ5ID0gZ2V0VmVyaWZ5SW50ZXJmYWNlKCk7CisgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJTZXJ2aWNlIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9NQV9BUFBMSUNBVElPTl9JRF9OQU1FUy5sZW5ndGgKKyAgICAgICAgICAgICAgICArIE9NQV9DT05URU5UX1RZUEVfTkFNRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZE5hbWUgPSBPTUFfQVBQTElDQVRJT05fSURfTkFNRVNbcmQubmV4dEludChPTUFfQVBQTElDQVRJT05fSURfTkFNRVMubGVuZ3RoKV07CisgICAgICAgICAgICBpbnQgY29udEluZGV4ID0gcmQubmV4dEludChPTUFfQ09OVEVOVF9UWVBFX05BTUVTLmxlbmd0aCk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gT01BX0NPTlRFTlRfVFlQRV9OQU1FU1tjb250SW5kZXhdOworCisgICAgICAgICAgICBtTWVzc2FnZUJvZHkgPSBuZXcgYnl0ZVsxMDAgKyByZC5uZXh0SW50KDEwMCldOworICAgICAgICAgICAgcmQubmV4dEJ5dGVzKG1NZXNzYWdlQm9keSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoOCk7CisgICAgICAgICAgICBieXRlW10gd2FwcHVzaFBkdSA9IHJldHJpZXZlV3NwQm9keSgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UobUFwcElkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdSh3YXBwdXNoUGR1LCBpd2FwbWFuKTsKKworICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UobUFwcElkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfUFVTSF9DTykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhdmVyaWZ5LnZlcmlmeURhdGEod2FwcHVzaFBkdSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKG1NZXNzYWdlQm9keSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IG9yaWdpbmFsQ29udGVudFR5cGVOYW1lOworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG9yaWdpbmFsTWVzc2FnZUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdyYXRpb24gdGVzdCA1LCBpdGVyYXRlIGJpbmFyeSBPbWFBcHBsaWNhdGlvbiBJRCwgT21hIGJpbmFyeSBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdyYXRpb241KCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDb250ZW50VHlwZU5hbWUgPSBtQ29udGVudFR5cGVOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworICAgICAgICBieXRlW10gb3JpZ2luYWxNZXNzYWdlQm9keSA9IG1NZXNzYWdlQm9keTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgIElEYXRhVmVyaWZ5IGRhdGF2ZXJpZnkgPSBnZXRWZXJpZnlJbnRlcmZhY2UoKTsKKyAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5SZWNlaXZlclNlcnZpY2UiOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT01BX0FQUExJQ0FUSU9OX0lEX1ZBTFVFUy5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICBPTUFfQ09OVEVOVF9UWVBFX1ZBTFVFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSBPTUFfQVBQTElDQVRJT05fSURfVkFMVUVTW3JkLm5leHRJbnQoCisgICAgICAgICAgICAgICAgICAgIE9NQV9BUFBMSUNBVElPTl9JRF9WQUxVRVMubGVuZ3RoKV07CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIE9NQV9DT05URU5UX1RZUEVfVkFMVUVTW3JkLm5leHRJbnQoT01BX0NPTlRFTlRfVFlQRV9WQUxVRVMubGVuZ3RoKV07CisKKyAgICAgICAgICAgIG1NZXNzYWdlQm9keSA9IG5ldyBieXRlWzEwMCArIHJkLm5leHRJbnQoMTAwKV07CisgICAgICAgICAgICByZC5uZXh0Qnl0ZXMobU1lc3NhZ2VCb2R5KTsKKworICAgICAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgzKTsKKyAgICAgICAgICAgIGJ5dGVbXSB3YXBwdXNoUGR1ID0gcmV0cmlldmVXc3BCb2R5KCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGF0YXZlcmlmeS5yZXNldERhdGEoKTsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgICAgIGlmIChpc0NvbnRlbnRUeXBlTWFwcGVkKG1Db250ZW50VHlwZVZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjb250ZW50IHR5cGUgaXMgbWFwcGVkIHRvIGludGVnZXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IGdldENvbnRlbnRUeXBlTmFtZShtQ29udGVudFR5cGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQ29udGVudFR5cGVWYWx1ZSBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db250ZW50VHlwZVZhbHVlICsgIjoiICsgbUNvbnRlbnRUeXBlTmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUsIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdSh3YXBwdXNoUGR1LCBpd2FwbWFuKTsKKworICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50VHlwZU5hbWUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKHdhcHB1c2hQZHUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgICAgICBtTWVzc2FnZUJvZHkgPSBvcmlnaW5hbE1lc3NhZ2VCb2R5OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IGYzZDA3YWIuLjIzOWZkNzYgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTE2Myw2ICsxNjMsMTIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb247CiAKKyAgICBwcml2YXRlIFJ1bm5hYmxlIG1SZWNyZWF0ZVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICByZWNyZWF0ZVNjcmVlbnMoKTsKKyAgICAgICAgfQorICAgIH07CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgd2UgYXJlIHN0dWNrIG9uIHRoZSBsb2NrIHNjcmVlbiBiZWNhdXNlIHRoZSBzaW0gaXMKICAgICAgKiAgIG1pc3NpbmcuCkBAIC0yNDQsNyArMjUwLDggQEAKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjcmVhdGVNZShDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uID0gY29uZmlnOwotICAgICAgICAgICAgICAgIHJlY3JlYXRlU2NyZWVucygpOworICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVjcmVhdGVSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgcG9zdChtUmVjcmVhdGVSdW5uYWJsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRha2VFbWVyZ2VuY3lDYWxsQWN0aW9uKCkgewpAQCAtNDYzLDYgKzQ3MCwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlY3JlYXRlUnVubmFibGUpOworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdha2VXaGVuUmVhZHlUcShpbnQga2V5Q29kZSkgewogICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uV2FrZUtleSIpOwogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FTlUgJiYgaXNTZWN1cmUoKSAmJiAobU1vZGUgPT0gTW9kZS5Mb2NrU2NyZWVuKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDhhYWEzMjUuLjQzM2YxZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKQEAgLTk3NSw3ICs5NzUsNiBAQAogewogICAgIGludDMyX3QqIGNvbnN0IG91dFRlbXAgPSBzdGF0ZS0+b3V0cHV0VGVtcDsKICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihpbnQzMl90KSAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZSk7CiAKICAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAKQEAgLTk5Nyw2ICs5OTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGUwICY9IH4oZTEpOwogICAgICAgICBpbnQzMl90ICpvdXQgPSB0MS5tYWluQnVmZmVyOworICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZSk7CiAgICAgICAgIHdoaWxlIChlMSkgewogICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOwogICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0ZTJmMWUzLi40OTMxY2M3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xMjQsNiArMTI0LDE0IEBACiAgICAgcHVibGljIEFsYXJtTWFuYWdlclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbURlc2NyaXB0b3IgPSBpbml0KCk7CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBzZXQgY3VycmVudCBUaW1lWm9uZSBpbmZvIHRvIGtlcm5lbAorICAgICAgICAvLyBiZWNhdXNlIGtlcm5lbCBkb2Vzbid0IGtlZXAgdGhpcyBhZnRlciByZWJvb3QKKyAgICAgICAgU3RyaW5nIHR6ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoVElNRVpPTkVfUFJPUEVSVFkpOworICAgICAgICBpZiAodHogIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0VGltZVpvbmUodHopOworICAgICAgICB9CisKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBUQUcpOwogICAgICAgICAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQppbmRleCBkMzc1NThmLi45N2ZkODA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2ltYXguV2ltYXhNYW5hZ2VyQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwpAQCAtNTYsNiArNTcsOCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogCiAKIApAQCAtOTA3LDYgKzkxMCw4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHJlcXVlc3RSb3V0ZVRvSG9zdEFkZHJlc3MgaW5zdGVhZAorICAgICAqCiAgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAogICAgICAqIGhvc3QgdmlhIHRoZSBzcGVjaWZpZWQgbmV0d29yayBpbnRlcmZhY2UuCiAgICAgICogQHBhcmFtIG5ldHdvcmtUeXBlIHRoZSB0eXBlIG9mIHRoZSBuZXR3b3JrIG92ZXIgd2hpY2ggdHJhZmZpYyB0byB0aGUKQEAgLTkxNiw2ICs5MjEsMjUgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoaW50IG5ldHdvcmtUeXBlLCBpbnQgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhob3N0QWRkcmVzcyk7CisKKyAgICAgICAgaWYgKGluZXRBZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0Um91dGVUb0hvc3RBZGRyZXNzKG5ldHdvcmtUeXBlLCBpbmV0QWRkcmVzcy5nZXRBZGRyZXNzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBob3N0IHZpYSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBuZXR3b3JrVHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV0d29yayBvdmVyIHdoaWNoIHRyYWZmaWMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIGhvc3QgaXMgdG8gYmUgcm91dGVkCisgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcworICAgICAqIGRlc2lyZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3RBZGRyZXNzKGludCBuZXR3b3JrVHlwZSwgYnl0ZVtdIGhvc3RBZGRyZXNzKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CiAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlVmFsaWQobmV0d29ya1R5cGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05MjUsMTEgKzk0OSwxOCBAQAogICAgICAgICBpZiAodHJhY2tlciA9PSBudWxsIHx8ICF0cmFja2VyLmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSB8fAogICAgICAgICAgICAgICAgIHRyYWNrZXIuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CiAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlcXVlc3RSb3V0ZVRvSG9zdCBvbiBkb3duIG5ldHdvcmsgKCIgKyBuZXR3b3JrVHlwZSArICIpIC0gZHJvcHBlZCIpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZXF1ZXN0Um91dGVUb0hvc3RBZGRyZXNzIG9uIGRvd24gbmV0d29yayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIoIiArIG5ldHdvcmtUeXBlICsgIikgLSBkcm9wcGVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGhvc3RBZGRyZXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGluZXRBZGRyZXNzKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Ryb3BCb3hNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDBlNDUxNDUuLjM5ODE1MjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Ryb3BCb3hNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Ryb3BCb3hNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yMTgsOCArMjE4LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAocmVhZCA+IDApOwogCi0gICAgICAgICAgICBjcmVhdGVFbnRyeSh0ZW1wLCB0YWcsIGZsYWdzKTsKKyAgICAgICAgICAgIGxvbmcgdGltZSA9IGNyZWF0ZUVudHJ5KHRlbXAsIHRhZywgZmxhZ3MpOwogICAgICAgICAgICAgdGVtcCA9IG51bGw7CisKKyAgICAgICAgICAgIEludGVudCBkcm9wYm94SW50ZW50ID0gbmV3IEludGVudChEcm9wQm94TWFuYWdlci5BQ1RJT05fRFJPUEJPWF9FTlRSWV9BRERFRCk7CisgICAgICAgICAgICBkcm9wYm94SW50ZW50LnB1dEV4dHJhKERyb3BCb3hNYW5hZ2VyLkVYVFJBX1RBRywgdGFnKTsKKyAgICAgICAgICAgIGRyb3Bib3hJbnRlbnQucHV0RXh0cmEoRHJvcEJveE1hbmFnZXIuRVhUUkFfVElNRSwgdGltZSk7CisgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGRyb3Bib3hJbnRlbnQsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX0xPR1MpOworCiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCB3cml0ZTogIiArIHRhZywgZSk7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC01OTcsNyArNjAzLDcgQEAKICAgICB9CiAKICAgICAvKiogTW92ZXMgYSB0ZW1wb3JhcnkgZmlsZSB0byBhIGZpbmFsIGxvZyBmaWxlbmFtZSBhbmQgZW5yb2xscyBpdC4gKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNyZWF0ZUVudHJ5KEZpbGUgdGVtcCwgU3RyaW5nIHRhZywgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGxvbmcgY3JlYXRlRW50cnkoRmlsZSB0ZW1wLCBTdHJpbmcgdGFnLCBpbnQgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgICAgIC8vIFJlcXVpcmUgZWFjaCBlbnRyeSB0byBoYXZlIGEgdW5pcXVlIHRpbWVzdGFtcDsgaWYgdGhlcmUgYXJlIGVudHJpZXMKQEAgLTYzNiw2ICs2NDIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZW5yb2xsRW50cnkobmV3IEVudHJ5RmlsZSh0ZW1wLCBtRHJvcEJveERpciwgdGFnLCB0LCBmbGFncywgbUJsb2NrU2l6ZSkpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiB0OwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YQppbmRleCBhMTkxNTQ5Li5lNmUzZTVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YQpAQCAtMTE0NCw2ICsxMTQ0LDE3IEBACiAgICAgICAgICAgICAvLyBQb3N0IGEgdW5tb3VudCBtZXNzYWdlLgogICAgICAgICAgICAgU2h1dGRvd25DYWxsQmFjayB1Y2IgPSBuZXcgU2h1dGRvd25DYWxsQmFjayhwYXRoLCBvYnNlcnZlcik7CiAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEhfVU5NT1VOVF9QTV9VUERBVEUsIHVjYikpOworICAgICAgICB9IGVsc2UgaWYgKG9ic2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPYnNlcnZlciBpcyB3YWl0aW5nIGZvciBvblNodXREb3duQ29tcGxldGUgd2hlbiB3ZSBhcmUgZG9uZS4KKyAgICAgICAgICAgICAqIFNpbmNlIG5vdGhpbmcgd2lsbCBiZSBkb25lIHNlbmQgbm90aWZpY2F0aW9uIGRpcmVjdGx5IHNvIHNodXRkb3duCisgICAgICAgICAgICAgKiBzZXF1ZW5jZSBjYW4gY29udGludWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25TaHV0RG93bkNvbXBsZXRlKFN0b3JhZ2VSZXN1bHRDb2RlLk9wZXJhdGlvblN1Y2NlZWRlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJSZW1vdGVFeGNlcHRpb24gd2hlbiBzaHV0dGluZyBkb3duIik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggY2Y4N2E5ZC4uODhkOTRjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTk3LDExICs5NywxMiBAQAogICAgICAgICAgICAgICAgICAgICBMb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlLlJFU0VSVkVEKTsKIAogICAgICAgICAgICAgc29ja2V0LmNvbm5lY3QoYWRkcmVzcyk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLm9uRGFlbW9uQ29ubmVjdGVkKCk7CiAKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwogCisgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uRGFlbW9uQ29ubmVjdGVkKCk7CisKICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CiAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBiMjZkYWM3Mi4uNTQwMzg5ZSAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xMzMsMTEgKzEzMywxMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtQmF0dGVyeUZ1bGw7CiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25SZWNvcmQgbUxlZE5vdGlmaWNhdGlvbjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0xPV19BUkdCID0gMHhGRkZGMDAwMDsgLy8gQ2hhcmdpbmcgTG93IC0gcmVkIHNvbGlkIG9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfTUVESVVNX0FSR0IgPSAweEZGRkZGRjAwOyAgICAvLyBDaGFyZ2luZyAtIG9yYW5nZSBzb2xpZCBvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0ZVTExfQVJHQiA9IDB4RkYwMEZGMDA7IC8vIENoYXJnaW5nIEZ1bGwgLSBncmVlbiBzb2xpZCBvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0JMSU5LX09OID0gMTI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0JMSU5LX09GRiA9IDI4NzU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1CYXR0ZXJ5TG93QVJHQjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUJhdHRlcnlNZWRpdW1BUkdCOworICAgIHByaXZhdGUgc3RhdGljIGludCBtQmF0dGVyeUZ1bGxBUkdCOworICAgIHByaXZhdGUgc3RhdGljIGludCBtQmF0dGVyeUxlZE9uOworICAgIHByaXZhdGUgc3RhdGljIGludCBtQmF0dGVyeUxlZE9mZjsKIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBpZERlYnVnU3RyaW5nKENvbnRleHQgYmFzZUNvbnRleHQsIFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGlkKSB7CiAgICAgICAgIENvbnRleHQgYyA9IG51bGw7CkBAIC00NTAsNiArNDUwLDE3IEBACiAgICAgICAgIG1EZWZhdWx0Tm90aWZpY2F0aW9uTGVkT2ZmID0gcmVzb3VyY2VzLmdldEludGVnZXIoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLmNvbmZpZ19kZWZhdWx0Tm90aWZpY2F0aW9uTGVkT2ZmKTsKIAorICAgICAgICBtQmF0dGVyeUxvd0FSR0IgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlMb3dBUkdCKTsKKyAgICAgICAgbUJhdHRlcnlNZWRpdW1BUkdCID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TWVkaXVtQVJHQik7CisgICAgICAgIG1CYXR0ZXJ5RnVsbEFSR0IgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlGdWxsQVJHQik7CisgICAgICAgIG1CYXR0ZXJ5TGVkT24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlMZWRPbik7CisgICAgICAgIG1CYXR0ZXJ5TGVkT2ZmID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TGVkT2ZmKTsKKwogICAgICAgICAvLyBEb24ndCBzdGFydCBhbGxvd2luZyBub3RpZmljYXRpb25zIHVudGlsIHRoZSBzZXR1cCB3aXphcmQgaGFzIHJ1biBvbmNlLgogICAgICAgICAvLyBBZnRlciB0aGF0LCBpbmNsdWRpbmcgc3Vic2VxdWVudCBib290cywgaW5pdCB3aXRoIG5vdGlmaWNhdGlvbnMgdHVybmVkIG9uLgogICAgICAgICAvLyBUaGlzIHdvcmtzIG9uIHRoZSBmaXJzdCBib290IGJlY2F1c2UgdGhlIHNldHVwIHdpemFyZCB3aWxsIHRvZ2dsZSB0aGlzCkBAIC0xMDY1LDE3ICsxMDc2LDE3IEBACiAgICAgICAgIC8vIEJhdHRlcnkgbG93IGFsd2F5cyBzaG93cywgb3RoZXIgc3RhdGVzIG9ubHkgc2hvdyBpZiBjaGFyZ2luZy4KICAgICAgICAgaWYgKG1CYXR0ZXJ5TG93KSB7CiAgICAgICAgICAgICBpZiAobUJhdHRlcnlDaGFyZ2luZykgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IoQkFUVEVSWV9MT1dfQVJHQik7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlMaWdodC5zZXRDb2xvcihtQmF0dGVyeUxvd0FSR0IpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBGbGFzaCB3aGVuIGJhdHRlcnkgaXMgbG93IGFuZCBub3QgY2hhcmdpbmcKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpZ2h0LnNldEZsYXNoaW5nKEJBVFRFUllfTE9XX0FSR0IsIExpZ2h0c1NlcnZpY2UuTElHSFRfRkxBU0hfVElNRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBCQVRURVJZX0JMSU5LX09OLCBCQVRURVJZX0JMSU5LX09GRik7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlMaWdodC5zZXRGbGFzaGluZyhtQmF0dGVyeUxvd0FSR0IsIExpZ2h0c1NlcnZpY2UuTElHSFRfRkxBU0hfVElNRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeUxlZE9uLCBtQmF0dGVyeUxlZE9mZik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobUJhdHRlcnlDaGFyZ2luZykgewogICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5RnVsbCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IoQkFUVEVSWV9GVUxMX0FSR0IpOworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IobUJhdHRlcnlGdWxsQVJHQik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IoQkFUVEVSWV9NRURJVU1fQVJHQik7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlMaWdodC5zZXRDb2xvcihtQmF0dGVyeU1lZGl1bUFSR0IpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUJhdHRlcnlMaWdodC50dXJuT2ZmKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qcm9jZXNzU3RhdHMuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Byb2Nlc3NTdGF0cy5qYXZhCmluZGV4IDAyMGY5ZWQuLjQzZGJjYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Byb2Nlc3NTdGF0cy5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Byb2Nlc3NTdGF0cy5qYXZhCkBAIC04MTEsNyArODExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG1CdWZmZXIsIDAsIDAsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG1CdWZmZXIsIDAsIGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2FsbHBhcGVyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dhbGxwYXBlck1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggODU5Yzg1Yy4uOTk3ZTc1MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2FsbHBhcGVyTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XYWxscGFwZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC01ODcsNiArNTg3LDggQEAKICAgICAgICAgICAgICAgICBtSVdpbmRvd01hbmFnZXIucmVtb3ZlV2luZG93VG9rZW4obVdhbGxwYXBlckNvbm5lY3Rpb24ubVRva2VuKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtV2FsbHBhcGVyQ29ubmVjdGlvbi5tU2VydmljZSA9IG51bGw7CisgICAgICAgICAgICBtV2FsbHBhcGVyQ29ubmVjdGlvbi5tRW5naW5lID0gbnVsbDsKICAgICAgICAgICAgIG1XYWxscGFwZXJDb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGVmZDBiYjQuLjY2N2I1NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTIyLDkgKzUyMiw4IEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aHIubVNlcnZpY2U7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhyLm1TZXJ2aWNlOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBXTVRocmVhZCBleHRlbmRzIFRocmVhZCB7CkBAIC0xNDgyLDYgKzE0ODEsNyBAQAogICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdiID0gbG9jYWxtV2luZG93cy5nZXQoZm91bmRJLTEpOwogICAgICAgICAgICAgICAgIGlmICh3Yi5tQmFzZUxheWVyIDwgbWF4TGF5ZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHdiLm1BdHRhY2hlZFdpbmRvdyAhPSBmb3VuZFcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHdiLm1BdHRhY2hlZFdpbmRvdyAhPSBmb3VuZFcubUF0dGFjaGVkV2luZG93ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAod2IubUF0dHJzLnR5cGUgIT0gVFlQRV9BUFBMSUNBVElPTl9TVEFSVElORyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yi5tVG9rZW4gIT0gZm91bmRXLm1Ub2tlbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3aW5kb3cgaXMgbm90IHJlbGF0ZWQgdG8gdGhlIHByZXZpb3VzIG9uZSBpbiBhbnkKQEAgLTU0MjEsNiArNTQyMSw3IEBACiAgICAgICAgIGludCBkZXZpY2VJZCA9IGV2LmdldERldmljZUlkKCk7CiAgICAgICAgIGludCBzY2FuY29kZSA9IGV2LmdldFNjYW5Db2RlKCk7CiAgICAgICAgIGludCBzb3VyY2UgPSBldi5nZXRTb3VyY2UoKTsKKyAgICAgICAgaW50IGZsYWdzID0gZXYuZ2V0RmxhZ3MoKTsKICAgICAgICAgCiAgICAgICAgIGlmIChzb3VyY2UgPT0gSW5wdXREZXZpY2UuU09VUkNFX1VOS05PV04pIHsKICAgICAgICAgICAgIHNvdXJjZSA9IElucHV0RGV2aWNlLlNPVVJDRV9LRVlCT0FSRDsKQEAgLTU0MzAsNyArNTQzMSw3IEBACiAgICAgICAgIGlmIChkb3duVGltZSA9PSAwKSBkb3duVGltZSA9IGV2ZW50VGltZTsKIAogICAgICAgICBLZXlFdmVudCBuZXdFdmVudCA9IG5ldyBLZXlFdmVudChkb3duVGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sIGNvZGUsIHJlcGVhdENvdW50LCBtZXRhU3RhdGUsCi0gICAgICAgICAgICAgICAgZGV2aWNlSWQsIHNjYW5jb2RlLCBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNLCBzb3VyY2UpOworICAgICAgICAgICAgICAgIGRldmljZUlkLCBzY2FuY29kZSwgZmxhZ3MgfCBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNLCBzb3VyY2UpOwogCiAgICAgICAgIGZpbmFsIGludCBwaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTc2MDEsNyArNzYwMiw4IEBACiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gYWxsQXBwV2luZG93cy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKHdpbiA9PSBzdGFydGluZ1dpbmRvdyB8fCB3aW4ubUFwcEZyZWV6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW4ubVZpZXdWaXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luLm1BdHRycy50eXBlID09IFRZUEVfQVBQTElDQVRJT05fU1RBUlRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbi5tQXR0cnMudHlwZSA9PSBUWVBFX0FQUExJQ0FUSU9OX1NUQVJUSU5HCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW4ubURlc3Ryb3lpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZGRkOTlmNC4uMGUzOGUxMCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTUsNiArNTUsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRSZWNlaXZlcjsKQEAgLTExMTYsNyArMTExNyw3IEBACiAgICAgICAgICAgICAgICAgZC5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICBkLnNldFRpdGxlKCJTeXN0ZW0gVUlEcyBJbmNvbnNpc3RlbnQiKTsKICAgICAgICAgICAgICAgICBkLnNldE1lc3NhZ2UoIlVJRHMgb24gdGhlIHN5c3RlbSBhcmUgaW5jb25zaXN0ZW50LCB5b3UgbmVlZCB0byB3aXBlIHlvdXIgZGF0YSBwYXJ0aXRpb24gb3IgeW91ciBkZXZpY2Ugd2lsbCBiZSB1bnN0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICBkLnNldEJ1dHRvbigiSSdtIEZlZWxpbmcgTHVja3kiLAorICAgICAgICAgICAgICAgIGQuc2V0QnV0dG9uKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkUsICJJJ20gRmVlbGluZyBMdWNreSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKElNX0ZFRUxJTkdfTFVDS1lfTVNHKSk7CiAgICAgICAgICAgICAgICAgbVVpZEFsZXJ0ID0gZDsKICAgICAgICAgICAgICAgICBkLnNob3coKTsKQEAgLTM2NzgsMTAgKzM2NzksMTIgQEAKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwa2dzID0gaW50ZW50LmdldFN0cmluZ0FycmF5RXh0cmEoSW50ZW50LkVYVFJBX1BBQ0tBR0VTKTsKICAgICAgICAgICAgICAgICBpZiAocGtncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IHBrZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVN0b3BQYWNrYWdlTG9ja2VkKHBrZywgLTEsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0Q29kZShBY3Rpdml0eS5SRVNVTFRfT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQWN0aXZpdHlNYW5hZ2VyU2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVN0b3BQYWNrYWdlTG9ja2VkKHBrZywgLTEsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKEFjdGl2aXR5LlJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDM4MiwxMiArNDM4NSwxNSBAQAogICAgICAgICBwZXJtLm1vZGVGbGFncyB8PSBtb2RlRmxhZ3M7CiAgICAgICAgIGlmIChvd25lciA9PSBudWxsKSB7CiAgICAgICAgICAgICBwZXJtLmdsb2JhbE1vZGVGbGFncyB8PSBtb2RlRmxhZ3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG1vZGVGbGFncyZJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7Ci0gICAgICAgICAgICBwZXJtLnJlYWRPd25lcnMuYWRkKG93bmVyKTsKLSAgICAgICAgICAgIG93bmVyLmFkZFJlYWRQZXJtaXNzaW9uKHBlcm0pOwotICAgICAgICB9IGVsc2UgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKLSAgICAgICAgICAgIHBlcm0ud3JpdGVPd25lcnMuYWRkKG93bmVyKTsKLSAgICAgICAgICAgIG93bmVyLmFkZFdyaXRlUGVybWlzc2lvbihwZXJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgcGVybS5yZWFkT3duZXJzLmFkZChvd25lcik7CisgICAgICAgICAgICAgICAgIG93bmVyLmFkZFJlYWRQZXJtaXNzaW9uKHBlcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgcGVybS53cml0ZU93bmVycy5hZGQob3duZXIpOworICAgICAgICAgICAgICAgICBvd25lci5hZGRXcml0ZVBlcm1pc3Npb24ocGVybSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY0MzUsNyArNjQ0MSwyOCBAQAogICAgICAgICAgICAgICAgIHNyLmNyYXNoQ291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICAvLyBJZiB0aGUgY3Jhc2hpbmcgcHJvY2VzcyBpcyB3aGF0IHdlIGNvbnNpZGVyIHRvIGJlIHRoZSAiaG9tZSBwcm9jZXNzIiBhbmQgaXQgaGFzIGJlZW4KKyAgICAgICAgLy8gcmVwbGFjZWQgYnkgYSB0aGlyZC1wYXJ0eSBhcHAsIGNsZWFyIHRoZSBwYWNrYWdlIHByZWZlcnJlZCBhY3Rpdml0aWVzIGZyb20gcGFja2FnZXMKKyAgICAgICAgLy8gd2l0aCBhIGhvbWUgYWN0aXZpdHkgcnVubmluZyBpbiB0aGUgcHJvY2VzcyB0byBwcmV2ZW50IGEgcmVwZWF0ZWRseSBjcmFzaGluZyBhcHAKKyAgICAgICAgLy8gZnJvbSBibG9ja2luZyB0aGUgdXNlciB0byBtYW51YWxseSBjbGVhciB0aGUgbGlzdC4KKyAgICAgICAgaWYgKGFwcCA9PSBtSG9tZVByb2Nlc3MgJiYgbUhvbWVQcm9jZXNzLmFjdGl2aXRpZXMuc2l6ZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiAobUhvbWVQcm9jZXNzLmluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pID09IDApIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbUhvbWVQcm9jZXNzLmFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoci5pc0hvbWVBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyBwYWNrYWdlIHByZWZlcnJlZCBhY3Rpdml0aWVzIGZyb20gIiArIHIucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlUaHJlYWQuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xlYXJQYWNrYWdlUHJlZmVycmVkQWN0aXZpdGllcyhyLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBtIGlzIGluIHNhbWUgcHJvY2VzcywgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1Qcm9jZXNzQ3Jhc2hUaW1lcy5wdXQoYXBwLmluZm8ucHJvY2Vzc05hbWUsIGFwcC5pbmZvLnVpZCwgbm93KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNjc4OSw2ICs2ODE2LDkgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZCgiU3ViamVjdDogIikuYXBwZW5kKHN1YmplY3QpLmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIkJ1aWxkOiAiKS5hcHBlbmQoQnVpbGQuRklOR0VSUFJJTlQpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgaWYgKERlYnVnLmlzRGVidWdnZXJDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJEZWJ1Z2dlcjogQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIlxuIik7CiAKICAgICAgICAgLy8gRG8gdGhlIHJlc3QgaW4gYSB3b3JrZXIgdGhyZWFkIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsZXIgb24gSS9PCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKaW5kZXggZjUyZDMyMi4uNDYzNDkzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQpAQCAtMjEzOSw3ICsyMTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgc3RhcnRlZCwgd2hpY2ggbWVhbnMgbm90IGJyaW5naW5nIGl0IHRvIHRoZSBmcm9udAogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2FsbGVyIGlzIG5vdCBpdHNlbGYgaW4gdGhlIGZyb250LgogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCBjdXJUb3AgPSB0b3BSdW5uaW5nTm9uRGVsYXllZEFjdGl2aXR5TG9ja2VkKG5vdFRvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb3AudGFzayAhPSB0YXNrVG9wLnRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvcCAhPSBudWxsICYmIGN1clRvcC50YXNrICE9IHRhc2tUb3AudGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgci5pbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQlJPVUdIVF9UT19GUk9OVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbGxlckF0RnJvbnQgPSBzb3VyY2VSZWNvcmQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjdXJUb3AudGFzayA9PSBzb3VyY2VSZWNvcmQudGFzazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FwcFdhaXRpbmdGb3JEZWJ1Z2dlckRpYWxvZy5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKaW5kZXggOGU5ODE4ZC4uOWZiNDhiMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCkBAIC00OSw3ICs1MCw3IEBACiAgICAgICAgIHRleHQuYXBwZW5kKCIgaXMgd2FpdGluZyBmb3IgdGhlIGRlYnVnZ2VyIHRvIGF0dGFjaC4iKTsKIAogICAgICAgICBzZXRNZXNzYWdlKHRleHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNldEJ1dHRvbigiRm9yY2UgQ2xvc2UiLCBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKDEsIGFwcCkpOworICAgICAgICBzZXRCdXR0b24oRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9QT1NJVElWRSwgIkZvcmNlIENsb3NlIiwgbUhhbmRsZXIub2J0YWluTWVzc2FnZSgxLCBhcHApKTsKICAgICAgICAgc2V0VGl0bGUoIldhaXRpbmcgRm9yIERlYnVnZ2VyIik7CiAgICAgICAgIGdldFdpbmRvdygpLnNldFRpdGxlKCJXYWl0aW5nIEZvciBEZWJ1Z2dlcjogIiArIGFwcC5pbmZvLnByb2Nlc3NOYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0ZhY3RvcnlFcnJvckRpYWxvZy5qYXZhCmluZGV4IDJlMjU0NzQuLmIxOWJiNWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuYW07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKQEAgLTI2LDcgKzI3LDggQEAKICAgICAgICAgc2V0Q2FuY2VsYWJsZShmYWxzZSk7CiAgICAgICAgIHNldFRpdGxlKGNvbnRleHQuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5mYWN0b3J5dGVzdF9mYWlsZWQpKTsKICAgICAgICAgc2V0TWVzc2FnZShtc2cpOwotICAgICAgICBzZXRCdXR0b24oY29udGV4dC5nZXRUZXh0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmZhY3Rvcnl0ZXN0X3JlYm9vdCksCisgICAgICAgIHNldEJ1dHRvbihEaWFsb2dJbnRlcmZhY2UuQlVUVE9OX1BPU0lUSVZFLAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5mYWN0b3J5dGVzdF9yZWJvb3QpLAogICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoMCkpOwogICAgICAgICBnZXRXaW5kb3coKS5zZXRUaXRsZSgiRmFjdG9yeSBFcnJvciIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKaW5kZXggOGU3Y2FkYy4uZDQ1MTNlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICBqaW50IGhlYWx0aERlYWQ7CiAgICAgamludCBoZWFsdGhPdmVyVm9sdGFnZTsKICAgICBqaW50IGhlYWx0aFVuc3BlY2lmaWVkRmFpbHVyZTsKKyAgICBqaW50IGhlYWx0aENvbGQ7CiB9Owogc3RhdGljIEJhdHRlcnlNYW5hZ2VyQ29uc3RhbnRzIGdDb25zdGFudHM7CiAKQEAgLTEwNCw2ICsxMDUsNyBAQAogc3RhdGljIGppbnQgZ2V0QmF0dGVyeUhlYWx0aChjb25zdCBjaGFyKiBzdGF0dXMpCiB7CiAgICAgc3dpdGNoIChzdGF0dXNbMF0pIHsKKyAgICAgICAgY2FzZSAnQyc6IHJldHVybiBnQ29uc3RhbnRzLmhlYWx0aENvbGQ7ICAgICAgICAgLy8gQ29sZAogICAgICAgICBjYXNlICdEJzogcmV0dXJuIGdDb25zdGFudHMuaGVhbHRoRGVhZDsgICAgICAgICAvLyBEZWFkCiAgICAgICAgIGNhc2UgJ0cnOiByZXR1cm4gZ0NvbnN0YW50cy5oZWFsdGhHb29kOyAgICAgICAgIC8vIEdvb2QKICAgICAgICAgY2FzZSAnTyc6IHsKQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIAogICAgIGpib29sZWFuIHZhbHVlID0gZmFsc2U7CiAgICAgaWYgKHJlYWRGcm9tRmlsZShwYXRoLCBidWYsIFNJWkUpID4gMCkgewotICAgICAgICBpZiAoYnVmWzBdID09ICcxJykgeworICAgICAgICBpZiAoYnVmWzBdICE9ICcwJykgewogICAgICAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzkwLDYgKzM5Miw5IEBACiAgICAgZ0NvbnN0YW50cy5oZWFsdGhVbnNwZWNpZmllZEZhaWx1cmUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGNsYXp6LCAKICAgICAgICAgICAgIGVudi0+R2V0U3RhdGljRmllbGRJRChjbGF6eiwgIkJBVFRFUllfSEVBTFRIX1VOU1BFQ0lGSUVEX0ZBSUxVUkUiLCAiSSIpKTsKICAgICAKKyAgICBnQ29uc3RhbnRzLmhlYWx0aENvbGQgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGNsYXp6LAorICAgICAgICAgICAgZW52LT5HZXRTdGF0aWNGaWVsZElEKGNsYXp6LCAiQkFUVEVSWV9IRUFMVEhfQ09MRCIsICJJIikpOworCiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvQmF0dGVyeVNlcnZpY2UiLCBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKaW5kZXggYTc1ZTQxZC4uNmQ0YWQ5YSAxMDA3NTUKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCkBAIC0yMTcsODIgKzIxNywxMCBAQAogICAgIGNyZWF0ZV90aHJlYWRfY2FsbGJhY2ssCiB9OwogCi1zdGF0aWMgY29uc3QgR3BzSW50ZXJmYWNlKiBnZXRfZ3BzX2ludGVyZmFjZSgpIHsKK3N0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9jbGFzc19pbml0X25hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7CiAgICAgaW50IGVycjsKICAgICBod19tb2R1bGVfdCogbW9kdWxlOwotICAgIGNvbnN0IEdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gTlVMTDsKIAotICAgIGVyciA9IGh3X2dldF9tb2R1bGUoR1BTX0hBUkRXQVJFX01PRFVMRV9JRCwgKGh3X21vZHVsZV90IGNvbnN0KiopJm1vZHVsZSk7Ci0gICAgaWYgKGVyciA9PSAwKSB7Ci0gICAgICAgIGh3X2RldmljZV90KiBkZXZpY2U7Ci0gICAgICAgIGVyciA9IG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIEdQU19IQVJEV0FSRV9NT0RVTEVfSUQsICZkZXZpY2UpOwotICAgICAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgICAgIGdwc19kZXZpY2VfdCogZ3BzX2RldmljZSA9IChncHNfZGV2aWNlX3QgKilkZXZpY2U7Ci0gICAgICAgICAgICBpbnRlcmZhY2UgPSBncHNfZGV2aWNlLT5nZXRfZ3BzX2ludGVyZmFjZShncHNfZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBHcHNJbnRlcmZhY2UqIEdldEdwc0ludGVyZmFjZShKTklFbnYqIGVudiwgam9iamVjdCBvYmopIHsKLSAgICAvLyB0aGlzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIEhBTCBsaWJyYXJ5Ci0gICAgaWYgKCFtQ2FsbGJhY2tzT2JqKQotICAgICAgICBtQ2FsbGJhY2tzT2JqID0gZW52LT5OZXdHbG9iYWxSZWYob2JqKTsKLQotICAgIGlmICghc0dwc0ludGVyZmFjZSkgewotICAgICAgICBzR3BzSW50ZXJmYWNlID0gZ2V0X2dwc19pbnRlcmZhY2UoKTsKLSAgICAgICAgaWYgKCFzR3BzSW50ZXJmYWNlIHx8IHNHcHNJbnRlcmZhY2UtPmluaXQoJnNHcHNDYWxsYmFja3MpICE9IDApIHsKLSAgICAgICAgICAgIHNHcHNJbnRlcmZhY2UgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNHcHNJbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBBR3BzSW50ZXJmYWNlKiBHZXRBR3BzSW50ZXJmYWNlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKLXsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzQUdwc0ludGVyZmFjZSkgewotICAgICAgICBzQUdwc0ludGVyZmFjZSA9IChjb25zdCBBR3BzSW50ZXJmYWNlKilpbnRlcmZhY2UtPmdldF9leHRlbnNpb24oQUdQU19JTlRFUkZBQ0UpOwotICAgICAgICBpZiAoc0FHcHNJbnRlcmZhY2UpCi0gICAgICAgICAgICBzQUdwc0ludGVyZmFjZS0+aW5pdCgmc0FHcHNDYWxsYmFja3MpOwotICAgIH0KLSAgICByZXR1cm4gc0FHcHNJbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBHcHNOaUludGVyZmFjZSogR2V0TmlJbnRlcmZhY2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKQotewotICAgIGNvbnN0IEdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0R3BzSW50ZXJmYWNlKGVudiwgb2JqKTsKLSAgICBpZiAoIWludGVyZmFjZSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkgewotICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopaW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwotICAgICAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQotICAgICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7Ci0gICAgfQotICAgIHJldHVybiBzR3BzTmlJbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBBR3BzUmlsSW50ZXJmYWNlKiBHZXRBR3BzUmlsSW50ZXJmYWNlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKLXsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzQUdwc1JpbEludGVyZmFjZSkgewotICAgICAgIHNBR3BzUmlsSW50ZXJmYWNlID0gKGNvbnN0IEFHcHNSaWxJbnRlcmZhY2UqKWludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihBR1BTX1JJTF9JTlRFUkZBQ0UpOwotICAgICAgICBpZiAoc0FHcHNSaWxJbnRlcmZhY2UpCi0gICAgICAgICAgICBzQUdwc1JpbEludGVyZmFjZS0+aW5pdCgmc0FHcHNSaWxDYWxsYmFja3MpOwotICAgIH0KLSAgICByZXR1cm4gc0FHcHNSaWxJbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9jbGFzc19pbml0X25hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7CiAgICAgbWV0aG9kX3JlcG9ydExvY2F0aW9uID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInJlcG9ydExvY2F0aW9uIiwgIihJRERERkZGSilWIik7CiAgICAgbWV0aG9kX3JlcG9ydFN0YXR1cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJyZXBvcnRTdGF0dXMiLCAiKEkpViIpOwogICAgIG1ldGhvZF9yZXBvcnRTdlN0YXR1cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJyZXBvcnRTdlN0YXR1cyIsICIoKVYiKTsKQEAgLTMwMCw0MCArMjI4LDczIEBACiAgICAgbWV0aG9kX3JlcG9ydE5tZWEgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAicmVwb3J0Tm1lYSIsICIoSilWIik7CiAgICAgbWV0aG9kX3NldEVuZ2luZUNhcGFiaWxpdGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXRFbmdpbmVDYXBhYmlsaXRpZXMiLCAiKEkpViIpOwogICAgIG1ldGhvZF94dHJhRG93bmxvYWRSZXF1ZXN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInh0cmFEb3dubG9hZFJlcXVlc3QiLCAiKClWIik7Ci0gICAgbWV0aG9kX3JlcG9ydE5pTm90aWZpY2F0aW9uID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInJlcG9ydE5pTm90aWZpY2F0aW9uIiwgIihJSUlJSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lJTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2RfcmVwb3J0TmlOb3RpZmljYXRpb24gPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAicmVwb3J0TmlOb3RpZmljYXRpb24iLAorICAgICAgICAgICAgIihJSUlJSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lJTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKICAgICBtZXRob2RfcmVxdWVzdFJlZkxvY2F0aW9uID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwicmVxdWVzdFJlZkxvY2F0aW9uIiwiKEkpViIpOwogICAgIG1ldGhvZF9yZXF1ZXN0U2V0SUQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCJyZXF1ZXN0U2V0SUQiLCIoSSlWIik7CisKKyAgICBlcnIgPSBod19nZXRfbW9kdWxlKEdQU19IQVJEV0FSRV9NT0RVTEVfSUQsIChod19tb2R1bGVfdCBjb25zdCoqKSZtb2R1bGUpOworICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICBod19kZXZpY2VfdCogZGV2aWNlOworICAgICAgICBlcnIgPSBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLCBHUFNfSEFSRFdBUkVfTU9EVUxFX0lELCAmZGV2aWNlKTsKKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICBncHNfZGV2aWNlX3QqIGdwc19kZXZpY2UgPSAoZ3BzX2RldmljZV90ICopZGV2aWNlOworICAgICAgICAgICAgc0dwc0ludGVyZmFjZSA9IGdwc19kZXZpY2UtPmdldF9ncHNfaW50ZXJmYWNlKGdwc19kZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzR3BzSW50ZXJmYWNlKSB7CisgICAgICAgIHNHcHNYdHJhSW50ZXJmYWNlID0KKyAgICAgICAgICAgIChjb25zdCBHcHNYdHJhSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19YVFJBX0lOVEVSRkFDRSk7CisgICAgICAgIHNBR3BzSW50ZXJmYWNlID0KKyAgICAgICAgICAgIChjb25zdCBBR3BzSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEFHUFNfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlID0KKyAgICAgICAgICAgIChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc0RlYnVnSW50ZXJmYWNlID0KKyAgICAgICAgICAgIChjb25zdCBHcHNEZWJ1Z0ludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfREVCVUdfSU5URVJGQUNFKTsKKyAgICAgICAgc0FHcHNSaWxJbnRlcmZhY2UgPQorICAgICAgICAgICAgKGNvbnN0IEFHcHNSaWxJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oQUdQU19SSUxfSU5URVJGQUNFKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfaXNfc3VwcG9ydGVkKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLSAgICByZXR1cm4gKHNHcHNJbnRlcmZhY2UgIT0gTlVMTCB8fCBnZXRfZ3BzX2ludGVyZmFjZSgpICE9IE5VTEwpOworICAgIHJldHVybiAoc0dwc0ludGVyZmFjZSAhPSBOVUxMKTsKIH0KIAogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9pbml0KEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKIHsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpCisgICAgLy8gdGhpcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBpbnRvIHRoZSBIQUwgbGlicmFyeQorICAgIGlmICghbUNhbGxiYWNrc09iaikKKyAgICAgICAgbUNhbGxiYWNrc09iaiA9IGVudi0+TmV3R2xvYmFsUmVmKG9iaik7CisKKyAgICAvLyBmYWlsIGlmIHRoZSBtYWluIGludGVyZmFjZSBmYWlscyB0byBpbml0aWFsaXplCisgICAgaWYgKCFzR3BzSW50ZXJmYWNlIHx8IHNHcHNJbnRlcmZhY2UtPmluaXQoJnNHcHNDYWxsYmFja3MpICE9IDApCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmICghc0dwc0RlYnVnSW50ZXJmYWNlKQotICAgICAgIHNHcHNEZWJ1Z0ludGVyZmFjZSA9IChjb25zdCBHcHNEZWJ1Z0ludGVyZmFjZSopaW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19ERUJVR19JTlRFUkZBQ0UpOworICAgIC8vIGlmIFhUUkEgaW5pdGlhbGl6YXRpb24gZmFpbHMgd2Ugd2lsbCBkaXNhYmxlIGl0IGJ5IHNHcHNYdHJhSW50ZXJmYWNlIHRvIG51bGwsCisgICAgLy8gYnV0IGNvbnRpbnVlIHRvIGFsbG93IHRoZSByZXN0IG9mIHRoZSBHUFMgaW50ZXJmYWNlIHRvIHdvcmsuCisgICAgaWYgKHNHcHNYdHJhSW50ZXJmYWNlICYmIHNHcHNYdHJhSW50ZXJmYWNlLT5pbml0KCZzR3BzWHRyYUNhbGxiYWNrcykgIT0gMCkKKyAgICAgICAgc0dwc1h0cmFJbnRlcmZhY2UgPSBOVUxMOworICAgIGlmIChzQUdwc0ludGVyZmFjZSkKKyAgICAgICAgc0FHcHNJbnRlcmZhY2UtPmluaXQoJnNBR3BzQ2FsbGJhY2tzKTsKKyAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQorICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CisgICAgaWYgKHNBR3BzUmlsSW50ZXJmYWNlKQorICAgICAgICBzQUdwc1JpbEludGVyZmFjZS0+aW5pdCgmc0FHcHNSaWxDYWxsYmFja3MpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9jbGVhbnVwKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKIHsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKGludGVyZmFjZSkKLSAgICAgICAgaW50ZXJmYWNlLT5jbGVhbnVwKCk7CisgICAgaWYgKHNHcHNJbnRlcmZhY2UpCisgICAgICAgIHNHcHNJbnRlcmZhY2UtPmNsZWFudXAoKTsKIH0KIAogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9zZXRfcG9zaXRpb25fbW9kZShKTklFbnYqIGVudiwgam9iamVjdCBvYmosCiAgICAgICAgIGppbnQgbW9kZSwgamludCByZWN1cnJlbmNlLCBqaW50IG1pbl9pbnRlcnZhbCwgamludCBwcmVmZXJyZWRfYWNjdXJhY3ksIGppbnQgcHJlZmVycmVkX3RpbWUpCiB7Ci0gICAgY29uc3QgR3BzSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBHZXRHcHNJbnRlcmZhY2UoZW52LCBvYmopOwotICAgIGlmIChpbnRlcmZhY2UpCi0gICAgICAgIHJldHVybiAoaW50ZXJmYWNlLT5zZXRfcG9zaXRpb25fbW9kZShtb2RlLCByZWN1cnJlbmNlLCBtaW5faW50ZXJ2YWwsIHByZWZlcnJlZF9hY2N1cmFjeSwKKyAgICBpZiAoc0dwc0ludGVyZmFjZSkKKyAgICAgICAgcmV0dXJuIChzR3BzSW50ZXJmYWNlLT5zZXRfcG9zaXRpb25fbW9kZShtb2RlLCByZWN1cnJlbmNlLCBtaW5faW50ZXJ2YWwsIHByZWZlcnJlZF9hY2N1cmFjeSwKICAgICAgICAgICAgICAgICBwcmVmZXJyZWRfdGltZSkgPT0gMCk7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNDEsMjcgKzMwMiwyNCBAQAogCiBzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3N0YXJ0KEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKIHsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKGludGVyZmFjZSkKLSAgICAgICAgcmV0dXJuIChpbnRlcmZhY2UtPnN0YXJ0KCkgPT0gMCk7CisgICAgaWYgKHNHcHNJbnRlcmZhY2UpCisgICAgICAgIHJldHVybiAoc0dwc0ludGVyZmFjZS0+c3RhcnQoKSA9PSAwKTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9zdG9wKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKIHsKLSAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKGludGVyZmFjZSkKLSAgICAgICAgcmV0dXJuIChpbnRlcmZhY2UtPnN0b3AoKSA9PSAwKTsKKyAgICBpZiAoc0dwc0ludGVyZmFjZSkKKyAgICAgICAgcmV0dXJuIChzR3BzSW50ZXJmYWNlLT5zdG9wKCkgPT0gMCk7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9kZWxldGVfYWlkaW5nX2RhdGEoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBqaW50IGZsYWdzKQogewotICAgIGNvbnN0IEdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0R3BzSW50ZXJmYWNlKGVudiwgb2JqKTsKLSAgICBpZiAoaW50ZXJmYWNlKQotICAgICAgICBpbnRlcmZhY2UtPmRlbGV0ZV9haWRpbmdfZGF0YShmbGFncyk7CisgICAgaWYgKHNHcHNJbnRlcmZhY2UpCisgICAgICAgIHNHcHNJbnRlcmZhY2UtPmRlbGV0ZV9haWRpbmdfZGF0YShmbGFncyk7CiB9CiAKIHN0YXRpYyBqaW50IGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9yZWFkX3N2X3N0YXR1cyhKTklFbnYqIGVudiwgam9iamVjdCBvYmosCkBAIC0zOTksOCArMzU3LDggQEAKICAgICAgICAgam9iamVjdCBvYmosIGppbnQgdHlwZSwgamludCBtY2MsIGppbnQgbW5jLCBqaW50IGxhYywgamludCBjaWQpCiB7CiAgICAgQUdwc1JlZkxvY2F0aW9uIGxvY2F0aW9uOwotICAgIGNvbnN0IEFHcHNSaWxJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEFHcHNSaWxJbnRlcmZhY2UoZW52LCBvYmopOwotICAgIGlmICghaW50ZXJmYWNlKSB7CisKKyAgICBpZiAoIXNBR3BzUmlsSW50ZXJmYWNlKSB7CiAgICAgICAgIExPR0UoIm5vIEFHUFMgUklMIGludGVyZmFjZSBpbiBhZ3BzX3NldF9yZWZlcmVuY2VfbG9jYXRpb25fY2VsbGlkIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC00MTksMTUgKzM3NywxNSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGludGVyZmFjZS0+c2V0X3JlZl9sb2NhdGlvbigmbG9jYXRpb24sIHNpemVvZihsb2NhdGlvbikpOworICAgIHNBR3BzUmlsSW50ZXJmYWNlLT5zZXRfcmVmX2xvY2F0aW9uKCZsb2NhdGlvbiwgc2l6ZW9mKGxvY2F0aW9uKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9hZ3BzX3NlbmRfbmlfbWVzc2FnZShKTklFbnYqIGVudiwKICAgICAgICAgam9iamVjdCBvYmosIGpieXRlQXJyYXkgbmlfbXNnLCBqaW50IHNpemUpCiB7CiAgICAgc2l6ZV90IHN6OwotICAgIGNvbnN0IEFHcHNSaWxJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEFHcHNSaWxJbnRlcmZhY2UoZW52LCBvYmopOwotICAgIGlmICghaW50ZXJmYWNlKSB7CisKKyAgICBpZiAoIXNBR3BzUmlsSW50ZXJmYWNlKSB7CiAgICAgICAgIExPR0UoIm5vIEFHUFMgUklMIGludGVyZmFjZSBpbiBzZW5kX25pX21lc3NhZ2UiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQzNSwyMSArMzkzLDIwIEBACiAgICAgICAgIHJldHVybjsKICAgICBzeiA9IChzaXplX3Qpc2l6ZTsKICAgICBqYnl0ZSogYiA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMobmlfbXNnLCAwKTsKLSAgICBpbnRlcmZhY2UtPm5pX21lc3NhZ2UoKHVpbnQ4X3QgKiliLHN6KTsKKyAgICBzQUdwc1JpbEludGVyZmFjZS0+bmlfbWVzc2FnZSgodWludDhfdCAqKWIsc3opOwogICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKG5pX21zZyxiLDApOwogfQogCiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfYWdwc19zZXRfaWQoSk5JRW52ICplbnYsCiAgICAgICAgIGpvYmplY3Qgb2JqLCBqaW50IHR5cGUsIGpzdHJpbmcgIHNldGlkX3N0cmluZykKIHsKLSAgICBjb25zdCBBR3BzUmlsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBHZXRBR3BzUmlsSW50ZXJmYWNlKGVudiwgb2JqKTsKLSAgICBpZiAoIWludGVyZmFjZSkgeworICAgIGlmICghc0FHcHNSaWxJbnRlcmZhY2UpIHsKICAgICAgICAgTE9HRSgibm8gQUdQUyBSSUwgaW50ZXJmYWNlIGluIGFncHNfc2V0X2lkIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBjb25zdCBjaGFyICpzZXRpZCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc2V0aWRfc3RyaW5nLCBOVUxMKTsKLSAgICBpbnRlcmZhY2UtPnNldF9zZXRfaWQodHlwZSwgc2V0aWQpOworICAgIHNBR3BzUmlsSW50ZXJmYWNlLT5zZXRfc2V0X2lkKHR5cGUsIHNldGlkKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzZXRpZF9zdHJpbmcsIHNldGlkKTsKIH0KIApAQCAtNDY5LDQwICs0MjYsMzAgQEAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9pbmplY3RfdGltZShKTklFbnYqIGVudiwgam9iamVjdCBvYmosCiAgICAgICAgIGpsb25nIHRpbWUsIGpsb25nIHRpbWVSZWZlcmVuY2UsIGppbnQgdW5jZXJ0YWludHkpCiB7Ci0gICAgY29uc3QgR3BzSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBHZXRHcHNJbnRlcmZhY2UoZW52LCBvYmopOwotICAgIGlmIChpbnRlcmZhY2UpCi0gICAgICAgIGludGVyZmFjZS0+aW5qZWN0X3RpbWUodGltZSwgdGltZVJlZmVyZW5jZSwgdW5jZXJ0YWludHkpOworICAgIGlmIChzR3BzSW50ZXJmYWNlKQorICAgICAgICBzR3BzSW50ZXJmYWNlLT5pbmplY3RfdGltZSh0aW1lLCB0aW1lUmVmZXJlbmNlLCB1bmNlcnRhaW50eSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9pbmplY3RfbG9jYXRpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgICBqZG91YmxlIGxhdGl0dWRlLCBqZG91YmxlIGxvbmdpdHVkZSwgamZsb2F0IGFjY3VyYWN5KQogewotICAgIGNvbnN0IEdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0R3BzSW50ZXJmYWNlKGVudiwgb2JqKTsKLSAgICBpZiAoaW50ZXJmYWNlKQotICAgICAgICBpbnRlcmZhY2UtPmluamVjdF9sb2NhdGlvbihsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhY2N1cmFjeSk7CisgICAgaWYgKHNHcHNJbnRlcmZhY2UpCisgICAgICAgIHNHcHNJbnRlcmZhY2UtPmluamVjdF9sb2NhdGlvbihsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhY2N1cmFjeSk7CiB9CiAKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfc3VwcG9ydHNfeHRyYShKTklFbnYqIGVudiwgam9iamVjdCBvYmopCiB7Ci0gICAgaWYgKCFzR3BzWHRyYUludGVyZmFjZSkgewotICAgICAgICBjb25zdCBHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgICAgIGlmICghaW50ZXJmYWNlKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBzR3BzWHRyYUludGVyZmFjZSA9IChjb25zdCBHcHNYdHJhSW50ZXJmYWNlKilpbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX1hUUkFfSU5URVJGQUNFKTsKLSAgICAgICAgaWYgKHNHcHNYdHJhSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc0dwc1h0cmFJbnRlcmZhY2UtPmluaXQoJnNHcHNYdHJhQ2FsbGJhY2tzKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzR3BzWHRyYUludGVyZmFjZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICByZXR1cm4gKHNHcHNYdHJhSW50ZXJmYWNlICE9IE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfaW5qZWN0X3h0cmFfZGF0YShKTklFbnYqIGVudiwgam9iamVjdCBvYmosCiAgICAgICAgIGpieXRlQXJyYXkgZGF0YSwgamludCBsZW5ndGgpCiB7CisgICAgaWYgKCFzR3BzWHRyYUludGVyZmFjZSkgeworICAgICAgICBMT0dFKCJubyBYVFJBIGludGVyZmFjZSBpbiBpbmplY3RfeHRyYV9kYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBqYnl0ZSogYnl0ZXMgPSAoamJ5dGUgKillbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZGF0YSwgMCk7CiAgICAgc0dwc1h0cmFJbnRlcmZhY2UtPmluamVjdF94dHJhX2RhdGEoKGNoYXIgKilieXRlcywgbGVuZ3RoKTsKICAgICBlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGRhdGEsIGJ5dGVzLCBKTklfQUJPUlQpOwpAQCAtNTEwLDggKzQ1Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9hZ3BzX2RhdGFfY29ubl9vcGVuKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwganN0cmluZyBhcG4pCiB7Ci0gICAgY29uc3QgQUdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0QUdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNBR3BzSW50ZXJmYWNlKSB7CiAgICAgICAgIExPR0UoIm5vIEFHUFMgaW50ZXJmYWNlIGluIGFncHNfZGF0YV9jb25uX29wZW4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUyMCw1MyArNDY2LDQ5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29uc3QgY2hhciAqYXBuU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhhcG4sIE5VTEwpOwotICAgIGludGVyZmFjZS0+ZGF0YV9jb25uX29wZW4oYXBuU3RyKTsKKyAgICBzQUdwc0ludGVyZmFjZS0+ZGF0YV9jb25uX29wZW4oYXBuU3RyKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhcG4sIGFwblN0cik7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9hZ3BzX2RhdGFfY29ubl9jbG9zZWQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKQogewotICAgIGNvbnN0IEFHcHNJbnRlcmZhY2UqIGludGVyZmFjZSA9IEdldEFHcHNJbnRlcmZhY2UoZW52LCBvYmopOwotICAgIGlmICghaW50ZXJmYWNlKSB7CisgICAgaWYgKCFzQUdwc0ludGVyZmFjZSkgewogICAgICAgICBMT0dFKCJubyBBR1BTIGludGVyZmFjZSBpbiBhZ3BzX2RhdGFfY29ubl9vcGVuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaW50ZXJmYWNlLT5kYXRhX2Nvbm5fY2xvc2VkKCk7CisgICAgc0FHcHNJbnRlcmZhY2UtPmRhdGFfY29ubl9jbG9zZWQoKTsKIH0KIAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX2FncHNfZGF0YV9jb25uX2ZhaWxlZChKTklFbnYqIGVudiwgam9iamVjdCBvYmopCiB7Ci0gICAgY29uc3QgQUdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0QUdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNBR3BzSW50ZXJmYWNlKSB7CiAgICAgICAgIExPR0UoIm5vIEFHUFMgaW50ZXJmYWNlIGluIGFncHNfZGF0YV9jb25uX29wZW4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpbnRlcmZhY2UtPmRhdGFfY29ubl9mYWlsZWQoKTsKKyAgICBzQUdwc0ludGVyZmFjZS0+ZGF0YV9jb25uX2ZhaWxlZCgpOwogfQogCiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfc2V0X2FncHNfc2VydmVyKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwKICAgICAgICAgamludCB0eXBlLCBqc3RyaW5nIGhvc3RuYW1lLCBqaW50IHBvcnQpCiB7Ci0gICAgY29uc3QgQUdwc0ludGVyZmFjZSogaW50ZXJmYWNlID0gR2V0QUdwc0ludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNBR3BzSW50ZXJmYWNlKSB7CiAgICAgICAgIExPR0UoIm5vIEFHUFMgaW50ZXJmYWNlIGluIGFncHNfZGF0YV9jb25uX29wZW4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCBjaGFyICpjX2hvc3RuYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhob3N0bmFtZSwgTlVMTCk7Ci0gICAgaW50ZXJmYWNlLT5zZXRfc2VydmVyKHR5cGUsIGNfaG9zdG5hbWUsIHBvcnQpOworICAgIHNBR3BzSW50ZXJmYWNlLT5zZXRfc2VydmVyKHR5cGUsIGNfaG9zdG5hbWUsIHBvcnQpOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGhvc3RuYW1lLCBjX2hvc3RuYW1lKTsKIH0KIAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3NlbmRfbmlfcmVzcG9uc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgamludCBub3RpZklkLCBqaW50IHJlc3BvbnNlKQogewotICAgIGNvbnN0IEdwc05pSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBHZXROaUludGVyZmFjZShlbnYsIG9iaik7Ci0gICAgaWYgKCFpbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkgewogICAgICAgICBMT0dFKCJubyBOSSBpbnRlcmZhY2UgaW4gc2VuZF9uaV9yZXNwb25zZSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50ZXJmYWNlLT5yZXNwb25kKG5vdGlmSWQsIHJlc3BvbnNlKTsKKyAgICBzR3BzTmlJbnRlcmZhY2UtPnJlc3BvbmQobm90aWZJZCwgcmVzcG9uc2UpOwogfQogCiBzdGF0aWMganN0cmluZyBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfZ2V0X2ludGVybmFsX3N0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKQEAgLTU4NiwxNCArNTI4LDE0IEBACiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfdXBkYXRlX25ldHdvcmtfc3RhdGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgICBqYm9vbGVhbiBjb25uZWN0ZWQsIGludCB0eXBlLCBqYm9vbGVhbiByb2FtaW5nLCBqc3RyaW5nIGV4dHJhSW5mbykKIHsKLSAgICBjb25zdCBBR3BzUmlsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBHZXRBR3BzUmlsSW50ZXJmYWNlKGVudiwgb2JqKTsKLSAgICBpZiAoaW50ZXJmYWNlICYmIGludGVyZmFjZS0+dXBkYXRlX25ldHdvcmtfc3RhdGUpIHsKKworICAgIGlmIChzQUdwc1JpbEludGVyZmFjZSAmJiBzQUdwc1JpbEludGVyZmFjZS0+dXBkYXRlX25ldHdvcmtfc3RhdGUpIHsKICAgICAgICAgaWYgKGV4dHJhSW5mbykgewogICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0cmFJbmZvU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhleHRyYUluZm8sIE5VTEwpOwotICAgICAgICAgICAgaW50ZXJmYWNlLT51cGRhdGVfbmV0d29ya19zdGF0ZShjb25uZWN0ZWQsIHR5cGUsIHJvYW1pbmcsIGV4dHJhSW5mb1N0cik7CisgICAgICAgICAgICBzQUdwc1JpbEludGVyZmFjZS0+dXBkYXRlX25ldHdvcmtfc3RhdGUoY29ubmVjdGVkLCB0eXBlLCByb2FtaW5nLCBleHRyYUluZm9TdHIpOwogICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZXh0cmFJbmZvLCBleHRyYUluZm9TdHIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50ZXJmYWNlLT51cGRhdGVfbmV0d29ya19zdGF0ZShjb25uZWN0ZWQsIHR5cGUsIHJvYW1pbmcsIE5VTEwpOworICAgICAgICAgICAgc0FHcHNSaWxJbnRlcmZhY2UtPnVwZGF0ZV9uZXR3b3JrX3N0YXRlKGNvbm5lY3RlZCwgdHlwZSwgcm9hbWluZywgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAKaW5kZXggZWRjMDBmMS4uMjM1MDZjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCdWZmZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmNwcApAQCAtNTA5LDcgKzUwOSw3IEBACiAgICAgY29uc3QgSVN1cmZhY2U6OkJ1ZmZlckhlYXAmIGJ1ZmZlcnMobUJ1ZmZlckhlYXApOwogICAgIHVpbnQzMl90IHcgPSBtTGF5ZXIubVRyYW5zZm9ybWVkQm91bmRzLndpZHRoKCk7CiAgICAgdWludDMyX3QgaCA9IG1MYXllci5tVHJhbnNmb3JtZWRCb3VuZHMuaGVpZ2h0KCk7Ci0gICAgaWYgKGJ1ZmZlcnMudyAqIGggIT0gYnVmZmVycy5oICogdykgeworICAgIGlmIChtTGF5ZXIuZ2V0T3JpZW50YXRpb24oKSAmIChUcmFuc2Zvcm06OlJPVF85MCB8IFRyYW5zZm9ybTo6Uk9UXzI3MCkpIHsKICAgICAgICAgaW50IHQgPSB3OyB3ID0gaDsgaCA9IHQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKaW5kZXggNTU0MmM0Mi4uOGU0ZjZmYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQpAQCAtNTUsNiArNTUsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgV0lMRCA9ICdOJzsKIAogICAgIC8qCisgICAgICogQ2FsbGluZyBMaW5lIElkZW50aWZpY2F0aW9uIFJlc3RyaWN0aW9uIChDTElSKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElSX09OID0gIiozMSMrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJUl9PRkYgPSAiIzMxIysiOworCisgICAgLyoKICAgICAgKiBUT0EgPSBUT04gKyBOUEkKICAgICAgKiBTZWUgVFMgMjQuMDA4IHNlY3Rpb24gMTAuNS40LjcgZm9yIGRldGFpbHMuCiAgICAgICogVGhlc2UgYXJlIHRoZSBvbmx5IHJlYWxseSB1c2VmdWwgVE9BIHZhbHVlcwpAQCAtMTc5LDggKzE4NSw2IEBACiAgICAgICogIFBsZWFzZSBub3RlIHRoYXQgdGhlIEdTTSB3aWxkIGNoYXJhY3RlciBpcyBhbGxvd2VkIGluIHRoZSByZXN1bHQuCiAgICAgICogIFRoaXMgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgZGlhbGluZy4KICAgICAgKgotICAgICAqICBBbGxvd3MgKyBvbmx5IGluIHRoZSBmaXJzdCAgcG9zaXRpb24gaW4gdGhlIHJlc3VsdCBzdHJpbmcuCi0gICAgICoKICAgICAgKiAgUmV0dXJucyBudWxsIGlmIHBob25lTnVtYmVyID09IG51bGwKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwpAQCAtMjAzLDYgKzIwNywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaW50IHBvcyA9IGFkZFBsdXNDaGFyKHBob25lTnVtYmVyKTsKKyAgICAgICAgaWYgKHBvcyA+PSAwICYmIHJldC5sZW5ndGgoKSA+IHBvcykgeworICAgICAgICAgICAgcmV0Lmluc2VydChwb3MsICcrJyk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CiAgICAgfQogCkBAIC0zMDQsNiArMzEzLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogR1NNIGNvZGVzCisgICAgICogIEZpbmRzIGlmIGEgR1NNIGNvZGUgaW5jbHVkZXMgdGhlIGludGVybmF0aW9uYWwgcHJlZml4ICgrKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1iZXIgdGhlIG51bWJlciB0byBkaWFsLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gd2hlcmUgdGhlICsgY2hhciB3aWxsIGJlIGluc2VydGVkLCAtMSBpZiB0aGUgR1NNIGNvZGUgd2FzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQKKyAgICBhZGRQbHVzQ2hhcihTdHJpbmcgbnVtYmVyKSB7CisgICAgICAgIGludCBwb3MgPSAtMTsKKworICAgICAgICBpZiAobnVtYmVyLnN0YXJ0c1dpdGgoQ0xJUl9PRkYpKSB7CisgICAgICAgICAgICBwb3MgPSBDTElSX09GRi5sZW5ndGgoKSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtYmVyLnN0YXJ0c1dpdGgoQ0xJUl9PTikpIHsKKyAgICAgICAgICAgIHBvcyA9IENMSVJfT04ubGVuZ3RoKCkgLSAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBFeHRyYWN0cyB0aGUgcG9zdC1kaWFsIHNlcXVlbmNlIG9mIERUTUYgY29udHJvbCBkaWdpdHMsIHBhdXNlcywgYW5kCiAgICAgICogd2FpdHMuIFN0cmlwcyBzZXBhcmF0b3JzLiBUaGlzIHN0cmluZyBtYXkgYmUgZW1wdHksIGJ1dCB3aWxsIG5vdCBiZSBudWxsCkBAIC0xMTE5LDcgKzExNTAsNyBAQAogICAgICAgICAgICAgICAgICYmIHRleHQuY2hhckF0KDIpID09ICcxJykgewogICAgICAgICAgICAgICAgIGZvcm1hdFR5cGUgPSBGT1JNQVRfSkFQQU47CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBmb3JtYXRUeXBlID0gRk9STUFUX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTEzMCw2ICsxMTYxLDkgQEAKICAgICAgICAgICAgIGNhc2UgRk9STUFUX0pBUEFOOgogICAgICAgICAgICAgICAgIGZvcm1hdEphcGFuZXNlTnVtYmVyKHRleHQpOwogICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX1VOS05PV046CisgICAgICAgICAgICAgICAgcmVtb3ZlRGFzaGVzKHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE2NSwxNCArMTE5OSw3IEBACiAgICAgICAgIENoYXJTZXF1ZW5jZSBzYXZlZCA9IHRleHQuc3ViU2VxdWVuY2UoMCwgbGVuZ3RoKTsKIAogICAgICAgICAvLyBTdHJpcCB0aGUgZGFzaGVzIGZpcnN0LCBhcyB3ZSdyZSBnb2luZyB0byBhZGQgdGhlbSBiYWNrCi0gICAgICAgIGludCBwID0gMDsKLSAgICAgICAgd2hpbGUgKHAgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQocCkgPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgdGV4dC5kZWxldGUocCwgcCArIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmVtb3ZlRGFzaGVzKHRleHQpOwogICAgICAgICBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwogCiAgICAgICAgIC8vIFdoZW4gc2Nhbm5pbmcgdGhlIG51bWJlciB3ZSByZWNvcmQgd2hlcmUgZGFzaGVzIG5lZWQgdG8gYmUgYWRkZWQsCkBAIC0xMjc2LDYgKzEzMDMsMjIgQEAKICAgICAgICAgSmFwYW5lc2VQaG9uZU51bWJlckZvcm1hdHRlci5mb3JtYXQodGV4dCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgZGFzaGVzIGZyb20gdGhlIG51bWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBudW1iZXIgdG8gY2xlYXIgZnJvbSBkYXNoZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZURhc2hlcyhFZGl0YWJsZSB0ZXh0KSB7CisgICAgICAgIGludCBwID0gMDsKKyAgICAgICAgd2hpbGUgKHAgPCB0ZXh0Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQocCkgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUocCwgcCArIDEpOworICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVGhyZWUgYW5kIGZvdXIgZGlnaXQgcGhvbmUgbnVtYmVycyBmb3IgZWl0aGVyIHNwZWNpYWwgc2VydmljZXMsCiAgICAgLy8gb3IgMy02IGRpZ2l0IGFkZHJlc3NlcyBmcm9tIHRoZSBuZXR3b3JrIChlZyBjYXJyaWVyLW9yaWdpbmF0ZWQgU01TIG1lc3NhZ2VzKSBzaG91bGQKICAgICAvLyBub3QgbWF0Y2guCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYk1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDMyNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYk1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNDYkhlYWRlcjsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBEZXNjcmliZXMgYW4gU01TLUNCIG1lc3NhZ2UuCisgKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgU21zQ2JNZXNzYWdlIHsKKworICAgIC8qKgorICAgICAqIENlbGwgd2lkZSBpbW1lZGlhdGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERV9JTU1FRElBVEUgPSAwOworCisgICAgLyoqCisgICAgICogUExNTiB3aWRlIGdlb2dyYXBoaWNhbCBzY29wZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFT0dSQVBISUNBTF9TQ09QRV9QTE1OX1dJREUgPSAxOworCisgICAgLyoqCisgICAgICogTG9jYXRpb24gLyBzZXJ2aWNlIGFyZWEgd2lkZSBnZW9ncmFwaGljYWwgc2NvcGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU9HUkFQSElDQUxfU0NPUEVfTEFfV0lERSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBDZWxsIHdpZGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIGEgcmVjZWl2ZWQgUERVCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGR1IFBEVSBieXRlcworICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgb3IgbnVsbCBpZiBpbnZhbGlkIHBkdQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU21zQ2JNZXNzYWdlIGNyZWF0ZUZyb21QZHUoYnl0ZVtdIHBkdSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYk1lc3NhZ2UocGR1KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGFuZ3VhZ2VzIGluIHRoZSAwMDAweHh4eCBEQ1MgZ3JvdXAgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzOCwgc2VjdGlvbiA1LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdVQUdFX0NPREVTX0dST1VQXzAgPSB7CisgICAgICAgICAgICAiZGUiLCAiZW4iLCAiaXQiLCAiZnIiLCAiZXMiLCAibmwiLCAic3YiLCAiZGEiLCAicHQiLCAiZmkiLCAibm8iLCAiZWwiLCAidHIiLCAiaHUiLAorICAgICAgICAgICAgInBsIiwgbnVsbAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBMYW5ndWFnZXMgaW4gdGhlIDAwMTB4eHh4IERDUyBncm91cCBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDM4LCBzZWN0aW9uIDUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFOR1VBR0VfQ09ERVNfR1JPVVBfMiA9IHsKKyAgICAgICAgICAgICJjcyIsICJoZSIsICJhciIsICJydSIsICJpcyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICBudWxsLCBudWxsCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0FSUklBR0VfUkVUVVJOID0gMHgwZDsKKworICAgIHByaXZhdGUgU21zQ2JIZWFkZXIgbUhlYWRlcjsKKworICAgIHByaXZhdGUgU3RyaW5nIG1MYW5ndWFnZTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Cb2R5OworCisgICAgcHJpdmF0ZSBTbXNDYk1lc3NhZ2UoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIG1IZWFkZXIgPSBuZXcgU21zQ2JIZWFkZXIocGR1KTsKKyAgICAgICAgcGFyc2VCb2R5KHBkdSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnZW9ncmFwaGljYWwgc2NvcGUgb2YgdGhpcyBtZXNzYWdlLCBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI0dFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREVfSU1NRURJQVRFfSwKKyAgICAgKiB7QGxpbmsgI0dFT0dSQVBISUNBTF9TQ09QRV9QTE1OX1dJREV9LAorICAgICAqIHtAbGluayAjR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREV9LAorICAgICAqIHtAbGluayAjR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERX0KKyAgICAgKgorICAgICAqIEByZXR1cm4gR2VvZ3JhcGhpY2FsIHNjb3BlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHZW9ncmFwaGljYWxTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXIuZ2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBJU08tNjM5LTEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtZXNzYWdlLCBvciBudWxsIGlmIHVuc3BlY2lmaWVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExhbmd1YWdlIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1MYW5ndWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJvZHkgb2YgdGhpcyBtZXNzYWdlLCBvciBudWxsIGlmIG5vIGJvZHkgYXZhaWxhYmxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEJvZHksIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VCb2R5KCkgeworICAgICAgICByZXR1cm4gbUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXNzYWdlIGlkZW50aWZpZXIgb2YgdGhpcyBtZXNzYWdlICgwLTY1NTM1KQorICAgICAqCisgICAgICogQHJldHVybiBNZXNzYWdlIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VJZGVudGlmaWVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci5tZXNzYWdlSWRlbnRpZmllcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgY29kZSBvZiB0aGlzIG1lc3NhZ2UgKDAtMTAyMykKKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVzc2FnZSBjb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNZXNzYWdlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXIubWVzc2FnZUNvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1cGRhdGUgbnVtYmVyIG9mIHRoaXMgbWVzc2FnZSAoMC0xNSkKKyAgICAgKgorICAgICAqIEByZXR1cm4gVXBkYXRlIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci51cGRhdGVOdW1iZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQm9keShieXRlW10gcGR1KSB7CisgICAgICAgIGludCBlbmNvZGluZzsKKyAgICAgICAgYm9vbGVhbiBoYXNMYW5ndWFnZUluZGljYXRvciA9IGZhbHNlOworCisgICAgICAgIC8vIEV4dHJhY3QgZW5jb2RpbmcgYW5kIGxhbmd1YWdlIGZyb20gRENTLCBhcyBkZWZpbmVkIGluIDNncHAgVFMgMjMuMDM4LAorICAgICAgICAvLyBzZWN0aW9uIDUuCisgICAgICAgIHN3aXRjaCAoKG1IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZjApID4+IDQpIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKKyAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBMQU5HVUFHRV9DT0RFU19HUk9VUF8wW21IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZSAmIDB4MGZdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICgobUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lICYgMHgwZikgPT0gMHgwMSkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CisgICAgICAgICAgICAgICAgbUxhbmd1YWdlID0gTEFOR1VBR0VfQ09ERVNfR1JPVVBfMlttSGVhZGVyLmRhdGFDb2RpbmdTY2hlbWUgJiAweDBmXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR183QklUOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICAgICAgc3dpdGNoICgobUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lICYgMHgwYykgPj4gMikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfOEJJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR18xNkJJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR183QklUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICBjYXNlIDB4MDc6CisgICAgICAgICAgICAgICAgLy8gQ29tcHJlc3Npb24gbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgICAgIC8vIFVESCBzdHJ1Y3R1cmUgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2FzZSAweDBlOgorICAgICAgICAgICAgICAgIC8vIERlZmluZWQgYnkgdGhlIFdBUCBmb3J1bSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HX1VOS05PV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHgwZjoKKyAgICAgICAgICAgICAgICBpZiAoKChtSGVhZGVyLmRhdGFDb2RpbmdTY2hlbWUgJiAweDA0KSA+PiAyKSA9PSAweDAxKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR184QklUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR183QklUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZCB2YWx1ZXMgYXJlIHRvIGJlIHRyZWF0ZWQgYXMgNy1iaXQKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGNhc2UgU21zTWVzc2FnZS5FTkNPRElOR183QklUOgorICAgICAgICAgICAgICAgIG1Cb2R5ID0gR3NtQWxwaGFiZXQuZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKHBkdSwgU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAocGR1Lmxlbmd0aCAtIFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIKSAqIDggLyA3KTsKKworICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBtQm9keSAhPSBudWxsICYmIG1Cb2R5Lmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBtQm9keS5zdWJzdHJpbmcoMCwgMik7CisgICAgICAgICAgICAgICAgICAgIG1Cb2R5ID0gbUJvZHkuc3Vic3RyaW5nKDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTbXNNZXNzYWdlLkVOQ09ESU5HXzE2QklUOgorICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSDsKKworICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBwZHUubGVuZ3RoID49IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIICsgMikgeworICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RILCAyKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUJvZHkgPSBuZXcgU3RyaW5nKHBkdSwgb2Zmc2V0LCAocGR1Lmxlbmd0aCAmIDB4ZmZmZSkgLSBvZmZzZXQsICJ1dGYtMTYiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRWVlZWsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Cb2R5Lmxlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAobUJvZHkuY2hhckF0KGkpICE9IENBUlJJQUdFX1JFVFVSTikgeworICAgICAgICAgICAgICAgICAgICBtQm9keSA9IG1Cb2R5LnN1YnN0cmluZygwLCBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Cb2R5ID0gIiI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKaW5kZXggZjVlOTc1MS4uMGVjZDg1NCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQpAQCAtMzQxLDcgKzM0MSw2NyBAQAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VMaXN0RnJvbVJhd1JlY29yZHMocmVjb3Jkcyk7Ci0gICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllci4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAorICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4gQWxsIHJlY2VpdmVkIG1lc3NhZ2VzIHdpbGwgYmUgYnJvYWRjYXN0IGluIGFuCisgICAgICogaW50ZW50IHdpdGggdGhlIGFjdGlvbiAiYW5kcm9pZC5wcm92aWRlci50ZWxlcGhvbnkuU01TX0NCX1JFQ0VJVkVEIi4KKyAgICAgKiBOb3RlOiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcsIGNhbGxlcnMgbWF5IHdhbnQgdG8gYXZvaWQgY2FsbGluZyBpdCBmcm9tCisgICAgICogdGhlIG1haW4gdGhyZWFkIG9mIGFuIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VJZGVudGlmaWVyIE1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBzZWUgI2Rpc2FibGVDZWxsQnJvYWRjYXN0KGludCkKKyAgICAgKgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVNtcyBpY2NJU21zID0gSVNtcy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImlzbXMiKSk7CisgICAgICAgICAgICBpZiAoaWNjSVNtcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGljY0lTbXMuZW5hYmxlQ2VsbEJyb2FkY2FzdChtZXNzYWdlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gaWdub3JlIGl0CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllci4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAorICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4KKyAgICAgKiBOb3RlOiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcsIGNhbGxlcnMgbWF5IHdhbnQgdG8gYXZvaWQgY2FsbGluZyBpdCBmcm9tCisgICAgICogdGhlIG1haW4gdGhyZWFkIG9mIGFuIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VJZGVudGlmaWVyIE1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSAjZW5hYmxlQ2VsbEJyb2FkY2FzdChpbnQpCisgICAgICoKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJU21zIGljY0lTbXMgPSBJU21zLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiaXNtcyIpKTsKKyAgICAgICAgICAgIGlmIChpY2NJU21zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gaWNjSVNtcy5kaXNhYmxlQ2VsbEJyb2FkY2FzdChtZXNzYWdlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gaWdub3JlIGl0CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIDxjb2RlPlNtc01lc3NhZ2U8L2NvZGU+cyBmcm9tIGEgbGlzdCBvZiBSYXdTbXNEYXRhCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkLmphdmEKaW5kZXggMWJmMmQzYy4uYTAxYjAwZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9BZG5SZWNvcmQuamF2YQpAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgcHJpdmF0ZSB2b2lkCiAgICAgcGFyc2VSZWNvcmQoYnl0ZVtdIHJlY29yZCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgYWxwaGFUYWcgPSBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nKAorICAgICAgICAgICAgYWxwaGFUYWcgPSBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLCAwLCByZWNvcmQubGVuZ3RoIC0gRk9PVEVSX1NJWkVfQllURVMpOwogCiAgICAgICAgICAgICBpbnQgZm9vdGVyT2Zmc2V0ID0gcmVjb3JkLmxlbmd0aCAtIEZPT1RFUl9TSVpFX0JZVEVTOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZENhY2hlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQppbmRleCBjOGMwNjU4Li5hMTc1ZDQ5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQpAQCAtMTg2LDcgKzE4NiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQXJyYXlMaXN0PEFkblJlY29yZD4gIG9sZEFkbkxpc3Q7Ci0gICAgICAgIG9sZEFkbkxpc3QgPSBnZXRSZWNvcmRzSWZMb2FkZWQoZWZpZCk7CisKKyAgICAgICAgaWYgKGVmaWQgPT0gRUZfUEJSKSB7CisgICAgICAgICAgICBvbGRBZG5MaXN0ID0gbVVzaW1QaG9uZUJvb2tNYW5hZ2VyLmxvYWRFZkZpbGVzRnJvbVVzaW0oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZEFkbkxpc3QgPSBnZXRSZWNvcmRzSWZMb2FkZWQoZWZpZCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAob2xkQWRuTGlzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShyZXNwb25zZSwgIkFkbiBsaXN0IG5vdCBleGlzdCBmb3IgRUY6IiArIGVmaWQpOwpAQCAtMjA4LDYgKzIxMywxNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGVmaWQgPT0gRUZfUEJSKSB7CisgICAgICAgICAgICBBZG5SZWNvcmQgZm91bmRBZG4gPSBvbGRBZG5MaXN0LmdldChpbmRleC0xKTsKKyAgICAgICAgICAgIGVmaWQgPSBmb3VuZEFkbi5lZmlkOworICAgICAgICAgICAgZXh0ZW5zaW9uRUYgPSBmb3VuZEFkbi5leHRSZWNvcmQ7CisgICAgICAgICAgICBpbmRleCA9IGZvdW5kQWRuLnJlY29yZE51bWJlcjsKKworICAgICAgICAgICAgbmV3QWRuLmVmaWQgPSBlZmlkOworICAgICAgICAgICAgbmV3QWRuLmV4dFJlY29yZCA9IGV4dGVuc2lvbkVGOworICAgICAgICAgICAgbmV3QWRuLnJlY29yZE51bWJlciA9IGluZGV4OworICAgICAgICB9CisKICAgICAgICAgTWVzc2FnZSBwZW5kaW5nUmVzcG9uc2UgPSB1c2VyV3JpdGVSZXNwb25zZS5nZXQoZWZpZCk7CiAKICAgICAgICAgaWYgKHBlbmRpbmdSZXNwb25zZSAhPSBudWxsKSB7CkBAIC0zMzEsNiArMzQ3LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhZG5MaWtlRmlsZXMuZ2V0KGVmaWQpLnNldChpbmRleCAtIDEsIGFkbik7CisgICAgICAgICAgICAgICAgICAgIG1Vc2ltUGhvbmVCb29rTWFuYWdlci5pbnZhbGlkYXRlQ2FjaGUoKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gdXNlcldyaXRlUmVzcG9uc2UuZ2V0KGVmaWQpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhCmluZGV4IGI5NjIzNzUuLjgxNWZiZmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9CYXNlQ29tbWFuZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQmFzZUNvbW1hbmRzLmphdmEKQEAgLTczLDEwICs3MywxMCBAQAogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TbXNPblNpbVJlZ2lzdHJhbnQ7CiAgICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbVNtc1N0YXR1c1JlZ2lzdHJhbnQ7CiAgICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbVNzblJlZ2lzdHJhbnQ7Ci0gICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbVN0a1Nlc3Npb25FbmRSZWdpc3RyYW50OwotICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TdGtQcm9DbWRSZWdpc3RyYW50OwotICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TdGtFdmVudFJlZ2lzdHJhbnQ7Ci0gICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbVN0a0NhbGxTZXRVcFJlZ2lzdHJhbnQ7CisgICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbUNhdFNlc3Npb25FbmRSZWdpc3RyYW50OworICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1DYXRQcm9DbWRSZWdpc3RyYW50OworICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1DYXRFdmVudFJlZ2lzdHJhbnQ7CisgICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbUNhdENhbGxTZXRVcFJlZ2lzdHJhbnQ7CiAgICAgcHJvdGVjdGVkIFJlZ2lzdHJhbnQgbUljY1Ntc0Z1bGxSZWdpc3RyYW50OwogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1FbWVyZ2VuY3lDYWxsYmFja01vZGVSZWdpc3RyYW50OwogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1JY2NSZWZyZXNoUmVnaXN0cmFudDsKQEAgLTM5NSwzNiArMzk1LDM2IEBACiAgICAgICAgIG1Tc25SZWdpc3RyYW50LmNsZWFyKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0T25TdGtTZXNzaW9uRW5kKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgbVN0a1Nlc3Npb25FbmRSZWdpc3RyYW50ID0gbmV3IFJlZ2lzdHJhbnQgKGgsIHdoYXQsIG9iaik7CisgICAgcHVibGljIHZvaWQgc2V0T25DYXRTZXNzaW9uRW5kKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUNhdFNlc3Npb25FbmRSZWdpc3RyYW50ID0gbmV3IFJlZ2lzdHJhbnQgKGgsIHdoYXQsIG9iaik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdW5TZXRPblN0a1Nlc3Npb25FbmQoSGFuZGxlciBoKSB7Ci0gICAgICAgIG1TdGtTZXNzaW9uRW5kUmVnaXN0cmFudC5jbGVhcigpOworICAgIHB1YmxpYyB2b2lkIHVuU2V0T25DYXRTZXNzaW9uRW5kKEhhbmRsZXIgaCkgeworICAgICAgICBtQ2F0U2Vzc2lvbkVuZFJlZ2lzdHJhbnQuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRPblN0a1Byb2FjdGl2ZUNtZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIG1TdGtQcm9DbWRSZWdpc3RyYW50ID0gbmV3IFJlZ2lzdHJhbnQgKGgsIHdoYXQsIG9iaik7CisgICAgcHVibGljIHZvaWQgc2V0T25DYXRQcm9hY3RpdmVDbWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQ2F0UHJvQ21kUmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHVuU2V0T25TdGtQcm9hY3RpdmVDbWQoSGFuZGxlciBoKSB7Ci0gICAgICAgIG1TdGtQcm9DbWRSZWdpc3RyYW50LmNsZWFyKCk7CisgICAgcHVibGljIHZvaWQgdW5TZXRPbkNhdFByb2FjdGl2ZUNtZChIYW5kbGVyIGgpIHsKKyAgICAgICAgbUNhdFByb0NtZFJlZ2lzdHJhbnQuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRPblN0a0V2ZW50KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgbVN0a0V2ZW50UmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2F0RXZlbnQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQ2F0RXZlbnRSZWdpc3RyYW50ID0gbmV3IFJlZ2lzdHJhbnQgKGgsIHdoYXQsIG9iaik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdW5TZXRPblN0a0V2ZW50KEhhbmRsZXIgaCkgewotICAgICAgICBtU3RrRXZlbnRSZWdpc3RyYW50LmNsZWFyKCk7CisgICAgcHVibGljIHZvaWQgdW5TZXRPbkNhdEV2ZW50KEhhbmRsZXIgaCkgeworICAgICAgICBtQ2F0RXZlbnRSZWdpc3RyYW50LmNsZWFyKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0T25TdGtDYWxsU2V0VXAoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICBtU3RrQ2FsbFNldFVwUmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2F0Q2FsbFNldFVwKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUNhdENhbGxTZXRVcFJlZ2lzdHJhbnQgPSBuZXcgUmVnaXN0cmFudCAoaCwgd2hhdCwgb2JqKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB1blNldE9uU3RrQ2FsbFNldFVwKEhhbmRsZXIgaCkgewotICAgICAgICBtU3RrQ2FsbFNldFVwUmVnaXN0cmFudC5jbGVhcigpOworICAgIHB1YmxpYyB2b2lkIHVuU2V0T25DYXRDYWxsU2V0VXAoSGFuZGxlciBoKSB7CisgICAgICAgIG1DYXRDYWxsU2V0VXBSZWdpc3RyYW50LmNsZWFyKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0T25JY2NTbXNGdWxsKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKaW5kZXggNWRlOWFhOS4uYjhiZjhhZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKQEAgLTM3NCw0OCArMzc0LDQ4IEBACiAgICAgdm9pZCB1blNldE9uU3VwcFNlcnZpY2VOb3RpZmljYXRpb24oSGFuZGxlciBoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIFNlc3Npb24gRW5kIE5vdGlmaWNhdGlvbnMgZm9yIFNUSy4KKyAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBTZXNzaW9uIEVuZCBOb3RpZmljYXRpb25zIGZvciBDQVQuCiAgICAgICogVW5saWtlIHRoZSByZWdpc3RlciogbWV0aG9kcywgdGhlcmUncyBvbmx5IG9uZSBub3RpZmljYXRpb24gaGFuZGxlcgogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciBmb3Igbm90aWZpY2F0aW9uIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIHdoYXQgVXNlci1kZWZpbmVkIG1lc3NhZ2UgY29kZS4KICAgICAgKiBAcGFyYW0gb2JqIFVzZXIgb2JqZWN0LgogICAgICAqLwotICAgIHZvaWQgc2V0T25TdGtTZXNzaW9uRW5kKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOwotICAgIHZvaWQgdW5TZXRPblN0a1Nlc3Npb25FbmQoSGFuZGxlciBoKTsKKyAgICB2b2lkIHNldE9uQ2F0U2Vzc2lvbkVuZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKKyAgICB2b2lkIHVuU2V0T25DYXRTZXNzaW9uRW5kKEhhbmRsZXIgaCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBQcm9hY3RpdmUgQ29tbWFuZHMgZm9yIFNUSy4KKyAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBQcm9hY3RpdmUgQ29tbWFuZHMgZm9yIENBVC4KICAgICAgKiBVbmxpa2UgdGhlIHJlZ2lzdGVyKiBtZXRob2RzLCB0aGVyZSdzIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBoYW5kbGVyCiAgICAgICoKICAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIGZvciBub3RpZmljYXRpb24gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgogICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCiAgICAgICovCi0gICAgdm9pZCBzZXRPblN0a1Byb2FjdGl2ZUNtZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKLSAgICB2b2lkIHVuU2V0T25TdGtQcm9hY3RpdmVDbWQoSGFuZGxlciBoKTsKKyAgICB2b2lkIHNldE9uQ2F0UHJvYWN0aXZlQ21kKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOworICAgIHZvaWQgdW5TZXRPbkNhdFByb2FjdGl2ZUNtZChIYW5kbGVyIGgpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgRXZlbnQgTm90aWZpY2F0aW9ucyBmb3IgU1RLLgorICAgICAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIEV2ZW50IE5vdGlmaWNhdGlvbnMgZm9yIENBVC4KICAgICAgKiBVbmxpa2UgdGhlIHJlZ2lzdGVyKiBtZXRob2RzLCB0aGVyZSdzIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBoYW5kbGVyCiAgICAgICoKICAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIGZvciBub3RpZmljYXRpb24gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgogICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCiAgICAgICovCi0gICAgdm9pZCBzZXRPblN0a0V2ZW50KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOwotICAgIHZvaWQgdW5TZXRPblN0a0V2ZW50KEhhbmRsZXIgaCk7CisgICAgdm9pZCBzZXRPbkNhdEV2ZW50KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOworICAgIHZvaWQgdW5TZXRPbkNhdEV2ZW50KEhhbmRsZXIgaCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBDYWxsIFNldCBVcCBOb3RpZmljYXRpb25zIGZvciBTVEsuCisgICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgQ2FsbCBTZXQgVXAgTm90aWZpY2F0aW9ucyBmb3IgQ0FULgogICAgICAqIFVubGlrZSB0aGUgcmVnaXN0ZXIqIG1ldGhvZHMsIHRoZXJlJ3Mgb25seSBvbmUgbm90aWZpY2F0aW9uIGhhbmRsZXIKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgZm9yIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSB3aGF0IFVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUuCiAgICAgICogQHBhcmFtIG9iaiBVc2VyIG9iamVjdC4KICAgICAgKi8KLSAgICB2b2lkIHNldE9uU3RrQ2FsbFNldFVwKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOwotICAgIHZvaWQgdW5TZXRPblN0a0NhbGxTZXRVcChIYW5kbGVyIGgpOworICAgIHZvaWQgc2V0T25DYXRDYWxsU2V0VXAoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaik7CisgICAgdm9pZCB1blNldE9uQ2F0Q2FsbFNldFVwKEhhbmRsZXIgaCk7CiAKICAgICAvKioKICAgICAgKiBFbmFibGVzL2Rpc2JhYmxlcyBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgcmVsYXRlZCBub3RpZmljYXRpb25zIGZyb20KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JU21zLmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVNtcy5haWRsCmluZGV4IDY1YmFkOTYuLjkwZGU1ZTEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JU21zLmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lTbXMuYWlkbApAQCAtMTQ0LDQgKzE0NCwzMCBAQAogICAgICAgICAgICAgaW4gTGlzdDxTdHJpbmc+IHBhcnRzLCBpbiBMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgaW4gTGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHMpOwogCisgICAgLyoqCisgICAgICogRW5hYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllci4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAorICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlSWRlbnRpZmllciBNZXNzYWdlIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIFRTIDIzLjA0MQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIEBzZWUgI2Rpc2FibGVDZWxsQnJvYWRjYXN0KGludCkKKyAgICAgKi8KKyAgICBib29sZWFuIGVuYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKTsKKworICAgIC8qKgorICAgICAqIERpc2FibGUgcmVjZXB0aW9uIG9mIGNlbGwgYnJvYWRjYXN0IChTTVMtQ0IpIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuCisgICAgICogbWVzc2FnZSBpZGVudGlmaWVyLiBOb3RlIHRoYXQgaWYgdHdvIGRpZmZlcmVudCBjbGllbnRzIGVuYWJsZSB0aGUgc2FtZQorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllciwgdGhleSBtdXN0IGJvdGggZGlzYWJsZSBpdCBmb3IgdGhlIGRldmljZSB0byBzdG9wCisgICAgICogcmVjZWl2aW5nIHRob3NlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VJZGVudGlmaWVyIE1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSAjZW5hYmxlQ2VsbEJyb2FkY2FzdChpbnQpCisgICAgICovCisgICAgYm9vbGVhbiBkaXNhYmxlQ2VsbEJyb2FkY2FzdChpbnQgbWVzc2FnZUlkZW50aWZpZXIpOworCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVdhcFB1c2hNYW5hZ2VyLmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVdhcFB1c2hNYW5hZ2VyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlY2I5NAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JV2FwUHVzaE1hbmFnZXIuYWlkbApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbnRlcmZhY2UgSVdhcFB1c2hNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgV0FQIHB1c2ggbWVzc2FnZSBhbmQgdHJpZ2dlcnMgdGhlIHJlY2VpdmVyIGFwcGxpY2F0aW9uIHJlZ2lzdGVyZWQKKyAgICAgKiBpbiB0aGUgYXBwbGljYXRpb24gSUQgdGFibGUuCisgICAgICovCisgICAgaW50IHByb2Nlc3NNZXNzYWdlKFN0cmluZyBhcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsIGluIEludGVudCBpbnRlbnQpOworCisgICAgLyoqCisgICAgICogQWRkIHJlY2VpdmVyIGFwcGxpY2F0aW9uIGludG8gdGhlIGFwcGxpY2F0aW9uIElEIHRhYmxlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpbnNlcnRpbmcgdGhlIGluZm9ybWF0aW9uIGlzIHN1Y2Nlc3NmdWxsLiBJbnNlcnRpbmcgdGhlIGR1cGxpY2F0ZWQKKyAgICAgKiByZWNvcmQgaW4gdGhlIGFwcGxpY2F0aW9uIElEIHRhYmxlIGlzIG5vdCBhbGxvd2VkLiBVc2UgdXBkYXRlL2RlbGV0ZSBtZXRob2QuCisgICAgICovCisgICAgYm9vbGVhbiBhZGRQYWNrYWdlKFN0cmluZyB4X2FwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlX25hbWUsIFN0cmluZyBjbGFzc19uYW1lLAorICAgICAgICAgICAgaW50IGFwcF90eXBlLCBib29sZWFuIG5lZWRfc2lnbmF0dXJlLCBib29sZWFuIGZ1cnRoZXJfcHJvY2Vzc2luZyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHJlY2VpdmVyIGFwcGxpY2F0aW9uIHRoYXQgaXMgbGFzdCBhZGRlZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdXBkYXRpbmcgdGhlIGluZm9ybWF0aW9uIGlzIHN1Y2Nlc3NmdWxsLgorICAgICAqLworICAgIGJvb2xlYW4gdXBkYXRlUGFja2FnZShTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgIGludCBhcHBfdHlwZSwgYm9vbGVhbiBuZWVkX3NpZ25hdHVyZSwgYm9vbGVhbiBmdXJ0aGVyX3Byb2Nlc3NpbmcpOworCisgICAgLyoqCisgICAgICogRGVsaXRlcyByZWNlaXZlciBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgZGVsZXRpbmcgaXMgc3VjY2Vzc2Z1bGwuCisgICAgICovCisgICAgYm9vbGVhbiBkZWxldGVQYWNrYWdlKFN0cmluZyB4X2FwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSk7Cit9CisKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCmluZGV4IGQzYTM0ZWMuLmUyNzBjZTkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQpAQCAtNDg3LDYgKzQ4NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRzSW50ZXJmYWNlLlNFUlZJQ0VfQ0xBU1NfREFUQSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZHNJbnRlcmZhY2UuU0VSVklDRV9DTEFTU19GQVg7CiAKKyAgICAgICAgICAgIGlmICghbVBob25lLm1Jc1RoZUN1cnJlbnRBY3RpdmVQaG9uZSkgeworICAgICAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJSZWNlaXZlZCBtZXNzYWdlICIgKyBtc2cgKyAiWyIgKyBtc2cud2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGlsZSBiZWluZyBkZXN0cm95ZWQuIElnbm9yaW5nLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewogICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfUkFESU9fT0ZGX09SX05PVF9BVkFJTEFCTEU6CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IG51bGw7CkBAIC02MjYsNyArNjMyLDEzIEBACiAgICAgICAgICAgICAgICAgaW5kZXggPSBtSWNjQ2FyZFN0YXR1cy5nZXRHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgSWNjQ2FyZEFwcGxpY2F0aW9uIGFwcCA9IG1JY2NDYXJkU3RhdHVzLmdldEFwcGxpY2F0aW9uKGluZGV4KTsKKyAgICAgICAgICAgIEljY0NhcmRBcHBsaWNhdGlvbiBhcHA7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IEljY0NhcmRTdGF0dXMuQ0FSRF9NQVhfQVBQUykgeworICAgICAgICAgICAgICAgIGFwcCA9IG1JY2NDYXJkU3RhdHVzLmdldEFwcGxpY2F0aW9uKGluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIltJY2NDYXJkXSBJbnZhbGlkIFN1YnNjcmlwdGlvbiBBcHBsaWNhdGlvbiBpbmRleDoiICsgaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLkFCU0VOVDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGFwcCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIltJY2NDYXJkXSBTdWJzY3JpcHRpb24gQXBwbGljYXRpb24gaW4gbm90IHByZXNlbnQiKTsKQEAgLTY3MiwxMiArNjg0LDExIEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGEgSUNDIGNhcmQgaXMgcHJlc2VudAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc0ljY0NhcmQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNJY2NQcmVzZW50OwotICAgICAgICBpZiAobVBob25lLmdldFBob25lTmFtZSgpLmVxdWFscygiR1NNIikpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNjQ2FyZFN0YXR1cy5nZXRDYXJkU3RhdGUoKS5pc0NhcmRQcmVzZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBNYWtlIHdvcmsgd2l0aCBhIENETUEgZGV2aWNlIHdpdGggYSBSVUlNIGNhcmQuCisgICAgICAgIGlmIChtSWNjQ2FyZFN0YXR1cyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXR1cm5zIElDQyBjYXJkIHN0YXR1cyBmb3IgYm90aCBHU00gYW5kIENETUEgbW9kZQorICAgICAgICAgICAgcmV0dXJuIG1JY2NDYXJkU3RhdHVzLmdldENhcmRTdGF0ZSgpLmlzQ2FyZFByZXNlbnQoKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhCmluZGV4IGFjYzkxOTcuLmIxMmQyZDQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ29uc3RhbnRzLmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEVGX1NQTl9DUEhTID0gMHg2ZjE0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfU1BOX1NIT1JUX0NQSFMgPSAweDZmMTg7CiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9JTkZPX0NQSFMgPSAweDZmMTY7CisgICAgc3RhdGljIGZpbmFsIGludCBFRl9DU1BfQ1BIUyA9IDB4NmYxNTsKIAogICAgIC8vIENETUEgUlVJTSBmaWxlIGlkcyBmcm9tIDNHUFAyIEMuUzAwMjMtMAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NUID0gMHg2ZjMyOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggOWY4ZTU3Zi4uMmYyMmQ3NCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC02Miw4ICs2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZCgiR0VUX1JFQ09SRF9TSVpFIFNpemUgIiArIHJlY29yZFNpemVbMF0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0b3RhbCAiICsgcmVjb3JkU2l6ZVsxXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICNyZWNvcmQgIiArIHJlY29yZFNpemVbMl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfRE9ORToKQEAgLTE0NCw2ICsxNDQsOSBAQAogICAgICAgICBpZiAoREJHKSBsb2dkKCJ1cGRhdGVBZG5SZWNvcmRzSW5FZkJ5U2VhcmNoOiBlZmlkPSIgKyBlZmlkICsKICAgICAgICAgICAgICAgICAiICgiKyBvbGRUYWcgKyAiLCIgKyBvbGRQaG9uZU51bWJlciArICIpIisgIj09PiIgKwogICAgICAgICAgICAgICAgICIgKCIrIG5ld1RhZyArICIsIiArIG5ld1Bob25lTnVtYmVyICsgIikiKyAiIHBpbjI9IiArIHBpbjIpOworCisgICAgICAgIGVmaWQgPSB1cGRhdGVFZkZvckljY1R5cGUoZWZpZCk7CisKICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CiAgICAgICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXJQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXJQcm94eS5qYXZhCmluZGV4IDE5MTBhOWMuLjUwNDkyNDkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlclByb3h5LmphdmEKQEAgLTY4LDQgKzY4LDEyIEBACiAgICAgICAgICAgICAgICAgcGFydHMsIHNlbnRJbnRlbnRzLCBkZWxpdmVyeUludGVudHMpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUljY1Ntc0ludGVyZmFjZU1hbmFnZXIuZW5hYmxlQ2VsbEJyb2FkY2FzdChtZXNzYWdlSWRlbnRpZmllcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUljY1Ntc0ludGVyZmFjZU1hbmFnZXIuZGlzYWJsZUNlbGxCcm9hZGNhc3QobWVzc2FnZUlkZW50aWZpZXIpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQppbmRleCA3MTkzNmYxLi41YmQ3NTIzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQpAQCAtNTEsNiArNTEsOCBAQAogICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcikoJzAnICsgdikpOwogCiAgICAgICAgICAgICB2ID0gKGRhdGFbaV0gPj4gNCkgJiAweGY7CisgICAgICAgICAgICAvLyBTb21lIFBMTU5zIGhhdmUgJ2YnIGFzIGhpZ2ggbmliYmxlLCBpZ25vcmUgaXQKKyAgICAgICAgICAgIGlmICh2ID09IDB4ZikgY29udGludWU7CiAgICAgICAgICAgICBpZiAodiA+IDkpICBicmVhazsKICAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpKCcwJyArIHYpKTsKICAgICAgICAgfQpAQCAtMTQ4LDYgKzE1MCw0NyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYWRuU3RyaW5nRmllbGRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmcgcyA9IGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdVY3MySGVscGVyKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcyA9IGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdHc204Qml0SGVscGVyKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBtZXRob2Qge0BsaW5rICNhZG5TdHJpbmdGaWVsZFRvU3RyaW5nfS4KKyAgICAgKgorICAgICAqIEV4Y2VwdGlvbjoKKyAgICAgKiBJZiB0aGUgU0lNIGlzIEtvcmVhbiAoTUNDIGVxdWFscyAiNDUwIiksIEtTQzU2MDEgZW5jb2Rpbmcgd2lsbCBiZQorICAgICAqIGFzc3VtZWQgKGluc3RlYWQgb2YgR1NNOEJpdCkuIFRoaXMgY291bGQgbGVhZCB0byB1bmludGVuZGVkIGNvbnNlcXVlbmNlcywKKyAgICAgKiBpZiB0aGUgQUROIGFscGhhVGFnIHdhcyBzYXZlZCB3aXRoIEdTTThCaXQuIFRoaXMgaXMgY29uc2lkZXJlZCBhbgorICAgICAqIGFjY2VwdGFibGUgcmlzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdLc2M1NjAxU3VwcG9ydChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmcgcyA9IGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdVY3MySGVscGVyKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoU2ltUmVnaW9uQ2FjaGUuZ2V0UmVnaW9uKCkgPT0gU2ltUmVnaW9uQ2FjaGUuTUNDX0tPUkVBTikgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGJ5dGUgc3RvcCA9IChieXRlKTB4RkY7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPCBsZW5ndGggJiYgZGF0YVtsZW5dICE9IHN0b3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRhdGEsIG9mZnNldCwgbGVuLCAiS1NDNTYwMSIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiaW1wbGF1c2libGUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdHc204Qml0SGVscGVyKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcKKyAgICBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nVWNzMkhlbHBlcihieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKICAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gPT0gKGJ5dGUpIDB4ODApIHsKICAgICAgICAgICAgICAgICBpbnQgdWNzbGVuID0gKGxlbmd0aCAtIDEpIC8gMjsKQEAgLTIyMyw2ICsyNjYsMTEgQEAKICAgICAgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKICAgICAgICAgfQogCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZworICAgIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmdHc204Qml0SGVscGVyKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHJldHVybiBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IGM3ZDRlYWQuLjI2MzgwNTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCkBAIC0xNzE3LDQgKzE3MTcsMTUgQEAKICAgICB2b2lkIHVuc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlKEhhbmRsZXIgaCk7CiAKIAorICAgIC8qKgorICAgICAqIFRPRE86IEFkZGluZyBhIGZ1bmN0aW9uIGZvciBlYWNoIHByb3BlcnR5IGlzIG5vdCBnb29kLgorICAgICAqIEEgZnVjbnRpb24gb2YgdHlwZSBnZXRQaG9uZVByb3AocHJvcFR5cGUpIHdoZXJlIHByb3BUeXBlIGlzIGFuCisgICAgICogZW51bSBvZiBHU00rQ0RNQStMVEUgcHJvcHMgd291bGQgYmUgYSBiZXR0ZXIgYXBwcm9hY2guCisgICAgICoKKyAgICAgKiBHZXQgIlJlc3RyaWN0aW9uIG9mIG1lbnUgb3B0aW9ucyBmb3IgbWFudWFsIFBMTU4gc2VsZWN0aW9uIiBiaXQKKyAgICAgKiBzdGF0dXMgZnJvbSBFRl9DU1AgZGF0YSwgdGhpcyBiZWxvbmdzIHRvICJWYWx1ZSBBZGRlZCBTZXJ2aWNlcyBHcm91cCIuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYml0IGlzIHNldCBvciBFRl9DU1AgZGF0YSBpcyB1bmF2YWlsYWJsZSwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sZWFuIGlzQ3NwUGxtbkVuYWJsZWQoKTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQppbmRleCA5YzZiNDMyLi5mMTVkNWIyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCkBAIC0xMDIwLDYgKzEwMjAsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQ3NwUGxtbkVuYWJsZWQoKSB7CisgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsYXNzIEdTTVBob25lLgorICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgaW4gQ0RNQVBob25lLgorICAgICAgICBsb2dVbmV4cGVjdGVkR3NtTWV0aG9kQ2FsbCgiaXNDc3BQbG1uRW5hYmxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29tbW9uIGVycm9yIGxvZ2dlciBtZXRob2QgZm9yIHVuZXhwZWN0ZWQgY2FsbHMgdG8gQ0RNQS1vbmx5IG1ldGhvZHMuCiAgICAgICovCkBAIC0xMDI4LDQgKzEwMzUsMTIgQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISAiICsgbmFtZSArICIoKSBpbiBQaG9uZUJhc2Ugc2hvdWxkIG5vdCBiZSAiICsKICAgICAgICAgICAgICAgICAiY2FsbGVkLCBDRE1BUGhvbmUgaW5hY3RpdmUuIik7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbW9uIGVycm9yIGxvZ2dlciBtZXRob2QgZm9yIHVuZXhwZWN0ZWQgY2FsbHMgdG8gR1NNL1dDRE1BLW9ubHkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nVW5leHBlY3RlZEdzbU1ldGhvZENhbGwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISAiICsgbmFtZSArICIoKSBpbiBQaG9uZUJhc2Ugc2hvdWxkIG5vdCBiZSAiICsKKyAgICAgICAgICAgICAgICAiY2FsbGVkLCBHU01QaG9uZSBpbmFjdGl2ZS4iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQppbmRleCA2ZjA4ODY4Li43N2YxZTZjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKQEAgLTg0Myw0ICs4NDMsOCBAQAogICAgIHB1YmxpYyB2b2lkIHVuc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlKEhhbmRsZXIgaCl7CiAgICAgICAgIG1BY3RpdmVQaG9uZS51bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZShoKTsKICAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NzcFBsbW5FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzQ3NwUGxtbkVuYWJsZWQoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggMDlhNDUwNi4uZTA1OTU1NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMTQxLDYgKzE0MSw3IEBACiAgICAgICAgICAgICAgICAgdGhpcy5tTmV4dCA9IHNQb29sOwogICAgICAgICAgICAgICAgIHNQb29sID0gdGhpczsKICAgICAgICAgICAgICAgICBzUG9vbFNpemUrKzsKKyAgICAgICAgICAgICAgICBtUmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM3MCw2ICszNzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByci5vbkVycm9yKEdFTkVSSUNfRkFJTFVSRSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnIucmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgYXJlICJEb25lIiBvbmx5IGlmIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgb3IgcmVwbGllcy4gVGh1cyB0aGlzIGNvZGUgcGF0aCB3aWxsIG9ubHkgcmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdha2UgbG9jayBvbiBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tJZkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeVN1YnRyYWN0ZWQgJiYgbVJlcXVlc3RNZXNzYWdlc1BlbmRpbmcgPiAwKSB7CkBAIC0xOTg5LDI2ICsxOTk1LDMwIEBACiAgICAgICAgIHNlbmRTY3JlZW5TdGF0ZSh0cnVlKTsKICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXRSYWRpb1N0YXRlRnJvbVJJTEludChpbnQgc3RhdGUpIHsKLSAgICAgICAgUmFkaW9TdGF0ZSBuZXdTdGF0ZTsKKyAgICBwcml2YXRlIFJhZGlvU3RhdGUgZ2V0UmFkaW9TdGF0ZUZyb21JbnQoaW50IHN0YXRlSW50KSB7CisgICAgICAgIFJhZGlvU3RhdGUgc3RhdGU7CiAKICAgICAgICAgLyogUklMX1JhZGlvU3RhdGUgcmlsLmggKi8KLSAgICAgICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IG5ld1N0YXRlID0gUmFkaW9TdGF0ZS5SQURJT19PRkY7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuUkFESU9fVU5BVkFJTEFCTEU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX05PVF9SRUFEWTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6IG5ld1N0YXRlID0gUmFkaW9TdGF0ZS5TSU1fTE9DS0VEX09SX0FCU0VOVDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IG5ld1N0YXRlID0gUmFkaW9TdGF0ZS5TSU1fUkVBRFk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9OT1RfUkVBRFk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9SRUFEWTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6IG5ld1N0YXRlID0gUmFkaW9TdGF0ZS5SVUlNX0xPQ0tFRF9PUl9BQlNFTlQ7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuTlZfTk9UX1JFQURZOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLk5WX1JFQURZOyBicmVhazsKKyAgICAgICAgc3dpdGNoKHN0YXRlSW50KSB7CisgICAgICAgICAgICBjYXNlIDA6IHN0YXRlID0gUmFkaW9TdGF0ZS5SQURJT19PRkY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiBzdGF0ZSA9IFJhZGlvU3RhdGUuUkFESU9fVU5BVkFJTEFCTEU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBzdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX05PVF9SRUFEWTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IHN0YXRlID0gUmFkaW9TdGF0ZS5TSU1fTE9DS0VEX09SX0FCU0VOVDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IHN0YXRlID0gUmFkaW9TdGF0ZS5TSU1fUkVBRFk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiBzdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9OT1RfUkVBRFk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OiBzdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9SRUFEWTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IHN0YXRlID0gUmFkaW9TdGF0ZS5SVUlNX0xPQ0tFRF9PUl9BQlNFTlQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiBzdGF0ZSA9IFJhZGlvU3RhdGUuTlZfTk9UX1JFQURZOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTogc3RhdGUgPSBSYWRpb1N0YXRlLk5WX1JFQURZOyBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIFJJTF9SYWRpb1N0YXRlOiAiICtzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBSSUxfUmFkaW9TdGF0ZTogIiArIHN0YXRlSW50KTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN3aXRjaFRvUmFkaW9TdGF0ZShSYWRpb1N0YXRlIG5ld1N0YXRlKSB7CiAKICAgICAgICAgaWYgKG1Jbml0aWFsUmFkaW9TdGF0ZUNoYW5nZSkgewogICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmlzT24oKSkgewpAQCAtMjA2Nyw2ICsyMDc3LDEyIEBACiAgICAgc2VuZChSSUxSZXF1ZXN0IHJyKSB7CiAgICAgICAgIE1lc3NhZ2UgbXNnOwogCisgICAgICAgIGlmIChtU29ja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJyLm9uRXJyb3IoUkFESU9fTk9UX0FWQUlMQUJMRSwgbnVsbCk7CisgICAgICAgICAgICByci5yZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBtc2cgPSBtU2VuZGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU0VORCwgcnIpOwogCiAgICAgICAgIGFjcXVpcmVXYWtlTG9jaygpOwpAQCAtMjM5OCw3ICsyNDE0LDcgQEAKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1RSSUNURURfU1RBVEVfQ0hBTkdFRDogcmV0ID0gcmVzcG9uc2VJbnRzKHApOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX1NJTV9TVEFUVVNfQ0hBTkdFRDogIHJldCA9ICByZXNwb25zZVZvaWQocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfQ0RNQV9ORVdfU01TOiAgcmV0ID0gIHJlc3BvbnNlQ2RtYVNtcyhwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNQT05TRV9ORVdfQlJPQURDQVNUX1NNUzogIHJldCA9ICByZXNwb25zZVN0cmluZyhwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNQT05TRV9ORVdfQlJPQURDQVNUX1NNUzogIHJldCA9ICByZXNwb25zZVJhdyhwKTsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9DRE1BX1JVSU1fU01TX1NUT1JBR0VfRlVMTDogIHJldCA9ICByZXNwb25zZVZvaWQocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfRU5URVJfRU1FUkdFTkNZX0NBTExCQUNLX01PREU6IHJldCA9IHJlc3BvbnNlVm9pZChwKTsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9DRE1BX0NBTExfV0FJVElORzogcmV0ID0gcmVzcG9uc2VDZG1hQ2FsbFdhaXRpbmcocCk7IGJyZWFrOwpAQCAtMjQyMCw5ICsyNDM2LDEwIEBACiAgICAgICAgIHN3aXRjaChyZXNwb25zZSkgewogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAvKiBoYXMgYm9udXMgcmFkaW8gc3RhdGUgaW50ICovCi0gICAgICAgICAgICAgICAgc2V0UmFkaW9TdGF0ZUZyb21SSUxJbnQocC5yZWFkSW50KCkpOworICAgICAgICAgICAgICAgIFJhZGlvU3RhdGUgbmV3U3RhdGUgPSBnZXRSYWRpb1N0YXRlRnJvbUludChwLnJlYWRJbnQoKSk7CisgICAgICAgICAgICAgICAgaWYgKFJJTEpfTE9HRCkgdW5zbGpMb2dNb3JlKHJlc3BvbnNlLCBuZXdTdGF0ZS50b1N0cmluZygpKTsKIAotICAgICAgICAgICAgICAgIGlmIChSSUxKX0xPR0QpIHVuc2xqTG9nTW9yZShyZXNwb25zZSwgbVN0YXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN3aXRjaFRvUmFkaW9TdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX0NBTExfU1RBVEVfQ0hBTkdFRDoKICAgICAgICAgICAgICAgICBpZiAoUklMSl9MT0dEKSB1bnNsakxvZyhyZXNwb25zZSk7CkBAIC0yNTQwLDggKzI1NTcsOCBAQAogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfU1RLX1NFU1NJT05fRU5EOgogICAgICAgICAgICAgICAgIGlmIChSSUxKX0xPR0QpIHVuc2xqTG9nKHJlc3BvbnNlKTsKIAotICAgICAgICAgICAgICAgIGlmIChtU3RrU2Vzc2lvbkVuZFJlZ2lzdHJhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RrU2Vzc2lvbkVuZFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKKyAgICAgICAgICAgICAgICBpZiAobUNhdFNlc3Npb25FbmRSZWdpc3RyYW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhdFNlc3Npb25FbmRSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jUmVzdWx0IChudWxsLCByZXQsIG51bGwpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ5LDggKzI1NjYsOCBAQAogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfU1RLX1BST0FDVElWRV9DT01NQU5EOgogICAgICAgICAgICAgICAgIGlmIChSSUxKX0xPR0QpIHVuc2xqTG9nUmV0KHJlc3BvbnNlLCByZXQpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1TdGtQcm9DbWRSZWdpc3RyYW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0a1Byb0NtZFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKKyAgICAgICAgICAgICAgICBpZiAobUNhdFByb0NtZFJlZ2lzdHJhbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ2F0UHJvQ21kUmVnaXN0cmFudC5ub3RpZnlSZWdpc3RyYW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Jlc3VsdCAobnVsbCwgcmV0LCBudWxsKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU1OCw4ICsyNTc1LDggQEAKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1NUS19FVkVOVF9OT1RJRlk6CiAgICAgICAgICAgICAgICAgaWYgKFJJTEpfTE9HRCkgdW5zbGpMb2dSZXQocmVzcG9uc2UsIHJldCk7CiAKLSAgICAgICAgICAgICAgICBpZiAobVN0a0V2ZW50UmVnaXN0cmFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGtFdmVudFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKKyAgICAgICAgICAgICAgICBpZiAobUNhdEV2ZW50UmVnaXN0cmFudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYXRFdmVudFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNSZXN1bHQgKG51bGwsIHJldCwgbnVsbCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1NjcsOCArMjU4NCw4IEBACiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9TVEtfQ0FMTF9TRVRVUDoKICAgICAgICAgICAgICAgICBpZiAoUklMSl9MT0dEKSB1bnNsakxvZ1JldChyZXNwb25zZSwgcmV0KTsKIAotICAgICAgICAgICAgICAgIGlmIChtU3RrQ2FsbFNldFVwUmVnaXN0cmFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGtDYWxsU2V0VXBSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCisgICAgICAgICAgICAgICAgaWYgKG1DYXRDYWxsU2V0VXBSZWdpc3RyYW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhdENhbGxTZXRVcFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNSZXN1bHQgKG51bGwsIHJldCwgbnVsbCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM0NjksNiArMzQ4Niw4IEBACiAgICAgICAgIFJJTFJlcXVlc3QgcnIgPSBSSUxSZXF1ZXN0Lm9idGFpbigKICAgICAgICAgICAgICAgICBSSUxDb25zdGFudHMuUklMX1JFUVVFU1RfUVVFUllfVFRZX01PREUsIHJlc3BvbnNlKTsKIAorICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKHJyLnNlcmlhbFN0cmluZygpICsgIj4gIiArIHJlcXVlc3RUb1N0cmluZyhyci5tUmVxdWVzdCkpOworCiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIApAQCAtMzQ4Miw2ICszNTAxLDkgQEAKICAgICAgICAgcnIubXAud3JpdGVJbnQoMSk7CiAgICAgICAgIHJyLm1wLndyaXRlSW50KHR0eU1vZGUpOwogCisgICAgICAgIGlmIChSSUxKX0xPR0QpIHJpbGpMb2cocnIuc2VyaWFsU3RyaW5nKCkgKyAiPiAiICsgcmVxdWVzdFRvU3RyaW5nKHJyLm1SZXF1ZXN0KQorICAgICAgICAgICAgICAgICsgIiA6ICIgKyB0dHlNb2RlKTsKKwogICAgICAgICBzZW5kKHJyKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDBiMTJiMzQuLmFkMzQ1NTAgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMTEzLDYgKzExMyw5IEBACiAgICAgLyoqIFJhZGlvIGlzIE9OICovCiAgICAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBpbnQgRVZFTlRfUkFESU9fT04gPSAxMjsKIAorICAgIC8qKiBOZXcgYnJvYWRjYXN0IFNNUyAqLworICAgIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgaW50IEVWRU5UX05FV19CUk9BRENBU1RfU01TID0gMTM7CisKICAgICBwcm90ZWN0ZWQgUGhvbmUgbVBob25lOwogICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OwogICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwpAQCAtMzkzLDYgKzM5NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShFVkVOVF9SRVBPUlRfTUVNT1JZX1NUQVRVU19ET05FKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVWRU5UX05FV19CUk9BRENBU1RfU01TOgorICAgICAgICAgICAgaGFuZGxlQnJvYWRjYXN0U21zKChBc3luY1Jlc3VsdCltc2cub2JqKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDA0LDQgKzEwMTEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVCcm9hZGNhc3RTbXMoQXN5bmNSZXN1bHQgYXIpOworCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hCcm9hZGNhc3RQZHVzKGJ5dGVbXVtdIHBkdXMpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoImFuZHJvaWQucHJvdmlkZXIudGVsZXBob255LlNNU19DQl9SRUNFSVZFRCIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdXMiLCBwZHVzKTsKKworICAgICAgICBpZiAoQ29uZmlnLkxPR0QpCisgICAgICAgICAgICBMb2cuZChUQUcsICJEaXNwYXRjaGluZyAiICsgcGR1cy5sZW5ndGggKyAiIFNNUyBDQiBwZHVzIik7CisKKyAgICAgICAgZGlzcGF0Y2goaW50ZW50LCAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIik7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUmVnaW9uQ2FjaGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1SZWdpb25DYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjZkMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUmVnaW9uQ2FjaGUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CisKK3B1YmxpYyBjbGFzcyBTaW1SZWdpb25DYWNoZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUNDX1VOU0VUICA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1DQ19LT1JFQU4gPSA0NTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVnaW9uRnJvbU1jYyA9IE1DQ19VTlNFVDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlZ2lvbiBhcyByZWFkIGZyb20gdGhlIE1DQyBvZiB0aGUgU0lNIGNhcmQuCisgICAgICogSWYgdGhlIHByb3BlcnR5IHtAbGluayBUZWxlcGhvbnlQcm9wZXJ0aWVzIworICAgICAqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9OVU1FUklDfQorICAgICAqIHJldHVybnMgbnVsbCBvciBhbiBlbXB0eSBTdHJpbmcsIHRoZSB2YWx1ZSBpcyB7QGxpbmsgI01DQ19VTlNFVH0KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCByZWdpb24sIGlmIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSZWdpb24oKSB7CisgICAgICAgIGlmIChyZWdpb25Gcm9tTWNjID09IE1DQ19VTlNFVCkgeworICAgICAgICAgICAgU3RyaW5nIHBsbW4gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgKKyAgICAgICAgICAgICAgICAgICAgVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChwbG1uICE9IG51bGwgJiYgcGxtbi5sZW5ndGgoKSA+PSAzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaW9uRnJvbU1jYyA9IEludGVnZXIucGFyc2VJbnQocGxtbi5zdWJzdHJpbmcoMCwgMykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0aGF0IGNhbiBiZSBkb25lIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZWdpb25Gcm9tTWNjOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXBQdXNoTWFuYWdlclBhcmFtcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dhcFB1c2hNYW5hZ2VyUGFyYW1zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXBQdXNoTWFuYWdlclBhcmFtcy5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworLyoqCisgKiBXYXBQdXNoTWFuYWdlciBjb25zdGFudCB2YWx1ZSBkZWZpbml0aW9ucworICovCitwdWJsaWMgY2xhc3MgV2FwUHVzaE1hbmFnZXJQYXJhbXMgeworICAgIC8qKgorICAgICAqIEFwcGxpY2F0aW9uIHR5cGUgYWN0aXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfVFlQRV9BQ1RJVklUWSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWNhdGlvbiB0eXBlIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfVFlQRV9TRVJWSUNFID0gMTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgTWVzc2FnZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNZXNzYWdlIGlzIGhhbmRsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0hBTkRMRUQgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIE1lc3NhZ2UgcmV0dXJuIHZhbHVlCisgICAgICogQXBwbGljYXRpb24gSUQgb3IgY29udGVudCB0eXBlIHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIElEIHRhYmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1FVRVJZX0ZBSUxFRCA9IDB4MjsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgTWVzc2FnZSByZXR1cm4gdmFsdWUKKyAgICAgKiBSZWNlaXZlciBhcHBsaWNhdGlvbiBzaWduYXR1cmUgY2hlY2sgZmFpbGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTkFUVVJFX05PX01BVENIID0gMHg0OworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBNZXNzYWdlIHJldHVybiB2YWx1ZQorICAgICAqIFJlY2VpdmVyIGFwcGxpY2F0aW9uIHdhcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFQ0VJVkVSX05BTUUgPSAweDg7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIE1lc3NhZ2UgcmV0dXJuIHZhbHVlCisgICAgICogVW5rbm93biBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENFUFRJT05fQ0FVR0hUID0gMHgxMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgTWVzc2FnZSByZXR1cm4gdmFsdWUKKyAgICAgKiBOZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZyBhZnRlciBXYXBQdXNoTWFuYWdlciBtZXNzYWdlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVVJUSEVSX1BST0NFU1NJTkcgPSAweDgwMDA7CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dhcFB1c2hPdmVyU21zLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE92ZXJTbXMuamF2YQppbmRleCAxNjhiNjNiLi43NzA0NjY3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE92ZXJTbXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE92ZXJTbXMuamF2YQpAQCAtMTQsMTYgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnk7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFdBUCBwdXNoIGhhbmRsZXIgY2xhc3MuCkBAIC00MywxMSArNDcsODMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBXQUtFX0xPQ0tfVElNRU9VVCA9IDUwMDA7CiAKKyAgICBwcml2YXRlIGZpbmFsIGludCBCSU5EX1JFVFJZX0lOVEVSVkFMID0gMTAwMDsKKyAgICAvKioKKyAgICAgKiBBIGhhbmRsZSB0byBXYXBQdXNoTWFuYWdlciBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFdhcFB1c2hDb25uZWN0aW9uIG1XYXBDb25uID0gbnVsbDsKKyAgICBwcml2YXRlIGNsYXNzIFdhcFB1c2hDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIElXYXBQdXNoTWFuYWdlciBtV2FwUHVzaE1hbjsKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Pd25lcjsKKworICAgICAgICBwdWJsaWMgV2FwUHVzaENvbm5lY3Rpb24oQ29udGV4dCBvd25lckNvbnRleHQpIHsKKyAgICAgICAgICAgIG1Pd25lciA9IG93bmVyQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbVdhcFB1c2hNYW4gPSBJV2FwUHVzaE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJ3YXBwdXNoIG1hbmFnZXIgY29ubmVjdGVkIHRvICIgKworICAgICAgICAgICAgICAgICAgICBtT3duZXIuaGFzaENvZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICBtV2FwUHVzaE1hbiA9IG51bGw7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAid2FwcHVzaCBtYW5hZ2VyIGRpc2Nvbm5lY3RlZC4iKTsKKyAgICAgICAgICAgIC8vIFdhcFB1c2hNYW5hZ2VyIG11c3QgYmUgYWx3YXlzIGF0dGFjaGVkLgorICAgICAgICAgICAgcmViaW5kV2FwUHVzaE1hbmFnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBiaW5kIFdhcFB1c2hNYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kV2FwUHVzaE1hbmFnZXIoKSB7CisgICAgICAgICAgICBpZiAobVdhcFB1c2hNYW4gIT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBmaW5hbCBTZXJ2aWNlQ29ubmVjdGlvbiB3YXBQdXNoQ29ubmVjdGlvbiA9IHRoaXM7CisKKyAgICAgICAgICAgIG1Pd25lci5iaW5kU2VydmljZShuZXcgSW50ZW50KElXYXBQdXNoTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICB3YXBQdXNoQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZWJpbmQgV2FwUHVzaE1hbmFnZXIKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gV2FwUHVzaE1hbmFnZXIgaXMgZGlzY29ubmVjdGVkIHVuZXhwZWN0ZWRseS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZWJpbmRXYXBQdXNoTWFuYWdlcigpIHsKKyAgICAgICAgICAgIGlmIChtV2FwUHVzaE1hbiAhPSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGZpbmFsIFNlcnZpY2VDb25uZWN0aW9uIHdhcFB1c2hDb25uZWN0aW9uID0gdGhpczsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobVdhcFB1c2hNYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLmJpbmRTZXJ2aWNlKG5ldyBJbnRlbnQoSVdhcFB1c2hNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcFB1c2hDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoQklORF9SRVRSWV9JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLnYoTE9HX1RBRywgInNsZWVwIGludGVycnVwdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgaW50ZXJmYWNlIHRvIFdhcFB1c2hNYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSVdhcFB1c2hNYW5hZ2VyIGdldFdhcFB1c2hNYW5hZ2VyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1XYXBQdXNoTWFuOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFdhcFB1c2hPdmVyU21zKFBob25lIHBob25lLCBTTVNEaXNwYXRjaGVyIHNtc0Rpc3BhdGNoZXIpIHsKICAgICAgICAgbVNtc0Rpc3BhdGNoZXIgPSBzbXNEaXNwYXRjaGVyOwogICAgICAgICBtQ29udGV4dCA9IHBob25lLmdldENvbnRleHQoKTsKKyAgICAgICAgbVdhcENvbm4gPSBuZXcgV2FwUHVzaENvbm5lY3Rpb24obUNvbnRleHQpOworICAgICAgICBtV2FwQ29ubi5iaW5kV2FwUHVzaE1hbmFnZXIoKTsKICAgICB9CiAKKwogICAgIC8qKgogICAgICAqIERpc3BhdGNoZXMgaW5ib3VuZCBtZXNzYWdlcyB0aGF0IGFyZSBpbiB0aGUgV0FQIFBEVSBmb3JtYXQuIFNlZQogICAgICAqIHdhcC0yMzAtd3NwLTIwMDEwNzA1LWEgc2VjdGlvbiA4IGZvciBkZXRhaWxzIG9uIHRoZSBXQVAgUERVIGZvcm1hdC4KQEAgLTU5LDcgKzEzNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBkaXNwYXRjaFdhcFBkdShieXRlW10gcGR1KSB7CiAKLSAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZChMT0dfVEFHLCAiUng6ICIgKyBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKHBkdSkpOworICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cuZChMT0dfVEFHLCAiUng6ICIgKyBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKHBkdSkpOwogCiAgICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICAgIGludCB0cmFuc2FjdGlvbklkID0gcGR1W2luZGV4KytdICYgMHhGRjsKQEAgLTY4LDcgKzE0NCw3IEBACiAKICAgICAgICAgaWYgKChwZHVUeXBlICE9IFdzcFR5cGVEZWNvZGVyLlBEVV9UWVBFX1BVU0gpICYmCiAgICAgICAgICAgICAgICAgKHBkdVR5cGUgIT0gV3NwVHlwZURlY29kZXIuUERVX1RZUEVfQ09ORklSTUVEX1BVU0gpKSB7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBub24tUFVTSCBXQVAgUERVLiBUeXBlID0gIiArIHBkdVR5cGUpOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIlJlY2VpdmVkIG5vbi1QVVNIIFdBUCBQRFUuIFR5cGUgPSAiICsgcGR1VHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0hBTkRMRUQ7CiAgICAgICAgIH0KIApAQCAtODEsNyArMTU3LDcgQEAKICAgICAgICAgICogU28gaXQgd2lsbCBiZSBlbmNvZGVkIGluIG5vIG1vcmUgdGhhbiA1IG9jdGV0cy4KICAgICAgICAgICovCiAgICAgICAgIGlmIChwZHVEZWNvZGVyLmRlY29kZVVpbnR2YXJJbnRlZ2VyKGluZGV4KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBIZWFkZXIgTGVuZ3RoIGVycm9yLiIpOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIlJlY2VpdmVkIFBEVS4gSGVhZGVyIExlbmd0aCBlcnJvci4iKTsKICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfR0VORVJJQ19FUlJPUjsKICAgICAgICAgfQogICAgICAgICBoZWFkZXJMZW5ndGggPSAoaW50KXBkdURlY29kZXIuZ2V0VmFsdWUzMigpOwpAQCAtMTAyLDE0MSArMTc4LDk5IEBACiAgICAgICAgICAqIExlbmd0aCA9IFVpbnR2YXItaW50ZWdlcgogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBkdURlY29kZXIuZGVjb2RlQ29udGVudFR5cGUoaW5kZXgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBQRFUuIEhlYWRlciBDb250ZW50LVR5cGUgZXJyb3IuIik7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBIZWFkZXIgQ29udGVudC1UeXBlIGVycm9yLiIpOwogICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19HRU5FUklDX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIGludCBiaW5hcnlDb250ZW50VHlwZTsKKwogICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCk7Ci0gICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IChpbnQpcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7Ci0gICAgICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBoYXZlIG1vcmUgZ2VuZXJpYyB3YXkgdG8gbWFwIGJpbmFyeUNvbnRlbnRUeXBlIGNvZGUgdG8gbWltZVR5cGUuCi0gICAgICAgICAgICBzd2l0Y2ggKGJpbmFyeUNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9EUk1fUklHSFRTX1hNTDoKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX0RSTV9SSUdIVFNfWE1MOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX0RSTV9SSUdIVFNfV0JYTUw6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1dCWE1MOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfU0k6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX1NJOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfU0w6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX1NMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ086Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX0NPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX01NUzoKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX01NUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9WTkRfRE9DT01PX1BGOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfVk5EX0RPQ09NT19QRjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9TVVBMX0lOSVQ6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9TVVBMX0lOSVQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFBEVS4gVW5zdXBwb3J0ZWQgQ29udGVudC1UeXBlID0gIiArIGJpbmFyeUNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1hNTCkpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX0RSTV9SSUdIVFNfWE1MOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1dCWE1MKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfRFJNX1JJR0hUU19XQlhNTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9TSSkpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfU0k7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX1BVU0hfU0wpKSB7Ci0gICAgICAgICAgICAgICAgYmluYXJ5Q29udGVudFR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX1NMOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX0NPKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfUFVTSF9DTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfTU1TKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfTU1TOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9WTkRfRE9DT01PX1BGKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfVk5EX0RPQ09NT19QRjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfU1VQTF9JTklUKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfU1VQTF9JTklUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBQRFUuIFVua25vd24gQ29udGVudC1UeXBlID0gIiArIG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBiaW5hcnlDb250ZW50VHlwZSA9IHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOwogICAgICAgICBpbmRleCArPSBwZHVEZWNvZGVyLmdldERlY29kZWREYXRhTGVuZ3RoKCk7CiAKLSAgICAgICAgYm9vbGVhbiBkaXNwYXRjaGVkQnlBcHBsaWNhdGlvbiA9IGZhbHNlOwotICAgICAgICBzd2l0Y2ggKGJpbmFyeUNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ086Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHVfUHVzaENPKHBkdSwgdHJhbnNhY3Rpb25JZCwgcGR1VHlwZSwgaGVhZGVyU3RhcnRJbmRleCwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVkQnlBcHBsaWNhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX01NUzoKLSAgICAgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdV9NTVMocGR1LCB0cmFuc2FjdGlvbklkLCBwZHVUeXBlLCBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGRpc3BhdGNoZWRCeUFwcGxpY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpc3BhdGNoZWRCeUFwcGxpY2F0aW9uID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaFdhcFBkdV9kZWZhdWx0KHBkdSwgdHJhbnNhY3Rpb25JZCwgcGR1VHlwZSwgbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclN0YXJ0SW5kZXgsIGhlYWRlckxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFjdGl2aXR5LlJFU1VMVF9PSzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hXYXBQZHVfZGVmYXVsdChieXRlW10gcGR1LCBpbnQgdHJhbnNhY3Rpb25JZCwgaW50IHBkdVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBpbnQgaGVhZGVyU3RhcnRJbmRleCwgaW50IGhlYWRlckxlbmd0aCkgewogICAgICAgICBieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbaGVhZGVyTGVuZ3RoXTsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGhlYWRlclN0YXJ0SW5kZXgsIGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCk7Ci0gICAgICAgIGludCBkYXRhSW5kZXggPSBoZWFkZXJTdGFydEluZGV4ICsgaGVhZGVyTGVuZ3RoOwotICAgICAgICBieXRlW10gZGF0YTsKIAotICAgICAgICBkYXRhID0gbmV3IGJ5dGVbcGR1Lmxlbmd0aCAtIGRhdGFJbmRleF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBkYXRhSW5kZXgsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgYnl0ZVtdIGludGVudERhdGE7CisKKyAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICBpbnRlbnREYXRhID0gcGR1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRhdGFJbmRleCA9IGhlYWRlclN0YXJ0SW5kZXggKyBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBpbnRlbnREYXRhID0gbmV3IGJ5dGVbcGR1Lmxlbmd0aCAtIGRhdGFJbmRleF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBkdSwgZGF0YUluZGV4LCBpbnRlbnREYXRhLCAwLCBpbnRlbnREYXRhLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VlayBmb3IgYXBwbGljYXRpb24gSUQgZmllbGQgaW4gV1NQIGhlYWRlci4KKyAgICAgICAgICogSWYgYXBwbGljYXRpb24gSUQgaXMgZm91bmQsIFdhcFB1c2hNYW5hZ2VyIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogcHJvY2Vzc2luZy4gU2luY2UgV2FwUHVzaE1hbmFnZXIgaXMgb3B0aW9uYWwgbW9kdWxlLCBpZiBXYXBQdXNoTWFuYWdlcgorICAgICAgICAgKiBpcyBub3QgZm91bmQsIGxlZ2FjeSBtZXNzYWdlIHByb2Nlc3Npbmcgd2lsbCBiZSBjb250aW51ZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQoaW5kZXgsIGluZGV4ICsgaGVhZGVyTGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICBwZHVEZWNvZGVyLmRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGluZGV4KTsKKyAgICAgICAgICAgIFN0cmluZyB3YXBBcHBJZCA9IHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICh3YXBBcHBJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2FwQXBwSWQgPSBJbnRlZ2VyLnRvU3RyaW5nKChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gKChtaW1lVHlwZSA9PSBudWxsKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhiaW5hcnlDb250ZW50VHlwZSkgOiBtaW1lVHlwZSk7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAiYXBwaWQgZm91bmQ6ICIgKyB3YXBBcHBJZCArICI6IiArIGNvbnRlbnRUeXBlKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NGdXJ0aGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgd2FwUHVzaE1hbiA9IG1XYXBDb25uLmdldFdhcFB1c2hNYW5hZ2VyKCk7CisKKyAgICAgICAgICAgICAgICBpZiAod2FwUHVzaE1hbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJ3YXAgcHVzaCBtYW5hZ2VyIG5vdCBmb3VuZCEiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCB0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVUeXBlIiwgcGR1VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiaGVhZGVyIiwgaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgaW50ZW50RGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiY29udGVudFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHVEZWNvZGVyLmdldENvbnRlbnRQYXJhbWV0ZXJzKCkpOworCisgICAgICAgICAgICAgICAgICAgIGludCBwcm9jUmV0ID0gd2FwUHVzaE1hbi5wcm9jZXNzTWVzc2FnZSh3YXBBcHBJZCwgY29udGVudFR5cGUsIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJwcm9jUmV0OiIgKyBwcm9jUmV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jUmV0ICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChwcm9jUmV0ICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuRlVSVEhFUl9QUk9DRVNTSU5HKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRnVydGhlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc0Z1cnRoZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgInJlbW90ZSBmdW5jIGZhaWxlZC4uLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJmYWxsIGJhY2sgdG8gZXhpc3RpbmcgaGFuZGxlciIpOworCisgICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAiSGVhZGVyIENvbnRlbnQtVHlwZSBlcnJvci4iKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uOworCisgICAgICAgIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfTU1TKSkgeworICAgICAgICAgICAgcGVybWlzc2lvbiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9NTVMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGVybWlzc2lvbiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCI7CisgICAgICAgIH0KIAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnRzLldBUF9QVVNIX1JFQ0VJVkVEX0FDVElPTik7CiAgICAgICAgIGludGVudC5zZXRUeXBlKG1pbWVUeXBlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIHBkdVR5cGUpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoImhlYWRlciIsIGhlYWRlcik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiZGF0YSIsIGRhdGEpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRhdGEiLCBpbnRlbnREYXRhKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJjb250ZW50VHlwZVBhcmFtZXRlcnMiLCBwZHVEZWNvZGVyLmdldENvbnRlbnRQYXJhbWV0ZXJzKCkpOwogCi0gICAgICAgIG1TbXNEaXNwYXRjaGVyLmRpc3BhdGNoKGludGVudCwgImFuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX1dBUF9QVVNIIik7Ci0gICAgfQorICAgICAgICBtU21zRGlzcGF0Y2hlci5kaXNwYXRjaChpbnRlbnQsIHBlcm1pc3Npb24pOwogCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoV2FwUGR1X1B1c2hDTyhieXRlW10gcGR1LCBpbnQgdHJhbnNhY3Rpb25JZCwgaW50IHBkdVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyU3RhcnRJbmRleCwgaW50IGhlYWRlckxlbmd0aCkgewotICAgICAgICBieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbaGVhZGVyTGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGhlYWRlclN0YXJ0SW5kZXgsIGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5XQVBfUFVTSF9SRUNFSVZFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuc2V0VHlwZShXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX1BVU0hfQ08pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCB0cmFuc2FjdGlvbklkKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVUeXBlIiwgcGR1VHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiaGVhZGVyIiwgaGVhZGVyKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgcGR1KTsKLQotICAgICAgICBtU21zRGlzcGF0Y2hlci5kaXNwYXRjaChpbnRlbnQsICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFdhcFBkdV9NTVMoYnl0ZVtdIHBkdSwgaW50IHRyYW5zYWN0aW9uSWQsIGludCBwZHVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlclN0YXJ0SW5kZXgsIGludCBoZWFkZXJMZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlckxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOwotICAgICAgICBpbnQgZGF0YUluZGV4ID0gaGVhZGVyU3RhcnRJbmRleCArIGhlYWRlckxlbmd0aDsKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtwZHUubGVuZ3RoIC0gZGF0YUluZGV4XTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGRhdGFJbmRleCwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudHMuV0FQX1BVU0hfUkVDRUlWRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LnNldFR5cGUoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9NTVMpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCB0cmFuc2FjdGlvbklkKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVUeXBlIiwgcGR1VHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiaGVhZGVyIiwgaGVhZGVyKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgZGF0YSk7Ci0KLSAgICAgICAgbVNtc0Rpc3BhdGNoZXIuZGlzcGF0Y2goaW50ZW50LCAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfTU1TIik7CisgICAgICAgIHJldHVybiBBY3Rpdml0eS5SRVNVTFRfT0s7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV3NwVHlwZURlY29kZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhCmluZGV4IDVkYzg5ZjAuLmM4ZGQ3MTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhCkBAIC0xNiwxMSArMTYsMTIgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogLyoqCi0gKiAgSW1wbGVtZW50IHRoZSBXU1AgZGF0YSB0eXBlIGRlY29kZXIuCisgKiBJbXBsZW1lbnQgdGhlIFdTUCBkYXRhIHR5cGUgZGVjb2Rlci4KICAqCi0gKiAgQGhpZGUKKyAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBXc3BUeXBlRGVjb2RlciB7CiAKQEAgLTMwLDM3ICszMSwxNzcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRFVfVFlQRV9QVVNIID0gMHgwNjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRFVfVFlQRV9DT05GSVJNRURfUFVTSCA9IDB4MDc7CiAKLSAgICAvLyBUT0RPIHdlIHNob3VsZCBoYXZlIG1hcHBpbmcgYmV0d2VlbiB0aG9zZSBiaW5hcnkgY29kZSBhbmQgbWltZSB0eXBlIHN0cmluZy4KLSAgICAvLyAgc2VlIGh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL29tbmEvb21uYS13c3AtY29udGVudC10eXBlLmFzcHgKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9NSU1FX1RZUEVTID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9CX0RSTV9SSUdIVFNfWE1MID0gMHg0YTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9EUk1fUklHSFRTX1dCWE1MID0gMHg0YjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9QVVNIX1NJID0gMHgyZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9QVVNIX1NMID0gMHgzMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9QVVNIX0NPID0gMHgzMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9NTVMgPSAweDNlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9CX1ZORF9ET0NPTU9fUEYgPSAweDAzMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfU1VQTF9JTklUID0gMHgzMTI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01JTUVfVFlQRV9CX0RSTV9SSUdIVFNfWE1MID0KLSAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01JTUVfVFlQRV9CX0RSTV9SSUdIVFNfV0JYTUwgPQotICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt3YnhtbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX1NJID0gImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01JTUVfVFlQRV9CX1BVU0hfU0wgPSAiYXBwbGljYXRpb24vdm5kLndhcC5zbGMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9DTyA9ICJhcHBsaWNhdGlvbi92bmQud2FwLmNvYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9NTVMgPSAiYXBwbGljYXRpb24vdm5kLndhcC5tbXMtbWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9WTkRfRE9DT01PX1BGID0gImFwcGxpY2F0aW9uL3ZuZC5kb2NvbW8ucGYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUlNRV9UWVBFX0JfU1VQTF9JTklUID0gImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9QQVJBTUVURVJTID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNRVRFUl9JRF9YX1dBUF9BUFBMSUNBVElPTl9JRCA9IDB4MmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFfVkFMVUUgPSAweDAwOwogCisgICAgc3RhdGljIHsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAwLCAiKi8qIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMSwgInRleHQvKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzLCAidGV4dC9wbGFpbiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDQsICJ0ZXh0L3gtaGRtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDUsICJ0ZXh0L3gtdHRtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDYsICJ0ZXh0L3gtdkNhbGVuZGFyIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwNywgInRleHQveC12Q2FyZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDgsICJ0ZXh0L3ZuZC53YXAud21sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwOSwgInRleHQvdm5kLndhcC53bWxzY3JpcHQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBBLCAidGV4dC92bmQud2FwLnd0YS1ldmVudCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MEIsICJtdWx0aXBhcnQvKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MEMsICJtdWx0aXBhcnQvbWl4ZWQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBELCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MEUsICJtdWx0aXBhcnQvYnl0ZXJhbnRlcyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MEYsICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDEwLCAiYXBwbGljYXRpb24vKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTEsICJhcHBsaWNhdGlvbi9qYXZhLXZtIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxMiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTMsICJhcHBsaWNhdGlvbi94LWhkbWxjIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxNCwgImFwcGxpY2F0aW9uL3ZuZC53YXAud21sYyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTUsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDE2LCAiYXBwbGljYXRpb24vdm5kLndhcC53dGEtZXZlbnRjIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxNywgImFwcGxpY2F0aW9uL3ZuZC53YXAudWFwcm9mIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxOCwgImFwcGxpY2F0aW9uL3ZuZC53YXAud3Rscy1jYS1jZXJ0aWZpY2F0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTksICJhcHBsaWNhdGlvbi92bmQud2FwLnd0bHMtdXNlci1jZXJ0aWZpY2F0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MUEsICJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MUIsICJhcHBsaWNhdGlvbi94LXg1MDktdXNlci1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxQywgImltYWdlLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDFELCAiaW1hZ2UvZ2lmIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxRSwgImltYWdlL2pwZWciKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDFGLCAiaW1hZ2UvdGlmZiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MjAsICJpbWFnZS9wbmciKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDIxLCAiaW1hZ2Uvdm5kLndhcC53Ym1wIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyMiwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LioiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDIzLCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQubWl4ZWQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDI0LCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuZm9ybS1kYXRhIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyNSwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmJ5dGVyYW5nZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDI2LCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuYWx0ZXJuYXRpdmUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDI3LCAiYXBwbGljYXRpb24veG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyOCwgInRleHQveG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyOSwgImFwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJBLCAiYXBwbGljYXRpb24veC14OTY4LWNyb3NzLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJCLCAiYXBwbGljYXRpb24veC14OTY4LWNhLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJDLCAiYXBwbGljYXRpb24veC14OTY4LXVzZXItY2VydCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MkQsICJ0ZXh0L3ZuZC53YXAuc2kiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJFLCAiYXBwbGljYXRpb24vdm5kLndhcC5zaWMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJGLCAidGV4dC92bmQud2FwLnNsIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzMCwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2xjIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzMSwgInRleHQvdm5kLndhcC5jbyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzIsICJhcHBsaWNhdGlvbi92bmQud2FwLmNvYyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzMsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5yZWxhdGVkIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzNCwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2lhIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzNSwgInRleHQvdm5kLndhcC5jb25uZWN0aXZpdHkteG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAuY29ubmVjdGl2aXR5LXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzNywgImFwcGxpY2F0aW9uL3BrY3M3LW1pbWUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDM4LCAiYXBwbGljYXRpb24vdm5kLndhcC5oYXNoZWQtY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDM5LCAiYXBwbGljYXRpb24vdm5kLndhcC5zaWduZWQtY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDNBLCAiYXBwbGljYXRpb24vdm5kLndhcC5jZXJ0LXJlc3BvbnNlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzQiwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4M0MsICJhcHBsaWNhdGlvbi93bWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzRCwgInRleHQvY3NzIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzRSwgImFwcGxpY2F0aW9uL3ZuZC53YXAubW1zLW1lc3NhZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDNGLCAiYXBwbGljYXRpb24vdm5kLndhcC5yb2xsb3Zlci1jZXJ0aWZpY2F0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NDAsICJhcHBsaWNhdGlvbi92bmQud2FwLmxvY2Mrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQxLCAiYXBwbGljYXRpb24vdm5kLndhcC5sb2MreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0MiwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0rd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQzLCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ0LCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5ub3RpZmljYXRpb24iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ1LCAiYXBwbGljYXRpb24vdm5kLndhcC54aHRtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ2LCAiYXBwbGljYXRpb24vdm5kLnd2LmNzcC5jaXIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ3LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kZCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ4LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NDksICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5jb250ZW50Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0QSwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDRCLCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0QywgImFwcGxpY2F0aW9uL3ZuZC53di5jc3AreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0RCwgImFwcGxpY2F0aW9uL3ZuZC53di5jc3Ard2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDRFLCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kcy5ub3RpZmljYXRpb24iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDRGLCAiYXVkaW8vKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NTAsICJ2aWRlby8qIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg1MSwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NTIsICJhcHBsaWNhdGlvbi9taWtleSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NTMsICJhcHBsaWNhdGlvbi92bmQub21hLmRjZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NTQsICJhcHBsaWNhdGlvbi92bmQub21hLmRjZGMiKTsKKworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwMSwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDIsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDMsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwNCwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDUsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjA2LCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwNywgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnByb3Zpc2lvbmluZy1zdGF0dXMtdXJpIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjA4LCAieC13YXAubXVsdGlwYXJ0L3ZuZC51cGxhbmV0LmhlYWRlci1zZXQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDksICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlLXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjBBLCAiYXBwbGljYXRpb24vdm5kLnBob25lY29tLm1tYy13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwQiwgImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5zeW5jc2V0K3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjBDLCAiaW1hZ2UveC11cC13cG5nIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzAwLCAiYXBwbGljYXRpb24vaW90YS5tbWMtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDEsICJhcHBsaWNhdGlvbi9pb3RhLm1tYy14bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDIsICJhcHBsaWNhdGlvbi92bmQuc3luY21sK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwMywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDQsICJ0ZXh0L3ZuZC53YXAuZW1uK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwNSwgInRleHQvY2FsZW5kYXIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDYsICJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzA3LCAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZpbGUreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzA4LCAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZvbGRlcit4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDksICJ0ZXh0L2RpcmVjdG9yeTtwcm9maWxlPXZDYXJkIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzBBLCAiYXBwbGljYXRpb24vdm5kLndhcC5lbW4rd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMEIsICJhcHBsaWNhdGlvbi92bmQubm9raWEuaXBkYy1wdXJjaGFzZS1yZXNwb25zZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwQywgImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5zY3JlZW4zK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwRCwgImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5zY3JlZW4zK2d6aXAiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMEUsICJhcHBsaWNhdGlvbi92bmQuY21jYy5zZXR0aW5nK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzBGLCAiYXBwbGljYXRpb24vdm5kLmNtY2MuYm9tYmluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxMCwgImFwcGxpY2F0aW9uL3ZuZC5kb2NvbW8ucGYiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTEsICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnViIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzEyLCAiYXBwbGljYXRpb24vdm5kLm9tYWxvYy1zdXBsLWluaXQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTMsICJhcHBsaWNhdGlvbi92bmQub21hLmdyb3VwLXVzYWdlLWxpc3QreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzE0LCAiYXBwbGljYXRpb24vb21hLWRpcmVjdG9yeSt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTUsICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmMiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxNiwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJvYXAtdHJpZ2dlcit3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxNywgImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxOCwgImFwcGxpY2F0aW9uL3ZuZC53bWYuYm9vdHN0cmFwIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzE5LCAiYXBwbGljYXRpb24vdm5jLmNtY2MuZGNkK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxQSwgImFwcGxpY2F0aW9uL3ZuZC5zYm0uY2lkIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzFCLCAiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5wcm92aXNpb25pbmd0cmlnZ2VyIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDAwLCAiUSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDEsICJDaGFyc2V0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMiwgIkxldmVsIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMywgIlR5cGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA3LCAiRGlmZmVyZW5jZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA4LCAiUGFkZGluZyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDksICJUeXBlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwRSwgIk1heC1BZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEwLCAiU2VjdXJlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxMSwgIlNFQyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTIsICJNQUMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEzLCAiQ3JlYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTQsICJNb2RpZmljYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTUsICJSZWFkLWRhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE2LCAiU2l6ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTcsICJOYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOCwgIkZpbGVuYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOSwgIlN0YXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxQSwgIlN0YXJ0LWluZm8iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFCLCAiQ29tbWVudCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MUMsICJEb21haW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFELCAiUGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9CX1BVU0hfQ08gPSAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9CX01NUyA9ICJhcHBsaWNhdGlvbi92bmQud2FwLm1tcy1tZXNzYWdlIjsKIAogICAgIGJ5dGVbXSB3c3BEYXRhOwogICAgIGludCAgICBkYXRhTGVuZ3RoOwogICAgIGxvbmcgICB1bnNpZ25lZDMyYml0OwogICAgIFN0cmluZyBzdHJpbmdWYWx1ZTsKIAorICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRlbnRQYXJhbWV0ZXJzOworCiAgICAgcHVibGljIFdzcFR5cGVEZWNvZGVyKGJ5dGVbXSBwZHUpIHsKICAgICAgICAgd3NwRGF0YSA9IHBkdTsKICAgICB9CkBAIC03MSwxNyArMjEyLDE3IEBACiAgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSAiVGV4dC1zdHJpbmciIGluIHRoaXMgcGR1CiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgVGV4dC1zdHJpbmcpIG9jY3VyCi0gICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZVN0cmluZygpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZQorICAgICAqICAgICAgICAgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlVGV4dFN0cmluZyhpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwogICAgICAgICB3aGlsZSAod3NwRGF0YVtpbmRleF0gIT0gMCkgewogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQotICAgICAgICBkYXRhTGVuZ3RoICA9IGluZGV4IC0gc3RhcnRJbmRleCArIDE7CisgICAgICAgIGRhdGFMZW5ndGggPSBpbmRleCAtIHN0YXJ0SW5kZXggKyAxOwogICAgICAgICBpZiAod3NwRGF0YVtzdGFydEluZGV4XSA9PSAxMjcpIHsKLSAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZyh3c3BEYXRhLCBzdGFydEluZGV4KzEsIGRhdGFMZW5ndGggLSAyKTsKKyAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZyh3c3BEYXRhLCBzdGFydEluZGV4ICsgMSwgZGF0YUxlbmd0aCAtIDIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBuZXcgU3RyaW5nKHdzcERhdGEsIHN0YXJ0SW5kZXgsIGRhdGFMZW5ndGggLSAxKTsKICAgICAgICAgfQpAQCAtODksMTMgKzIzMCwzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY29kZSB0aGUgIlRva2VuLXRleHQiIHR5cGUgZm9yIFdTUCBwZHUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIlRva2VuLXRleHQiIGluIHRoaXMgcGR1CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB0cnVlCisgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZVN0cmluZygpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVUb2tlblRleHQoaW50IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKKyAgICAgICAgd2hpbGUgKHdzcERhdGFbaW5kZXhdICE9IDApIHsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgZGF0YUxlbmd0aCA9IGluZGV4IC0gc3RhcnRJbmRleCArIDE7CisgICAgICAgIHN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZyh3c3BEYXRhLCBzdGFydEluZGV4LCBkYXRhTGVuZ3RoIC0gMSk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRGVjb2RlIHRoZSAiU2hvcnQtaW50ZWdlciIgdHlwZSBmb3IgV1NQIHBkdQogICAgICAqCiAgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSAiU2hvcnQtaW50ZWdlciIgaW4gdGhpcyBwZHUKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBTaG9ydC1pbnRlZ2VyKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVTaG9ydEludGVnZXIoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaWYgKCh3c3BEYXRhW3N0YXJ0SW5kZXhdICYgMHg4MCkgPT0gMCkgewpAQCAtMTEzLDcgKzI3NCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgTG9uZy1pbnRlZ2VyKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVMb25nSW50ZWdlcihpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpbnQgbGVuZ3RoTXVsdGlPY3RldCA9IHdzcERhdGFbc3RhcnRJbmRleF0gJiAweGZmOwpAQCAtMTIyLDEwICsyODMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB1bnNpZ25lZDMyYml0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaT0xOyBpPD1sZW5ndGhNdWx0aU9jdGV0OyBpKyspIHsKLSAgICAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSAodW5zaWduZWQzMmJpdCA8PCA4KSB8ICh3c3BEYXRhW3N0YXJ0SW5kZXgraV0gJiAweGZmKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuZ3RoTXVsdGlPY3RldDsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZDMyYml0ID0gKHVuc2lnbmVkMzJiaXQgPDwgOCkgfCAod3NwRGF0YVtzdGFydEluZGV4ICsgaV0gJiAweGZmKTsKICAgICAgICAgfQotICAgICAgICBkYXRhTGVuZ3RoID0gMStsZW5ndGhNdWx0aU9jdGV0OworICAgICAgICBkYXRhTGVuZ3RoID0gMSArIGxlbmd0aE11bHRpT2N0ZXQ7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMTM2LDcgKzI5Nyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgSW50ZWdlci1WYWx1ZSkgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlSW50ZWdlclZhbHVlKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIGlmIChkZWNvZGVTaG9ydEludGVnZXIoc3RhcnRJbmRleCkgPT0gdHJ1ZSkgewpAQCAtMTUyLDEwICszMTMsMTAgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBVaW50dmFyLWludGVnZXIpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCi0gICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZVVpbnR2YXJJbnRlZ2VyKGludCBzdGFydEluZGV4KSB7Ci0gICAgICAgIGludCAgaW5kZXggPSBzdGFydEluZGV4OworICAgICAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwogCiAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSAwOwogICAgICAgICB3aGlsZSAoKHdzcERhdGFbaW5kZXhdICYgMHg4MCkgIT0gMCkgewpAQCAtMTc3LDcgKzMzOCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgVmFsdWUtbGVuZ3RoKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVWYWx1ZUxlbmd0aChpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpZiAoKHdzcERhdGFbc3RhcnRJbmRleF0gJiAweGZmKSA+IFdBUF9QRFVfTEVOR1RIX1FVT1RFKSB7CkBAIC0xODcsMjIgKzM0OCwyMiBAQAogICAgICAgICAgICAgdW5zaWduZWQzMmJpdCA9IHdzcERhdGFbc3RhcnRJbmRleF07CiAgICAgICAgICAgICBkYXRhTGVuZ3RoID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlY29kZVVpbnR2YXJJbnRlZ2VyKHN0YXJ0SW5kZXgrMSk7Ci0gICAgICAgICAgICBkYXRhTGVuZ3RoICsrOworICAgICAgICAgICAgZGVjb2RlVWludHZhckludGVnZXIoc3RhcnRJbmRleCArIDEpOworICAgICAgICAgICAgZGF0YUxlbmd0aCsrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgotICAgICogRGVjb2RlIHRoZSAiRXh0ZW5zaW9uLW1lZGlhIiB0eXBlIGZvciBXU1AgUERVLgotICAgICoKLSAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIkV4dGVuc2lvbi1tZWRpYSIgaW4gdGhpcyBQRFUuCi0gICAgKgotICAgICogQHJldHVybiBmYWxzZSBvbiBlcnJvciwgc3VjaCBhcyBpZiB0aGVyZSBpcyBubyBFeHRlbnNpb24tbWVkaWEgYXQgc3RhcnRJbmRleC4KLSAgICAqIFNpZGUtZWZmZWN0czogdXBkYXRlcyBzdHJpbmdWYWx1ZSAoYXZhaWxhYmxlIHdpdGggZ2V0VmFsdWVTdHJpbmcoKSksIHdoaWNoIHdpbGwgYmUKLSAgICAqIG51bGwgb24gZXJyb3IuIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIFBEVSBpcyBhdmFpbGFibGUgd2l0aCBnZXRWYWx1ZTMyKCksIDAKLSAgICAqIG9uIGVycm9yLgotICAgICovCisgICAgICogRGVjb2RlIHRoZSAiRXh0ZW5zaW9uLW1lZGlhIiB0eXBlIGZvciBXU1AgUERVLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSAiRXh0ZW5zaW9uLW1lZGlhIiBpbiB0aGlzIFBEVS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHN1Y2ggYXMgaWYgdGhlcmUgaXMgbm8gRXh0ZW5zaW9uLW1lZGlhIGF0IHN0YXJ0SW5kZXguCisgICAgICogICAgICAgICBTaWRlLWVmZmVjdHM6IHVwZGF0ZXMgc3RyaW5nVmFsdWUgKGF2YWlsYWJsZSB3aXRoCisgICAgICogICAgICAgICBnZXRWYWx1ZVN0cmluZygpKSwgd2hpY2ggd2lsbCBiZSBudWxsIG9uIGVycm9yLiBUaGUgbGVuZ3RoIG9mIHRoZQorICAgICAqICAgICAgICAgZGF0YSBpbiB0aGUgUERVIGlzIGF2YWlsYWJsZSB3aXRoIGdldFZhbHVlMzIoKSwgMCBvbiBlcnJvci4KKyAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVFeHRlbnNpb25NZWRpYShpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwogICAgICAgICBkYXRhTGVuZ3RoID0gMDsKQEAgLTIxNCw3ICszNzUsNyBAQAogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCi0gICAgICAgIGRhdGFMZW5ndGggID0gaW5kZXggLSBzdGFydEluZGV4ICsgMTsKKyAgICAgICAgZGF0YUxlbmd0aCA9IGluZGV4IC0gc3RhcnRJbmRleCArIDE7CiAgICAgICAgIHN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZyh3c3BEYXRhLCBzdGFydEluZGV4LCBkYXRhTGVuZ3RoIC0gMSk7CiAKICAgICAgICAgcmV0dXJuIHJ0cm47CkBAIC0yMjcsNyArMzg4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBDb25zdHJhaW5lZC1lbmNvZGluZykgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGZpcnN0IGJ5IGdldFZhbHVlU3RyaW5nKCkgYW5kIHNlY29uZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCi0gICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZUNvbnN0cmFpbmVkRW5jb2RpbmcoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaWYgKGRlY29kZVNob3J0SW50ZWdlcihzdGFydEluZGV4KSA9PSB0cnVlKSB7CkBAIC0yNDIsMzEgKzQwMywxNjIgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIkNvbnRlbnQtdHlwZSIgaW4gdGhpcyBwZHUKICAgICAgKgotICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBDb250ZW50LXR5cGUpIG9jY3VyCi0gICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBmaXJzdCBieSBnZXRWYWx1ZVN0cmluZygpIGFuZCBzZWNvbmQgYnkgZ2V0VmFsdWUzMigpCi0gICAgICogICAgICAgICBtZXRob2QgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBDb250ZW50LXR5cGUpIG9jY3VycworICAgICAqICAgICAgICAgSWYgYSBjb250ZW50IHR5cGUgZXhpc3RzIGluIHRoZSBoZWFkZXJzIChlaXRoZXIgYXMgaW5saW5lIHN0cmluZywgb3IgYXMgd2VsbC1rbm93bgorICAgICAqICAgICAgICAgdmFsdWUpLCBnZXRWYWx1ZVN0cmluZygpIHdpbGwgcmV0dXJuIGl0LiBJZiBhICd3ZWxsIGtub3duIHZhbHVlJyBpcyBlbmNvdW50ZXJlZCB0aGF0CisgICAgICogICAgICAgICBjYW5ub3QgYmUgbWFwcGVkIHRvIGEgc3RyaW5nIG1pbWUgdHlwZSwgZ2V0VmFsdWVTdHJpbmcoKSB3aWxsIHJldHVybiBudWxsLCBhbmQKKyAgICAgKiAgICAgICAgIGdldFZhbHVlMzIoKSB3aWxsIHJldHVybiB0aGUgdW5rbm93biBjb250ZW50IHR5cGUgdmFsdWUuCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAorICAgICAqICAgICAgICAgQW55IGNvbnRlbnQgdHlwZSBwYXJhbWV0ZXJzIHdpbGwgYmUgYWNjZXNzaWJsZSB2aWEgZ2V0Q29udGVudFBhcmFtZXRlcnMoKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZUNvbnRlbnRUeXBlKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIGludCBtZWRpYVByZWZpeExlbmd0aDsKLSAgICAgICAgbG9uZyBtZWRpYUZpZWxkTGVuZ3RoOworICAgICAgICBjb250ZW50UGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogCi0gICAgICAgIGlmIChkZWNvZGVWYWx1ZUxlbmd0aChzdGFydEluZGV4KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZUNvbnN0cmFpbmVkRW5jb2Rpbmcoc3RhcnRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVkaWFQcmVmaXhMZW5ndGggPSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpOwotICAgICAgICBtZWRpYUZpZWxkTGVuZ3RoID0gZ2V0VmFsdWUzMigpOwotICAgICAgICBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXggKyBtZWRpYVByZWZpeExlbmd0aCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgZGF0YUxlbmd0aCArPSBtZWRpYVByZWZpeExlbmd0aDsKLSAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNvZGVFeHRlbnNpb25NZWRpYShzdGFydEluZGV4ICsgbWVkaWFQcmVmaXhMZW5ndGgpID09IHRydWUpIHsKLSAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gbWVkaWFQcmVmaXhMZW5ndGg7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkZWNvZGVWYWx1ZUxlbmd0aChzdGFydEluZGV4KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBkZWNvZGVDb25zdHJhaW5lZEVuY29kaW5nKHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBleHBhbmRXZWxsS25vd25NaW1lVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaGVhZGVyc0xlbmd0aCA9IChpbnQpIHVuc2lnbmVkMzJiaXQ7CisgICAgICAgICAgICBtZWRpYVByZWZpeExlbmd0aCA9IGdldERlY29kZWREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXggKyBtZWRpYVByZWZpeExlbmd0aCkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gbWVkaWFQcmVmaXhMZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHJlYWRMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBleHBhbmRXZWxsS25vd25NaW1lVHlwZSgpOworICAgICAgICAgICAgICAgIGxvbmcgd2VsbEtub3duVmFsdWUgPSB1bnNpZ25lZDMyYml0OworICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHN0cmluZ1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyZWFkQ29udGVudFBhcmFtZXRlcnMoc3RhcnRJbmRleCArIGRhdGFMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyc0xlbmd0aCAtIChkYXRhTGVuZ3RoIC0gbWVkaWFQcmVmaXhMZW5ndGgpKSwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCArPSByZWFkTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDMyYml0ID0gd2VsbEtub3duVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbWltZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVjb2RlRXh0ZW5zaW9uTWVkaWEoc3RhcnRJbmRleCArIG1lZGlhUHJlZml4TGVuZ3RoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCArPSBtZWRpYVByZWZpeExlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZExlbmd0aCA9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgZXhwYW5kV2VsbEtub3duTWltZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBsb25nIHdlbGxLbm93blZhbHVlID0gdW5zaWduZWQzMmJpdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBzdHJpbmdWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZENvbnRlbnRQYXJhbWV0ZXJzKHN0YXJ0SW5kZXggKyBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlcnNMZW5ndGggLSAoZGF0YUxlbmd0aCAtIG1lZGlhUHJlZml4TGVuZ3RoKSksIDApKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gcmVhZExlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQzMmJpdCA9IHdlbGxLbm93blZhbHVlOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG1pbWVUeXBlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL3NvbWV0aGluZyBkb2Vzbid0IGFkZCB1cAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVhZENvbnRlbnRQYXJhbWV0ZXJzKGludCBzdGFydEluZGV4LCBpbnQgbGVmdFRvUmVhZCwgaW50IGFjY3VtdWxhdG9yKSB7CisKKyAgICAgICAgaW50IHRvdGFsUmVhZCA9IDA7CisKKyAgICAgICAgaWYgKGxlZnRUb1JlYWQgPiAwKSB7CisgICAgICAgICAgICBieXRlIG5leHRCeXRlID0gd3NwRGF0YVtzdGFydEluZGV4XTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBudWxsOworICAgICAgICAgICAgaWYgKChuZXh0Qnl0ZSAmIDB4ODApID09IDB4MDAgJiYgbmV4dEJ5dGUgPiAzMSkgeyAvLyB1bnR5cGVkCisgICAgICAgICAgICAgICAgZGVjb2RlVG9rZW5UZXh0KHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgICAgIHBhcmFtID0gc3RyaW5nVmFsdWU7CisgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0eXBlZAorICAgICAgICAgICAgICAgIGlmIChkZWNvZGVJbnRlZ2VyVmFsdWUoc3RhcnRJbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGludCB3ZWxsS25vd25QYXJhbWV0ZXJWYWx1ZSA9IChpbnQpIHVuc2lnbmVkMzJiaXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gV0VMTF9LTk9XTl9QQVJBTUVURVJTLmdldCh3ZWxsS25vd25QYXJhbWV0ZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9ICJ1bmFzc2lnbmVkLzB4IiArIExvbmcudG9IZXhTdHJpbmcod2VsbEtub3duUGFyYW1ldGVyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlICJRIiBwYXJhbWV0ZXIsIHZhbHVlIGlzIGEgdWludHZhcgorICAgICAgICAgICAgICAgICAgICBpZiAod2VsbEtub3duUGFyYW1ldGVyVmFsdWUgPT0gUV9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZVVpbnR2YXJJbnRlZ2VyKHN0YXJ0SW5kZXggKyB0b3RhbFJlYWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcudmFsdWVPZih1bnNpZ25lZDMyYml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyYW1ldGVycy5wdXQocGFyYW0sIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZENvbnRlbnRQYXJhbWV0ZXJzKHN0YXJ0SW5kZXggKyB0b3RhbFJlYWQsIGxlZnRUb1JlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdG90YWxSZWFkLCBhY2N1bXVsYXRvciArIHRvdGFsUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVOb1ZhbHVlKHN0YXJ0SW5kZXggKyB0b3RhbFJlYWQpKSB7CisgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVJbnRlZ2VyVmFsdWUoc3RhcnRJbmRleCArIHRvdGFsUmVhZCkpIHsKKyAgICAgICAgICAgICAgICB0b3RhbFJlYWQgKz0gZGF0YUxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgaW50VmFsdWUgPSAoaW50KSB1bnNpZ25lZDMyYml0OworICAgICAgICAgICAgICAgIGlmIChpbnRWYWx1ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcudmFsdWVPZihpbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVUb2tlblRleHQoc3RhcnRJbmRleCArIHRvdGFsUmVhZCk7CisgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJpbmdWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiXCIiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBxdW90ZWQgc3RyaW5nLCBzbyByZW1vdmUgdGhlIHF1b3RlCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRlbnRQYXJhbWV0ZXJzLnB1dChwYXJhbSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRDb250ZW50UGFyYW1ldGVycyhzdGFydEluZGV4ICsgdG90YWxSZWFkLCBsZWZ0VG9SZWFkIC0gdG90YWxSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciArIHRvdGFsUmVhZCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFMZW5ndGggPSBhY2N1bXVsYXRvcjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIG5leHQgYnl0ZSBpcyBOby1WYWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSAiQ29udGVudCBsZW5ndGgiIGluIHRoaXMgcGR1CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG5leHQgYnl0ZSBpcyAweDAwCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZU5vVmFsdWUoaW50IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgaWYgKHdzcERhdGFbc3RhcnRJbmRleF0gPT0gMCkgeworICAgICAgICAgICAgZGF0YUxlbmd0aCA9IDE7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHN0cmluZ1ZhbHVlIHdpdGggdGhlIG1pbWUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBpbiB1bnNpZ25lZDMyYml0CisgICAgICoKKyAgICAgKiBTZXRzIHVuc2lnbmVkMzJiaXQgdG8gLTEgaWYgc3RyaW5nVmFsdWUgaXMgYWxyZWFkeSBwb3B1bGF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwYW5kV2VsbEtub3duTWltZVR5cGUoKSB7CisgICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnQgYmluYXJ5Q29udGVudFR5cGUgPSAoaW50KSB1bnNpZ25lZDMyYml0OworICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBXRUxMX0tOT1dOX01JTUVfVFlQRVMuZ2V0KGJpbmFyeUNvbnRlbnRUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIERlY29kZSB0aGUgIkNvbnRlbnQgbGVuZ3RoIiB0eXBlIGZvciBXU1AgcGR1CiAgICAgICoKQEAgLTI3NCw3ICs1NjYsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIENvbnRlbnQgbGVuZ3RoKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVDb250ZW50TGVuZ3RoKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIHJldHVybiBkZWNvZGVJbnRlZ2VyVmFsdWUoc3RhcnRJbmRleCk7CkBAIC0yODcsNyArNTc5LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBDb250ZW50IGxvY2F0aW9uKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlQ29udGVudExvY2F0aW9uKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIHJldHVybiBkZWNvZGVUZXh0U3RyaW5nKHN0YXJ0SW5kZXgpOwpAQCAtMzAwLDcgKzU5Miw4IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgWC1XYXAtQXBwbGljYXRpb24tSWQpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBmaXJzdCBieSBnZXRWYWx1ZVN0cmluZygpIGFuZCBzZWNvbmQgYnkgZ2V0VmFsdWUzMigpCi0gICAgICogICAgICAgICBtZXRob2QgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbWV0aG9kCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIGlmIChkZWNvZGVJbnRlZ2VyVmFsdWUoc3RhcnRJbmRleCkgPT0gdHJ1ZSkgewpAQCAtMzExLDEzICs2MDQsNzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZWVrIGZvciB0aGUgIlgtV2FwLUFwcGxpY2F0aW9uLUlkIiBmaWVsZCBmb3IgV1NQIHBkdQorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHNlZWsgcG9pbnRlcgorICAgICAqIEBwYXJhbSBlbmRJbmRleCBWYWxpZCBzZWVrIGFyZWEgZW5kIHBvaW50CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgWC1XYXAtQXBwbGljYXRpb24tSWQpIG9jY3VyCisgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWVrWFdhcEFwcGxpY2F0aW9uSWQoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgeworICAgICAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPD0gZW5kSW5kZXg7ICkgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIDguNC4xLjEgIEZpZWxkIG5hbWUKKyAgICAgICAgICAgICAgICAgKiBGaWVsZCBuYW1lIGlzIGludGVnZXIgb3IgdGV4dC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRWYWx1ZSA9IChpbnQpIGdldFZhbHVlMzIoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PSBQQVJBTUVURVJfSURfWF9XQVBfQVBQTElDQVRJT05fSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGVjb2RlVGV4dFN0cmluZyhpbmRleCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggKz0gZ2V0RGVjb2RlZERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBlbmRJbmRleCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogOC40LjEuMiBGaWVsZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgKiBWYWx1ZSBJbnRlcnByZXRhdGlvbiBvZiBGaXJzdCBPY3RldAorICAgICAgICAgICAgICAgICAqIDAgLSAzMCBUaGlzIG9jdGV0IGlzIGZvbGxvd2VkIGJ5IHRoZSBpbmRpY2F0ZWQgbnVtYmVyICgwIC0gMzApCisgICAgICAgICAgICAgICAgICAgICAgICBvZiBkYXRhIG9jdGV0cworICAgICAgICAgICAgICAgICAqIDMxIFRoaXMgb2N0ZXQgaXMgZm9sbG93ZWQgYnkgYSB1aW50dmFyLCB3aGljaCBpbmRpY2F0ZXMgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAqICAgICAgb2YgZGF0YSBvY3RldHMgYWZ0ZXIgaXQKKyAgICAgICAgICAgICAgICAgKiAzMiAtIDEyNyBUaGUgdmFsdWUgaXMgYSB0ZXh0IHN0cmluZywgdGVybWluYXRlZCBieSBhIHplcm8gb2N0ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIChOVUwgY2hhcmFjdGVyKQorICAgICAgICAgICAgICAgICAqIDEyOCAtIDI1NSBJdCBpcyBhbiBlbmNvZGVkIDctYml0IHZhbHVlOyB0aGlzIGhlYWRlciBoYXMgbm8gbW9yZSBkYXRhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnl0ZSB2YWwgPSB3c3BEYXRhW2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSB2YWwgJiYgdmFsIDw9IFdBUF9QRFVfU0hPUlRfTEVOR1RIX01BWCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSB3c3BEYXRhW2luZGV4XSArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gV0FQX1BEVV9MRU5HVEhfUVVPVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSBlbmRJbmRleCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY29kZVVpbnR2YXJJbnRlZ2VyKGluZGV4KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoV0FQX1BEVV9MRU5HVEhfUVVPVEUgPCB2YWwgJiYgdmFsIDw9IDEyNykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY29kZVRleHRTdHJpbmcoaW5kZXgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGdldERlY29kZWREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL3NlZWsgYXBwbGljYXRpb24gSUQgZmFpbGVkLiBXU1AgaGVhZGVyIG1pZ2h0IGJlIGNvcnJ1cHRlZAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEZWNvZGUgdGhlICJYLVdhcC1Db250ZW50LVVSSSIgdHlwZSBmb3IgV1NQIHBkdQogICAgICAqCiAgICAgICogQHBhcmFtIHN0YXJ0SW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSAiWC1XYXAtQ29udGVudC1VUkkiIGluIHRoaXMgcGR1CiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgWC1XYXAtQ29udGVudC1VUkkpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZVN0cmluZygpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVYV2FwQ29udGVudFVSSShpbnQgc3RhcnRJbmRleCkgewogICAgICAgICByZXR1cm4gZGVjb2RlVGV4dFN0cmluZyhzdGFydEluZGV4KTsKQEAgLTMzMCw3ICs2ODcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFgtV2FwLUluaXRpYXRvci1VUkkpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZVN0cmluZygpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVYV2FwSW5pdGlhdG9yVVJJKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIHJldHVybiBkZWNvZGVUZXh0U3RyaW5nKHN0YXJ0SW5kZXgpOwpAQCAtMzU2LDQgKzcxMywxOCBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbnkgcGFyYW1ldGVycyBlbmNvdW50ZXJlZCBhcyBwYXJ0IG9mIGEgZGVjb2RlQ29udGVudFR5cGUoKSBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhIG1hcCBvZiBjb250ZW50IHBhcmFtZXRlcnMga2V5ZWQgYnkgdGhlaXIgbmFtZXMsIG9yIG51bGwgaWYKKyAgICAgKiAgICAgICAgIGRlY29kZUNvbnRlbnRUeXBlKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCBJZiBhbnkgdW5hc3NpZ25lZAorICAgICAqICAgICAgICAgd2VsbC1rbm93biBwYXJhbWV0ZXJzIGFyZSBlbmNvdW50ZXJlZCwgdGhlIGtleSBvZiB0aGUgbWFwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICd1bmFzc2lnbmVkLzB4Li4uJywgd2hlcmUgJy4uLicgaXMgdGhlIGhleCB2YWx1ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIHVuYXNzaWduZWQgcGFyYW1ldGVyLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIE5vLVZhbHVlIHRoZSB2YWx1ZSB3aWxsIGJlIG51bGwuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q29udGVudFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50UGFyYW1ldGVyczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9BcHBJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQXBwSW50ZXJmYWNlLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQXBwSW50ZXJmYWNlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQXBwSW50ZXJmYWNlLmphdmEKaW5kZXggNThmMWY5Ny4uMmViNmNjYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQXBwSW50ZXJmYWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9BcHBJbnRlcmZhY2UuamF2YQpAQCAtMTQsMjkgKzE0LDI5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAvKioKLSAqIEludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIFNUSyBBcHAgYW5kIFNUSyBUZWxlcGhvbnkKKyAqIEludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIFNUSyBBcHAgYW5kIENBVCBUZWxlcGhvbnkKICAqCiAgKiB7QGhpZGV9CiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQXBwSW50ZXJmYWNlIHsKIAogICAgIC8qCi0gICAgICogSW50ZW50J3MgYWN0aW9ucyB3aGljaCBhcmUgYnJvYWRjYXN0ZWQgYnkgdGhlIFRlbGVwaG9ueSBvbmNlIGEgbmV3IFNUSworICAgICAqIEludGVudCdzIGFjdGlvbnMgd2hpY2ggYXJlIGJyb2FkY2FzdGVkIGJ5IHRoZSBUZWxlcGhvbnkgb25jZSBhIG5ldyBDQVQKICAgICAgKiBwcm9hY3RpdmUgY29tbWFuZCwgc2Vzc2lvbiBlbmQgYXJyaXZlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUS19DTURfQUNUSU9OID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRfQ01EX0FDVElPTiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLnN0ay5jb21tYW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEtfU0VTU0lPTl9FTkRfQUNUSU9OID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRfU0VTU0lPTl9FTkRfQUNUSU9OID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uc3RrLnNlc3Npb25fZW5kIjsKIAogICAgIC8qCiAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBhcHAgdG8gdGVsZXBob255IHRvIHBhc3MgYSByZXN1bHQgY29kZSBhbmQgdXNlcidzCi0gICAgICogaW5wdXQgYmFjayB0byB0aGUgU0lNLgorICAgICAqIGlucHV0IGJhY2sgdG8gdGhlIElDQy4KICAgICAgKi8KLSAgICB2b2lkIG9uQ21kUmVzcG9uc2UoU3RrUmVzcG9uc2VNZXNzYWdlIHJlc01zZyk7CisgICAgdm9pZCBvbkNtZFJlc3BvbnNlKENhdFJlc3BvbnNlTWVzc2FnZSByZXNNc2cpOwogCiAgICAgLyoKICAgICAgKiBFbnVtZXJhdGlvbiBmb3IgcmVwcmVzZW50aW5nICJUeXBlIG9mIENvbW1hbmQiIG9mIHByb2FjdGl2ZSBjb21tYW5kcy4KQEAgLTU4LDcgKzU4LDggQEAKICAgICAgICAgU0VUX1VQX0VWRU5UX0xJU1QoMHgwNSksCiAgICAgICAgIFNFVF9VUF9JRExFX01PREVfVEVYVCgweDI4KSwKICAgICAgICAgU0VUX1VQX01FTlUoMHgyNSksCi0gICAgICAgIFNFVF9VUF9DQUxMKDB4MTApOworICAgICAgICBTRVRfVVBfQ0FMTCgweDEwKSwKKyAgICAgICAgUFJPVklERV9MT0NBTF9JTkZPUk1BVElPTigweDI2KTsKIAogICAgICAgICBwcml2YXRlIGludCBtVmFsdWU7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0JlclRsdi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9CZXJUbHYuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9CZXJUbHYuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9CZXJUbHYuamF2YQppbmRleCAxOWQzMjc5Li43NzRiZmEzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9CZXJUbHYuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0JlclRsdi5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0NtZE1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0Q21kTWVzc2FnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0NtZE1lc3NhZ2UuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRDbWRNZXNzYWdlLmphdmEKaW5kZXggNTQyNWE0My4uNTE1NWJiMiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrQ21kTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0Q21kTWVzc2FnZS5qYXZhCkBAIC0xNCwxNyArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiAKIC8qKgotICogQ2xhc3MgdXNlZCB0byBwYXNzIFNUSyBtZXNzYWdlcyBmcm9tIHRlbGVwaG9ueSB0byBhcHBsaWNhdGlvbi4gQXBwbGljYXRpb24KKyAqIENsYXNzIHVzZWQgdG8gcGFzcyBDQVQgbWVzc2FnZXMgZnJvbSB0ZWxlcGhvbnkgdG8gYXBwbGljYXRpb24uIEFwcGxpY2F0aW9uCiAgKiBzaG91bGQgY2FsbCBnZXRYWFgoKSB0byBnZXQgY29tbWFuZHMncyBzcGVjaWZpYyB2YWx1ZXMuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgU3RrQ21kTWVzc2FnZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworcHVibGljIGNsYXNzIENhdENtZE1lc3NhZ2UgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvLyBtZW1iZXJzCiAgICAgQ29tbWFuZERldGFpbHMgbUNtZERldDsKICAgICBwcml2YXRlIFRleHRNZXNzYWdlIG1UZXh0TXNnOwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICBwdWJsaWMgVGV4dE1lc3NhZ2UgY2FsbE1zZzsKICAgICB9CiAKLSAgICBTdGtDbWRNZXNzYWdlKENvbW1hbmRQYXJhbXMgY21kUGFyYW1zKSB7CisgICAgQ2F0Q21kTWVzc2FnZShDb21tYW5kUGFyYW1zIGNtZFBhcmFtcykgewogICAgICAgICBtQ21kRGV0ID0gY21kUGFyYW1zLmNtZERldDsKICAgICAgICAgc3dpdGNoKGdldENtZFR5cGUoKSkgewogICAgICAgICBjYXNlIFNFVF9VUF9NRU5VOgpAQCAtODgsNyArODgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIFN0a0NtZE1lc3NhZ2UoUGFyY2VsIGluKSB7CisgICAgcHVibGljIENhdENtZE1lc3NhZ2UoUGFyY2VsIGluKSB7CiAgICAgICAgIG1DbWREZXQgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKICAgICAgICAgbVRleHRNc2cgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKICAgICAgICAgbU1lbnUgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKQEAgLTEzMCwxMyArMTMwLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTdGtDbWRNZXNzYWdlPiBDUkVBVE9SID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTdGtDbWRNZXNzYWdlPigpIHsKLSAgICAgICAgcHVibGljIFN0a0NtZE1lc3NhZ2UgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RrQ21kTWVzc2FnZShpbik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2F0Q21kTWVzc2FnZT4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q2F0Q21kTWVzc2FnZT4oKSB7CisgICAgICAgIHB1YmxpYyBDYXRDbWRNZXNzYWdlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhdENtZE1lc3NhZ2UoaW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFN0a0NtZE1lc3NhZ2VbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGtDbWRNZXNzYWdlW3NpemVdOworICAgICAgICBwdWJsaWMgQ2F0Q21kTWVzc2FnZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhdENtZE1lc3NhZ2Vbc2l6ZV07CiAgICAgICAgIH0KICAgICB9OwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0RXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0RXhjZXB0aW9uLmphdmEKaW5kZXggODZkZTM2Ni4uMWJmMTM2OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRFeGNlcHRpb24uamF2YQpAQCAtMTQsMTggKzE0LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiAKIAogLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gU1RLIHNlcnZpY2UuCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gQ0FUIHNlcnZpY2UuCiAgKgogICoge0BoaWRlfQogICovCi1jbGFzcyBTdGtFeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgU3RrRXhjZXB0aW9uKCkgeworY2xhc3MgQ2F0RXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIENhdEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtMb2cuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0TG9nLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrTG9nLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0TG9nLmphdmEKaW5kZXggYmQ2YmM4Zi4uZTE5ZmY0MyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrTG9nLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRMb2cuamF2YQpAQCAtMTQsMTEgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0a0xvZyB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0TG9nIHsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZChPYmplY3QgY2FsbGVyLCBTdHJpbmcgbXNnKSB7CkBAIC0yNyw3ICsyNyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2FsbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBMb2cuZCgiU1RLIiwgY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpICsgIjogIgorICAgICAgICBMb2cuZCgiQ0FUIiwgY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpICsgIjogIgogICAgICAgICAgICAgICAgICsgbXNnKTsKICAgICB9CiAKQEAgLTM2LDYgKzM2LDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIExvZy5kKCJTVEsiLCBjYWxsZXIgKyAiOiAiICsgbXNnKTsKKyAgICAgICAgTG9nLmQoIkNBVCIsIGNhbGxlciArICI6ICIgKyBtc2cpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a1Jlc3BvbnNlTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRSZXNwb25zZU1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtSZXNwb25zZU1lc3NhZ2UuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRSZXNwb25zZU1lc3NhZ2UuamF2YQppbmRleCAwNGE1MmU2Li5jZmNhYzM2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtSZXNwb25zZU1lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdFJlc3BvbnNlTWVzc2FnZS5qYXZhCkBAIC0xNCw5ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCi1wdWJsaWMgY2xhc3MgU3RrUmVzcG9uc2VNZXNzYWdlIHsKK3B1YmxpYyBjbGFzcyBDYXRSZXNwb25zZU1lc3NhZ2UgewogICAgICAgICBDb21tYW5kRGV0YWlscyBjbWREZXQgPSBudWxsOwogICAgICAgICBSZXN1bHRDb2RlIHJlc0NvZGUgID0gUmVzdWx0Q29kZS5PSzsKICAgICAgICAgaW50IHVzZXJzTWVudVNlbGVjdGlvbiA9IDA7CkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIGJvb2xlYW4gdXNlcnNZZXNOb1NlbGVjdGlvbiA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHVzZXJzQ29uZmlybSA9IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBTdGtSZXNwb25zZU1lc3NhZ2UoU3RrQ21kTWVzc2FnZSBjbWRNc2cpIHsKKyAgICAgICAgcHVibGljIENhdFJlc3BvbnNlTWVzc2FnZShDYXRDbWRNZXNzYWdlIGNtZE1zZykgewogICAgICAgICAgICAgdGhpcy5jbWREZXQgPSBjbWRNc2cubUNtZERldDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtTZXJ2aWNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdFNlcnZpY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtTZXJ2aWNlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0U2VydmljZS5qYXZhCmluZGV4IDI5ZWQ5NWMuLjM2MDU5YWQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a1NlcnZpY2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdFNlcnZpY2UuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yMiwxMiArMjIsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltQ2FyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTUZpbGVIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1JlY29yZHM7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogCkBAIC0xMTEsMTcgKzExMiwxOSBAQAogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGNsYXNzIFN0a1NlcnZpY2UgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgQXBwSW50ZXJmYWNlIHsKK3B1YmxpYyBjbGFzcyBDYXRTZXJ2aWNlIGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIEFwcEludGVyZmFjZSB7CiAKICAgICAvLyBDbGFzcyBtZW1iZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgU0lNUmVjb3JkcyBtU2ltUmVjb3JkczsKKyAgICBwcml2YXRlIHN0YXRpYyBJY2NSZWNvcmRzIG1JY2NSZWNvcmRzOwogCiAgICAgLy8gU2VydmljZSBtZW1iZXJzLgotICAgIHByaXZhdGUgc3RhdGljIFN0a1NlcnZpY2Ugc0luc3RhbmNlOworICAgIC8vIFByb3RlY3RzIHNpbmdsZXRvbiBpbnN0YW5jZSBsYXp5IGluaXRpYWxpemF0aW9uLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzSW5zdGFuY2VMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIENhdFNlcnZpY2Ugc0luc3RhbmNlOwogICAgIHByaXZhdGUgQ29tbWFuZHNJbnRlcmZhY2UgbUNtZElmOwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIFN0a0NtZE1lc3NhZ2UgbUN1cnJudENtZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdGtDbWRNZXNzYWdlIG1NZW51Q21kID0gbnVsbDsKKyAgICBwcml2YXRlIENhdENtZE1lc3NhZ2UgbUN1cnJudENtZCA9IG51bGw7CisgICAgcHJpdmF0ZSBDYXRDbWRNZXNzYWdlIG1NZW51Q21kID0gbnVsbDsKIAogICAgIHByaXZhdGUgUmlsTWVzc2FnZURlY29kZXIgbU1zZ0RlY29kZXIgPSBudWxsOwogCkBAIC0xMzYsNyArMTM5LDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE1TR19JRF9SSUxfTVNHX0RFQ09ERUQgICAgICAgICAgPSAxMDsKIAogICAgIC8vIEV2ZW50cyB0byBzaWduYWwgU0lNIHByZXNlbmNlIG9yIGFic2VudCBpbiB0aGUgZGV2aWNlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfSURfU0lNX0xPQURFRCAgICAgICA9IDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfSURfSUNDX1JFQ09SRFNfTE9BREVEICAgICAgID0gMjA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX0tFWVBBRCAgICAgID0gMHgwMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX0RJU1BMQVkgICAgID0gMHgwMjsKQEAgLTE0NiwxMCArMTQ5LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVl9JRF9ORVRXT1JLICAgICA9IDB4ODM7CiAKICAgICAvKiBJbnRlbnRpb25hbGx5IHByaXZhdGUgZm9yIHNpbmdsZXRvbiAqLwotICAgIHByaXZhdGUgU3RrU2VydmljZShDb21tYW5kc0ludGVyZmFjZSBjaSwgU0lNUmVjb3JkcyBzciwgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgU0lNRmlsZUhhbmRsZXIgZmgsIFNpbUNhcmQgc2MpIHsKLSAgICAgICAgaWYgKGNpID09IG51bGwgfHwgc3IgPT0gbnVsbCB8fCBjb250ZXh0ID09IG51bGwgfHwgZmggPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IHNjID09IG51bGwpIHsKKyAgICBwcml2YXRlIENhdFNlcnZpY2UoQ29tbWFuZHNJbnRlcmZhY2UgY2ksIEljY1JlY29yZHMgaXIsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIEljY0ZpbGVIYW5kbGVyIGZoLCBJY2NDYXJkIGljKSB7CisgICAgICAgIGlmIChjaSA9PSBudWxsIHx8IGlyID09IG51bGwgfHwgY29udGV4dCA9PSBudWxsIHx8IGZoID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBpYyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlOiBJbnB1dCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKICAgICAgICAgfQpAQCAtMTYwLDMzICsxNjMsMzMgQEAKICAgICAgICAgbU1zZ0RlY29kZXIgPSBSaWxNZXNzYWdlRGVjb2Rlci5nZXRJbnN0YW5jZSh0aGlzLCBmaCk7CiAKICAgICAgICAgLy8gUmVnaXN0ZXIgcmlsIGV2ZW50cyBoYW5kbGluZy4KLSAgICAgICAgbUNtZElmLnNldE9uU3RrU2Vzc2lvbkVuZCh0aGlzLCBNU0dfSURfU0VTU0lPTl9FTkQsIG51bGwpOwotICAgICAgICBtQ21kSWYuc2V0T25TdGtQcm9hY3RpdmVDbWQodGhpcywgTVNHX0lEX1BST0FDVElWRV9DT01NQU5ELCBudWxsKTsKLSAgICAgICAgbUNtZElmLnNldE9uU3RrRXZlbnQodGhpcywgTVNHX0lEX0VWRU5UX05PVElGWSwgbnVsbCk7Ci0gICAgICAgIG1DbWRJZi5zZXRPblN0a0NhbGxTZXRVcCh0aGlzLCBNU0dfSURfQ0FMTF9TRVRVUCwgbnVsbCk7CisgICAgICAgIG1DbWRJZi5zZXRPbkNhdFNlc3Npb25FbmQodGhpcywgTVNHX0lEX1NFU1NJT05fRU5ELCBudWxsKTsKKyAgICAgICAgbUNtZElmLnNldE9uQ2F0UHJvYWN0aXZlQ21kKHRoaXMsIE1TR19JRF9QUk9BQ1RJVkVfQ09NTUFORCwgbnVsbCk7CisgICAgICAgIG1DbWRJZi5zZXRPbkNhdEV2ZW50KHRoaXMsIE1TR19JRF9FVkVOVF9OT1RJRlksIG51bGwpOworICAgICAgICBtQ21kSWYuc2V0T25DYXRDYWxsU2V0VXAodGhpcywgTVNHX0lEX0NBTExfU0VUVVAsIG51bGwpOwogICAgICAgICAvL21DbWRJZi5zZXRPblNpbVJlZnJlc2godGhpcywgTVNHX0lEX1JFRlJFU0gsIG51bGwpOwogCi0gICAgICAgIG1TaW1SZWNvcmRzID0gc3I7CisgICAgICAgIG1JY2NSZWNvcmRzID0gaXI7CiAKICAgICAgICAgLy8gUmVnaXN0ZXIgZm9yIFNJTSByZWFkeSBldmVudC4KLSAgICAgICAgbVNpbVJlY29yZHMucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHRoaXMsIE1TR19JRF9TSU1fTE9BREVELCBudWxsKTsKKyAgICAgICAgbUljY1JlY29yZHMucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHRoaXMsIE1TR19JRF9JQ0NfUkVDT1JEU19MT0FERUQsIG51bGwpOwogCiAgICAgICAgIG1DbWRJZi5yZXBvcnRTdGtTZXJ2aWNlSXNSdW5uaW5nKG51bGwpOwotICAgICAgICBTdGtMb2cuZCh0aGlzLCAiU3RrU2VydmljZTogaXMgcnVubmluZyIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAiSXMgcnVubmluZyIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIG1TaW1SZWNvcmRzLnVucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHRoaXMpOwotICAgICAgICBtQ21kSWYudW5TZXRPblN0a1Nlc3Npb25FbmQodGhpcyk7Ci0gICAgICAgIG1DbWRJZi51blNldE9uU3RrUHJvYWN0aXZlQ21kKHRoaXMpOwotICAgICAgICBtQ21kSWYudW5TZXRPblN0a0V2ZW50KHRoaXMpOwotICAgICAgICBtQ21kSWYudW5TZXRPblN0a0NhbGxTZXRVcCh0aGlzKTsKKyAgICAgICAgbUljY1JlY29yZHMudW5yZWdpc3RlckZvclJlY29yZHNMb2FkZWQodGhpcyk7CisgICAgICAgIG1DbWRJZi51blNldE9uQ2F0U2Vzc2lvbkVuZCh0aGlzKTsKKyAgICAgICAgbUNtZElmLnVuU2V0T25DYXRQcm9hY3RpdmVDbWQodGhpcyk7CisgICAgICAgIG1DbWRJZi51blNldE9uQ2F0RXZlbnQodGhpcyk7CisgICAgICAgIG1DbWRJZi51blNldE9uQ2F0Q2FsbFNldFVwKHRoaXMpOwogCiAgICAgICAgIHRoaXMucmVtb3ZlQ2FsbGJhY2tzQW5kTWVzc2FnZXMobnVsbCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJTZXJ2aWNlIGZpbmFsaXplZCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAiU2VydmljZSBmaW5hbGl6ZWQiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmlsTXNnKFJpbE1lc3NhZ2UgcmlsTXNnKSB7CkBAIC0yNDEsNTUgKzI0NCw1MyBAQAogICAgICAqCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2FjdGl2ZUNvbW1hbmQoQ29tbWFuZFBhcmFtcyBjbWRQYXJhbXMpIHsKLSAgICAgICAgU3RrTG9nLmQodGhpcywgY21kUGFyYW1zLmdldENvbW1hbmRUeXBlKCkubmFtZSgpKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgY21kUGFyYW1zLmdldENvbW1hbmRUeXBlKCkubmFtZSgpKTsKIAotICAgICAgICBTdGtDbWRNZXNzYWdlIGNtZE1zZyA9IG5ldyBTdGtDbWRNZXNzYWdlKGNtZFBhcmFtcyk7CisgICAgICAgIENhdENtZE1lc3NhZ2UgY21kTXNnID0gbmV3IENhdENtZE1lc3NhZ2UoY21kUGFyYW1zKTsKICAgICAgICAgc3dpdGNoIChjbWRQYXJhbXMuZ2V0Q29tbWFuZFR5cGUoKSkgewotICAgICAgICBjYXNlIFNFVF9VUF9NRU5VOgotICAgICAgICAgICAgaWYgKHJlbW92ZU1lbnUoY21kTXNnLmdldE1lbnUoKSkpIHsKLSAgICAgICAgICAgICAgICBtTWVudUNtZCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NZW51Q21kID0gY21kTXNnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsIDAsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElTUExBWV9URVhUOgotICAgICAgICAgICAgLy8gd2hlbiBhcHBsaWNhdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8gcmVzcG9uZCwgc2VuZCBhbiBpbW1lZGlhdGUKLSAgICAgICAgICAgIC8vIHJlc3BvbnNlLgotICAgICAgICAgICAgaWYgKCFjbWRNc2cuZ2VUZXh0TWVzc2FnZSgpLnJlc3BvbnNlTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFRlJFU0g6Ci0gICAgICAgICAgICAvLyBNRSBzaWRlIG9ubHkgaGFuZGxlcyByZWZyZXNoIGNvbW1hbmRzIHdoaWNoIG1lYW50IHRvIHJlbW92ZSBJRExFCi0gICAgICAgICAgICAvLyBNT0RFIFRFWFQuCi0gICAgICAgICAgICBjbWRQYXJhbXMuY21kRGV0LnR5cGVPZkNvbW1hbmQgPSBDb21tYW5kVHlwZS5TRVRfVVBfSURMRV9NT0RFX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgLnZhbHVlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVVBfSURMRV9NT0RFX1RFWFQ6Ci0gICAgICAgICAgICBzZW5kVGVybWluYWxSZXNwb25zZShjbWRQYXJhbXMuY21kRGV0LCBSZXN1bHRDb2RlLk9LLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgMCwgbnVsbCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMQVVOQ0hfQlJPV1NFUjoKLSAgICAgICAgY2FzZSBTRUxFQ1RfSVRFTToKLSAgICAgICAgY2FzZSBHRVRfSU5QVVQ6Ci0gICAgICAgIGNhc2UgR0VUX0lOS0VZOgotICAgICAgICBjYXNlIFNFTkRfRFRNRjoKLSAgICAgICAgY2FzZSBTRU5EX1NNUzoKLSAgICAgICAgY2FzZSBTRU5EX1NTOgotICAgICAgICBjYXNlIFNFTkRfVVNTRDoKLSAgICAgICAgY2FzZSBQTEFZX1RPTkU6Ci0gICAgICAgIGNhc2UgU0VUX1VQX0NBTEw6Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIG9uIHRlbGVwaG9ueSEKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIlVuc3VwcG9ydGVkIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgU0VUX1VQX01FTlU6CisgICAgICAgICAgICAgICAgaWYgKHJlbW92ZU1lbnUoY21kTXNnLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1lbnVDbWQgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NZW51Q21kID0gY21kTXNnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kVGVybWluYWxSZXNwb25zZShjbWRQYXJhbXMuY21kRGV0LCBSZXN1bHRDb2RlLk9LLCBmYWxzZSwgMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU1BMQVlfVEVYVDoKKyAgICAgICAgICAgICAgICAvLyB3aGVuIGFwcGxpY2F0aW9uIGlzIG5vdCByZXF1aXJlZCB0byByZXNwb25kLCBzZW5kIGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyAgICAgICAgICAgICAgICBpZiAoIWNtZE1zZy5nZVRleHRNZXNzYWdlKCkucmVzcG9uc2VOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsIDAsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkVGUkVTSDoKKyAgICAgICAgICAgICAgICAvLyBNRSBzaWRlIG9ubHkgaGFuZGxlcyByZWZyZXNoIGNvbW1hbmRzIHdoaWNoIG1lYW50IHRvIHJlbW92ZSBJRExFCisgICAgICAgICAgICAgICAgLy8gTU9ERSBURVhULgorICAgICAgICAgICAgICAgIGNtZFBhcmFtcy5jbWREZXQudHlwZU9mQ29tbWFuZCA9IENvbW1hbmRUeXBlLlNFVF9VUF9JRExFX01PREVfVEVYVC52YWx1ZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfVVBfSURMRV9NT0RFX1RFWFQ6CisgICAgICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsIDAsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9WSURFX0xPQ0FMX0lORk9STUFUSU9OOgorICAgICAgICAgICAgICAgIHNlbmRUZXJtaW5hbFJlc3BvbnNlKGNtZFBhcmFtcy5jbWREZXQsIFJlc3VsdENvZGUuT0ssIGZhbHNlLCAwLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIExBVU5DSF9CUk9XU0VSOgorICAgICAgICAgICAgY2FzZSBTRUxFQ1RfSVRFTToKKyAgICAgICAgICAgIGNhc2UgR0VUX0lOUFVUOgorICAgICAgICAgICAgY2FzZSBHRVRfSU5LRVk6CisgICAgICAgICAgICBjYXNlIFNFTkRfRFRNRjoKKyAgICAgICAgICAgIGNhc2UgU0VORF9TTVM6CisgICAgICAgICAgICBjYXNlIFNFTkRfU1M6CisgICAgICAgICAgICBjYXNlIFNFTkRfVVNTRDoKKyAgICAgICAgICAgIGNhc2UgUExBWV9UT05FOgorICAgICAgICAgICAgY2FzZSBTRVRfVVBfQ0FMTDoKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIG9uIHRlbGVwaG9ueSEKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIlVuc3VwcG9ydGVkIGNvbW1hbmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJudENtZCA9IGNtZE1zZzsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQXBwSW50ZXJmYWNlLlNUS19DTURfQUNUSU9OKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQXBwSW50ZXJmYWNlLkNBVF9DTURfQUNUSU9OKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJTVEsgQ01EIiwgY21kTXNnKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KQEAgLTI5OSwxMCArMzAwLDEwIEBACiAgICAgICoKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2Vzc2lvbkVuZCgpIHsKLSAgICAgICAgU3RrTG9nLmQodGhpcywgIlNFU1NJT04gRU5EIik7CisgICAgICAgIENhdExvZy5kKHRoaXMsICJTRVNTSU9OIEVORCIpOwogCiAgICAgICAgIG1DdXJybnRDbWQgPSBtTWVudUNtZDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQXBwSW50ZXJmYWNlLlNUS19TRVNTSU9OX0VORF9BQ1RJT04pOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChBcHBJbnRlcmZhY2UuQ0FUX1NFU1NJT05fRU5EX0FDVElPTik7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9CiAKQEAgLTMxNSw2ICszMTYsMTEgQEAKICAgICAgICAgfQogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCisgICAgICAgIElucHV0IGNtZElucHV0ID0gbnVsbDsKKyAgICAgICAgaWYgKG1DdXJybnRDbWQgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kSW5wdXQgPSBtQ3Vycm50Q21kLmdlSW5wdXQoKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGNvbW1hbmQgZGV0YWlscwogICAgICAgICBpbnQgdGFnID0gQ29tcHJlaGVuc2lvblRsdlRhZy5DT01NQU5EX0RFVEFJTFMudmFsdWUoKTsKICAgICAgICAgaWYgKGNtZERldC5jb21wUmVxdWlyZWQpIHsKQEAgLTMyNyw3ICszMzMsMTMgQEAKICAgICAgICAgYnVmLndyaXRlKGNtZERldC5jb21tYW5kUXVhbGlmaWVyKTsKIAogICAgICAgICAvLyBkZXZpY2UgaWRlbnRpdGllcwotICAgICAgICB0YWcgPSAweDgwIHwgQ29tcHJlaGVuc2lvblRsdlRhZy5ERVZJQ0VfSURFTlRJVElFUy52YWx1ZSgpOworICAgICAgICAvLyBBY2NvcmRpbmcgdG8gVFMxMDIuMjIzL1RTMzEuMTExIHNlY3Rpb24gNi44IFN0cnVjdHVyZSBvZgorICAgICAgICAvLyBURVJNSU5BTCBSRVNQT05TRSwgIkZvciBhbGwgU0lNUExFLVRMViBvYmplY3RzIHdpdGggTWluPU4sCisgICAgICAgIC8vIHRoZSBNRSBzaG91bGQgc2V0IHRoZSBDUihjb21wcmVoZW5zaW9uIHJlcXVpcmVkKSBmbGFnIHRvCisgICAgICAgIC8vIGNvbXByZWhlbnNpb24gbm90IHJlcXVpcmVkLihDUj0wKSIKKyAgICAgICAgLy8gU2luY2UgREVWSUNFX0lERU5USVRJRVMgYW5kIERVUkFUSU9OIFRMVnMgaGF2ZSBNaW49TiwKKyAgICAgICAgLy8gdGhlIENSIGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgdGFnID0gQ29tcHJlaGVuc2lvblRsdlRhZy5ERVZJQ0VfSURFTlRJVElFUy52YWx1ZSgpOwogICAgICAgICBidWYud3JpdGUodGFnKTsKICAgICAgICAgYnVmLndyaXRlKDB4MDIpOyAvLyBsZW5ndGgKICAgICAgICAgYnVmLndyaXRlKERFVl9JRF9URVJNSU5BTCk7IC8vIHNvdXJjZSBkZXZpY2UgaWQKQEAgLTM0OCwxNyArMzYwLDY1IEBACiAgICAgICAgIC8vIEZpbGwgb3B0aW9uYWwgZGF0YSBmb3IgZWFjaCBjb3JyZXNwb25kaW5nIGNvbW1hbmQKICAgICAgICAgaWYgKHJlc3AgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVzcC5mb3JtYXQoYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuY29kZU9wdGlvbmFsVGFncyhjbWREZXQsIHJlc3VsdENvZGUsIGNtZElucHV0LCBidWYpOwogICAgICAgICB9CiAKICAgICAgICAgYnl0ZVtdIHJhd0RhdGEgPSBidWYudG9CeXRlQXJyYXkoKTsKICAgICAgICAgU3RyaW5nIGhleFN0cmluZyA9IEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcocmF3RGF0YSk7CiAgICAgICAgIGlmIChDb25maWcuTE9HRCkgewotICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIlRFUk1JTkFMIFJFU1BPTlNFOiAiICsgaGV4U3RyaW5nKTsKKyAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJURVJNSU5BTCBSRVNQT05TRTogIiArIGhleFN0cmluZyk7CiAgICAgICAgIH0KIAogICAgICAgICBtQ21kSWYuc2VuZFRlcm1pbmFsUmVzcG9uc2UoaGV4U3RyaW5nLCBudWxsKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlT3B0aW9uYWxUYWdzKENvbW1hbmREZXRhaWxzIGNtZERldCwKKyAgICAgICAgICAgIFJlc3VsdENvZGUgcmVzdWx0Q29kZSwgSW5wdXQgY21kSW5wdXQsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYpIHsKKyAgICAgICAgc3dpdGNoIChBcHBJbnRlcmZhY2UuQ29tbWFuZFR5cGUuZnJvbUludChjbWREZXQudHlwZU9mQ29tbWFuZCkpIHsKKyAgICAgICAgICAgIGNhc2UgR0VUX0lOS0VZOgorICAgICAgICAgICAgICAgIC8vIEVUU0kgVFMgMTAyIDM4NCwyNy4yMi40LjIuOC40LjIuCisgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSByZXNwb25zZSBmb3IgR0VUX0lOS0VZIGNvbW1hbmQgYW5kIHRoZSByZXNwb25zZSB0aW1lb3V0CisgICAgICAgICAgICAgICAgLy8gb2NjdXJlZCwgdGhlbiBhZGQgRFVSQVRJT04gVExWIGZvciB2YXJpYWJsZSB0aW1lb3V0IGNhc2UuCisgICAgICAgICAgICAgICAgaWYgKChyZXN1bHRDb2RlLnZhbHVlKCkgPT0gUmVzdWx0Q29kZS5OT19SRVNQT05TRV9GUk9NX1VTRVIudmFsdWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNtZElucHV0ICE9IG51bGwpICYmIChjbWRJbnB1dC5kdXJhdGlvbiAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRJbktleVJlc3BvbnNlKGJ1ZiwgY21kSW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPVklERV9MT0NBTF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoKGNtZERldC5jb21tYW5kUXVhbGlmaWVyID09IENvbW1hbmRQYXJhbXNGYWN0b3J5LkxBTkdVQUdFX1NFVFRJTkcpICYmCisgICAgICAgICAgICAgICAgICAgIChyZXN1bHRDb2RlLnZhbHVlKCkgPT0gUmVzdWx0Q29kZS5PSy52YWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRQbGlSZXNwb25zZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgImVuY29kZU9wdGlvbmFsVGFncygpIFVuc3VwcG9ydGVkIENtZDoiICsgY21kRGV0LnR5cGVPZkNvbW1hbmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldEluS2V5UmVzcG9uc2UoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiwgSW5wdXQgY21kSW5wdXQpIHsKKyAgICAgICAgaW50IHRhZyA9IENvbXByZWhlbnNpb25UbHZUYWcuRFVSQVRJT04udmFsdWUoKTsKKworICAgICAgICBidWYud3JpdGUodGFnKTsKKyAgICAgICAgYnVmLndyaXRlKDB4MDIpOyAvLyBsZW5ndGgKKyAgICAgICAgYnVmLndyaXRlKGNtZElucHV0LmR1cmF0aW9uLnRpbWVVbml0LlNFQ09ORC52YWx1ZSgpKTsgLy8gVGltZSAoVW5pdCxTZWNvbmRzKQorICAgICAgICBidWYud3JpdGUoY21kSW5wdXQuZHVyYXRpb24udGltZUludGVydmFsKTsgLy8gVGltZSBEdXJhdGlvbgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRQbGlSZXNwb25zZShCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmKSB7CisKKyAgICAgICAgLy8gTG9jYWxlIExhbmd1YWdlIFNldHRpbmcKKyAgICAgICAgU3RyaW5nIGxhbmcgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5zeXMubGFuZ3VhZ2UiKTsKKworICAgICAgICBpZiAobGFuZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0YWcKKyAgICAgICAgICAgIGludCB0YWcgPSBDb21wcmVoZW5zaW9uVGx2VGFnLkxBTkdVQUdFLnZhbHVlKCk7CisgICAgICAgICAgICBidWYud3JpdGUodGFnKTsKKyAgICAgICAgICAgIFJlc3BvbnNlRGF0YS53cml0ZUxlbmd0aChidWYsIGxhbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgYnVmLndyaXRlKGxhbmcuZ2V0Qnl0ZXMoKSwgMCwgbGFuZy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2VuZE1lbnVTZWxlY3Rpb24oaW50IG1lbnVJZCwgYm9vbGVhbiBoZWxwUmVxdWlyZWQpIHsKIApAQCAtNDQ2LDM3ICs1MDYsMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVc2VkIGZvciBpbnN0YW50aWF0aW5nL3VwZGF0aW5nIHRoZSBTZXJ2aWNlIGZyb20gdGhlIEdzbVBob25lIGNvbnN0cnVjdG9yLgorICAgICAqIFVzZWQgZm9yIGluc3RhbnRpYXRpbmcvdXBkYXRpbmcgdGhlIFNlcnZpY2UgZnJvbSB0aGUgR3NtUGhvbmUgb3IgQ2RtYVBob25lIGNvbnN0cnVjdG9yLgogICAgICAqCiAgICAgICogQHBhcmFtIGNpIENvbW1hbmRzSW50ZXJmYWNlIG9iamVjdAotICAgICAqIEBwYXJhbSBzciBTSU1SZWNvcmRzIG9iamVjdAorICAgICAqIEBwYXJhbSBpciBJY2NSZWNvcmRzIG9iamVjdAogICAgICAqIEBwYXJhbSBjb250ZXh0IHBob25lIGFwcCBjb250ZXh0Ci0gICAgICogQHBhcmFtIGZoIFNJTSBmaWxlIGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gc2MgR1NNIFNJTSBjYXJkCisgICAgICogQHBhcmFtIGZoIEljYyBmaWxlIGhhbmRsZXIKKyAgICAgKiBAcGFyYW0gaWMgSWNjIGNhcmQKICAgICAgKiBAcmV0dXJuIFRoZSBvbmx5IFNlcnZpY2Ugb2JqZWN0IGluIHRoZSBzeXN0ZW0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0a1NlcnZpY2UgZ2V0SW5zdGFuY2UoQ29tbWFuZHNJbnRlcmZhY2UgY2ksIFNJTVJlY29yZHMgc3IsCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFNJTUZpbGVIYW5kbGVyIGZoLCBTaW1DYXJkIHNjKSB7Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNpID09IG51bGwgfHwgc3IgPT0gbnVsbCB8fCBjb250ZXh0ID09IG51bGwgfHwgZmggPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTdGsgVGVsZXBob255IHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IFN0a1NlcnZpY2UoY2ksIHNyLCBjb250ZXh0LCBmaCwgc2MpOwotICAgICAgICAgICAgU3RrTG9nLmQoc0luc3RhbmNlLCAiTkVXIHNJbnN0YW5jZSIpOwotICAgICAgICB9IGVsc2UgaWYgKChzciAhPSBudWxsKSAmJiAobVNpbVJlY29yZHMgIT0gc3IpKSB7Ci0gICAgICAgICAgICBTdGtMb2cuZChzSW5zdGFuY2UsICJSZWluaXRpYWxpemUgdGhlIFNlcnZpY2Ugd2l0aCBTSU1SZWNvcmRzIik7Ci0gICAgICAgICAgICBtU2ltUmVjb3JkcyA9IHNyOworICAgIHB1YmxpYyBzdGF0aWMgQ2F0U2VydmljZSBnZXRJbnN0YW5jZShDb21tYW5kc0ludGVyZmFjZSBjaSwgSWNjUmVjb3JkcyBpciwKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgSWNjRmlsZUhhbmRsZXIgZmgsIEljY0NhcmQgaWMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VMb2NrKSB7CisgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2kgPT0gbnVsbCB8fCBpciA9PSBudWxsIHx8IGNvbnRleHQgPT0gbnVsbCB8fCBmaCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJDYXQgVGVsZXBob255IHNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2F0U2VydmljZShjaSwgaXIsIGNvbnRleHQsIGZoLCBpYyk7CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQoc0luc3RhbmNlLCAiTkVXIHNJbnN0YW5jZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoaXIgIT0gbnVsbCkgJiYgKG1JY2NSZWNvcmRzICE9IGlyKSkgeworICAgICAgICAgICAgICAgIENhdExvZy5kKHNJbnN0YW5jZSwgIlJlaW5pdGlhbGl6ZSB0aGUgU2VydmljZSB3aXRoIFNJTVJlY29yZHMiKTsKKyAgICAgICAgICAgICAgICBtSWNjUmVjb3JkcyA9IGlyOwogCi0gICAgICAgICAgICAvLyByZS1SZWdpc3RlciBmb3IgU0lNIHJlYWR5IGV2ZW50LgotICAgICAgICAgICAgbVNpbVJlY29yZHMucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHNJbnN0YW5jZSwgTVNHX0lEX1NJTV9MT0FERUQsIG51bGwpOwotICAgICAgICAgICAgU3RrTG9nLmQoc0luc3RhbmNlLCAic3IgY2hhbmdlZCByZWluaXRpYWxpemUgYW5kIHJldHVybiBjdXJyZW50IHNJbnN0YW5jZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RrTG9nLmQoc0luc3RhbmNlLCAiUmV0dXJuIGN1cnJlbnQgc0luc3RhbmNlIik7CisgICAgICAgICAgICAgICAgLy8gcmUtUmVnaXN0ZXIgZm9yIFNJTSByZWFkeSBldmVudC4KKyAgICAgICAgICAgICAgICBtSWNjUmVjb3Jkcy5yZWdpc3RlckZvclJlY29yZHNMb2FkZWQoc0luc3RhbmNlLCBNU0dfSURfSUNDX1JFQ09SRFNfTE9BREVELCBudWxsKTsKKyAgICAgICAgICAgICAgICBDYXRMb2cuZChzSW5zdGFuY2UsICJzciBjaGFuZ2VkIHJlaW5pdGlhbGl6ZSBhbmQgcmV0dXJuIGN1cnJlbnQgc0luc3RhbmNlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENhdExvZy5kKHNJbnN0YW5jZSwgIlJldHVybiBjdXJyZW50IHNJbnN0YW5jZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDk2LDcgKzU1OCw3IEBACiAgICAgICAgIGNhc2UgTVNHX0lEX1BST0FDVElWRV9DT01NQU5EOgogICAgICAgICBjYXNlIE1TR19JRF9FVkVOVF9OT1RJRlk6CiAgICAgICAgIGNhc2UgTVNHX0lEX1JFRlJFU0g6Ci0gICAgICAgICAgICBTdGtMb2cuZCh0aGlzLCAicmlsIG1lc3NhZ2UgYXJyaXZlZCIpOworICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgInJpbCBtZXNzYWdlIGFycml2ZWQiKTsKICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtc2cub2JqICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBc3luY1Jlc3VsdCBhciA9IChBc3luY1Jlc3VsdCkgbXNnLm9iajsKQEAgLTUxMywyMCArNTc1LDIwIEBACiAgICAgICAgIGNhc2UgTVNHX0lEX0NBTExfU0VUVVA6CiAgICAgICAgICAgICBtTXNnRGVjb2Rlci5zZW5kU3RhcnREZWNvZGluZ01lc3NhZ2VQYXJhbXMobmV3IFJpbE1lc3NhZ2UobXNnLndoYXQsIG51bGwpKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1TR19JRF9TSU1fTE9BREVEOgorICAgICAgICBjYXNlIE1TR19JRF9JQ0NfUkVDT1JEU19MT0FERUQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNU0dfSURfUklMX01TR19ERUNPREVEOgogICAgICAgICAgICAgaGFuZGxlUmlsTXNnKChSaWxNZXNzYWdlKSBtc2cub2JqKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1TR19JRF9SRVNQT05TRToKLSAgICAgICAgICAgIGhhbmRsZUNtZFJlc3BvbnNlKChTdGtSZXNwb25zZU1lc3NhZ2UpIG1zZy5vYmopOworICAgICAgICAgICAgaGFuZGxlQ21kUmVzcG9uc2UoKENhdFJlc3BvbnNlTWVzc2FnZSkgbXNnLm9iaik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5yZWNvZ25pemVkIFNUSyBjb21tYW5kOiAiICsgbXNnLndoYXQpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbnJlY29nbml6ZWQgQ0FUIGNvbW1hbmQ6ICIgKyBtc2cud2hhdCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25DbWRSZXNwb25zZShTdGtSZXNwb25zZU1lc3NhZ2UgcmVzTXNnKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uQ21kUmVzcG9uc2UoQ2F0UmVzcG9uc2VNZXNzYWdlIHJlc01zZykgewogICAgICAgICBpZiAocmVzTXNnID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNTM1LDcgKzU5Nyw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVSZXNwb25zZShTdGtSZXNwb25zZU1lc3NhZ2UgcmVzTXNnKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmVzcG9uc2UoQ2F0UmVzcG9uc2VNZXNzYWdlIHJlc01zZykgewogICAgICAgICBpZiAobUN1cnJudENtZCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gKHJlc01zZy5jbWREZXQuY29tcGFyZVRvKG1DdXJybnRDbWQubUNtZERldCkpOwogICAgICAgICB9CkBAIC01NDgsMTMgKzYxMCwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdGtMb2cuZCh0aGlzLCAiVW5hYmxlIHRvIGdldCBNZW51J3MgaXRlbXMgc2l6ZSIpOworICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIlVuYWJsZSB0byBnZXQgTWVudSdzIGl0ZW1zIHNpemUiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ21kUmVzcG9uc2UoU3RrUmVzcG9uc2VNZXNzYWdlIHJlc01zZykgeworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbWRSZXNwb25zZShDYXRSZXNwb25zZU1lc3NhZ2UgcmVzTXNnKSB7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgZGV0YWlscyBtYXRjaCB0aGUgbGFzdCB2YWxpZCBjb21tYW5kLiBBbiBpbnZhbGlkCiAgICAgICAgIC8vIHJlc3BvbnNlIGlzIGEgb25lIHRoYXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBwcm9hY3RpdmUgY29tbWFuZAogICAgICAgICAvLyBhbmQgc2VuZGluZyBpdCBjYW4gImNvbmZ1c2UiIHRoZSBiYXNlYmFuZC9yaWwuCkBAIC01NjMsNyArNjI1LDcgQEAKICAgICAgICAgLy8gYnkgdGhlIGZyYW1ld29yayBpbnNpZGUgdGhlIGhpc3Rvcnkgc3RhY2suIFRoYXQgYWN0aXZpdHkgd2lsbCBiZQogICAgICAgICAvLyBhdmFpbGFibGUgZm9yIHJlbGF1bmNoIHVzaW5nIHRoZSBsYXRlc3QgYXBwbGljYXRpb24gZGlhbG9nCiAgICAgICAgIC8vIChsb25nIHByZXNzIG9uIHRoZSBob21lIGJ1dHRvbikuIFJlbGF1bmNoaW5nIHRoYXQgYWN0aXZpdHkgY2FuIHNlbmQKLSAgICAgICAgLy8gdGhlIHNhbWUgY29tbWFuZCdzIHJlc3VsdCBhZ2FpbiB0byB0aGUgU3RrU2VydmljZSBhbmQgY2FuIGNhdXNlIGl0IHRvCisgICAgICAgIC8vIHRoZSBzYW1lIGNvbW1hbmQncyByZXN1bHQgYWdhaW4gdG8gdGhlIENhdFNlcnZpY2UgYW5kIGNhbiBjYXVzZSBpdCB0bwogICAgICAgICAvLyBnZXQgb3V0IG9mIHN5bmMgd2l0aCB0aGUgU0lNLgogICAgICAgICBpZiAoIXZhbGlkYXRlUmVzcG9uc2UocmVzTXNnKSkgewogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZERldGFpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tbWFuZERldGFpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kRGV0YWlscy5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmREZXRhaWxzLmphdmEKaW5kZXggZTgxZmY5OC4uZTNmMDc5OCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZERldGFpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmREZXRhaWxzLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmRQYXJhbXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tbWFuZFBhcmFtcy5qYXZhCmluZGV4IDNkYTY1MmYuLjIyYTVjOGMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbW1hbmRQYXJhbXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmRQYXJhbXMuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zRmFjdG9yeS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21tYW5kUGFyYW1zRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbW1hbmRQYXJhbXNGYWN0b3J5LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tbWFuZFBhcmFtc0ZhY3RvcnkuamF2YQppbmRleCBjZTRjNDU5Li4xMjIwNGEwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zRmFjdG9yeS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tbWFuZFBhcmFtc0ZhY3RvcnkuamF2YQpAQCAtMTQsMTQgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTUZpbGVIYW5kbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NGaWxlSGFuZGxlcjsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTUyLDggKzUyLDExIEBACiAgICAgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIX05BQV9JTklUICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDM7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIX1VJQ0NfUkVTRVQgICAgICAgICAgICAgICAgICAgICA9IDB4MDQ7CiAKKyAgICAvLyBDb21tYW5kIFF1YWxpZmllciB2YWx1ZXMgZm9yIFBMSSBjb21tYW5kCisgICAgc3RhdGljIGZpbmFsIGludCBMQU5HVUFHRV9TRVRUSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQ7CisKICAgICBzdGF0aWMgc3luY2hyb25pemVkIENvbW1hbmRQYXJhbXNGYWN0b3J5IGdldEluc3RhbmNlKFJpbE1lc3NhZ2VEZWNvZGVyIGNhbGxlciwKLSAgICAgICAgICAgIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgICAgICAgICBJY2NGaWxlSGFuZGxlciBmaCkgewogICAgICAgICBpZiAoc0luc3RhbmNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgICAgIH0KQEAgLTYzLDcgKzY2LDcgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDb21tYW5kUGFyYW1zRmFjdG9yeShSaWxNZXNzYWdlRGVjb2RlciBjYWxsZXIsIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgcHJpdmF0ZSBDb21tYW5kUGFyYW1zRmFjdG9yeShSaWxNZXNzYWdlRGVjb2RlciBjYWxsZXIsIEljY0ZpbGVIYW5kbGVyIGZoKSB7CiAgICAgICAgIG1DYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgIG1JY29uTG9hZGVyID0gSWNvbkxvYWRlci5nZXRJbnN0YW5jZSh0aGlzLCBmaCk7CiAgICAgfQpAQCAtNzksNyArODIsNyBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGNtZERldCA9IFZhbHVlUGFyc2VyLnJldHJpZXZlQ29tbWFuZERldGFpbHMoY3RsdkNtZERldCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVzdWx0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIkZhaWxlZCB0byBwcm9jZWVzIGNvbW1hbmQgZGV0YWlscyIpOworICAgICAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiRmFpbGVkIHRvIHByb2NlZXMgY29tbWFuZCBkZXRhaWxzIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTIsNyArMTE1LDEwIEBACiAgICAgICAgIEFwcEludGVyZmFjZS5Db21tYW5kVHlwZSBjbWRUeXBlID0gQXBwSW50ZXJmYWNlLkNvbW1hbmRUeXBlCiAgICAgICAgICAgICAgICAgLmZyb21JbnQoY21kRGV0LnR5cGVPZkNvbW1hbmQpOwogICAgICAgICBpZiAoY21kVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZW5kQ21kUGFyYW1zKFJlc3VsdENvZGUuQ01EX1RZUEVfTk9UX1VOREVSU1RPT0QpOworICAgICAgICAgICAgLy8gVGhpcyBQUk9BQ1RJVkUgQ09NTUFORCBpcyBwcmVzZW50bHkgbm90IGhhbmRsZWQuIEhlbmNlIHNldAorICAgICAgICAgICAgLy8gcmVzdWx0IGNvZGUgYXMgQkVZT05EX1RFUk1JTkFMX0NBUEFCSUxJVFkgaW4gVFIuCisgICAgICAgICAgICBtQ21kUGFyYW1zID0gbmV3IENvbW1hbmRQYXJhbXMoY21kRGV0KTsKKyAgICAgICAgICAgIHNlbmRDbWRQYXJhbXMoUmVzdWx0Q29kZS5CRVlPTkRfVEVSTUlOQUxfQ0FQQUJJTElUWSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTU1LDEwICsxNjEsMTMgQEAKICAgICAgICAgICAgICBjYXNlIFBMQVlfVE9ORToKICAgICAgICAgICAgICAgICBjbWRQZW5kaW5nID0gcHJvY2Vzc1BsYXlUb25lKGNtZERldCwgY3RsdnMpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgUFJPVklERV9MT0NBTF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgICAgICBjbWRQZW5kaW5nID0gcHJvY2Vzc1Byb3ZpZGVMb2NhbEluZm8oY21kRGV0LCBjdGx2cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHByb2FjdGl2ZSBjb21tYW5kcwogICAgICAgICAgICAgICAgIG1DbWRQYXJhbXMgPSBuZXcgQ29tbWFuZFBhcmFtcyhjbWREZXQpOwotICAgICAgICAgICAgICAgIHNlbmRDbWRQYXJhbXMoUmVzdWx0Q29kZS5DTURfVFlQRV9OT1RfVU5ERVJTVE9PRCk7CisgICAgICAgICAgICAgICAgc2VuZENtZFBhcmFtcyhSZXN1bHRDb2RlLkJFWU9ORF9URVJNSU5BTF9DQVBBQklMSVRZKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlc3VsdEV4Y2VwdGlvbiBlKSB7CkBAIC0yNTksNyArMjY4LDcgQEAKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpCiAgICAgICAgICAgICB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBEaXNwbGF5VGV4dCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBEaXNwbGF5VGV4dCIpOwogCiAgICAgICAgIFRleHRNZXNzYWdlIHRleHRNc2cgPSBuZXcgVGV4dE1lc3NhZ2UoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC0zMTksNyArMzI4LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NldFVwSWRsZU1vZGVUZXh0KENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIFNldFVwSWRsZU1vZGVUZXh0Iik7CisgICAgICAgIENhdExvZy5kKHRoaXMsICJwcm9jZXNzIFNldFVwSWRsZU1vZGVUZXh0Iik7CiAKICAgICAgICAgVGV4dE1lc3NhZ2UgdGV4dE1zZyA9IG5ldyBUZXh0TWVzc2FnZSgpOwogICAgICAgICBJY29uSWQgaWNvbklkID0gbnVsbDsKQEAgLTM2Miw3ICszNzEsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzR2V0SW5rZXkoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgR2V0SW5rZXkiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgR2V0SW5rZXkiKTsKIAogICAgICAgICBJbnB1dCBpbnB1dCA9IG5ldyBJbnB1dCgpOwogICAgICAgICBJY29uSWQgaWNvbklkID0gbnVsbDsKQEAgLTM4MCw2ICszODksMTIgQEAKICAgICAgICAgICAgIGljb25JZCA9IFZhbHVlUGFyc2VyLnJldHJpZXZlSWNvbklkKGN0bHYpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcGFyc2UgZHVyYXRpb24KKyAgICAgICAgY3RsdiA9IHNlYXJjaEZvclRhZyhDb21wcmVoZW5zaW9uVGx2VGFnLkRVUkFUSU9OLCBjdGx2cyk7CisgICAgICAgIGlmIChjdGx2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0LmR1cmF0aW9uID0gVmFsdWVQYXJzZXIucmV0cmlldmVEdXJhdGlvbihjdGx2KTsKKyAgICAgICAgfQorCiAgICAgICAgIGlucHV0Lm1pbkxlbiA9IDE7CiAgICAgICAgIGlucHV0Lm1heExlbiA9IDE7CiAKQEAgLTQxMiw3ICs0MjcsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzR2V0SW5wdXQoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgR2V0SW5wdXQiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgR2V0SW5wdXQiKTsKIAogICAgICAgICBJbnB1dCBpbnB1dCA9IG5ldyBJbnB1dCgpOwogICAgICAgICBJY29uSWQgaWNvbklkID0gbnVsbDsKQEAgLTQ3Niw3ICs0OTEsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUmVmcmVzaChDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgUmVmcmVzaCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBSZWZyZXNoIik7CiAKICAgICAgICAgLy8gUkVGUkVTSCBwcm9hY3RpdmUgY29tbWFuZCBpcyByZXJvdXRlZCBieSB0aGUgYmFzZWJhbmQgYW5kIGhhbmRsZWQgYnkKICAgICAgICAgLy8gdGhlIHRlbGVwaG9ueSBsYXllci4gSURMRSBURVhUIHNob3VsZCBiZSByZW1vdmVkIGZvciBhIFJFRlJFU0ggY29tbWFuZApAQCAtNTA1LDcgKzUyMCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZWxlY3RJdGVtKENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIFNlbGVjdEl0ZW0iKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgU2VsZWN0SXRlbSIpOwogCiAgICAgICAgIE1lbnUgbWVudSA9IG5ldyBNZW51KCk7CiAgICAgICAgIEljb25JZCB0aXRsZUljb25JZCA9IG51bGw7CkBAIC01MzQsNyArNTQ5LDcgQEAKIAogICAgICAgICBjdGx2ID0gc2VhcmNoRm9yVGFnKENvbXByZWhlbnNpb25UbHZUYWcuSVRFTV9JRCwgY3RsdnMpOwogICAgICAgICBpZiAoY3RsdiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBTVEsgaXRlbXMgYXJlIGxpc3RlZCAxLi4ubiB3aGlsZSBsaXN0IHN0YXJ0IGF0IDAsIG5lZWQgdG8KKyAgICAgICAgICAgIC8vIENBVCBpdGVtcyBhcmUgbGlzdGVkIDEuLi5uIHdoaWxlIGxpc3Qgc3RhcnQgYXQgMCwgbmVlZCB0bwogICAgICAgICAgICAgLy8gc3VidHJhY3Qgb25lLgogICAgICAgICAgICAgbWVudS5kZWZhdWx0SXRlbSA9IFZhbHVlUGFyc2VyLnJldHJpZXZlSXRlbUlkKGN0bHYpIC0gMTsKICAgICAgICAgfQpAQCAtNjAyLDcgKzYxNyw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFdmVudE5vdGlmeShDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBFdmVudE5vdGlmeSIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBFdmVudE5vdGlmeSIpOwogCiAgICAgICAgIFRleHRNZXNzYWdlIHRleHRNc2cgPSBuZXcgVGV4dE1lc3NhZ2UoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC02NDUsNyArNjYwLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NldFVwRXZlbnRMaXN0KENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXRVcEV2ZW50TGlzdCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXRVcEV2ZW50TGlzdCIpOwogICAgICAgICAvLwogICAgICAgICAvLyBDb21wcmVoZW5zaW9uVGx2IGN0bHYgPSBzZWFyY2hGb3JUYWcoQ29tcHJlaGVuc2lvblRsdlRhZy5FVkVOVF9MSVNULAogICAgICAgICAvLyBjdGx2cyk7CkBAIC02NzAsMTAgKzY4NSwxMCBAQAogICAgICAqICAgICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCiAgICAgICogQHRocm93cyBSZXN1bHRFeGNlcHRpb24KICAgICAgKi8KLSAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NMYXVuY2hCcm93c2VyKENvbW1hbmREZXRhaWxzIGNtZERldCwKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0xhdW5jaEJyb3dzZXIoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgTGF1bmNoQnJvd3NlciIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBMYXVuY2hCcm93c2VyIik7CiAKICAgICAgICAgVGV4dE1lc3NhZ2UgY29uZmlybU1zZyA9IG5ldyBUZXh0TWVzc2FnZSgpOwogICAgICAgICBJY29uSWQgaWNvbklkID0gbnVsbDsKQEAgLTc0NCwxMCArNzU5LDEwIEBACiAgICAgICogICAgICAgICBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC50CiAgICAgICogQHRocm93cyBSZXN1bHRFeGNlcHRpb24KICAgICAgKi8KLSAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQbGF5VG9uZShDb21tYW5kRGV0YWlscyBjbWREZXQsCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQbGF5VG9uZShDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBQbGF5VG9uZSIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBQbGF5VG9uZSIpOwogCiAgICAgICAgIFRvbmUgdG9uZSA9IG51bGw7CiAgICAgICAgIFRleHRNZXNzYWdlIHRleHRNc2cgPSBuZXcgVGV4dE1lc3NhZ2UoKTsKQEAgLTgxMCw5ICs4MjUsOSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tbWFuZCBpcyBwcm9jZXNzaW5nIGlzIHBlbmRpbmcgYW5kIGFkZGl0aW9uYWwKICAgICAgKiAgICAgICAgIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLgogICAgICAqLwotICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NldHVwQ2FsbChDb21tYW5kRGV0YWlscyBjbWREZXQsCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZXR1cENhbGwoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIFNldHVwQ2FsbCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXR1cENhbGwiKTsKIAogICAgICAgICBJdGVyYXRvcjxDb21wcmVoZW5zaW9uVGx2PiBpdGVyID0gY3RsdnMuaXRlcmF0b3IoKTsKICAgICAgICAgQ29tcHJlaGVuc2lvblRsdiBjdGx2ID0gbnVsbDsKQEAgLTg2Myw0ICs4NzgsMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcm92aWRlTG9jYWxJbmZvKENvbW1hbmREZXRhaWxzIGNtZERldCwgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykKKyAgICAgICAgICAgIHRocm93cyBSZXN1bHRFeGNlcHRpb24geworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBQcm92aWRlTG9jYWxJbmZvIik7CisgICAgICAgIHN3aXRjaCAoY21kRGV0LmNvbW1hbmRRdWFsaWZpZXIpIHsKKyAgICAgICAgICAgIGNhc2UgTEFOR1VBR0VfU0VUVElORzoKKyAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiUExJIFtMQU5HVUFHRV9TRVRUSU5HXSIpOworICAgICAgICAgICAgICAgIG1DbWRQYXJhbXMgPSBuZXcgQ29tbWFuZFBhcmFtcyhjbWREZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiUExJWyIgKyBjbWREZXQuY29tbWFuZFF1YWxpZmllciArICJdIENvbW1hbmQgTm90IFN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIG1DbWRQYXJhbXMgPSBuZXcgQ29tbWFuZFBhcmFtcyhjbWREZXQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFeGNlcHRpb24oUmVzdWx0Q29kZS5CRVlPTkRfVEVSTUlOQUxfQ0FQQUJJTElUWSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHYuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tcHJlaGVuc2lvblRsdi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHYuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21wcmVoZW5zaW9uVGx2LmphdmEKaW5kZXggZmZkZTZhMy4uOTlmNjYyZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tcHJlaGVuc2lvblRsdi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tcHJlaGVuc2lvblRsdi5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0R1cmF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvRHVyYXRpb24uamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9EdXJhdGlvbi5qYXZhCmluZGV4IDlkOGNjOTcuLmU4Y2Q0MDQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9EdXJhdGlvbi5qYXZhCkBAIC0xNCwxNCArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiAKIAogLyoqCi0gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nICJEdXJhdGlvbiIgb2JqZWN0IGZvciBTVEsuCisgKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nICJEdXJhdGlvbiIgb2JqZWN0IGZvciBDQVQuCiAgKgogICoge0BoaWRlfQogICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Gb250U2l6ZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Gb250U2l6ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ZvbnRTaXplLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvRm9udFNpemUuamF2YQppbmRleCBiZDRmNDlmLi4wMmM3ZWEwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Gb250U2l6ZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvRm9udFNpemUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ljb25Mb2FkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSWNvbkxvYWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ljb25Mb2FkZXIuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9JY29uTG9hZGVyLmphdmEKaW5kZXggZmMwMmQyYS4uMmZhMTgxMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSWNvbkxvYWRlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSWNvbkxvYWRlci5qYXZhCkBAIC0xNCw5ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwpAQCAtNDAsNyArNDAsNyBAQAogICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIG1JZCA9IG51bGw7CiAgICAgcHJpdmF0ZSBCaXRtYXAgbUN1cnJlbnRJY29uID0gbnVsbDsKICAgICBwcml2YXRlIGludCBtUmVjb3JkTnVtYmVyOwotICAgIHByaXZhdGUgU0lNRmlsZUhhbmRsZXIgbVNpbUZIID0gbnVsbDsKKyAgICBwcml2YXRlIEljY0ZpbGVIYW5kbGVyIG1TaW1GSCA9IG51bGw7CiAgICAgcHJpdmF0ZSBNZXNzYWdlIG1FbmRNc2cgPSBudWxsOwogICAgIHByaXZhdGUgYnl0ZVtdIG1JY29uRGF0YSA9IG51bGw7CiAgICAgLy8gbXVsdGkgaWNvbnMgc3RhdGUgbWVtYmVycwpAQCAtNjgsMTkgKzY4LDE5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMVVRfRU5UUllfU0laRSA9IDM7CiAKIAotICAgIHByaXZhdGUgSWNvbkxvYWRlcihMb29wZXIgbG9vcGVyICwgU0lNRmlsZUhhbmRsZXIgZmgpIHsKKyAgICBwcml2YXRlIEljb25Mb2FkZXIoTG9vcGVyIGxvb3BlciAsIEljY0ZpbGVIYW5kbGVyIGZoKSB7CiAgICAgICAgIHN1cGVyKGxvb3Blcik7CiAgICAgICAgIG1TaW1GSCA9IGZoOwogCiAgICAgICAgIG1JY29uc0NhY2hlID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQml0bWFwPig1MCk7CiAgICAgfQogCi0gICAgc3RhdGljIEljb25Mb2FkZXIgZ2V0SW5zdGFuY2UoSGFuZGxlciBjYWxsZXIsIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgc3RhdGljIEljb25Mb2FkZXIgZ2V0SW5zdGFuY2UoSGFuZGxlciBjYWxsZXIsIEljY0ZpbGVIYW5kbGVyIGZoKSB7CiAgICAgICAgIGlmIChzTG9hZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBzTG9hZGVyOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTdGsgSWNvbiBMb2FkZXIiKTsKKyAgICAgICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkNhdCBJY29uIExvYWRlciIpOwogICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEljb25Mb2FkZXIodGhyZWFkLmdldExvb3BlcigpLCBmaCk7CiAgICAgICAgIH0KQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIkljb24gbG9hZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJJY29uIGxvYWQgZmFpbGVkIik7CiAgICAgICAgICAgICAvLyBwb3N0IG51bGwgaWNvbiBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgICAgICAgICBwb3N0SWNvbigpOwogICAgICAgICB9CkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwaXhlbEluZGV4ICE9IG51bU9mUGl4ZWxzKSB7Ci0gICAgICAgICAgICBTdGtMb2cuZCgiSWNvbkxvYWRlciIsICJwYXJzZVRvQm5XOyBzaXplIGVycm9yIik7CisgICAgICAgICAgICBDYXRMb2cuZCgiSWNvbkxvYWRlciIsICJwYXJzZVRvQm5XOyBzaXplIGVycm9yIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVCaXRtYXAocGl4ZWxzLCB3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ltYWdlRGVzY3JpcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ltYWdlRGVzY3JpcHRvci5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ltYWdlRGVzY3JpcHRvci5qYXZhCmluZGV4IDg4MGI5ZTUuLjcxMWQ5NzcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ltYWdlRGVzY3JpcHRvci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSW1hZ2VEZXNjcmlwdG9yLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtNjksNyArNjksNyBAQAogCiAgICAgICAgICAgICBkLmxlbmd0aCA9ICgocmF3RGF0YVt2YWx1ZUluZGV4KytdICYgMHhmZikgPDwgOCB8IChyYXdEYXRhW3ZhbHVlSW5kZXgrK10gJiAweGZmKSk7CiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RrTG9nLmQoIkltYWdlRGVzY3JpcHRlciIsICJwYXJzZTsgZmFpbGVkIHBhcnNpbmcgaW1hZ2UgZGVzY3JpcHRvciIpOworICAgICAgICAgICAgQ2F0TG9nLmQoIkltYWdlRGVzY3JpcHRlciIsICJwYXJzZTsgZmFpbGVkIHBhcnNpbmcgaW1hZ2UgZGVzY3JpcHRvciIpOwogICAgICAgICAgICAgZCA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGQ7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JbnB1dC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9JbnB1dC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0lucHV0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSW5wdXQuamF2YQppbmRleCAxOWY3MjRiLi4xM2E1YWQ0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JbnB1dC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSW5wdXQuamF2YQpAQCAtMTQsMTQgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiAvKioKLSAqIENvbnRhaW5lciBjbGFzcyBmb3IgU1RLIEdFVCBJTlBVVCwgR0VUIElOIEtFWSBjb21tYW5kcyBwYXJhbWV0ZXJzLgorICogQ29udGFpbmVyIGNsYXNzIGZvciBDQVQgR0VUIElOUFVULCBHRVQgSU4gS0VZIGNvbW1hbmRzIHBhcmFtZXRlcnMuCiAgKgogICovCiBwdWJsaWMgY2xhc3MgSW5wdXQgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKQEAgLTM2LDYgKzM2LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBlY2hvOwogICAgIHB1YmxpYyBib29sZWFuIHllc05vOwogICAgIHB1YmxpYyBib29sZWFuIGhlbHBBdmFpbGFibGU7CisgICAgcHVibGljIER1cmF0aW9uIGR1cmF0aW9uOwogCiAgICAgSW5wdXQoKSB7CiAgICAgICAgIHRleHQgPSAiIjsKQEAgLTQ5LDYgKzUwLDcgQEAKICAgICAgICAgZWNobyA9IGZhbHNlOwogICAgICAgICB5ZXNObyA9IGZhbHNlOwogICAgICAgICBoZWxwQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIGR1cmF0aW9uID0gbnVsbDsKICAgICB9CiAKICAgICBwcml2YXRlIElucHV0KFBhcmNlbCBpbikgewpAQCAtNjMsNiArNjUsNyBAQAogICAgICAgICBlY2hvID0gaW4ucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgIHllc05vID0gaW4ucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgIGhlbHBBdmFpbGFibGUgPSBpbi5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgZHVyYXRpb24gPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CkBAIC04MSw2ICs4NCw3IEBACiAgICAgICAgIGRlc3Qud3JpdGVJbnQoZWNobyA/IDEgOiAwKTsKICAgICAgICAgZGVzdC53cml0ZUludCh5ZXNObyA/IDEgOiAwKTsKICAgICAgICAgZGVzdC53cml0ZUludChoZWxwQXZhaWxhYmxlID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlUGFyY2VsYWJsZShkdXJhdGlvbiwgMCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXQ+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0PigpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW0uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSXRlbS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW0uamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9JdGVtLmphdmEKaW5kZXggYjJmMzM4Yy4uZDQ3MDJiYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSXRlbS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSXRlbS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9MYXVuY2hCcm93c2VyTW9kZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9MYXVuY2hCcm93c2VyTW9kZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0xhdW5jaEJyb3dzZXJNb2RlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTGF1bmNoQnJvd3Nlck1vZGUuamF2YQppbmRleCAzMDIyNzNjLi5hZjA0M2QxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9MYXVuY2hCcm93c2VyTW9kZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTGF1bmNoQnJvd3Nlck1vZGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTWVudS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnUuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9NZW51LmphdmEKaW5kZXggMzMxZjY5ZC4uN2JiYWUwMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvTWVudS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTWVudS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogQ29udGFpbmVyIGNsYXNzIGZvciBTVEsgbWVudSAoU0VUIFVQIE1FTlUsIFNFTEVDVCBJVEVNKSBwYXJhbWV0ZXJzLgorICogQ29udGFpbmVyIGNsYXNzIGZvciBDQVQgbWVudSAoU0VUIFVQIE1FTlUsIFNFTEVDVCBJVEVNKSBwYXJhbWV0ZXJzLgogICoKICAqLwogcHVibGljIGNsYXNzIE1lbnUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ByZXNlbnRhdGlvblR5cGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUHJlc2VudGF0aW9uVHlwZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ByZXNlbnRhdGlvblR5cGUuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9QcmVzZW50YXRpb25UeXBlLmphdmEKaW5kZXggNzFiZGNkYy4uN2M4Y2Q4YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUHJlc2VudGF0aW9uVHlwZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUHJlc2VudGF0aW9uVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzcG9uc2VEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3BvbnNlRGF0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3BvbnNlRGF0YS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3BvbnNlRGF0YS5qYXZhCmluZGV4IGFmZDFiYmEuLjY3N2Q2NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3BvbnNlRGF0YS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmVzcG9uc2VEYXRhLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKQEAgLTI4LDYgKzI4LDE2IEBACiAgICAgICogdGhlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9ybWF0KEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTGVuZ3RoKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYsIGludCBsZW5ndGgpIHsKKyAgICAgICAgLy8gQXMgcGVyIEVUU0kgMTAyLjIyMCBTZWM3LjEuMiwgaWYgdGhlIHRvdGFsIGxlbmd0aCBpcyBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gMHg3RiwgaXQgc2hvdWxkIGJlIGNvZGVkIGluIHR3byBieXRlcyBhbmQgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgLy8gc2hvdWxkIGJlIDB4ODEuCisgICAgICAgIGlmIChsZW5ndGggPiAweDdGKSB7CisgICAgICAgICAgICBidWYud3JpdGUoMHg4MSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLndyaXRlKGxlbmd0aCk7CisgICAgfQogfQogCiBjbGFzcyBTZWxlY3RJdGVtUmVzcG9uc2VEYXRhIGV4dGVuZHMgUmVzcG9uc2VEYXRhIHsKQEAgLTEyMCw3ICsxMzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gbGVuZ3RoIC0gb25lIG1vcmUgZm9yIGRhdGEgY29kaW5nIHNjaGVtZS4KLSAgICAgICAgYnVmLndyaXRlKGRhdGEubGVuZ3RoICsgMSk7CisgICAgICAgIHdyaXRlTGVuZ3RoKGJ1ZiwgZGF0YS5sZW5ndGggKyAxKTsKIAogICAgICAgICAvLyBkYXRhIGNvZGluZyBzY2hlbWUKICAgICAgICAgaWYgKG1Jc1VjczIpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdENvZGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmVzdWx0Q29kZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdENvZGUuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SZXN1bHRDb2RlLmphdmEKaW5kZXggYjk2YTUyNC4uODU0NDE3NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0Q29kZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmVzdWx0Q29kZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDJlYjE2YzkuLjFjMmNiNjMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmVzdWx0RXhjZXB0aW9uLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIAogLyoqCkBAIC0yMiw3ICsyMiw3IEBACiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RXhjZXB0aW9uIGV4dGVuZHMgU3RrRXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBSZXN1bHRFeGNlcHRpb24gZXh0ZW5kcyBDYXRFeGNlcHRpb24gewogICAgIHByaXZhdGUgUmVzdWx0Q29kZSBtUmVzdWx0OwogICAgIHByaXZhdGUgaW50IG1BZGRpdGlvbmFsSW5mbzsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmlsTWVzc2FnZURlY29kZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmlsTWVzc2FnZURlY29kZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SaWxNZXNzYWdlRGVjb2Rlci5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1JpbE1lc3NhZ2VEZWNvZGVyLmphdmEKaW5kZXggYTgyMTc3Yy4uYTE5N2M5YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmlsTWVzc2FnZURlY29kZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1JpbE1lc3NhZ2VEZWNvZGVyLmphdmEKQEAgLTE0LDkgKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTUZpbGVIYW5kbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NGaWxlSGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC0yNiw3ICsyNiw3IEBACiAKIC8qKgogICogQ2xhc3MgdXNlZCBmb3IgcXVldWluZyByYXcgcmlsIG1lc3NhZ2VzLCBkZWNvZGluZyB0aGVtIGludG8gQ29tbWFuUGFyYW1zCi0gKiBvYmplY3RzIGFuZCBzZW5kaW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUgU1RLIFNlcnZpY2UuCisgKiBvYmplY3RzIGFuZCBzZW5kaW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUgQ0FUIFNlcnZpY2UuCiAgKi8KIGNsYXNzIFJpbE1lc3NhZ2VEZWNvZGVyIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIHsKIApAQCAtNTEsNyArNTEsNyBAQAogICAgICAqIEBwYXJhbSBmaAogICAgICAqIEByZXR1cm4gUmlsTWVzc3NhZ2VEZWNvZGVyCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmlsTWVzc2FnZURlY29kZXIgZ2V0SW5zdGFuY2UoSGFuZGxlciBjYWxsZXIsIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmlsTWVzc2FnZURlY29kZXIgZ2V0SW5zdGFuY2UoSGFuZGxlciBjYWxsZXIsIEljY0ZpbGVIYW5kbGVyIGZoKSB7CiAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IFJpbE1lc3NhZ2VEZWNvZGVyKGNhbGxlciwgZmgpOwogICAgICAgICAgICAgc0luc3RhbmNlLnN0YXJ0KCk7CkBAIC04NSwxMiArODUsMTIgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2VuZENtZEZvckV4ZWN1dGlvbihSaWxNZXNzYWdlIHJpbE1zZykgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1DYWxsZXIub2J0YWluTWVzc2FnZShTdGtTZXJ2aWNlLk1TR19JRF9SSUxfTVNHX0RFQ09ERUQsCisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNhbGxlci5vYnRhaW5NZXNzYWdlKENhdFNlcnZpY2UuTVNHX0lEX1JJTF9NU0dfREVDT0RFRCwKICAgICAgICAgICAgICAgICBuZXcgUmlsTWVzc2FnZShyaWxNc2cpKTsKICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgUmlsTWVzc2FnZURlY29kZXIoSGFuZGxlciBjYWxsZXIsIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgcHJpdmF0ZSBSaWxNZXNzYWdlRGVjb2RlcihIYW5kbGVyIGNhbGxlciwgSWNjRmlsZUhhbmRsZXIgZmgpIHsKICAgICAgICAgc3VwZXIoIlJpbE1lc3NhZ2VEZWNvZGVyIik7CiAKICAgICAgICAgYWRkU3RhdGUobVN0YXRlU3RhcnQpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU3RhdGVDbWRQYXJhbXNSZWFkeSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdGtMb2cuZCh0aGlzLCAiU3RhdGVTdGFydCB1bmV4cGVjdGVkIGV4cGVjdGluZyBTVEFSVD0iICsKKyAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiU3RhdGVTdGFydCB1bmV4cGVjdGVkIGV4cGVjdGluZyBTVEFSVD0iICsKICAgICAgICAgICAgICAgICAgICAgICAgICBDTURfU1RBUlQgKyAiIGdvdCAiICsgbXNnLndoYXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgICAgICAgICBzZW5kQ21kRm9yRXhlY3V0aW9uKG1DdXJyZW50UmlsTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TdGF0ZVN0YXJ0KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIlN0YXRlQ21kUGFyYW1zUmVhZHkgZXhwZWN0aW5nIENNRF9QQVJBTVNfUkVBRFk9IgorICAgICAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJTdGF0ZUNtZFBhcmFtc1JlYWR5IGV4cGVjdGluZyBDTURfUEFSQU1TX1JFQURZPSIKICAgICAgICAgICAgICAgICAgICAgICAgICArIENNRF9QQVJBTVNfUkVBRFkgKyAiIGdvdCAiICsgbXNnLndoYXQpOwogICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgfQpAQCAtMTM2LDIxICsxMzYsMjEgQEAKIAogICAgICAgICBtQ3VycmVudFJpbE1lc3NhZ2UgPSByaWxNc2c7CiAgICAgICAgIHN3aXRjaChyaWxNc2cubUlkKSB7Ci0gICAgICAgIGNhc2UgU3RrU2VydmljZS5NU0dfSURfU0VTU0lPTl9FTkQ6Ci0gICAgICAgIGNhc2UgU3RrU2VydmljZS5NU0dfSURfQ0FMTF9TRVRVUDoKKyAgICAgICAgY2FzZSBDYXRTZXJ2aWNlLk1TR19JRF9TRVNTSU9OX0VORDoKKyAgICAgICAgY2FzZSBDYXRTZXJ2aWNlLk1TR19JRF9DQUxMX1NFVFVQOgogICAgICAgICAgICAgbUN1cnJlbnRSaWxNZXNzYWdlLm1SZXNDb2RlID0gUmVzdWx0Q29kZS5PSzsKICAgICAgICAgICAgIHNlbmRDbWRGb3JFeGVjdXRpb24obUN1cnJlbnRSaWxNZXNzYWdlKTsKICAgICAgICAgICAgIGRlY29kaW5nU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RrU2VydmljZS5NU0dfSURfUFJPQUNUSVZFX0NPTU1BTkQ6Ci0gICAgICAgIGNhc2UgU3RrU2VydmljZS5NU0dfSURfRVZFTlRfTk9USUZZOgotICAgICAgICBjYXNlIFN0a1NlcnZpY2UuTVNHX0lEX1JFRlJFU0g6CisgICAgICAgIGNhc2UgQ2F0U2VydmljZS5NU0dfSURfUFJPQUNUSVZFX0NPTU1BTkQ6CisgICAgICAgIGNhc2UgQ2F0U2VydmljZS5NU0dfSURfRVZFTlRfTk9USUZZOgorICAgICAgICBjYXNlIENhdFNlcnZpY2UuTVNHX0lEX1JFRlJFU0g6CiAgICAgICAgICAgICBieXRlW10gcmF3RGF0YSA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJhd0RhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKChTdHJpbmcpIHJpbE1zZy5tRGF0YSk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIHpvbWJpZSBtZXNzYWdlcyBhcmUgZHJvcHBlZAotICAgICAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJkZWNvZGVNZXNzYWdlUGFyYW1zIGRyb3BwaW5nIHpvbWJpZSBtZXNzYWdlcyIpOworICAgICAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJkZWNvZGVNZXNzYWdlUGFyYW1zIGRyb3BwaW5nIHpvbWJpZSBtZXNzYWdlcyIpOwogICAgICAgICAgICAgICAgIGRlY29kaW5nU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEFsaWdubWVudC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0QWxpZ25tZW50LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEFsaWdubWVudC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRBbGlnbm1lbnQuamF2YQppbmRleCBjNWRkNTBlLi43ZmI1OGE1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QWxpZ25tZW50LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0QWxpZ25tZW50LmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIAogLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRBdHRyaWJ1dGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dEF0dHJpYnV0ZS5qYXZhCmluZGV4IGFjZTQzMDAuLjBkZWE2NDAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRBdHRyaWJ1dGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRBdHRyaWJ1dGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRDb2xvci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0Q29sb3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0Q29sb3IuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0Q29sb3IuamF2YQppbmRleCAxMjZmYzYyLi42NDQ3ZTc0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0Q29sb3IuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRDb2xvci5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dE1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dE1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0TWVzc2FnZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRNZXNzYWdlLmphdmEKaW5kZXggM2I2YTA5YS4uNWZmZDA3NiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dE1lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRNZXNzYWdlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVG9uZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RvbmUuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Ub25lLmphdmEKaW5kZXggYjY0ZTc3N2QuLjI3YjQ0ODkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RvbmUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RvbmVTZXR0aW5ncy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Ub25lU2V0dGluZ3MuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lU2V0dGluZ3MuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Ub25lU2V0dGluZ3MuamF2YQppbmRleCA5MGNjNmMxLi42Mzc1YWZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lU2V0dGluZ3MuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RvbmVTZXR0aW5ncy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVmFsdWVQYXJzZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVmFsdWVQYXJzZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9WYWx1ZVBhcnNlci5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1ZhbHVlUGFyc2VyLmphdmEKaW5kZXggMDlhODYwZS4uMzRlNDgxMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVmFsdWVQYXJzZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1ZhbHVlUGFyc2VyLmphdmEKQEAgLTE0LDExICsxNCwxMSBAQAogICogdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRHVyYXRpb24uVGltZVVuaXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdC5EdXJhdGlvbi5UaW1lVW5pdDsKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICovCiAgICAgc3RhdGljIEl0ZW1zSWNvbklkIHJldHJpZXZlSXRlbXNJY29uSWQoQ29tcHJlaGVuc2lvblRsdiBjdGx2KQogICAgICAgICAgICAgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0a0xvZy5kKCJWYWx1ZVBhcnNlciIsICJyZXRyaWV2ZUl0ZW1zSWNvbklkOiIpOworICAgICAgICBDYXRMb2cuZCgiVmFsdWVQYXJzZXIiLCAicmV0cmlldmVJdGVtc0ljb25JZDoiKTsKICAgICAgICAgSXRlbXNJY29uSWQgaWQgPSBuZXcgSXRlbXNJY29uSWQoKTsKIAogICAgICAgICBieXRlW10gcmF3VmFsdWUgPSBjdGx2LmdldFJhd1ZhbHVlKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L3BhY2thZ2UuaHRtbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmJmYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDUgQEAKKzxIVE1MPgorPEJPRFk+CitQcm92aWRlcyBjbGFzc2VzIGZvciBJQ0MgVG9vbGtpdCBTZXJ2aWNlIChDQVQpLgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQppbmRleCBjMTFkZDBiLi4zODkwYTk4IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQuQ2F0U2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOwpAQCAtMTA4LDcgKzEwOSw3IEBACiAgICAgUGhvbmVTdWJJbmZvIG1TdWJJbmZvOwogICAgIEVyaU1hbmFnZXIgbUVyaU1hbmFnZXI7CiAgICAgV2FrZUxvY2sgbVdha2VMb2NrOwotCisgICAgQ2F0U2VydmljZSBtQ2NhdFNlcnZpY2U7CiAKICAgICAvLyBtTnZMb2FkZWRSZWdpc3RyYW50cyBhcmUgaW5mb3JtZWQgYWZ0ZXIgdGhlIEVWRU5UX05WX1JFQURZCiAgICAgcHJpdmF0ZSBSZWdpc3RyYW50TGlzdCBtTnZMb2FkZWRSZWdpc3RyYW50cyA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOwpAQCAtMTYwLDYgKzE2MSw4IEBACiAgICAgICAgIG1SdWltU21zSW50ZXJmYWNlTWFuYWdlciA9IG5ldyBSdWltU21zSW50ZXJmYWNlTWFuYWdlcih0aGlzLCBtU01TKTsKICAgICAgICAgbVN1YkluZm8gPSBuZXcgUGhvbmVTdWJJbmZvKHRoaXMpOwogICAgICAgICBtRXJpTWFuYWdlciA9IG5ldyBFcmlNYW5hZ2VyKHRoaXMsIGNvbnRleHQsIEVyaU1hbmFnZXIuRVJJX0ZST01fWE1MKTsKKyAgICAgICAgbUNjYXRTZXJ2aWNlID0gQ2F0U2VydmljZS5nZXRJbnN0YW5jZShtQ00sIG1SdWltUmVjb3JkcywgbUNvbnRleHQsCisgICAgICAgICAgICAgICAgbUljY0ZpbGVIYW5kbGVyLCBtUnVpbUNhcmQpOwogCiAgICAgICAgIG1DTS5yZWdpc3RlckZvckF2YWlsYWJsZSh0aGlzLCBFVkVOVF9SQURJT19BVkFJTEFCTEUsIG51bGwpOwogICAgICAgICBtUnVpbVJlY29yZHMucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHRoaXMsIEVWRU5UX1JVSU1fUkVDT1JEU19MT0FERUQsIG51bGwpOwpAQCAtMjIwLDYgKzIyMyw3IEBACiAgICAgICAgICAgICBtQ00udW5yZWdpc3RlckZvck5WUmVhZHkodGhpcyk7IC8vRVZFTlRfTlZfUkVBRFkKICAgICAgICAgICAgIG1TU1QudW5yZWdpc3RlckZvck5ldHdvcmtBdHRhY2godGhpcyk7IC8vRVZFTlRfUkVHSVNURVJFRF9UT19ORVRXT1JLCiAgICAgICAgICAgICBtQ00udW5TZXRPblN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKHRoaXMpOworICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1FeGl0RWNtUnVubmFibGUpOwogCiAgICAgICAgICAgICBtUGVuZGluZ01taXMuY2xlYXIoKTsKIApAQCAtMjM1LDYgKzIzOSw3IEBACiAgICAgICAgICAgICBtUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuZGlzcG9zZSgpOwogICAgICAgICAgICAgbVN1YkluZm8uZGlzcG9zZSgpOwogICAgICAgICAgICAgbUVyaU1hbmFnZXIuZGlzcG9zZSgpOworICAgICAgICAgICAgbUNjYXRTZXJ2aWNlLmRpc3Bvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjUwLDYgKzI1NSw4IEBACiAgICAgICAgICAgICB0aGlzLm1DVCA9IG51bGw7CiAgICAgICAgICAgICB0aGlzLm1TU1QgPSBudWxsOwogICAgICAgICAgICAgdGhpcy5tRXJpTWFuYWdlciA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm1DY2F0U2VydmljZSA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm1FeGl0RWNtUnVubmFibGUgPSBudWxsOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggZGNlZmYyYS4uZDZmYzEzNCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCkBAIC00ODMsNiArNDgzLDExIEBACiAgICAgICAgIG1DbS5zZXRDZG1hQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQnJvYWRjYXN0U21zKEFzeW5jUmVzdWx0IGFyKSB7CisgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIE5vdCBpbXBsZW1lbnRlZCBmb3IgQ0RNQS4iKTsKKyAgICB9CisKICAgICBwcml2YXRlIGludCByZXN1bHRUb0NhdXNlKGludCByYykgewogICAgICAgICBzd2l0Y2ggKHJjKSB7CiAgICAgICAgIGNhc2UgQWN0aXZpdHkuUkVTVUxUX09LOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyY2FkNmNjLi41YjZiYzFmCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtNTUyLDMyICs1NTIsNTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3dlck9mZlJhZGlvU2FmZWx5KCl7Ci0gICAgICAgIC8vIGNsZWFuIGRhdGEgY29ubmVjdGlvbgorICAgIHByb3RlY3RlZCB2b2lkIHBvd2VyT2ZmUmFkaW9TYWZlbHkoKSB7CiAgICAgICAgIERhdGFDb25uZWN0aW9uVHJhY2tlciBkY1RyYWNrZXIgPSBwaG9uZS5tRGF0YUNvbm5lY3Rpb247CiAKICAgICAgICAgTWVzc2FnZSBtc2cgPSBkY1RyYWNrZXIub2J0YWluTWVzc2FnZShEYXRhQ29ubmVjdGlvblRyYWNrZXIuRVZFTlRfQ0xFQU5fVVBfQ09OTkVDVElPTik7Ci0gICAgICAgIG1zZy5hcmcxID0gMTsgLy8gdGVhckRvd24gaXMgdHJ1ZQogICAgICAgICBtc2cub2JqID0gQ0RNQVBob25lLlJFQVNPTl9SQURJT19UVVJORURfT0ZGOwotICAgICAgICBkY1RyYWNrZXIuc2VuZE1lc3NhZ2UobXNnKTsKIAotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaWYgKCFtUGVuZGluZ1JhZGlvUG93ZXJPZmZBZnRlckRhdGFPZmYpIHsKLSAgICAgICAgICAgICAgICBEYXRhQ29ubmVjdGlvblRyYWNrZXIuU3RhdGUgY3VycmVudFN0YXRlID0gZGNUcmFja2VyLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPSBEYXRhQ29ubmVjdGlvblRyYWNrZXIuU3RhdGUuQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlLkRJU0NPTk5FQ1RJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRTdGF0ZSAhPSBEYXRhQ29ubmVjdGlvblRyYWNrZXIuU3RhdGUuSU5JVElORykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkRhdGEgZGlzY29ubmVjdGVkLCB0dXJuIG9mZiByYWRpbyByaWdodCBhd2F5LiIpOwotICAgICAgICAgICAgICAgICAgICBoYW5ndXBBbmRQb3dlck9mZigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9TRVRfUkFESU9fUE9XRVJfT0ZGLCAzMDAwMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYWl0IHVwIHRvIDMwIHNlYyBmb3IgZGF0YSB0byBkaXNjb25uZWN0LCB0aGVuIHR1cm4gb2ZmIHJhZGlvLiIpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChuZXR3b3JrVHlwZSA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV8xeFJUVCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSW4gMXggQ0RNQSAsIGR1cmluZyByYWRpbyBwb3dlciBvZmYgbW9kZW0gd2lsbCBkaXNjb25uZWN0IHRoZQorICAgICAgICAgICAgICAgICAqIGRhdGEgY2FsbCBhbmQgc2VuZHMgdGhlIHBvd2VyIGRvd24gcmVnaXN0cmF0aW9uIG1lc3NhZ2UgYWxvbmcKKyAgICAgICAgICAgICAgICAgKiB3aXRoIHRoZSBkYXRhIGNhbGwgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IDA7IC8vIHRlYXJEb3duIGlzIGZhbHNlIHNpbmNlIG1vZGVtIGRvZXMgaXQgYW55d2F5IGZvciAxWAorICAgICAgICAgICAgICAgIGRjVHJhY2tlci5zZW5kTWVzc2FnZShtc2cpOworCisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlR1cm4gb2ZmIHRoZSByYWRpbyByaWdodCBhd2F5Iik7CisgICAgICAgICAgICAgICAgaGFuZ3VwQW5kUG93ZXJPZmYoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUGVuZGluZ1JhZGlvUG93ZXJPZmZBZnRlckRhdGFPZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlIGN1cnJlbnRTdGF0ZSA9IGRjVHJhY2tlci5nZXRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlICE9IERhdGFDb25uZWN0aW9uVHJhY2tlci5TdGF0ZS5DT05ORUNURUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlLkRJU0NPTk5FQ1RJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlLklOSVRJTkcpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSAwOyAvLyB0ZWFyRG93biBpcyBmYWxzZSBhcyBpdCBpcyBub3QgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgZGNUcmFja2VyLnNlbmRNZXNzYWdlKG1zZyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEYXRhIGRpc2Nvbm5lY3RlZCwgdHVybiBvZmYgcmFkaW8gcmlnaHQgYXdheS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmd1cEFuZFBvd2VyT2ZmKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiBkYXRhIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gMTsgLy8gdGVhckRvd24gaXMgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZGNUcmFja2VyLnNlbmRNZXNzYWdlKG1zZyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9TRVRfUkFESU9fUE9XRVJfT0ZGLCAzMDAwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FpdCB1cHRvIDMwcyBmb3IgZGF0YSB0byBkaXNjb25uZWN0LCB0aGVuIHR1cm4gb2ZmIHJhZGlvLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1JhZGlvUG93ZXJPZmZBZnRlckRhdGFPZmYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQ2Fubm90IHNlbmQgZGVsYXllZCBNc2csIHR1cm4gb2ZmIHJhZGlvIHJpZ2h0IGF3YXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ3VwQW5kUG93ZXJPZmYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1JhZGlvUG93ZXJPZmZBZnRlckRhdGFPZmYgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJDYW5ub3Qgc2VuZCBkZWxheWVkIE1zZywgdHVybiBvZmYgcmFkaW8gcmlnaHQgYXdheS4iKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZ3VwQW5kUG93ZXJPZmYoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY1Myw4ICs2NzQsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcgJiYKLSAgICAgICAgICAgICAgICAgICAgZXJyICE9IENvbW1hbmRFeGNlcHRpb24uRXJyb3IuT1BfTk9UX0FMTE9XRURfQkVGT1JFX1JFR19OVykgeworICAgICAgICAgICAgaWYgKGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcpIHsKICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJJTCBpbXBsZW1lbnRhdGlvbiBoYXMgcmV0dXJuZWQgYW4gZXJyb3Igd2hlcmUgaXQgbXVzdCBzdWNjZWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFyLmV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBlOTc1NDlkLi5mNGE2ZDExIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTE5Miw2ICsxOTIsMTggQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlQ2VsbEJyb2FkY2FzdChpbnQgbWVzc2FnZUlkZW50aWZpZXIpIHsKKyAgICAgICAgLy8gTm90IGltcGxlbWVudGVkCisgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgTm90IGltcGxlbWVudGVkIGZvciBDRE1BLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB7CisgICAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZAorICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IhIE5vdCBpbXBsZW1lbnRlZCBmb3IgQ0RNQS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbUnVpbVNtc0ludGVyZmFjZU1hbmFnZXJdICIgKyBtc2cpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZmMDI0ZWQuLjU0Y2Y2MTIKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpAQCAtMjksOCArMjksMTAgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuQmVhcmVyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuQ2RtYVNtc0FkZHJlc3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkNkbWFTbXNTdWJhZGRyZXNzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5TbXNFbnZlbG9wZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwpAQCAtNzEsNiArNzMsMTYgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQ0RNQSI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExPR0dBQkxFX1RBRyA9ICJDRE1BOlNNUyI7CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFRFTEVTRVJWSUNFX0lERU5USUZJRVIgICAgICAgICAgICAgICAgICAgID0gMHgwMDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNFUlZJQ0VfQ0FURUdPUlkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIE9SSUdJTkFUSU5HX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIE9SSUdJTkFUSU5HX1NVQl9BRERSRVNTICAgICAgICAgICAgICAgICAgID0gMHgwMzsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIERFU1RJTkFUSU9OX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIERFU1RJTkFUSU9OX1NVQl9BRERSRVNTICAgICAgICAgICAgICAgICAgID0gMHgwNTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEJFQVJFUl9SRVBMWV9PUFRJT04gICAgICAgICAgICAgICAgICAgICAgID0gMHgwNjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIENBVVNFX0NPREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNzsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEJFQVJFUl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODsKKwogICAgIC8qKgogICAgICAqICBTdGF0dXMgb2YgYSBwcmV2aW91c2x5IHN1Ym1pdHRlZCBTTVMuCiAgICAgICogIFRoaXMgZmllbGQgYXBwbGllcyB0byBTTVMgRGVsaXZlcnkgQWNrbm93bGVkZ2UgbWVzc2FnZXMuIDAgaW5kaWNhdGVzIHN1Y2Nlc3M7CkBAIC0xMzgsNiArMTUwLDcgQEAKICAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBuZXcgU21zTWVzc2FnZSgpOwogICAgICAgICBTbXNFbnZlbG9wZSBlbnYgPSBuZXcgU21zRW52ZWxvcGUoKTsKICAgICAgICAgQ2RtYVNtc0FkZHJlc3MgYWRkciA9IG5ldyBDZG1hU21zQWRkcmVzcygpOworICAgICAgICBDZG1hU21zU3ViYWRkcmVzcyBzdWJhZGRyID0gbmV3IENkbWFTbXNTdWJhZGRyZXNzKCk7CiAgICAgICAgIGJ5dGVbXSBkYXRhOwogICAgICAgICBieXRlIGNvdW50OwogICAgICAgICBpbnQgY291bnRJbnQ7CkBAIC0xODAsMTUgKzE5MywyNCBAQAogCiAgICAgICAgIGFkZHIub3JpZ0J5dGVzID0gZGF0YTsKIAotICAgICAgICAvLyBpZ25vcmUgc3ViYWRkcmVzcwotICAgICAgICBwLnJlYWRJbnQoKTsgLy9wX2N1ci0+c1N1YkFkZHJlc3Muc3ViYWRkcmVzc1R5cGUKLSAgICAgICAgcC5yZWFkSW50KCk7IC8vcF9jdXItPnNTdWJBZGRyZXNzLm9kZAotICAgICAgICBjb3VudCA9IHAucmVhZEJ5dGUoKTsgLy9wX2N1ci0+c1N1YkFkZHJlc3MubnVtYmVyX29mX2RpZ2l0cwotICAgICAgICAvL3BfY3VyLT5zU3ViQWRkcmVzcy5kaWdpdHNbZGlnaXRDb3VudF0gOgotICAgICAgICBmb3IgKGludCBpbmRleD0wOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBwLnJlYWRCeXRlKCk7CisgICAgICAgIHN1YmFkZHIudHlwZSA9IHAucmVhZEludCgpOyAvLyBwX2N1ci0+c1N1YkFkZHJlc3Muc3ViYWRkcmVzc1R5cGUKKyAgICAgICAgc3ViYWRkci5vZGQgPSBwLnJlYWRCeXRlKCk7ICAgICAvLyBwX2N1ci0+c1N1YkFkZHJlc3Mub2RkCisgICAgICAgIGNvdW50ID0gcC5yZWFkQnl0ZSgpOyAgICAgICAgICAgLy8gcF9jdXItPnNTdWJBZGRyZXNzLm51bWJlcl9vZl9kaWdpdHMKKworICAgICAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBwX2N1ci0+c1N1YkFkZHJlc3MuZGlnaXRzW2RpZ2l0Q291bnRdIDoKKworICAgICAgICBkYXRhID0gbmV3IGJ5dGVbY291bnRdOworCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgZGF0YVtpbmRleF0gPSBwLnJlYWRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdWJhZGRyLm9yaWdCeXRlcyA9IGRhdGE7CisKICAgICAgICAgLyogY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vZGVtLWxpYjoKICAgICAgICAgICAgIGVudi5iZWFyZXJSZXBseQogICAgICAgICAgICAgZW52LnJlcGx5U2VxTm8KQEAgLTIxMCw2ICsyMzIsNyBAQAogCiAgICAgICAgIC8vIGxpbmsgdGhlIHRoZSBmaWxsZWQgb2JqZWN0cyB0byB0aGUgU01TCiAgICAgICAgIGVudi5vcmlnQWRkcmVzcyA9IGFkZHI7CisgICAgICAgIGVudi5vcmlnU3ViYWRkcmVzcyA9IHN1YmFkZHI7CiAgICAgICAgIG1zZy5vcmlnaW5hdGluZ0FkZHJlc3MgPSBhZGRyOwogICAgICAgICBtc2cubUVudmVsb3BlID0gZW52OwogCkBAIC0yNTUsNiArMjc4LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMiwgcGR1LCAwLCBzaXplKTsKICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGhhcyB0byBiZSBwYXJzZWQgYmVmb3JlIGl0IGNhbiBiZSBkaXNwbGF5ZWQKICAgICAgICAgICAgIC8vIHNlZSBnc20uU21zTWVzc2FnZQorICAgICAgICAgICAgbXNnLnBhcnNlUGR1RnJvbUVmUmVjb3JkKHBkdSk7CiAgICAgICAgICAgICByZXR1cm4gbXNnOwogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU01TIFBEVSBwYXJzaW5nIGZhaWxlZDogIiwgZXgpOwpAQCAtNTI3LDYgKzU1MSwxNDMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZWNvZGVzIDNHUFAyIHNtcyBzdG9yZWQgaW4gQ1NJTS9SVUlNIGNhcmRzIEFzIHBlciAzR1BQMiBDLlMwMDE1LTAKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQZHVGcm9tRWZSZWNvcmQoYnl0ZVtdIHBkdSkgeworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBkdSk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGJhaXMpOworICAgICAgICBTbXNFbnZlbG9wZSBlbnYgPSBuZXcgU21zRW52ZWxvcGUoKTsKKyAgICAgICAgQ2RtYVNtc0FkZHJlc3MgYWRkciA9IG5ldyBDZG1hU21zQWRkcmVzcygpOworICAgICAgICBDZG1hU21zU3ViYWRkcmVzcyBzdWJBZGRyID0gbmV3IENkbWFTbXNTdWJhZGRyZXNzKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudi5tZXNzYWdlVHlwZSA9IGRpcy5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICB3aGlsZSAoZGlzLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJJZCA9IGRpcy5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJMZW4gPSBkaXMucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBieXRlW10gcGFyYW1ldGVyRGF0YSA9IG5ldyBieXRlW3BhcmFtZXRlckxlbl07CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVEVMRVNFUlZJQ0VfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAxNiBiaXQgcGFyYW1ldGVyIHRoYXQgaWRlbnRpZmllcyB3aGljaCB1cHBlciBsYXllcgorICAgICAgICAgICAgICAgICAgICAgICAgICogc2VydmljZSBhY2Nlc3MgcG9pbnQgaXMgc2VuZGluZyBvciBzaG91bGQgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcyBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi50ZWxlU2VydmljZSA9IGRpcy5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlbGVzZXJ2aWNlID0gIiArIGVudi50ZWxlU2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NBVEVHT1JZOgorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIDE2IGJpdCBwYXJhbWV0ZXIgdGhhdCBpZGVudGlmaWVzIHR5cGUgb2Ygc2VydmljZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gM0dQUDIgQy5TMDAxNS0wIFRhYmxlIDMuNC4zLjItMQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbnYuc2VydmljZUNhdGVnb3J5ID0gZGlzLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUklHSU5BVElOR19BRERSRVNTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERFU1RJTkFUSU9OX0FERFJFU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXMucmVhZChwYXJhbWV0ZXJEYXRhLCAwLCBwYXJhbWV0ZXJMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgQml0d2lzZUlucHV0U3RyZWFtIGFkZHJCaXMgPSBuZXcgQml0d2lzZUlucHV0U3RyZWFtKHBhcmFtZXRlckRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5kaWdpdE1vZGUgPSBhZGRyQmlzLnJlYWQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLm51bWJlck1vZGUgPSBhZGRyQmlzLnJlYWQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkci5kaWdpdE1vZGUgPT0gQ2RtYVNtc0FkZHJlc3MuRElHSVRfTU9ERV84QklUX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUeXBlID0gYWRkckJpcy5yZWFkKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIudG9uID0gbnVtYmVyVHlwZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyLm51bWJlck1vZGUgPT0gQ2RtYVNtc0FkZHJlc3MuTlVNQkVSX01PREVfTk9UX0RBVEFfTkVUV09SSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5udW1iZXJQbGFuID0gYWRkckJpcy5yZWFkKDQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLm51bWJlck9mRGlnaXRzID0gYWRkckJpcy5yZWFkKDgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2FkZHIubnVtYmVyT2ZEaWdpdHNdOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBiID0gMHgwMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIuZGlnaXRNb2RlID09IENkbWFTbXNBZGRyZXNzLkRJR0lUX01PREVfNEJJVF9EVE1GKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXMgcGVyIDNHUFAyIEMuUzAwMDUtMCBUYWJsZSAyLjcuMS4zLjIuNC00ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFkZHIubnVtYmVyT2ZEaWdpdHM7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChieXRlKSAoMHhGICYgYWRkckJpcy5yZWFkKDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgdmFsdWUgaWYgaXQgaXMgNC1iaXQgRFRNRiB0byA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IGNvbnZlcnREdG1mVG9Bc2NpaShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHIuZGlnaXRNb2RlID09IENkbWFTbXNBZGRyZXNzLkRJR0lUX01PREVfOEJJVF9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIubnVtYmVyTW9kZSA9PSBDZG1hU21zQWRkcmVzcy5OVU1CRVJfTU9ERV9OT1RfREFUQV9ORVRXT1JLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhZGRyLm51bWJlck9mRGlnaXRzOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKGJ5dGUpICgweEZGICYgYWRkckJpcy5yZWFkKDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyLm51bWJlck1vZGUgPT0gQ2RtYVNtc0FkZHJlc3MuTlVNQkVSX01PREVfREFUQV9ORVRXT1JLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJUeXBlID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVE9ETzogT3JpZ2luYXRpbmcgQWRkciBpcyBlbWFpbCBpZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPRE86IE9yaWdpbmF0aW5nIEFkZHIgaXMgZGF0YSBuZXR3b3JrIGFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3JpZ2luYXRpbmcgQWRkciBpcyBvZiBpbmNvcnJlY3QgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBEaWdpdCBtb2RlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLm9yaWdCeXRlcyA9IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiT3JpZ2luYXRpbmcgQWRkcj0iICsgYWRkci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9SSUdJTkFUSU5HX1NVQl9BRERSRVNTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERFU1RJTkFUSU9OX1NVQl9BRERSRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzLnJlYWQocGFyYW1ldGVyRGF0YSwgMCwgcGFyYW1ldGVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHdpc2VJbnB1dFN0cmVhbSBzdWJBZGRyQmlzID0gbmV3IEJpdHdpc2VJbnB1dFN0cmVhbShwYXJhbWV0ZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkFkZHIudHlwZSA9IHN1YkFkZHJCaXMucmVhZCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkFkZHIub2RkID0gc3ViQWRkckJpcy5yZWFkQnl0ZUFycmF5KDEpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YkFkZHJMZW4gPSBzdWJBZGRyQmlzLnJlYWQoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc3ViZGF0YSA9IG5ldyBieXRlW3N1YkFkZHJMZW5dOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN1YkFkZHJMZW47IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKGJ5dGUpICgweEZGICYgc3ViQWRkckJpcy5yZWFkKDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSBpZiBpdCBpcyA0LWJpdCBEVE1GIHRvIDggYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGF0YVtpbmRleF0gPSBjb252ZXJ0RHRtZlRvQXNjaWkoYik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJBZGRyLm9yaWdCeXRlcyA9IHN1YmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCRUFSRVJfUkVQTFlfT1BUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzLnJlYWQocGFyYW1ldGVyRGF0YSwgMCwgcGFyYW1ldGVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHdpc2VJbnB1dFN0cmVhbSByZXBseU9wdEJpcyA9IG5ldyBCaXR3aXNlSW5wdXRTdHJlYW0ocGFyYW1ldGVyRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYuYmVhcmVyUmVwbHkgPSByZXBseU9wdEJpcy5yZWFkKDYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FVU0VfQ09ERVM6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXMucmVhZChwYXJhbWV0ZXJEYXRhLCAwLCBwYXJhbWV0ZXJMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgQml0d2lzZUlucHV0U3RyZWFtIGNjQmlzID0gbmV3IEJpdHdpc2VJbnB1dFN0cmVhbShwYXJhbWV0ZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi5yZXBseVNlcU5vID0gY2NCaXMucmVhZEJ5dGVBcnJheSg2KVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi5lcnJvckNsYXNzID0gY2NCaXMucmVhZEJ5dGVBcnJheSgyKVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYuZXJyb3JDbGFzcyAhPSAweDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5jYXVzZUNvZGUgPSBjY0Jpcy5yZWFkQnl0ZUFycmF5KDgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkVBUkVSX0RBVEE6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXMucmVhZChwYXJhbWV0ZXJEYXRhLCAwLCBwYXJhbWV0ZXJMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZW52LmJlYXJlckRhdGEgPSBwYXJhbWV0ZXJEYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBwYXJhbWV0ZXJJZCAoIiArIHBhcmFtZXRlcklkICsgIikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYWlzLmNsb3NlKCk7CisgICAgICAgICAgICBkaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicGFyc2VQZHVGcm9tRWZSZWNvcmQ6IGNvbnZlcnNpb24gZnJvbSBwZHUgdG8gU21zTWVzc2FnZSBmYWlsZWQiICsgZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbGluayB0aGUgZmlsbGVkIG9iamVjdHMgdG8gdGhpcyBTTVMKKyAgICAgICAgb3JpZ2luYXRpbmdBZGRyZXNzID0gYWRkcjsKKyAgICAgICAgZW52Lm9yaWdBZGRyZXNzID0gYWRkcjsKKyAgICAgICAgZW52Lm9yaWdTdWJhZGRyZXNzID0gc3ViQWRkcjsKKyAgICAgICAgbUVudmVsb3BlID0gZW52OworICAgICAgICBtUGR1ID0gcGR1OworCisgICAgICAgIHBhcnNlU21zKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFyc2VzIGEgU01TIG1lc3NhZ2UgZnJvbSBpdHMgQmVhcmVyRGF0YSBzdHJlYW0uIChtb2JpbGUtdGVybWluYXRlZCBvbmx5KQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlU21zKCkgewpAQCAtODE4LDYgKzk3OSw4IEBACiAgICAgICAgIG91dHB1dC53cml0ZShtRW52ZWxvcGUudGVsZVNlcnZpY2UpOwogICAgICAgICBvdXRwdXQud3JpdGUobUVudmVsb3BlLm9yaWdBZGRyZXNzLm9yaWdCeXRlcywgMCwgbUVudmVsb3BlLm9yaWdBZGRyZXNzLm9yaWdCeXRlcy5sZW5ndGgpOwogICAgICAgICBvdXRwdXQud3JpdGUobUVudmVsb3BlLmJlYXJlckRhdGEsIDAsIG1FbnZlbG9wZS5iZWFyZXJEYXRhLmxlbmd0aCk7CisgICAgICAgIG91dHB1dC53cml0ZShtRW52ZWxvcGUub3JpZ1N1YmFkZHJlc3Mub3JpZ0J5dGVzLCAwLAorICAgICAgICAgICAgICAgIG1FbnZlbG9wZS5vcmlnU3ViYWRkcmVzcy5vcmlnQnl0ZXMubGVuZ3RoKTsKIAogICAgICAgICByZXR1cm4gb3V0cHV0LnRvQnl0ZUFycmF5KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKaW5kZXggN2JjNDhjYS4uOGE0ZTBjZSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCkBAIC01ODgsNyArNTg4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdURhdGEucGF5bG9hZCA9IG5ldyBieXRlWzBdOwogICAgICAgICAgICAgICAgICAgICB1RGF0YS5udW1GaWVsZHMgPSAwOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVEYXRhLnBheWxvYWQgPSB1RGF0YS5wYXlsb2FkOwogICAgICAgICAgICAgICAgICAgICB1RGF0YS5udW1GaWVsZHMgPSB1RGF0YS5wYXlsb2FkLmxlbmd0aDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQ2RtYVNtc1N1YmFkZHJlc3MuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKY29weSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQ2RtYVNtc1N1YmFkZHJlc3MuamF2YQppbmRleCA4NmRlMzY2Li5mOWNlYmY1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQ2RtYVNtc1N1YmFkZHJlc3MuamF2YQpAQCAtMSw1ICsxLDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTUsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtczsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOworcHVibGljIGNsYXNzIENkbWFTbXNTdWJhZGRyZXNzIHsKKyAgICBwdWJsaWMgaW50IHR5cGU7CiAKKyAgICBwdWJsaWMgYnl0ZSBvZGQ7CiAKLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBleGNlcHRpb25zIGluIFNUSyBzZXJ2aWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotY2xhc3MgU3RrRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFN0a0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisgICAgcHVibGljIGJ5dGVbXSBvcmlnQnl0ZXM7CiB9CisKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKaW5kZXggMGRjYWNjMS4uNGYwMDE2MyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zOwogCiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuQ2RtYVNtc1N1YmFkZHJlc3M7CisKIHB1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZXsKICAgICAvKioKICAgICAgKiBNZXNzYWdlIFR5cGVzCkBAIC03NCwxNyArNzYsMjMgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhZGRyZXNzIGlkZW50aWZpZXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIFNNUyBtZXNzYWdlLgotICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2MiwgMy40LjMuNCkKKyAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIsIDMuNC4zLjMpCiAgICAgICovCiAgICAgcHVibGljIENkbWFTbXNBZGRyZXNzIG9yaWdBZGRyZXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaWRlbnRpZmllcyB0aGUgdGFyZ2V0IG9mIHRoZSBTTVMgbWVzc2FnZS4KLSAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIsIDMuNC4zLjQpCisgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLCAzLjQuMy4zKQogICAgICAqLwogICAgIHB1YmxpYyBDZG1hU21zQWRkcmVzcyBkZXN0QWRkcmVzczsKIAogICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW5hdGlvbiBzdWJhZGRyZXNzIGlkZW50aWZpZXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIFNNUyBtZXNzYWdlLgorICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2MiwgMy40LjMuNCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2RtYVNtc1N1YmFkZHJlc3Mgb3JpZ1N1YmFkZHJlc3M7CisKKyAgICAvKioKICAgICAgKiBUaGUgNi1iaXQgYmVhcmVyIHJlcGx5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHJlcXVlc3QgdGhlIHJldHVybiBvZiBhCiAgICAgICogU01TIEFja25vd2xlZGdlIE1lc3NhZ2UuCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLCAzLjQuMy41KQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCmluZGV4IDY4OWE5NzIuLjM5NTljNjcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKQEAgLTQ5LDYgKzQ5LDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlLlNFUlZJQ0VfQ0xBU1NfVk9JQ0U7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzLlBST1BFUlRZX0JBU0VCQU5EX1ZFUlNJT047CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0LkNhdFNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxGb3J3YXJkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwpAQCAtNjgsNyArNjksNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU3RrU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1ZtTm90U3VwcG9ydGVkRXhjZXB0aW9uOwogCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICBHc21TTVNEaXNwYXRjaGVyIG1TTVM7CiAgICAgU0lNUmVjb3JkcyBtU0lNUmVjb3JkczsKICAgICBTaW1DYXJkIG1TaW1DYXJkOwotICAgIFN0a1NlcnZpY2UgbVN0a1NlcnZpY2U7CisgICAgQ2F0U2VydmljZSBtU3RrU2VydmljZTsKICAgICBBcnJheUxpc3QgPEdzbU1taUNvZGU+IG1QZW5kaW5nTU1JcyA9IG5ldyBBcnJheUxpc3Q8R3NtTW1pQ29kZT4oKTsKICAgICBTaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyIG1TaW1QaG9uZUJvb2tJbnRNYW5hZ2VyOwogICAgIFNpbVNtc0ludGVyZmFjZU1hbmFnZXIgbVNpbVNtc0ludE1hbmFnZXI7CkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgICAgIG1TaW1TbXNJbnRNYW5hZ2VyID0gbmV3IFNpbVNtc0ludGVyZmFjZU1hbmFnZXIodGhpcywgbVNNUyk7CiAgICAgICAgICAgICBtU3ViSW5mbyA9IG5ldyBQaG9uZVN1YkluZm8odGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgbVN0a1NlcnZpY2UgPSBTdGtTZXJ2aWNlLmdldEluc3RhbmNlKG1DTSwgbVNJTVJlY29yZHMsIG1Db250ZXh0LAorICAgICAgICBtU3RrU2VydmljZSA9IENhdFNlcnZpY2UuZ2V0SW5zdGFuY2UobUNNLCBtU0lNUmVjb3JkcywgbUNvbnRleHQsCiAgICAgICAgICAgICAgICAgKFNJTUZpbGVIYW5kbGVyKW1JY2NGaWxlSGFuZGxlciwgbVNpbUNhcmQpOwogCiAgICAgICAgIG1DTS5yZWdpc3RlckZvckF2YWlsYWJsZSh0aGlzLCBFVkVOVF9SQURJT19BVkFJTEFCTEUsIG51bGwpOwpAQCAtOTY4LDcgKzk2OCw5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZ2V0Q2FsbFdhaXRpbmcoTWVzc2FnZSBvbkNvbXBsZXRlKSB7Ci0gICAgICAgIG1DTS5xdWVyeUNhbGxXYWl0aW5nKENvbW1hbmRzSW50ZXJmYWNlLlNFUlZJQ0VfQ0xBU1NfVk9JQ0UsIG9uQ29tcGxldGUpOworICAgICAgICAvL0FzIHBlciAzR1BQIFRTIDI0LjA4Mywgc2VjdGlvbiAxLjYgVUUgZG9lc24ndCBuZWVkIHRvIHNlbmQgc2VydmljZQorICAgICAgICAvL2NsYXNzIHBhcmFtZXRlciBpbiBjYWxsIHdhaXRpbmcgaW50ZXJyb2dhdGlvbiAgdG8gbmV0d29yaworICAgICAgICBtQ00ucXVlcnlDYWxsV2FpdGluZyhDb21tYW5kc0ludGVyZmFjZS5TRVJWSUNFX0NMQVNTX05PTkUsIG9uQ29tcGxldGUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldENhbGxXYWl0aW5nKGJvb2xlYW4gZW5hYmxlLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKQEAgLTEyMjEsNyArMTIyMyw4IEBACiAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRpZmZlcmVudCBTSU0gdGhhbiB0aGUgcHJldmlvdXMgb25lLiBJZiBzbyB1bnNldCB0aGUKICAgICAgICAgICAgICAgICAvLyB2b2ljZSBtYWlsIG51bWJlci4KICAgICAgICAgICAgICAgICBTdHJpbmcgaW1zaSA9IGdldFZtU2ltSW1zaSgpOwotICAgICAgICAgICAgICAgIGlmIChpbXNpICE9IG51bGwgJiYgIWdldFN1YnNjcmliZXJJZCgpLmVxdWFscyhpbXNpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBpbXNpRnJvbVNJTSA9IGdldFN1YnNjcmliZXJJZCgpOworICAgICAgICAgICAgICAgIGlmIChpbXNpICE9IG51bGwgJiYgaW1zaUZyb21TSU0gIT0gbnVsbCAmJiAhaW1zaUZyb21TSU0uZXF1YWxzKGltc2kpKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0b3JlVm9pY2VNYWlsTnVtYmVyKG51bGwpOwogICAgICAgICAgICAgICAgICAgICBzZXRWbVNpbUltc2kobnVsbCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQ4MCw0ICsxNDgzLDcgQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNDc3BQbG1uRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TSU1SZWNvcmRzLmlzQ3NwUGxtbkVuYWJsZWQoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbU1taUNvZGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtTW1pQ29kZS5qYXZhCmluZGV4IDVjN2NlMmYuLjI5NjJlMGYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtTW1pQ29kZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtTW1pQ29kZS5qYXZhCkBAIC00NCw2ICs0NCwxMyBAQAogCiAgICAgLy8qKioqKiBDb25zdGFudHMKIAorICAgIC8vIE1heCBTaXplIG9mIHRoZSBTaG9ydCBDb2RlIChha2EgU2hvcnQgU3RyaW5nIGZyb20gVFMgMjIuMDMwIDYuNS4yKQorICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xFTkdUSF9TSE9SVF9DT0RFID0gMjsKKworICAgIC8vIFRTIDIyLjAzMCA2LjUuMiBFdmVyeSBTaG9ydCBTdHJpbmcgVVNTRCBjb21tYW5kIHdpbGwgZW5kIHdpdGggIy1rZXkKKyAgICAvLyAoa25vd24gYXMgIy1TdHJpbmcpCisgICAgc3RhdGljIGZpbmFsIGNoYXIgRU5EX09GX1VTU0RfQ09NTUFORCA9ICcjJzsKKwogICAgIC8vIEZyb20gVFMgMjIuMDMwIDYuNS4yCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQUNUSVZBVEUgPSAiKiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVBQ1RJVkFURSA9ICIjIjsKQEAgLTQ3MSwyMiArNDc4LDY5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBuZXdGcm9tRGlhbFN0cmluZy4gIFJldHVybnMgdHJ1ZSBpZiBkaWFsU3RyaW5nIGFwcGVhcnMgdG8gYmUgYSBzaG9ydCBjb2RlCi0gICAgICogQU5EIGNvbmRpdGlvbnMgYXJlIGNvcnJlY3QgZm9yIGl0IHRvIGJlIHRyZWF0ZWQgYXMgc3VjaC4KKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG5ld0Zyb21EaWFsU3RyaW5nLiBSZXR1cm5zIHRydWUgaWYgZGlhbFN0cmluZyBhcHBlYXJzCisgICAgICogdG8gYmUgYSBzaG9ydCBjb2RlIEFORCBjb25kaXRpb25zIGFyZSBjb3JyZWN0IGZvciBpdCB0byBiZSB0cmVhdGVkIGFzCisgICAgICogc3VjaC4KICAgICAgKi8KICAgICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzU2hvcnRDb2RlKFN0cmluZyBkaWFsU3RyaW5nLCBHU01QaG9uZSBwaG9uZSkgewogICAgICAgICAvLyBSZWZlciB0byBUUyAyMi4wMzAgRmlndXJlIDMuNS4zLjI6Ci0gICAgICAgIC8vIEEgMSBvciAyIGRpZ2l0ICJzaG9ydCBjb2RlIiBpcyB0cmVhdGVkIGFzIFVTU0QgaWYgaXQgaXMgZW50ZXJlZCB3aGlsZSBvbiBhIGNhbGwgb3IKLSAgICAgICAgLy8gZG9lcyBub3Qgc2F0aXNmeSB0aGUgY29uZGl0aW9uIChleGFjdGx5IDIgZGlnaXRzICYmIHN0YXJ0cyB3aXRoICcxJykuCi0gICAgICAgIHJldHVybiAoKGRpYWxTdHJpbmcgIT0gbnVsbCAmJiBkaWFsU3RyaW5nLmxlbmd0aCgpIDw9IDIpCi0gICAgICAgICAgICAgICAgJiYgIVBob25lTnVtYmVyVXRpbHMuaXNFbWVyZ2VuY3lOdW1iZXIoZGlhbFN0cmluZykKLSAgICAgICAgICAgICAgICAmJiAocGhvbmUuaXNJbkNhbGwoKQotICAgICAgICAgICAgICAgICAgICB8fCAhKChkaWFsU3RyaW5nLmxlbmd0aCgpID09IDIgJiYgZGlhbFN0cmluZy5jaGFyQXQoMCkgPT0gJzEnKQotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoaWxlIGNvbnRyYXJ5IHRvIFRTIDIyLjAzMCwgdGhlcmUgaXMgc3Ryb25nIHByZWNlZGVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3IgdHJlYXRpbmcgIjAiIGFuZCAiMDAiIGFzIGNhbGwgc2V0dXAgc3RyaW5ncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkaWFsU3RyaW5nLmVxdWFscygiMCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGlhbFN0cmluZy5lcXVhbHMoIjAwIikpKSk7CisgICAgICAgIGlmIChkaWFsU3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElsbGVnYWwgZGlhbCBzdHJpbmcgY2hhcmFjdGVycyB3aWxsIGdpdmUgYSBaRVJPIGxlbmd0aC4KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBkbyBub3Qgd2FudCB0byBjcmFzaCBhcyBhbnkgYXBwbGljYXRpb24gd2l0aAorICAgICAgICAvLyBjYWxsIHByaXZpbGVnZXMgbWF5IHNlbmQgYSBub24gZGlhbCBzdHJpbmcuCisgICAgICAgIC8vIEl0IHJldHVybiBmYWxzZSBhcyB3aGVuIHRoZSBkaWFsU3RyaW5nIGlzIGVxdWFsIHRvIE5VTEwuCisgICAgICAgIGlmIChkaWFsU3RyaW5nLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQaG9uZU51bWJlclV0aWxzLmlzRW1lcmdlbmN5TnVtYmVyKGRpYWxTdHJpbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaXNTaG9ydENvZGVVU1NEKGRpYWxTdHJpbmcsIHBob25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXNTaG9ydENvZGUuIFJldHVybnMgdHJ1ZSBpZiBkaWFsU3RyaW5nIGFwcGVhcnMgdG8gYmUKKyAgICAgKiBhIHNob3J0IGNvZGUgYW5kIGl0IGlzIGEgVVNTRCBzdHJ1Y3R1cmUKKyAgICAgKgorICAgICAqIEFjY29yZGluZyB0byB0aGUgM1BHRyBUUyAyMi4wMzAgc3BlY2lmaWNhdGlvbiBGaWd1cmUgMy41LjMuMjogQSAxIG9yIDIKKyAgICAgKiBkaWdpdCAic2hvcnQgY29kZSIgaXMgdHJlYXRlZCBhcyBVU1NEIGlmIGl0IGlzIGVudGVyZWQgd2hpbGUgb24gYSBjYWxsIG9yCisgICAgICogZG9lcyBub3Qgc2F0aXNmeSB0aGUgY29uZGl0aW9uIChleGFjdGx5IDIgZGlnaXRzICYmIHN0YXJ0cyB3aXRoICcxJyksIHRoZXJlCisgICAgICogYXJlIGhvd2V2ZXIgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUgKHNlZSBiZWxvdykKKyAgICAgKgorICAgICAqIEV4Y2VwdGlvbiAoMSkgdG8gQ2FsbCBpbml0aWF0aW9uIGlzOiBJZiB0aGUgdXNlciBvZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgaW4gYSBjYWxsCisgICAgICogYW5kIGVudGVycyBhIFNob3J0IFN0cmluZyB3aXRob3V0IGFueSAjLWtleSBhdCB0aGUgZW5kIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBTaG9ydCBTdHJpbmcgaXMKKyAgICAgKiBlcXVhbCBvciBsZXNzIHRoZW4gdGhlIE1BWF9MRU5HVEhfU0hPUlRfQ09ERSBbY29uc3RhbnQgdGhhdCBpcyBlcXVhbCB0byAyXQorICAgICAqCisgICAgICogVGhlIHBob25lIHNoYWxsIGluaXRpYXRlIGEgVVNTRC9TUyBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIEV4Y2VwdGlvbiAoMikgdG8gQ2FsbCBpbml0aWF0aW9uIGlzOiBJZiB0aGUgdXNlciBvZiB0aGUgZGV2aWNlIGVudGVycyBvbmUKKyAgICAgKiBEaWdpdCBmb2xsb3dlZCBieSB0aGUgIy1rZXkuIFRoaXMgcnVsZSBkZWZpbmVzIHRoaXMgU3RyaW5nIGFzIHRoZQorICAgICAqICMtU3RyaW5nIHdoaWNoIGlzIGEgVVNTRC9TUyBjb21tYW5kLgorICAgICAqCisgICAgICogVGhlIHBob25lIHNoYWxsIGluaXRpYXRlIGEgVVNTRC9TUyBjb21tYW5kLgorICAgICAqLworICAgIHN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNTaG9ydENvZGVVU1NEKFN0cmluZyBkaWFsU3RyaW5nLCBHU01QaG9uZSBwaG9uZSkgeworICAgICAgICBpZiAoZGlhbFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGhvbmUuaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIFNob3J0IENvZGUgKGFrYSBTaG9ydCBTdHJpbmcpIGlzIDIKKyAgICAgICAgICAgICAgICBpZiAoZGlhbFN0cmluZy5sZW5ndGgoKSA8PSBNQVhfTEVOR1RIX1NIT1JUX0NPREUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBTaG9ydCBDb2RlIChha2EgU2hvcnQgU3RyaW5nKSBpcyAyCisgICAgICAgICAgICBpZiAoZGlhbFN0cmluZy5sZW5ndGgoKSA8PSBNQVhfTEVOR1RIX1NIT1JUX0NPREUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlhbFN0cmluZy5jaGFyQXQoZGlhbFN0cmluZy5sZW5ndGgoKSAtIDEpID09IEVORF9PRl9VU1NEX0NPTU1BTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggZTdiNmMzNy4uODM1NTA0NiAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTIyLDIxICsyMiwyNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNtczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXMuSW50ZW50czsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmdzbS5Hc21DZWxsTG9jYXRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkJhc2VDb21tYW5kczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TTVNEaXNwYXRjaGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3M7CiAKQEAgLTQ4LDYgKzU0LDggQEAKICAgICBHc21TTVNEaXNwYXRjaGVyKEdTTVBob25lIHBob25lKSB7CiAgICAgICAgIHN1cGVyKHBob25lKTsKICAgICAgICAgbUdzbVBob25lID0gcGhvbmU7CisKKyAgICAgICAgKChCYXNlQ29tbWFuZHMpbUNtKS5zZXRPbk5ld0dzbUJyb2FkY2FzdFNtcyh0aGlzLCBFVkVOVF9ORVdfQlJPQURDQVNUX1NNUywgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zOTIsNCArNDAwLDE2MiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDb21tYW5kc0ludGVyZmFjZS5HU01fU01TX0ZBSUxfQ0FVU0VfVU5TUEVDSUZJRURfRVJST1I7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBhbGwgaW5mbyBhYm91dCBhIG1lc3NhZ2UgcGFnZSBuZWVkZWQgdG8gYXNzZW1ibGUgYSBjb21wbGV0ZQorICAgICAqIGNvbmNhdGVuYXRlZCBtZXNzYWdlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU21zQ2JDb25jYXRJbmZvIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTbXNDYkhlYWRlciBtSGVhZGVyOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QbG1uOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1MYWM7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNpZDsKKworICAgICAgICBwdWJsaWMgU21zQ2JDb25jYXRJbmZvKFNtc0NiSGVhZGVyIGhlYWRlciwgU3RyaW5nIHBsbW4sIGludCBsYWMsIGludCBjaWQpIHsKKyAgICAgICAgICAgIG1IZWFkZXIgPSBoZWFkZXI7CisgICAgICAgICAgICBtUGxtbiA9IHBsbW47CisgICAgICAgICAgICBtTGFjID0gbGFjOworICAgICAgICAgICAgbUNpZCA9IGNpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXIgKiAzMSArIG1IZWFkZXIudXBkYXRlTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU21zQ2JDb25jYXRJbmZvKSB7CisgICAgICAgICAgICAgICAgU21zQ2JDb25jYXRJbmZvIG90aGVyID0gKFNtc0NiQ29uY2F0SW5mbylvYmo7CisKKyAgICAgICAgICAgICAgICAvLyBUd28gcGFnZXMgbWF0Y2ggaWYgYWxsIGhlYWRlciBhdHRyaWJ1dGVzIChleGNlcHQgdGhlIHBhZ2UKKyAgICAgICAgICAgICAgICAvLyBpbmRleCkgYXJlIGlkZW50aWNhbCwgYW5kIGJvdGggcGFnZXMgYmVsb25nIHRvIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gKHdoaWNoIGlzIGFsc28gZGV0ZXJtaW5lZCBieSB0aGUgc2NvcGUgcGFyYW1ldGVyKQorICAgICAgICAgICAgICAgIGlmIChtSGVhZGVyLmdlb2dyYXBoaWNhbFNjb3BlID09IG90aGVyLm1IZWFkZXIuZ2VvZ3JhcGhpY2FsU2NvcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIubWVzc2FnZUNvZGUgPT0gb3RoZXIubUhlYWRlci5tZXNzYWdlQ29kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci51cGRhdGVOdW1iZXIgPT0gb3RoZXIubUhlYWRlci51cGRhdGVOdW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXIgPT0gb3RoZXIubUhlYWRlci5tZXNzYWdlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lID09IG90aGVyLm1IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci5uck9mUGFnZXMgPT0gb3RoZXIubUhlYWRlci5uck9mUGFnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNMb2NhdGlvbihvdGhlci5tUGxtbiwgb3RoZXIubUxhYywgb3RoZXIubUNpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgY29uY2F0ZW5hdGlvbiBpbmZvIG1hdGNoZXMgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGUKKyAgICAgICAgICogZ3JhbnVsYXJpdHkgb2YgdGhlIG1hdGNoIGRlcGVuZHMgb24gdGhlIGdlb2dyYXBoaWNhbCBzY29wZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBsbW4gUExNTgorICAgICAgICAgKiBAcGFyYW0gbGFjIExvY2F0aW9uIGFyZWEgY29kZQorICAgICAgICAgKiBAcGFyYW0gY2lkIENlbGwgSUQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIG1hdGNoaW5nLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNMb2NhdGlvbihTdHJpbmcgcGxtbiwgaW50IGxhYywgaW50IGNpZCkgeworICAgICAgICAgICAgc3dpdGNoIChtSGVhZGVyLmdlb2dyYXBoaWNhbFNjb3BlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERToKKyAgICAgICAgICAgICAgICBjYXNlIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DaWQgIT0gY2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfTEFfV0lERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYWMgIT0gbGFjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfUExNTl9XSURFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVBsbW4gIT0gbnVsbCAmJiBtUGxtbi5lcXVhbHMocGxtbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgbWFwIGhvbGRzIGluY29tcGxldGUgY29uY2F0ZW5hdGVkIG1lc3NhZ2VzIHdhaXRpbmcgZm9yIGFzc2VtYmx5CisgICAgcHJpdmF0ZSBIYXNoTWFwPFNtc0NiQ29uY2F0SW5mbywgYnl0ZVtdW10+IG1TbXNDYlBhZ2VNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U21zQ2JDb25jYXRJbmZvLCBieXRlW11bXT4oKTsKKworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUJyb2FkY2FzdFNtcyhBc3luY1Jlc3VsdCBhcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdW10gcGR1cyA9IG51bGw7CisgICAgICAgICAgICBieXRlW10gcmVjZWl2ZWRQZHUgPSAoYnl0ZVtdKWFyLnJlc3VsdDsKKworICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNlaXZlZFBkdS5sZW5ndGg7IGkgKz0gOCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlNNUyBDQiBwZHUgZGF0YTogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgaSArIDggJiYgaiA8IHJlY2VpdmVkUGR1Lmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHJlY2VpdmVkUGR1W2pdICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMHgxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYikpLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTbXNDYkhlYWRlciBoZWFkZXIgPSBuZXcgU21zQ2JIZWFkZXIocmVjZWl2ZWRQZHUpOworICAgICAgICAgICAgU3RyaW5nIHBsbW4gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChUZWxlcGhvbnlQcm9wZXJ0aWVzLlBST1BFUlRZX09QRVJBVE9SX05VTUVSSUMpOworICAgICAgICAgICAgR3NtQ2VsbExvY2F0aW9uIGNlbGxMb2NhdGlvbiA9IChHc21DZWxsTG9jYXRpb24pbUdzbVBob25lLmdldENlbGxMb2NhdGlvbigpOworICAgICAgICAgICAgaW50IGxhYyA9IGNlbGxMb2NhdGlvbi5nZXRMYWMoKTsKKyAgICAgICAgICAgIGludCBjaWQgPSBjZWxsTG9jYXRpb24uZ2V0Q2lkKCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubnJPZlBhZ2VzID4gMSkgeworICAgICAgICAgICAgICAgIC8vIE11bHRpLXBhZ2UgbWVzc2FnZQorICAgICAgICAgICAgICAgIFNtc0NiQ29uY2F0SW5mbyBjb25jYXRJbmZvID0gbmV3IFNtc0NiQ29uY2F0SW5mbyhoZWFkZXIsIHBsbW4sIGxhYywgY2lkKTsKKworICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIG90aGVyIHBhZ2VzIG9mIHRoZSBzYW1lIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBwZHVzID0gbVNtc0NiUGFnZU1hcC5nZXQoY29uY2F0SW5mbyk7CisKKyAgICAgICAgICAgICAgICBpZiAocGR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXQgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhpcyBtZXNzYWdlLCBtYWtlIHJvb20gZm9yIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBwYWdlcyBhbmQga2VlcCB1bnRpbCBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICBwZHVzID0gbmV3IGJ5dGVbaGVhZGVyLm5yT2ZQYWdlc11bXTsKKworICAgICAgICAgICAgICAgICAgICBtU21zQ2JQYWdlTWFwLnB1dChjb25jYXRJbmZvLCBwZHVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBQYWdlIHBhcmFtZXRlciBpcyBvbmUtYmFzZWQKKyAgICAgICAgICAgICAgICBwZHVzW2hlYWRlci5wYWdlSW5kZXggLSAxXSA9IHJlY2VpdmVkUGR1OworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZHVzW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIG1pc3NpbmcgcGFnZXMsIGV4aXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgY29tcGxldGUsIHJlbW92ZSBhbmQgZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBtU21zQ2JQYWdlTWFwLnJlbW92ZShjb25jYXRJbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2luZ2xlIHBhZ2UgbWVzc2FnZQorICAgICAgICAgICAgICAgIHBkdXMgPSBuZXcgYnl0ZVsxXVtdOworICAgICAgICAgICAgICAgIHBkdXNbMF0gPSByZWNlaXZlZFBkdTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzcGF0Y2hCcm9hZGNhc3RQZHVzKHBkdXMpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgbWVzc2FnZXMgdGhhdCBhcmUgb3V0IG9mIHNjb3BlIHRvIHByZXZlbnQgdGhlIG1hcCBmcm9tCisgICAgICAgICAgICAvLyBncm93aW5nIGluZGVmaW5pdGVseSwgY29udGFpbmluZyBpbmNvbXBsZXRlIG1lc3NhZ2VzIHRoYXQgd2VyZQorICAgICAgICAgICAgLy8gbmV2ZXIgYXNzZW1ibGVkCisgICAgICAgICAgICBJdGVyYXRvcjxTbXNDYkNvbmNhdEluZm8+IGl0ZXIgPSBtU21zQ2JQYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFNtc0NiQ29uY2F0SW5mbyBpbmZvID0gaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWluZm8ubWF0Y2hlc0xvY2F0aW9uKHBsbW4sIGxhYywgY2lkKSkgeworICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiBkZWNvZGluZyBTTVMgQ0IgcGR1IiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggNmRkYjMxMi4uMThlZjEyMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTY0Myw4ICs2NDMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcgJiYKLSAgICAgICAgICAgICAgICAgICAgZXJyICE9IENvbW1hbmRFeGNlcHRpb24uRXJyb3IuT1BfTk9UX0FMTE9XRURfQkVGT1JFX1JFR19OVykgeworICAgICAgICAgICAgaWYgKGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcpIHsKICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJJTCBpbXBsZW1lbnRhdGlvbiBoYXMgcmV0dXJuZWQgYW4gZXJyb3Igd2hlcmUgaXQgbXVzdCBzdWNjZWVkIiArCiAgICAgICAgICAgICAgICAgICAgICAgICBhci5leGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlci5qYXZhCmluZGV4IDIwNmU2MmYuLmU4ZDEwZjkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTUZpbGVIYW5kbGVyLmphdmEKQEAgLTgxLDYgKzgxLDcgQEAKICAgICAgICAgY2FzZSBFRl9TUE5fQ1BIUzoKICAgICAgICAgY2FzZSBFRl9TUE5fU0hPUlRfQ1BIUzoKICAgICAgICAgY2FzZSBFRl9JTkZPX0NQSFM6CisgICAgICAgIGNhc2UgRUZfQ1NQX0NQSFM6CiAgICAgICAgICAgICByZXR1cm4gTUZfU0lNICsgREZfR1NNOwogCiAgICAgICAgIGNhc2UgRUZfUEJSOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQppbmRleCBlMjE0MDYxLi4zYjEzM2RhIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQpAQCAtNzMsNiArNzMsNyBAQAogICAgICAqICBtQ3Boc0luZm9bMV0gYW5kIG1DcGhzSW5mb1syXSBpcyBDUEhTIFNlcnZpY2UgVGFibGUKICAgICAgKi8KICAgICBwcml2YXRlIGJ5dGVbXSBtQ3Boc0luZm8gPSBudWxsOworICAgIGJvb2xlYW4gbUNzcFBsbW5FbmFibGVkID0gdHJ1ZTsKIAogICAgIGJ5dGVbXSBlZk1XSVMgPSBudWxsOwogICAgIGJ5dGVbXSBlZkNQSFNfTVdJID1udWxsOwpAQCAtOTMsNiArOTQsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BOX1JVTEVfU0hPV19QTE1OID0gMHgwMjsKIAogICAgIC8vIEZyb20gVFMgNTEuMDExIEVGW1NQREldIHNlY3Rpb24KKyAgICBzdGF0aWMgZmluYWwgaW50IFRBR19TUERJID0gMHhBMzsKICAgICBzdGF0aWMgZmluYWwgaW50IFRBR19TUERJX1BMTU5fTElTVCA9IDB4ODA7CiAKICAgICAvLyBGdWxsIE5hbWUgSUVJIGZyb20gVFMgMjQuMDA4CkBAIC0xNDAsNiArMTQyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX01TSVNETl9ET05FID0gMzA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJTV9SRUZSRVNIID0gMzE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DRklTX0RPTkUgPSAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTUF9DUEhTX0RPTkUgPSAzMzsKIAogICAgIC8vIExvb2t1cCB0YWJsZSBmb3IgY2FycmllcnMga25vd24gdG8gcHJvZHVjZSBTSU1zIHdoaWNoIGluY29ycmVjdGx5IGluZGljYXRlIE1OQyBsZW5ndGguCiAKQEAgLTU4OSw2ICs1OTIsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NQSFNfTUFJTEJPWF9ET05FOgogICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfTUJETl9ET05FOgorICAgICAgICAgICAgICAgIC8vUmVzZXR0aW5nIHRoZSB2b2ljZSBtYWlsIG51bWJlciBhbmQgdm9pY2UgbWFpbCB0YWcgdG8gbnVsbAorICAgICAgICAgICAgICAgIC8vYXMgdGhlc2Ugc2hvdWxkIGJlIHVwZGF0ZWQgZnJvbSB0aGUgZGF0YSByZWFkIGZyb20gRUZfTUJETi4KKyAgICAgICAgICAgICAgICAvL0lmIHRoZXkgYXJlIG5vdCByZXNldCwgaW5jYXNlIG9mIGludmFsaWQgZGF0YS9leGNlcHRpb24gdGhlc2UKKyAgICAgICAgICAgICAgICAvL3ZhcmlhYmxlcyBhcmUgcmV0YWluaW5nIHRoZWlyIHByZXZpb3VzIHZhbHVlcyBhbmQgYXJlCisgICAgICAgICAgICAgICAgLy9jYXVzaW5nIGludmFsaWQgdm9pY2UgbWFpbGJveCBpbmZvIGRpc3BsYXkgdG8gdXNlci4KKyAgICAgICAgICAgICAgICB2b2ljZU1haWxOdW0gPSBudWxsOworICAgICAgICAgICAgICAgIHZvaWNlTWFpbFRhZyA9IG51bGw7CiAgICAgICAgICAgICAgICAgaXNSZWNvcmRMb2FkUmVzcG9uc2UgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKQEAgLTEwMzUsNiArMTA0NSwyMiBAQAogICAgICAgICAgICAgICAgICgoR1NNUGhvbmUpIHBob25lKS5ub3RpZnlDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICBjYXNlIEVWRU5UX0dFVF9DU1BfQ1BIU19ET05FOgorICAgICAgICAgICAgICAgIGlzUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KW1zZy5vYmo7CisKKyAgICAgICAgICAgICAgICBpZiAoYXIuZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywiRXhjZXB0aW9uIGluIGZldGNoaW5nIEVGX0NTUCBkYXRhICIgKyBhci5leGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhID0gKGJ5dGVbXSlhci5yZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCJFRl9DU1A6ICIgKyBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKGRhdGEpKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVFZkNzcERhdGEoZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgfX1jYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKICAgICAgICAgICAgIC8vIEkgZG9uJ3Qgd2FudCB0aGVzZSBleGNlcHRpb25zIHRvIGJlIGZhdGFsCiAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXhjZXB0aW9uIHBhcnNpbmcgU0lNIHJlY29yZCIsIGV4Yyk7CkBAIC0xMDU4LDYgKzEwODQsMTIgQEAKICAgICAgICAgICAgICAgICBuZXcgQWRuUmVjb3JkTG9hZGVyKHBob25lKS5sb2FkRnJvbUVGKEVGX01BSUxCT1hfQ1BIUywgRUZfRVhUMSwKICAgICAgICAgICAgICAgICAgICAgICAgIDEsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0NQSFNfTUFJTEJPWF9ET05FKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVGX0NTUF9DUEhTOgorICAgICAgICAgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiW0NTUF0gU0lNIFJlZnJlc2ggZm9yIEVGX0NTUF9DUEhTIik7CisgICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjRmlsZUhhbmRsZXIoKS5sb2FkRUZUcmFuc3BhcmVudChFRl9DU1BfQ1BIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0NTUF9DUEhTX0RPTkUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgZmV0Y2ggYWxsIHJlY29yZHMgaWYgdGhpcyBpcyBub3QgYQogICAgICAgICAgICAgICAgIC8vIHZvaWNlbWFpbCBudW1iZXIuCkBAIC0xMjg4LDYgKzEzMjAsOSBAQAogICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9JTkZPX0NQSFMsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0lORk9fQ1BIU19ET05FKSk7CiAgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKIAorICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9DU1BfQ1BIUyxvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9DU1BfQ1BIU19ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKwogICAgICAgICAvLyBYWFggc2hvdWxkIHNlZWsgaW5zdGVhZCBvZiBleGFtaW5pbmcgdGhlbSBhbGwKICAgICAgICAgaWYgKGZhbHNlKSB7IC8vIFhYWAogICAgICAgICAgICAgaWNjRmgubG9hZEVGTGluZWFyRml4ZWRBbGwoRUZfU01TLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9BTExfU01TX0RPTkUpKTsKQEAgLTE0NjcsOCArMTUwMiwxMiBAQAogCiAgICAgICAgIGJ5dGVbXSBwbG1uRW50cmllcyA9IG51bGw7CiAKLSAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIFRBR19TUERJX1BMTU5fTElTVAogICAgICAgICBmb3IgKCA7IHRsdi5pc1ZhbGlkT2JqZWN0KCkgOyB0bHYubmV4dE9iamVjdCgpKSB7CisgICAgICAgICAgICAvLyBTa2lwIFNQREkgdGFnLCBpZiBleGlzdGFudAorICAgICAgICAgICAgaWYgKHRsdi5nZXRUYWcoKSA9PSBUQUdfU1BESSkgeworICAgICAgICAgICAgICB0bHYgPSBuZXcgU2ltVGx2KHRsdi5nZXREYXRhKCksIDAsIHRsdi5nZXREYXRhKCkubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBUQUdfU1BESV9QTE1OX0xJU1QKICAgICAgICAgICAgIGlmICh0bHYuZ2V0VGFnKCkgPT0gVEFHX1NQRElfUExNTl9MSVNUKSB7CiAgICAgICAgICAgICAgICAgcGxtbkVudHJpZXMgPSB0bHYuZ2V0RGF0YSgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTUwNSw0ICsxNTQ0LDUzIEBACiAgICAgICAgIExvZy5kKExPR19UQUcsICJbU0lNUmVjb3Jkc10gIiArIHMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmICJSZXN0cmljdGlvbiBvZiBtZW51IG9wdGlvbnMgZm9yIG1hbnVhbCBQTE1OIHNlbGVjdGlvbiIKKyAgICAgKiBiaXQgaXMgc2V0IG9yIEVGX0NTUCBkYXRhIGlzIHVuYXZhaWxhYmxlLCByZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3NwUGxtbkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtQ3NwUGxtbkVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgRUZfQ1NQIGRhdGEgYW5kIGNoZWNrIGlmCisgICAgICogIlJlc3RyaWN0aW9uIG9mIG1lbnUgb3B0aW9ucyBmb3IgbWFudWFsIFBMTU4gc2VsZWN0aW9uIiBpcworICAgICAqIEVuYWJsZWQvRGlzYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIEVGX0NTUCBoZXggZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRWZDc3BEYXRhKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIC8vIEFzIHBlciBzcGVjIENQSFM0XzIuV1c2LCBDUEhTIEIuNC43LjEsIEVGX0NTUCBjb250YWlucyBDUEhTIGRlZmluZWQKKyAgICAgICAgLy8gMTggYnl0ZXMgKGkuZSA5IHNlcnZpY2UgZ3JvdXBzIGluZm8pIGFuZCBhZGRpdGlvbmFsIGRhdGEgc3BlY2lmaWMgdG8KKyAgICAgICAgLy8gb3BlcmF0b3IuIFRoZSB2YWx1ZUFkZGVkU2VydmljZXNHcm91cCBpcyBub3QgcGFydCBvZiBzdGFuZGFyZAorICAgICAgICAvLyBzZXJ2aWNlcy4gVGhpcyBpcyBvcGVyYXRvciBzcGVjaWZpYyBhbmQgY2FuIGJlIHByb2dyYW1tZWQgYW55IHdoZXJlLgorICAgICAgICAvLyBOb3JtYWxseSB0aGlzIGlzIHByb2dyYW1tZWQgYXMgMTB0aCBzZXJ2aWNlIGFmdGVyIHRoZSBzdGFuZGFyZAorICAgICAgICAvLyBzZXJ2aWNlcy4KKyAgICAgICAgaW50IHVzZWRDc3BHcm91cHMgPSBkYXRhLmxlbmd0aCAvIDI7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlICJTZXJ2aXZlIEdyb3VwIE51bWJlciIgb2YgIlZhbHVlIEFkZGVkIFNlcnZpY2VzIEdyb3VwIi4KKyAgICAgICAgYnl0ZSB2YWx1ZUFkZGVkU2VydmljZXNHcm91cCA9IChieXRlKTB4QzA7CisKKyAgICAgICAgbUNzcFBsbW5FbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VkQ3NwR3JvdXBzOyBpKyspIHsKKyAgICAgICAgICAgICBpZiAoZGF0YVsyICogaV0gPT0gdmFsdWVBZGRlZFNlcnZpY2VzR3JvdXApIHsKKyAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIltDU1BdIGZvdW5kIFZhbHVlQWRkZWRTZXJ2aWNlc0dyb3VwLCB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVsoMiAqIGkpICsgMV0pOworICAgICAgICAgICAgICAgICBpZiAoKGRhdGFbKDIgKiBpKSArIDFdICYgMHg4MCkgPT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgLy8gQml0IDggaXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAvLyAiUmVzdHJpY3Rpb24gb2YgbWVudSBvcHRpb25zIGZvciBtYW51YWwgUExNTiBzZWxlY3Rpb24iLgorICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmF0b3IgU2VsZWN0aW9uIG1lbnUgc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICBtQ3NwUGxtbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgbUNzcFBsbW5FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAvLyBPcGVyYXRvciBTZWxlY3Rpb24gbWVudSBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAvLyBPcGVyYXRvciBTZWxlY3Rpb24gTW9kZSBzaG91bGQgYmUgc2V0IHRvIEF1dG9tYXRpYy4KKyAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsIltDU1BdIFNldCBBdXRvbWF0aWMgTmV0d29yayBTZWxlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgIHBob25lLnNldE5ldHdvcmtTZWxlY3Rpb25Nb2RlQXV0b21hdGljKG51bGwpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMb2cudyhMT0dfVEFHLCAiW0NTUF0gVmFsdWUgQWRkZWQgU2VydmljZSBHcm91cCAoMHhDMCksIG5vdCBmb3VuZCEiKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDY3ZWNjNzcuLmU1NTU5NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0zMCw3ICszMiwxMCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWFuYWdlci5TVEFUVVNfT05fSUNDX0ZSRUU7CiAKQEAgLTQ1LDkgKzUwLDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TdWNjZXNzOwogICAgIHByaXZhdGUgTGlzdDxTbXNSYXdEYXRhPiBtU21zOworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoU2V0PFN0cmluZz4+IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoU2V0PFN0cmluZz4+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTE9BRF9ET05FID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVBEQVRFX0RPTkUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQlJPQURDQVNUX0FDVElWQVRJT05fRE9ORSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9CUk9BRENBU1RfQ09ORklHX0RPTkUgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01TX0NCX0NPREVfU0NIRU1FX01BWCA9IDI1NTsKIAogICAgIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC03NSw2ICs4NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9TRVRfQlJPQURDQVNUX0FDVElWQVRJT05fRE9ORToKKyAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1NFVF9CUk9BRENBU1RfQ09ORklHX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VjY2VzcyA9IChhci5leGNlcHRpb24gPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xOTIsNiArMjExLDEyNiBAQAogICAgICAgICByZXR1cm4gbVNtczsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICBpZiAoREJHKSBsb2coImVuYWJsZUNlbGxCcm9hZGNhc3QiKTsKKworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtUGhvbmUuZ2V0Q29udGV4dCgpOworCisgICAgICAgIGNvbnRleHQuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9TTVMiLAorICAgICAgICAgICAgICAgICJFbmFibGluZyBjZWxsIGJyb2FkY2FzdCBTTVMiKTsKKworICAgICAgICBTdHJpbmcgY2xpZW50ID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldE5hbWVGb3JVaWQoCisgICAgICAgICAgICAgICAgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBjbGllbnRzID0gbUNlbGxCcm9hZGNhc3RTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlSWRlbnRpZmllcik7CisKKyAgICAgICAgaWYgKGNsaWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtZXNzYWdlIGlkZW50aWZpZXIKKyAgICAgICAgICAgIGNsaWVudHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMucHV0KG1lc3NhZ2VJZGVudGlmaWVyLCBjbGllbnRzKTsKKworICAgICAgICAgICAgaWYgKCF1cGRhdGVDZWxsQnJvYWRjYXN0Q29uZmlnKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMucmVtb3ZlKG1lc3NhZ2VJZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGllbnRzLmFkZChjbGllbnQpOworCisgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICBsb2coIkFkZGVkIGNlbGwgYnJvYWRjYXN0IHN1YnNjcmlwdGlvbiBmb3IgTUlEICIgKyBtZXNzYWdlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBjbGllbnQgIiArIGNsaWVudCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzYWJsZUNlbGxCcm9hZGNhc3QiKTsKKworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtUGhvbmUuZ2V0Q29udGV4dCgpOworCisgICAgICAgIGNvbnRleHQuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9TTVMiLAorICAgICAgICAgICAgICAgICJEaXNhYmxpbmcgY2VsbCBicm9hZGNhc3QgU01TIik7CisKKyAgICAgICAgU3RyaW5nIGNsaWVudCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXROYW1lRm9yVWlkKAorICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBIYXNoU2V0PFN0cmluZz4gY2xpZW50cyA9IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZUlkZW50aWZpZXIpOworCisgICAgICAgIGlmIChjbGllbnRzICE9IG51bGwgJiYgY2xpZW50cy5yZW1vdmUoY2xpZW50KSkgeworICAgICAgICAgICAgaWYgKERCRykKKyAgICAgICAgICAgICAgICBsb2coIlJlbW92ZWQgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgIiArIG1lc3NhZ2VJZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBjbGllbnQgIiArIGNsaWVudCk7CisKKyAgICAgICAgICAgIGlmIChjbGllbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5yZW1vdmUobWVzc2FnZUlkZW50aWZpZXIpOworICAgICAgICAgICAgICAgIHVwZGF0ZUNlbGxCcm9hZGNhc3RDb25maWcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVDZWxsQnJvYWRjYXN0Q29uZmlnKCkgeworICAgICAgICBTZXQ8SW50ZWdlcj4gbWVzc2FnZUlkZW50aWZpZXJzID0gbUNlbGxCcm9hZGNhc3RTdWJzY3JpcHRpb25zLmtleVNldCgpOworCisgICAgICAgIGlmIChtZXNzYWdlSWRlbnRpZmllcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgU21zQnJvYWRjYXN0Q29uZmlnSW5mb1tdIGNvbmZpZ3MgPQorICAgICAgICAgICAgICAgICAgICBuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mb1ttZXNzYWdlSWRlbnRpZmllcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgZm9yIChpbnQgbWVzc2FnZUlkZW50aWZpZXIgOiBtZXNzYWdlSWRlbnRpZmllcnMpIHsKKyAgICAgICAgICAgICAgICBjb25maWdzW2krK10gPSBuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyhtZXNzYWdlSWRlbnRpZmllciwgbWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNldENlbGxCcm9hZGNhc3RDb25maWcoY29uZmlncykgJiYgc2V0Q2VsbEJyb2FkY2FzdEFjdGl2YXRpb24odHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc2V0Q2VsbEJyb2FkY2FzdEFjdGl2YXRpb24oZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldENlbGxCcm9hZGNhc3RDb25maWcoU21zQnJvYWRjYXN0Q29uZmlnSW5mb1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgaWYgKERCRykKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBzZXRHc21Ccm9hZGNhc3RDb25maWcgd2l0aCAiICsgY29uZmlncy5sZW5ndGggKyAiIGNvbmZpZ3VyYXRpb25zIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU0VUX0JST0FEQ0FTVF9DT05GSUdfRE9ORSk7CisKKyAgICAgICAgICAgIG1TdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICBtUGhvbmUubUNNLnNldEdzbUJyb2FkY2FzdENvbmZpZyhjb25maWdzLCByZXNwb25zZSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHNldCBjZWxsIGJyb2FkY2FzdCBjb25maWciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3VjY2VzczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0Q2VsbEJyb2FkY2FzdEFjdGl2YXRpb24oYm9vbGVhbiBhY3RpdmF0ZSkgeworICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgbG9nKCJDYWxsaW5nIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKCIgKyBhY3RpdmF0ZSArICIpIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU0VUX0JST0FEQ0FTVF9BQ1RJVkFUSU9OX0RPTkUpOworCisgICAgICAgICAgICBtU3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgbVBob25lLm1DTS5zZXRHc21Ccm9hZGNhc3RBY3RpdmF0aW9uKGFjdGl2YXRlLCByZXNwb25zZSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHNldCBjZWxsIGJyb2FkY2FzdCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVN1Y2Nlc3M7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyN2NmYwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtOworCitwdWJsaWMgY2xhc3MgU21zQ2JIZWFkZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBEVV9IRUFERVJfTEVOR1RIID0gNjsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2VvZ3JhcGhpY2FsU2NvcGU7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IG1lc3NhZ2VDb2RlOworCisgICAgcHVibGljIGZpbmFsIGludCB1cGRhdGVOdW1iZXI7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IG1lc3NhZ2VJZGVudGlmaWVyOworCisgICAgcHVibGljIGZpbmFsIGludCBkYXRhQ29kaW5nU2NoZW1lOworCisgICAgcHVibGljIGZpbmFsIGludCBwYWdlSW5kZXg7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IG5yT2ZQYWdlczsKKworICAgIHB1YmxpYyBTbXNDYkhlYWRlcihieXRlW10gcGR1KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBkdSA9PSBudWxsIHx8IHBkdS5sZW5ndGggPCBQRFVfSEVBREVSX0xFTkdUSCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBQRFUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gKHBkdVswXSAmIDB4YzApID4+IDY7CisgICAgICAgIG1lc3NhZ2VDb2RlID0gKChwZHVbMF0gJiAweDNmKSA8PCA0KSB8ICgocGR1WzFdICYgMHhmMCkgPj4gNCk7CisgICAgICAgIHVwZGF0ZU51bWJlciA9IHBkdVsxXSAmIDB4MGY7CisgICAgICAgIG1lc3NhZ2VJZGVudGlmaWVyID0gKHBkdVsyXSA8PCA4KSB8IHBkdVszXTsKKyAgICAgICAgZGF0YUNvZGluZ1NjaGVtZSA9IHBkdVs0XTsKKworICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBwYWdlIHBhcmFtZXRlcgorICAgICAgICBpbnQgcGFnZUluZGV4ID0gKHBkdVs1XSAmIDB4ZjApID4+IDQ7CisgICAgICAgIGludCBuck9mUGFnZXMgPSBwZHVbNV0gJiAweDBmOworCisgICAgICAgIGlmIChwYWdlSW5kZXggPT0gMCB8fCBuck9mUGFnZXMgPT0gMCB8fCBwYWdlSW5kZXggPiBuck9mUGFnZXMpIHsKKyAgICAgICAgICAgIHBhZ2VJbmRleCA9IDE7CisgICAgICAgICAgICBuck9mUGFnZXMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7CisgICAgICAgIHRoaXMubnJPZlBhZ2VzID0gbnJPZlBhZ2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKaW5kZXggNTBkZDQwMi4uZjRjNWU2YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNpbVJlZ2lvbkNhY2hlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwpAQCAtNDgsNiArNDksMTIgQEAKIHB1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2V7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdTTSI7CiAKKyAgICAvKioKKyAgICAgKiBVc2VkIHdpdGggdGhlIEVOQ09ESU5HXyBjb25zdGFudHMgZnJvbSB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZX0KKyAgICAgKiBOb3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLCB0aGVyZWZvcmUgbm90IGluIG9yZGVyIHdpdGggdGhvc2UgY29uc3RhbnRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19LU0M1NjAxID0gNDAwMDsKKwogICAgIHByaXZhdGUgTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzczsKIAogICAgIC8qKgpAQCAtNzgxLDYgKzc4OCwyOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcnByZXRzIHRoZSB1c2VyIGRhdGEgcGF5bG9hZCBhcyBLU0M1NjAxIGNoYXJhY3RlcnMsIGFuZAorICAgICAgICAgKiBkZWNvZGVzIHRoZW0gaW50byBhIFN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnl0ZUNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHVzZXIgZGF0YSBwYXlsb2FkCisgICAgICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgZGVjb2RlZCBjaGFyYWN0ZXJzCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgZ2V0VXNlckRhdGFLU0M1NjAxKGludCBieXRlQ291bnQpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXQ7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZyhwZHUsIGN1ciwgYnl0ZUNvdW50LCAiS1NDNTYwMSIpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCByZXR1cm4gc2FtZSBhcyBFTkNPRElOR19VTktOT1dOIG9uIGVycm9yLgorICAgICAgICAgICAgICAgIHJldCA9IG51bGw7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImltcGxhdXNpYmxlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLCBleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1ciArPSBieXRlQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKICAgICAgICAgYm9vbGVhbiBtb3JlRGF0YVByZXNlbnQoKSB7CiAgICAgICAgICAgICByZXR1cm4gKHBkdS5sZW5ndGggPiBjdXIpOwogICAgICAgICB9CkBAIC05MzAsNiArOTU5LDggQEAKICAgICAgICAgLy8gVFAtTWVzc2FnZS1UeXBlLUluZGljYXRvcgogICAgICAgICAvLyA5LjIuMwogICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMzogLy9HU00gMDMuNDAgOS4yLjMuMTogTVRJID09IDMgaXMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgLy9UaGlzIHNob3VsZCBiZSBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIE1USSA9PSAwIChEZWxpdmVyKQogICAgICAgICAgICAgcGFyc2VTbXNEZWxpdmVyKHAsIGZpcnN0Qnl0ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgpAQCAtMTEwOCw2ICsxMTM5LDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiMyAtIFVuc3VwcG9ydGVkIFNNUyBkYXRhIGNvZGluZyBzY2hlbWUgIgogICAgICAgICAgICAgICAgICAgICArIChkYXRhQ29kaW5nU2NoZW1lICYgMHhmZikpOworICAgICAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiS29yZWFuIFNJTSwgdXNpbmcgS1NDNTYwMSBmb3IgZGVjb2RpbmcuIik7CisgICAgICAgICAgICAgICAgZW5jb2RpbmdUeXBlID0gRU5DT0RJTkdfS1NDNTYwMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHNldCBib3RoIHRoZSB1c2VyIGRhdGEgYW5kIHRoZSB1c2VyIGRhdGEgaGVhZGVyLgpAQCAtMTEyOSw2ICsxMTY0LDEwIEBACiAgICAgICAgIGNhc2UgRU5DT0RJTkdfMTZCSVQ6CiAgICAgICAgICAgICBtZXNzYWdlQm9keSA9IHAuZ2V0VXNlckRhdGFVQ1MyKGNvdW50KTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5DT0RJTkdfS1NDNTYwMToKKyAgICAgICAgICAgIG1lc3NhZ2VCb2R5ID0gcC5nZXRVc2VyRGF0YUtTQzU2MDEoY291bnQpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KExPR19UQUcsICJTTVMgbWVzc2FnZSBib2R5IChyYXcpOiAnIiArIG1lc3NhZ2VCb2R5ICsgIiciKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDY0NThmZGEuLmVjM2QyMGEKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpAQCAtNTMsNiArNTMsNyBAQAogICAgIHByaXZhdGUgQXJyYXlMaXN0PGJ5dGVbXT4gbUlhcEZpbGVSZWNvcmQ7CiAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Ynl0ZVtdPiBtRW1haWxGaWxlUmVjb3JkOwogICAgIHByaXZhdGUgTWFwPEludGVnZXIsIEFycmF5TGlzdDxTdHJpbmc+PiBtRW1haWxzRm9yQWRuUmVjOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVmcmVzaENhY2hlID0gZmFsc2U7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEJSX0xPQURfRE9ORSA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1VTSU1fQUROX0xPQURfRE9ORSA9IDI7CkBAIC05MSwxMSArOTIsMTkgQEAKICAgICAgICAgbUVtYWlsRmlsZVJlY29yZCA9IG51bGw7CiAgICAgICAgIG1QYnJGaWxlID0gbnVsbDsKICAgICAgICAgbUlzUGJyUHJlc2VudCA9IHRydWU7CisgICAgICAgIG1SZWZyZXNoQ2FjaGUgPSBmYWxzZTsKICAgICB9CiAKICAgICBwdWJsaWMgQXJyYXlMaXN0PEFkblJlY29yZD4gbG9hZEVmRmlsZXNGcm9tVXNpbSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtUGhvbmVCb29rUmVjb3Jkcy5pc0VtcHR5KCkpIHJldHVybiBtUGhvbmVCb29rUmVjb3JkczsKKyAgICAgICAgICAgIGlmICghbVBob25lQm9va1JlY29yZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZWZyZXNoQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZWZyZXNoQ2FjaGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1QaG9uZUJvb2tSZWNvcmRzOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoIW1Jc1BiclByZXNlbnQpIHJldHVybiBudWxsOwogCiAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgUEJSIGZpbGUgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUsIGlmIG5vdCByZWFkIGl0CkBAIC0xMTYsNiArMTI1LDIwIEBACiAgICAgICAgIHJldHVybiBtUGhvbmVCb29rUmVjb3JkczsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENhY2hlKCkgeworICAgICAgICBpZiAobVBickZpbGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtUGhvbmVCb29rUmVjb3Jkcy5jbGVhcigpOworCisgICAgICAgIGludCBudW1SZWNzID0gbVBickZpbGUubUZpbGVJZHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlY3M7IGkrKykgeworICAgICAgICAgICAgcmVhZEFkbkZpbGVBbmRXYWl0KGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZUNhY2hlKCkgeworICAgICAgICBtUmVmcmVzaENhY2hlID0gdHJ1ZTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcmVhZFBickZpbGVBbmRXYWl0KCkgewogICAgICAgICBtUGhvbmUuZ2V0SWNjRmlsZUhhbmRsZXIoKS5sb2FkRUZMaW5lYXJGaXhlZEFsbChFRl9QQlIsIG9idGFpbk1lc3NhZ2UoRVZFTlRfUEJSX0xPQURfRE9ORSkpOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvcGFja2FnZS5odG1sIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg1YjU3Li4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLVByb3ZpZGVzIGNsYXNzZXMgZm9yIFNJTSBUb29sa2l0IFNlcnZpY2UuCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKaW5kZXggZGU1OWI4MS4uNjdkZjUxMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQppbmRleCA4OGVhZWNkLi40YzdlYmNhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YQppbmRleCA4YTRhMjg1Li41NTExYzA5YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YQpAQCAtMTcwLDYgKzE3MCwxOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZ2ptIiwgYWRuLmdldEFscGhhVGFnKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIisxODg4NTU1MTIxMiwxMjM0NTY3OCIsIGFkbi5nZXROdW1iZXIoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGFkbi5pc0VtcHR5KCkpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRlc3QgdGhhdCBhIEFETiByZWNvcmQgd2l0aCBLU0M1NjAxIHdpbGwgZ2V0IGNvbnZlcnRlZCBjb3JyZWN0bHkKKyAgICAgICAgLy8gVGhpcyB0ZXN0IHdpbGwgb25seSBiZSBydW4gd2hlbiB1c2luZyBhIEtvcmVhbiBTSU0KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgIGFkbiA9IG5ldyBBZG5SZWNvcmQoSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygKKyAgICAgICAgICAgICAgICAgICIzMDMwMzEyQzIwQzhBQjQxQjFFNkZGRkZGRkZGRkZGRjA3ODExMDEwMzI1NDc2RjhGRkZGRkZGRkZGRkYiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMSwgXHVENjREQVx1QUUzOCIsIGFkbi5nZXRBbHBoYVRhZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMDEwMTIzNDU2NzgiLCBhZG4uZ2V0TnVtYmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRuLmlzRW1wdHkoKSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc0NiVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzNmVhMAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc0NiVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNhc2VzIGZvciBiYXNpYyBTbXNDYk1lc3NhZ2Ugb3BlcmF0aW9ucworICovCitwdWJsaWMgY2xhc3MgR3NtU21zQ2JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RHZW9ncmFwaGljYWxTY29wZVZhbHVlKGJ5dGVbXSBwZHUsIGJ5dGUgYiwgaW50IGV4cGVjdGVkR3MpIHsKKyAgICAgICAgcGR1WzBdID0gYjsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGdlb2dyYXBoaWNhbCBzY29wZSBkZWNvZGVkIiwgZXhwZWN0ZWRHcywgbXNnCisgICAgICAgICAgICAgICAgLmdldEdlb2dyYXBoaWNhbFNjb3BlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOdWxsUGR1KCkgeworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUobnVsbCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiY3JlYXRlRnJvbVBkdShieXRlW10gd2l0aCBudWxsIHBkdSBzaG91bGQgcmV0dXJuIG51bGwiLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUb29TaG9ydFBkdSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IG5ldyBieXRlWzRdOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnROdWxsKCJjcmVhdGVGcm9tUGR1KGJ5dGVbXSB3aXRoIHRvbyBzaG9ydCBwZHUgc2hvdWxkIHJldHVybiBudWxsIiwgbXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworCisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURSk7CisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDQwLCBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERSk7CisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDgwLCBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREUpOworICAgICAgICBkb1Rlc3RHZW9ncmFwaGljYWxTY29wZVZhbHVlKHBkdSwgKGJ5dGUpMHhDMCwgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXQoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRGdWxsKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LCAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNCwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI0LCAoYnl0ZSkweEZCLCAoYnl0ZSkweDBDLCAoYnl0ZSkweDJBLCAoYnl0ZSkweEUzLCAoYnl0ZSkweEMzLCAoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4M0IsIChieXRlKTB4MEYsIChieXRlKTB4Q0EsIChieXRlKTB4Q0QsIChieXRlKTB4NDAsIChieXRlKTB4NjMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHhEMywgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhGMiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM5LCAoYnl0ZSkweDg4LCAoYnl0ZSkweEZELCAoYnl0ZSkweDc2LCAoYnl0ZSkweDlGLCAoYnl0ZSkweDU5LCAoYnl0ZSkweEEwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzYsIChieXRlKTB4MzksIChieXRlKTB4RUMsIChieXRlKTB4NEUsIChieXRlKTB4QkIsIChieXRlKTB4Q0YsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHhCQSwgKGJ5dGUpMHgyQywgKGJ5dGUpMHgyRiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEMiwgKGJ5dGUpMHg3MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDkwLCAoYnl0ZSkweEZCLCAoYnl0ZSkweDBELCAoYnl0ZSkweDgyLCAoYnl0ZSkweDg3LCAoYnl0ZSkweEM5LCAoYnl0ZSkweEU0LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjQsIChieXRlKTB4RkIsIChieXRlKTB4MUMsIChieXRlKTB4MDIKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIGJlaW5nIGV4YWN0bHkgOTMgY2hhcmFjdGVycyBsb25nLCAiICsKKyAgICAgICAgICAgICAgICAibWVhbmluZyB0aGVyZSBpcyBubyBwYWRkaW5nISIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRXaXRoTGFuZ3VhZ2UoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJlcyIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdFdpdGhMYW5ndWFnZUluQm9keSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDczLAorICAgICAgICAgICAgICAgIChieXRlKTB4N0IsIChieXRlKTB4MjMsIChieXRlKTB4MDgsIChieXRlKTB4M0EsIChieXRlKTB4NEUsIChieXRlKTB4OUIsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MiwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHgxQywgKGJ5dGUpMHhBRSwgKGJ5dGUpMHhCMywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHhBMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLCAoYnl0ZSkweDFCLCAoYnl0ZSkweDhFLCAoYnl0ZSkweDBFLCAoYnl0ZSkweDhCLCAoYnl0ZSkweENCLCAoYnl0ZSkweDc0LAorICAgICAgICAgICAgICAgIChieXRlKTB4NTAsIChieXRlKTB4QkIsIChieXRlKTB4M0MsIChieXRlKTB4OUYsIChieXRlKTB4ODcsIChieXRlKTB4Q0YsIChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHgzRCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNiwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDFELCAoYnl0ZSkweDNFLCAoYnl0ZSkweDk3LCAoYnl0ZSkweDQxLCAoYnl0ZSkweEYyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MzIsIChieXRlKTB4QkQsIChieXRlKTB4MkUsIChieXRlKTB4NzcsIChieXRlKTB4ODMsIChieXRlKTB4RTAsIChieXRlKTB4NjEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHhFRCwgKGJ5dGUpMHgzRSwgKGJ5dGUpMHgzNywgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSB3aXRoIGNhcnJpYWdlIHJldHVybiBwYWRkaW5nIiwKKyAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInN2IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk4Qml0KCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDQsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4LWJpdCBtZXNzYWdlIGJvZHkgc2hvdWxkIGJlIGVtcHR5IiwgIiIsIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHlVY3MyKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDgsIChieXRlKTB4MTEsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDUzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NkQsIChieXRlKTB4MDAsIChieXRlKTB4NjUsIChieXRlKTB4MDAsIChieXRlKTB4NzMsIChieXRlKTB4MDAsIChieXRlKTB4NzMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZGLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzQsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MEQsIChieXRlKTB4MDAsIChieXRlKTB4MEQKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5VWNzMldpdGhMYW5ndWFnZUluQm9keSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDc4LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0MsIChieXRlKTB4MDAsIChieXRlKTB4NDEsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZELCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzMsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjcsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjgsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NzIsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDBECisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJ4eCIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VJZGVudGlmaWVyKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LCAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhFRSwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNBLCAoYnl0ZSkweDFBLCAoYnl0ZSkweDM0LCAoYnl0ZSkweDBFLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjAsIChieXRlKTB4QjksIChieXRlKTB4MEMsIChieXRlKTB4OTIsIChieXRlKTB4OTcsIChieXRlKTB4RTksIChieXRlKTB4NzUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwRiwgKGJ5dGUpMHg5MywgKGJ5dGUpMHhDOSwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY3LCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAKKyAgICAgICAgfTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBpZGVudGlmaWVyIGRlY29kZWQiLCAxMjM0NSwgbXNnLmdldE1lc3NhZ2VJZGVudGlmaWVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQ29kZSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsIChieXRlKTB4Q0IsIChieXRlKTB4RTYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLCAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjksIChieXRlKTB4M0MsIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LCAoYnl0ZSkweDc1LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsIChieXRlKTB4QzksIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY29kZSBkZWNvZGVkIiwgNjgyLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFVwZGF0ZU51bWJlcigpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsIChieXRlKTB4Q0IsIChieXRlKTB4RTYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLCAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjksIChieXRlKTB4M0MsIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LCAoYnl0ZSkweDc1LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsIChieXRlKTB4QzksIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHVwZGF0ZSBudW1iZXIgZGVjb2RlZCIsIDUsIG1zZy5nZXRVcGRhdGVOdW1iZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXJUZXN0LmphdmEKaW5kZXggOGE2NjYxNC4uZjU3OGE4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlclRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyVGVzdC5qYXZhCkBAIC0xMDIsNCArMTAyLDI1IEBACiAgICAgICAgc21zID0gU21zTWVzc2FnZS5jcmVhdGVGcm9tRWZSZWNvcmQoMSwgZGF0YSk7CiAgICAgICAgYXNzZXJ0Tm90TnVsbChzbXMuZ2V0TWVzc2FnZUJvZHkoKSk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWZSZWNvcmRLb3JlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgIFNtc01lc3NhZ2Ugc21zOworCisgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMTA4OTEyODAxMDA5OTAxMDI1OTA0MGJhMTEwMDAwMDAwMDBmMDAwOTUwMTMwOTE5MDA1NjMwMDhjNDE0MiIKKyAgICAgICAgICAgICAgICAgICAgICsgIjQzNDQ0NWIwYTFiM2FhYjRkOWI2ZjNiOGI2MzEzMjMzMzQzNTQxNDI0MzQ0NDViMGExYjNhYWI0ZDliNmYzIgorICAgICAgICAgICAgICAgICAgICAgKyAiYjhiNjMxMzIzMzM0MzU0MTQyNDM0NDQ1YjBhMWIzYWFiNGQ5YjZmM2I4YjYzMTMyMzMzNDM1NDE0MjQzNDQiCisgICAgICAgICAgICAgICAgICAgICArICI0NWIwYTFiM2FhYjRkOWI2ZjNiOGI2MzEzMjMzMzQzNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICsgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgKyAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmIjsKKworCisgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcyhzKTsKKworICAgICAgICAgICBzbXMgPSBTbXNNZXNzYWdlLmNyZWF0ZUZyb21FZlJlY29yZCgxLCBkYXRhKTsKKyAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzbXMuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgICAgICAgIGFzc2VydFRydWUoc21zLmdldE1lc3NhZ2VCb2R5KCkuc3RhcnRzV2l0aCgiQUJDREVcdUFDMDBcdUIwOThcdUIyRTRcdUI3N0NcdUI5QzgxMjM0NUFCQ0RFIikpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQppbmRleCBkYjM4ZWRlLi4wNTAyNjM2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpAQCAtODIsNiArODIsMzAgQEAKICAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjgyMDUwNTMwMkQ4MmQzMmQzMSIpOwogICAgICAgICAvLyBFeGFtcGxlIGZyb20gM0dQUCBUUyAxMS4xMSBWMTguMS4zLjAgYW5uZXggQgogICAgICAgICBhc3NlcnRFcXVhbHMoIi1cdTA1MzJcdTA1ODMtMSIsIEljY1V0aWxzLmFkblN0cmluZ0ZpZWxkVG9TdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoKQorICAgICAgICAgKiBUZXN0cyBlcXVhbCB0aGUgb25lcyBhYm92ZSwgYW5kIHdpbGwgb25seSBiZSBydW4gaWYgdGhlIFNJTSBpcyBOT1Qga29yZWFuLgorICAgICAgICAgKi8KKworICAgICAgICBpZiAoU2ltUmVnaW9uQ2FjaGUuZ2V0UmVnaW9uKCkgIT0gU2ltUmVnaW9uQ2FjaGUuTUNDX0tPUkVBTikgeworICAgICAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjAwNTY2ZjY5NjM2NTIwNGQ2MTY5NmMwNzkxODE1MDM2Nzc0MmYzZmZmZmZmZmZmZmZmIik7CisgICAgICAgICAgICAvLyBBZ2Fpbiwgc2tpcCBwcmVwZW5kZWQgMAorICAgICAgICAgICAgLy8gKHRoaXMgaXMgYW4gRUZbQUROXSByZWNvcmQpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlZvaWNlIE1haWwiLCBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoZGF0YSwgMSwgZGF0YS5sZW5ndGggLSAxNSkpOworCisgICAgICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiODA5NjczNTM5QTU3NjQwMDJGMDA0REZGRkZGRkZGRkYiKTsKKyAgICAgICAgICAgIC8vICh0aGlzIGlzIGZyb20gYW4gRUZbQUROXSByZWNvcmQpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlx1OTY3M1x1NTM5QVx1NTc2NC9NIiwgSWNjVXRpbHMuYWRuU3RyaW5nRmllbGRUb1N0cmluZ0tzYzU2MDFTdXBwb3J0KGRhdGEsIDAsIGRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI4MTBBMDE1NjZmZWM2MzY1MjA0ZGUwNjk2Y0ZGRkZGRiIpOworICAgICAgICAgICAgLy8gKHRoaXMgaXMgbWFkZSB1cCB0byB0ZXN0IHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIHJlYWwgb25lKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWb1x1MDBFQ2NlIE1cdTAwRTBpbCIsIEljY1V0aWxzLmFkblN0cmluZ0ZpZWxkVG9TdHJpbmdLc2M1NjAxU3VwcG9ydChkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiODIwNTA1MzAyRDgyZDMyZDMxIik7CisgICAgICAgICAgICAvLyBFeGFtcGxlIGZyb20gM0dQUCBUUyAxMS4xMSBWMTguMS4zLjAgYW5uZXggQgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItXHUwNTMyXHUwNTgzLTEiLCBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXAyMzBXc3BDb250ZW50VHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFiMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Xc3BUeXBlRGVjb2RlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9QQVJBTUVURVJTCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwMCwgIiovKiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDEsICJ0ZXh0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDAyLCAidGV4dC9odG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwMywgInRleHQvcGxhaW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA0LCAidGV4dC94LWhkbWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA1LCAidGV4dC94LXR0bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA2LCAidGV4dC94LXZDYWxlbmRhciIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDcsICJ0ZXh0L3gtdkNhcmQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA4LCAidGV4dC92bmQud2FwLndtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDksICJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwQSwgInRleHQvdm5kLndhcC53dGEtZXZlbnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBCLCAibXVsdGlwYXJ0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBDLCAibXVsdGlwYXJ0L21peGVkIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwRCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBFLCAibXVsdGlwYXJ0L2J5dGVyYW50ZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBGLCAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxMCwgImFwcGxpY2F0aW9uLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDExLCAiYXBwbGljYXRpb24vamF2YS12bSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDEzLCAiYXBwbGljYXRpb24veC1oZG1sYyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTQsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDE1LCAiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAud3RhLWV2ZW50YyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTcsICJhcHBsaWNhdGlvbi92bmQud2FwLnVhcHJvZiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTgsICJhcHBsaWNhdGlvbi92bmQud2FwLnd0bHMtY2EtY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDE5LCAiYXBwbGljYXRpb24vdm5kLndhcC53dGxzLXVzZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDFBLCAiYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDFCLCAiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MUMsICJpbWFnZS8qIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxRCwgImltYWdlL2dpZiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MUUsICJpbWFnZS9qcGVnIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxRiwgImltYWdlL3RpZmYiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDIwLCAiaW1hZ2UvcG5nIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyMSwgImltYWdlL3ZuZC53YXAud2JtcCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjIsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC4qIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyMywgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0Lm1peGVkIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNCwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmZvcm0tZGF0YSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjUsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5ieXRlcmFuZ2VzIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmFsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNywgImFwcGxpY2F0aW9uL3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjgsICJ0ZXh0L3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjksICJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQSwgImFwcGxpY2F0aW9uL3gteDk2OC1jcm9zcy1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQiwgImFwcGxpY2F0aW9uL3gteDk2OC1jYS1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQywgImFwcGxpY2F0aW9uL3gteDk2OC11c2VyLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDJELCAidGV4dC92bmQud2FwLnNpIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyRSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyRiwgInRleHQvdm5kLndhcC5zbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzAsICJhcHBsaWNhdGlvbi92bmQud2FwLnNsYyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzEsICJ0ZXh0L3ZuZC53YXAuY28iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDMyLCAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDMzLCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQucmVsYXRlZCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzQsICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzUsICJ0ZXh0L3ZuZC53YXAuY29ubmVjdGl2aXR5LXhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzYsICJhcHBsaWNhdGlvbi92bmQud2FwLmNvbm5lY3Rpdml0eS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzcsICJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzOCwgImFwcGxpY2F0aW9uL3ZuZC53YXAuaGFzaGVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzOSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2lnbmVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzQSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuY2VydC1yZXNwb25zZSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0IsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDNDLCAiYXBwbGljYXRpb24vd21sK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0QsICJ0ZXh0L2NzcyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0UsICJhcHBsaWNhdGlvbi92bmQud2FwLm1tcy1tZXNzYWdlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzRiwgImFwcGxpY2F0aW9uL3ZuZC53YXAucm9sbG92ZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDQwLCAiYXBwbGljYXRpb24vdm5kLndhcC5sb2NjK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0MSwgImFwcGxpY2F0aW9uL3ZuZC53YXAubG9jK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NDIsICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0MywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NCwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NSwgImFwcGxpY2F0aW9uL3ZuZC53YXAueGh0bWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NiwgImFwcGxpY2F0aW9uL3ZuZC53di5jc3AuY2lyIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NywgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0OCwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLm1lc3NhZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDQ5LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEEsICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0QiwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEMsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEQsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0RSwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0RiwgImF1ZGlvLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUwLCAidmlkZW8vKiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NTEsICJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUyLCAiYXBwbGljYXRpb24vbWlrZXkiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUzLCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2QiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDU0LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwMSwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwMiwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnNpZ25hbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjAzLCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNCwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNSwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNiwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNywgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnByb3Zpc2lvbmluZy1zdGF0dXMtdXJpIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAyMDgsICJ4LXdhcC5tdWx0aXBhcnQvdm5kLnVwbGFuZXQuaGVhZGVyLXNldCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjA5LCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjBBLCAiYXBwbGljYXRpb24vdm5kLnBob25lY29tLm1tYy13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjBCLCAiYXBwbGljYXRpb24vdm5kLm5va2lhLnN5bmNzZXQrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwQywgImltYWdlL3gtdXAtd3BuZyIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzAwLCAiYXBwbGljYXRpb24vaW90YS5tbWMtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwMSwgImFwcGxpY2F0aW9uL2lvdGEubW1jLXhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzAyLCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwMywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwNCwgInRleHQvdm5kLndhcC5lbW4reG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDUsICJ0ZXh0L2NhbGVuZGFyIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDYsICJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDcsICJhcHBsaWNhdGlvbi92bmQub21hZHMtZmlsZSt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwOCwgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDksICJ0ZXh0L2RpcmVjdG9yeTtwcm9maWxlPXZDYXJkIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMEEsICJhcHBsaWNhdGlvbi92bmQud2FwLmVtbit3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBCLCAiYXBwbGljYXRpb24vdm5kLm5va2lhLmlwZGMtcHVyY2hhc2UtcmVzcG9uc2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwQywgImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5zY3JlZW4zK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBELCAiYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLnNjcmVlbjMrZ3ppcCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBFLCAiYXBwbGljYXRpb24vdm5kLmNtY2Muc2V0dGluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBGLCAiYXBwbGljYXRpb24vdm5kLmNtY2MuYm9tYmluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzEwLCAiYXBwbGljYXRpb24vdm5kLmRvY29tby5wZiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzExLCAiYXBwbGljYXRpb24vdm5kLmRvY29tby51YiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzEyLCAiYXBwbGljYXRpb24vdm5kLm9tYWxvYy1zdXBsLWluaXQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxMywgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZ3JvdXAtdXNhZ2UtbGlzdCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxNCwgImFwcGxpY2F0aW9uL29tYS1kaXJlY3RvcnkreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTUsICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmMiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzE2LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucm9hcC10cmlnZ2VyK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTcsICJhcHBsaWNhdGlvbi92bmQuc2JtLm1pZDIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxOCwgImFwcGxpY2F0aW9uL3ZuZC53bWYuYm9vdHN0cmFwIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTksICJhcHBsaWNhdGlvbi92bmMuY21jYy5kY2QreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMUEsICJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzFCLCAiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5wcm92aXNpb25pbmd0cmlnZ2VyIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDAwLCAiUSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDEsICJDaGFyc2V0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMiwgIkxldmVsIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMywgIlR5cGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA3LCAiRGlmZmVyZW5jZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA4LCAiUGFkZGluZyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDksICJUeXBlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwRSwgIk1heC1BZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEwLCAiU2VjdXJlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxMSwgIlNFQyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTIsICJNQUMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEzLCAiQ3JlYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTQsICJNb2RpZmljYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTUsICJSZWFkLWRhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE2LCAiU2l6ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTcsICJOYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOCwgIkZpbGVuYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOSwgIlN0YXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxQSwgIlN0YXJ0LWluZm8iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFCLCAiQ29tbWVudCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MUMsICJEb21haW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFELCAiUGF0aCIpOworCisgICAgfQorCisgICAgZmluYWwgaW50IFdTUF9ERUZJTkVEX1NIT1JUX01JTUVfVFlQRV9DT1VOVCA9IDg1OworICAgIGZpbmFsIGludCBXU1BfREVGSU5FRF9MT05HX01JTUVfVFlQRV9DT1VOVCA9IDg1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBXU1BfU1RSSU5HX1RFUk1JTkFUT1IgPSAweDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyA9IChieXRlKSAweDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgV1NQX0xFTkdUSF9RVU9URSA9IDB4MUY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBXU1BfUVVPVEUgPSAweDIyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgTE9OR19NSU1FX1RZUEVfT01BX0RJUkVDVE9SWV9YTUwgPSAweDAzMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgTE9OR19NSU1FX1RZUEVfVU5BU1NJR05FRCA9IDB4MDUyQzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFID0gMHgzRjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNIT1JUX01JTUVfVFlQRV9VTkFTU0lHTkVEID0gMHg2MDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFCisgICAgICAgICAgICA9ICJhcHBsaWNhdGlvbi92bmQud2FwLnJvbGxvdmVyLWNlcnRpZmljYXRlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFlQRURfUEFSQU1fUSA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFRF9QQVJBTV9ET01BSU4gPSAweDFDOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSQU1fVU5BU1NJR05FRCA9IDB4NDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJBTV9OT19WQUxVRSA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFRF9QQVJBTV9TRUMgPSAweDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFlQRURfUEFSQU1fTUFDID0gMHgxMjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFeHBlY3RlZE51bWJlck9mU2hvcnRNaW1lVHlwZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhXU1BfREVGSU5FRF9TSE9SVF9NSU1FX1RZUEVfQ09VTlQsIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFeHBlY3RlZE51bWJlck9mTG9uZ01pbWVUeXBlcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFdTUF9ERUZJTkVEX0xPTkdfTUlNRV9UWVBFX0NPVU5ULCBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWxsS25vd25TaG9ydEludGVnZXJNaW1lVHlwZVZhbHVlcygpIHsKKworICAgICAgICBmb3IgKGludCB2YWx1ZSA6IFdhcDIzMFdzcENvbnRlbnRUeXBlVGVzdC5XRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIoCisgICAgICAgICAgICAgICAgICAgIEhleER1bXAudG9CeXRlQXJyYXkoKGJ5dGUpICh2YWx1ZSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICAgICAgaW50IHdlbGxLbm93blZhbHVlID0gKGludCkgdW5pdC5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LldFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5nZXQodmFsdWUpLCBtaW1lVHlwZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHdlbGxLbm93blZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdlbGxLbm93bkxvbmdJbnRlZ2VyTWltZVR5cGVWYWx1ZXMoKSB7CisgICAgICAgIGJ5dGUgaGVhZGVyTGVuZ3RoID0gMzsKKyAgICAgICAgYnl0ZSB0eXBlTGVuZ3RoID0gMjsKKyAgICAgICAgZm9yIChpbnQgdmFsdWUgOiBXYXAyMzBXc3BDb250ZW50VHlwZVRlc3QuV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLmtleVNldCgpKSB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgICAgIGRhdGFbMF0gPSBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBkYXRhWzFdID0gdHlwZUxlbmd0aDsKKyAgICAgICAgICAgIGRhdGFbMl0gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOworICAgICAgICAgICAgZGF0YVszXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIoZGF0YSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICAgICAgaW50IHdlbGxLbm93blZhbHVlID0gKGludCkgdW5pdC5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LldFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5nZXQodmFsdWUpLCBtaW1lVHlwZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHdlbGxLbm93blZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVJldHVybnNGYWxzZV9XaGVuT25seUFaZXJvQnl0ZVByZXNlbnQoKSB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDApOworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cmFpbmVkTWVkaWFFeHRlbnNpb25NZWRpYSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB0ZXN0VHlwZSA9ICJhcHBsaWNhdGlvbi93aWJibGUiOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUodGVzdFR5cGUuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdFR5cGUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxOSwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbEZvcm1TaG9ydExlbmd0aEV4dGVuc2lvbk1lZGlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHRlc3RUeXBlID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IjsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKHRlc3RUeXBlLmxlbmd0aCgpICsgMSk7CisgICAgICAgIG91dC53cml0ZSh0ZXN0VHlwZS5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIG91dC53cml0ZShXU1BfU1RSSU5HX1RFUk1JTkFUT1IpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxGb3JtU2hvcnRMZW5ndGhXZWxsS25vd25TaG9ydEludGVnZXIoKSAgeworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDAxKTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsRm9ybVNob3J0TGVuZ3RoV2VsbEtub3duU2hvcnRJbnRlZ2VyV2l0aFVua25vd25WYWx1ZSgpICB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEpOworICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1VOQVNTSUdORUQgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1VOQVNTSUdORUQsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbEZvcm1TaG9ydExlbmd0aFdlbGxLbm93bkxvbmdJbnRlZ2VyKCkgIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIG91dC53cml0ZSgweDAzKTsgLy8gaGVhZGVyIGxlbmd0aAorICAgICAgICBvdXQud3JpdGUoMHgwMik7IC8vIHR5cGUgbGVuZ3RoICgyIG9jdGV0cykKKyAgICAgICAgb3V0LndyaXRlKExPTkdfTUlNRV9UWVBFX09NQV9ESVJFQ1RPUllfWE1MID4+IDgpOworICAgICAgICBvdXQud3JpdGUoTE9OR19NSU1FX1RZUEVfT01BX0RJUkVDVE9SWV9YTUwgJiAweEZGKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9vbWEtZGlyZWN0b3J5K3htbCIsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExPTkdfTUlNRV9UWVBFX09NQV9ESVJFQ1RPUllfWE1MLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsRm9ybVNob3J0TGVuZ3RoV2VsbEtub3duTG9uZ0ludGVnZXJXaXRoVW5rbm93blZhbHVlKCkgIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIG91dC53cml0ZSgweDAzKTsgLy8gVmFsdWUtbGVuZ3RoLCBzaG9ydC1sZW5ndGgKKyAgICAgICAgb3V0LndyaXRlKDB4MDIpOyAvLyBsb25nLWludGVnZXIgbGVuZ3RoICgyIG9jdGV0cykKKyAgICAgICAgb3V0LndyaXRlKExPTkdfTUlNRV9UWVBFX1VOQVNTSUdORUQgPj4gOCk7CisgICAgICAgIG91dC53cml0ZShMT05HX01JTUVfVFlQRV9VTkFTU0lHTkVEICYgMHhGRik7CisKKyAgICAgICAgV3NwVHlwZURlY29kZXIgdW5pdCA9IG5ldyBXc3BUeXBlRGVjb2RlcihvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydFRydWUodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworCisgICAgICAgIGFzc2VydE51bGwobWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoTE9OR19NSU1FX1RZUEVfVU5BU1NJR05FRCwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsRm9ybUxlbmd0aFF1b3RlV2VsbEtub3duU2hvcnRJbnRlZ2VyKCkgIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIG91dC53cml0ZShXU1BfTEVOR1RIX1FVT1RFKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEpOyAvLyBMZW5ndGggYXMgVUlOVFZBUgorICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisKKyAgICAgICAgV3NwVHlwZURlY29kZXIgdW5pdCA9IG5ldyBXc3BUeXBlRGVjb2RlcihvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydFRydWUodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxGb3JtTGVuZ3RoUXVvdGVXZWxsS25vd25TaG9ydEludGVnZXJXaXRoVW5rbm93blZhbHVlKCkgIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIG91dC53cml0ZShXU1BfTEVOR1RIX1FVT1RFKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEpOyAvLyBMZW5ndGggYXMgVUlOVFZBUgorICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1VOQVNTSUdORUQgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1VOQVNTSUdORUQsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxGb3JtTGVuZ3RoUXVvdGVXZWxsS25vd25Mb25nSW50ZWdlcigpICB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBvdXQud3JpdGUoV1NQX0xFTkdUSF9RVU9URSk7CisgICAgICAgIG91dC53cml0ZSgweDAzKTsgLy8gTGVuZ3RoIGFzIFVJTlRWQVIKKyAgICAgICAgb3V0LndyaXRlKDB4MDIpOyAvLyBsb25nLWludGVnZXIgbGVuZ3RoICgyIG9jdGV0cykKKyAgICAgICAgb3V0LndyaXRlKExPTkdfTUlNRV9UWVBFX09NQV9ESVJFQ1RPUllfWE1MID4+IDgpOworICAgICAgICBvdXQud3JpdGUoTE9OR19NSU1FX1RZUEVfT01BX0RJUkVDVE9SWV9YTUwgJiAweEZGKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9vbWEtZGlyZWN0b3J5K3htbCIsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExPTkdfTUlNRV9UWVBFX09NQV9ESVJFQ1RPUllfWE1MLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYWxGb3JtTGVuZ3RoUXVvdGVXZWxsS25vd25Mb25nSW50ZWdlcldpdGhVbmtub3duVmFsdWUoKSAgeworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgb3V0LndyaXRlKFdTUF9MRU5HVEhfUVVPVEUpOworICAgICAgICBvdXQud3JpdGUoMHgwMyk7IC8vIExlbmd0aCBhcyBVSU5UVkFSCisgICAgICAgIG91dC53cml0ZSgweDAyKTsgLy8gbG9uZy1pbnRlZ2VyIGxlbmd0aCAoMiBvY3RldHMpCisgICAgICAgIG91dC53cml0ZShMT05HX01JTUVfVFlQRV9VTkFTU0lHTkVEID4+IDgpOworICAgICAgICBvdXQud3JpdGUoTE9OR19NSU1FX1RZUEVfVU5BU1NJR05FRCAmIDB4RkYpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnROdWxsKG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExPTkdfTUlNRV9UWVBFX1VOQVNTSUdORUQsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbEZvcm1MZW5ndGhRdW90ZUV4dGVuc2lvbk1lZGlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHRlc3RUeXBlID0gImFwcGxpY2F0aW9uL3dpYmJsZSI7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgb3V0LndyaXRlKFdTUF9MRU5HVEhfUVVPVEUpOworICAgICAgICBvdXQud3JpdGUodGVzdFR5cGUubGVuZ3RoKCkgKyAxKTsgLy8gTGVuZ3RoIGFzIFVJTlRWQVIKKworICAgICAgICBvdXQud3JpdGUodGVzdFR5cGUuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbEZvcm1MZW5ndGhRdW90ZUV4dGVuc2lvbk1lZGlhV2l0aE5pY2VMb25nTWltZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgdGVzdFR5cGUgPQorICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAgICAgICAgICAgICArIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IjsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBvdXQud3JpdGUoV1NQX0xFTkdUSF9RVU9URSk7CisgICAgICAgIG91dC53cml0ZSgweDgxKTsgLy8gTGVuZ3RoIGFzIFVJTlRWQVIgKDE2MSBkZWNpbWFsLCAweEExKSwgMiBieXRlcworICAgICAgICBvdXQud3JpdGUoMHgyMSk7CisKKyAgICAgICAgb3V0LndyaXRlKHRlc3RUeXBlLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7CisKKyAgICAgICAgV3NwVHlwZURlY29kZXIgdW5pdCA9IG5ldyBXc3BUeXBlRGVjb2RlcihvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydFRydWUodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VHlwZSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE2NCwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW5lZE1lZGlhRXh0ZW5zaW9uTWVkaWFXaXRoU3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgdGVzdFR5cGUgPSAiIGFwcGxpY2F0aW9uL3dpYmJsZSI7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSh0ZXN0VHlwZS5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIG91dC53cml0ZShXU1BfU1RSSU5HX1RFUk1JTkFUT1IpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGVzdFR5cGUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMCwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZFBhcmFtV2VsbEtub3duU2hvcnRJbnRlZ2VyTm9WYWx1ZSgpICB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDMpOyAvLyBWYWx1ZS1sZW5ndGgsIHNob3J0LWxlbmd0aAorICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZShUWVBFRF9QQVJBTV9ET01BSU4gfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKFBBUkFNX05PX1ZBTFVFKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdW5pdC5nZXRDb250ZW50UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyYW1zLmdldCgiRG9tYWluIikpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkUGFyYW1XZWxsS25vd25TaG9ydEludGVnZXJUb2tlblRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgxNCk7IC8vIFZhbHVlLWxlbmd0aCwgc2hvcnQtbGVuZ3RoCisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKFRZUEVEX1BBUkFNX0RPTUFJTiB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoIndkc3RlY2hub2xvZ3kuY29tIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIG91dC53cml0ZShXU1BfU1RSSU5HX1RFUk1JTkFUT1IpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCB1bml0LmdldFZhbHVlMzIoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG91dC50b0J5dGVBcnJheSgpLmxlbmd0aCwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3ZHN0ZWNobm9sb2d5LmNvbSIsIHBhcmFtcy5nZXQoIkRvbWFpbiIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZFBhcmFtV2VsbEtub3duTG9uZ0ludGVnZXJUb2tlblRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgxNSk7CisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEpOworICAgICAgICBvdXQud3JpdGUoVFlQRURfUEFSQU1fRE9NQUlOKTsKKyAgICAgICAgb3V0LndyaXRlKCJ3ZHN0ZWNobm9sb2d5LmNvbSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMiwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3ZHN0ZWNobm9sb2d5LmNvbSIsIHBhcmFtcy5nZXQoIkRvbWFpbiIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZFBhcmFtV2VsbEtub3duU2hvcnRJbnRlZ2VyUXVvdGVkVGV4dCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDE1KTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoVFlQRURfUEFSQU1fRE9NQUlOIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZShXU1BfUVVPVEUpOworICAgICAgICBvdXQud3JpdGUoIndkc3RlY2hub2xvZ3kuY29tIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIG91dC53cml0ZShXU1BfU1RSSU5HX1RFUk1JTkFUT1IpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHgzRiwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjIsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSB1bml0LmdldENvbnRlbnRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygid2RzdGVjaG5vbG9neS5jb20iLCBwYXJhbXMuZ2V0KCJEb21haW4iKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRQYXJhbVdlbGxLbm93blNob3J0SW50ZWdlckNvbXBhY3RJbnRlZ2VyVmFsdWUoKSAgeworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDMpOworICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZShUWVBFRF9QQVJBTV9TRUMgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4M0YsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSB1bml0LmdldENvbnRlbnRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBhcmFtcy5nZXQoIlNFQyIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZFBhcmFtV2VsbEtub3duU2hvcnRJbnRlZ2VyTXVsdGlwbGVQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MEIpOworICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZShUWVBFRF9QQVJBTV9TRUMgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKFRZUEVEX1BBUkFNX01BQyB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoV1NQX1FVT1RFKTsKKyAgICAgICAgb3V0LndyaXRlKCJpbWFwYyIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIHVuaXQuZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSk7CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSB1bml0LmdldENvbnRlbnRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBhcmFtcy5nZXQoIlNFQyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFwYyIsIHBhcmFtcy5nZXQoIk1BQyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW50eXBlZFBhcmFtSW50ZWdlclZhbHVlU2hvcnRJbnRlZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDBBKTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoIk1ZUEFSQU0iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7IC8vIEVPUworICAgICAgICBvdXQud3JpdGUoMHg0NSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMSwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2OSIsIHBhcmFtcy5nZXQoIk1ZUEFSQU0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVudHlwZWRQYXJhbUludGVnZXJWYWx1ZUxvbmdJbnRlZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDBDKTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoIk1ZUEFSQU0iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7CisgICAgICAgIG91dC53cml0ZSgweDAyKTsgLy8gU2hvcnQgTGVuZ3RoCisgICAgICAgIG91dC53cml0ZSgweDQyKTsgLy8gTG9uZyBJbnRlZ2VyIGJ5dGUgMQorICAgICAgICBvdXQud3JpdGUoMHg2OSk7IC8vIExvbmcgSW50ZWdlciBieXRlIDIKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4M0YsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzLCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdW5pdC5nZXRDb250ZW50UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDAxIiwgcGFyYW1zLmdldCgiTVlQQVJBTSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW50eXBlZFBhcmFtVGV4dE5vVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MEEpOworICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZSgiTVlQQVJBTSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKyAgICAgICAgb3V0LndyaXRlKFBBUkFNX05PX1ZBTFVFKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhTVFJJTkdfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCBtaW1lVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdW5pdC5nZXRDb250ZW50UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyYW1zLmdldCgiTVlQQVJBTSIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbnR5cGVkUGFyYW1UZXh0VG9rZW5UZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDExKTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoIk1ZUEFSQU0iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7CisgICAgICAgIG91dC53cml0ZSgibXl2YWx1ZSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhTVFJJTkdfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCBtaW1lVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIHVuaXQuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE4LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdW5pdC5nZXRDb250ZW50UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15dmFsdWUiLCBwYXJhbXMuZ2V0KCJNWVBBUkFNIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbnR5cGVkUGFyYW1UZXh0UXVvdGVkU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dC53cml0ZSgweDExKTsKKyAgICAgICAgb3V0LndyaXRlKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spOworICAgICAgICBvdXQud3JpdGUoIk1ZUEFSQU0iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7CisgICAgICAgIG91dC53cml0ZShXU1BfUVVPVEUpOworICAgICAgICBvdXQud3JpdGUoIm15dmFsdWUiLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgb3V0LndyaXRlKFdTUF9TVFJJTkdfVEVSTUlOQVRPUik7CisKKyAgICAgICAgV3NwVHlwZURlY29kZXIgdW5pdCA9IG5ldyBXc3BUeXBlRGVjb2RlcihvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydFRydWUodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVuaXQuZ2V0VmFsdWVTdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgbWltZVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxOSwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteXZhbHVlIiwgcGFyYW1zLmdldCgiTVlQQVJBTSIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVzUmV0dXJuc0ZhbHNlX0ZvclBhcmFtV2l0aE1pc3NpbmdWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgwOSk7CisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKCJNWVBBUkFNIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIG91dC53cml0ZShXU1BfU1RSSU5HX1RFUk1JTkFUT1IpOworCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRQYXJhbVRleHRRVmFsdWUoKSAgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgwNCk7CisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKFRZUEVEX1BBUkFNX1EpOworICAgICAgICBvdXQud3JpdGUoMHg4Myk7IC8vIFEgdmFsdWUgYnl0ZSAxCisgICAgICAgIG91dC53cml0ZSgweDMxKTsgLy8gUSB2YWx1ZSBieXRlIDIKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhTVFJJTkdfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFLCBtaW1lVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscygweDNGLCB1bml0LmdldFZhbHVlMzIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdW5pdC5nZXRDb250ZW50UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQzMyIsIHBhcmFtcy5nZXQoIlEiKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRQYXJhbVVuYXNzaWduZWRXZWxsS25vd25TaG9ydEludGVnZXJUb2tlblRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgxNCk7CisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKFBBUkFNX1VOQVNTSUdORUQgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKCJ3ZHN0ZWNobm9sb2d5LmNvbSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMSwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3ZHN0ZWNobm9sb2d5LmNvbSIsIHBhcmFtcy5nZXQoInVuYXNzaWduZWQvMHg0MiIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZFBhcmFtVW5hc3NpZ25lZFdlbGxLbm93bkxvbmdJbnRlZ2VyVG9rZW5UZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MTUpOworICAgICAgICBvdXQud3JpdGUoU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFIHwgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyk7CisgICAgICAgIG91dC53cml0ZSgweDAxKTsgLy8gU2hvcnQtbGVuZ3RoIG9mIHdlbGwta25vd24gcGFyYW1ldGVyIHRva2VuCisgICAgICAgIG91dC53cml0ZShQQVJBTV9VTkFTU0lHTkVEKTsKKyAgICAgICAgb3V0LndyaXRlKCJ3ZHN0ZWNobm9sb2d5LmNvbSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICBvdXQud3JpdGUoV1NQX1NUUklOR19URVJNSU5BVE9SKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0LmRlY29kZUNvbnRlbnRUeXBlKDApKTsKKworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSB1bml0LmdldFZhbHVlU3RyaW5nKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklOR19NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUsIG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNIT1JUX01JTUVfVFlQRV9ST0xMT1ZFUl9DRVJUSUZJQ0FURSwgdW5pdC5nZXRWYWx1ZTMyKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMiwgdW5pdC5nZXREZWNvZGVkRGF0YUxlbmd0aCgpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHVuaXQuZ2V0Q29udGVudFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3ZHN0ZWNobm9sb2d5LmNvbSIsIHBhcmFtcy5nZXQoInVuYXNzaWduZWQvMHg0MiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2Rlc1JldHVybnNGYWxzZV9XaGVuUGFyYW1WYWx1ZU5vdFRlcm1pbmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXQud3JpdGUoMHgxNSk7CisgICAgICAgIG91dC53cml0ZShTSE9SVF9NSU1FX1RZUEVfUk9MTE9WRVJfQ0VSVElGSUNBVEUgfCBXU1BfU0hPUlRfSU5URUdFUl9NQVNLKTsKKyAgICAgICAgb3V0LndyaXRlKDB4MDEpOworICAgICAgICBvdXQud3JpdGUoUEFSQU1fVU5BU1NJR05FRCk7CisgICAgICAgIG91dC53cml0ZSgid2RzdGVjaG5vbG9neS5jb20iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciB1bml0ID0gbmV3IFdzcFR5cGVEZWNvZGVyKG91dC50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodW5pdC5kZWNvZGVDb250ZW50VHlwZSgwKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvSXNvbGF0ZWRDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0lzb2xhdGVkQ29udGV4dC5qYXZhCmluZGV4IGI0ODNiODIuLmJjMDBmNjggMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvSXNvbGF0ZWRDb250ZXh0LmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Jc29sYXRlZENvbnRleHQuamF2YQpAQCAtODcsNiArODcsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgLy8gSWdub3JlCisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIG1Ccm9hZGNhc3RJbnRlbnRzLmFkZChpbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlLmphdmEKaW5kZXggYjYzYjNjZS4uNzljNTU0YSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBJZiBpdCBpcyB0aGUgbGFzdCB0ZXN0IGNhc2UsIGNhbGwgZmluaXNoIG9uIHRoZSBhY3Rpdml0eS4KICAgICAgICAgc1Rlc3RDYXNlQ291bnRlciAtLTsKLSAgICAgICAgaWYgKHNUZXN0Q2FzZUNvdW50ZXIgPT0gMSkgeworICAgICAgICBpZiAoc1Rlc3RDYXNlQ291bnRlciA9PSAwKSB7CiAgICAgICAgICAgICBzQWN0aXZpdHkuZmluaXNoKCk7CiAgICAgICAgIH0gICAgICAgIAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vQW5kcm9pZC5tayBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OGQ5ZTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhcHBsaWNhdGlvbgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEJyb3dzZXJUZXN0UGx1Z2luCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnRlc3RwbHVnaW4KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgQWxzbyBidWlsZCBhbGwgb2YgdGhlIHN1Yi10YXJnZXRzIHVuZGVyIHRoaXMgb25lOiB0aGUgc2hhcmVkIGxpYnJhcnkuCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3MWFiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cGx1Z2luIgotICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKLSAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+Ci0KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQucGVybWlzc2lvbi5QTFVHSU4iLz4KLQotICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIC8+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvYnJvd3Nlcl90ZXN0X3BsdWdpbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJCcm93c2VyIFRlc3QgUGx1Z2luIj4KLSAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJUZXN0UGx1Z2luIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndlYmtpdC5QTFVHSU4iIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvc2VydmljZT4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL0FuZHJvaWQubWsgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhMjFlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjCi0jIwotIyMgQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMjCi0jIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyMgYXJlIG1ldDoKLSMjICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMjCi0jIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQotIyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSMjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0jIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSMjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotIyMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotIyMgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCW1haW4uY3BwIFwKLQlQbHVnaW5PYmplY3QuY3BwIFwKLQlldmVudC9FdmVudFBsdWdpbi5jcHAgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLQkkKExPQ0FMX1BBVEgpIFwKLQkkKExPQ0FMX1BBVEgpL2V2ZW50IFwKLQlleHRlcm5hbC93ZWJraXQvV2ViQ29yZS9icmlkZ2UgXAotCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsdWdpbnMgXAotCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvSmF2YVZNIFwKLQlleHRlcm5hbC93ZWJraXQvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucwotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJ0ZXN0cGx1Z2luCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGZjYTYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgotIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sCi0gbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZQotIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCi0gcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCi0KLSBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCi0gdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4KLSB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kCi0gcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Ci0gZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0Ci0gbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbAotIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKLSBvciBsb2dvcyBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gdGhlIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuIEV4Y2VwdCBhcyBleHByZXNzbHkKLSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQotIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91cgotIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCi0KLSBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PIFdBUlJBTlRJRVMsCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwKLSBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUwotIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KLQotIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKLSBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsCi0gUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAotIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IKLSBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKLQotc3RhdGljIHZvaWQgcGx1Z2luSW52YWxpZGF0ZShOUE9iamVjdCAqb2JqKTsKLXN0YXRpYyBib29sIHBsdWdpbkhhc1Byb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKLXN0YXRpYyBib29sIHBsdWdpbkhhc01ldGhvZChOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7Ci1zdGF0aWMgYm9vbCBwbHVnaW5HZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgTlBWYXJpYW50ICp2YXJpYW50KTsKLXN0YXRpYyBib29sIHBsdWdpblNldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKnZhcmlhbnQpOwotc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCk7Ci1zdGF0aWMgYm9vbCBwbHVnaW5JbnZva2VEZWZhdWx0KE5QT2JqZWN0ICpvYmosIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKLXN0YXRpYyBOUE9iamVjdCAqcGx1Z2luQWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyAqdGhlQ2xhc3MpOwotc3RhdGljIHZvaWQgcGx1Z2luRGVhbGxvY2F0ZShOUE9iamVjdCAqb2JqKTsKLXN0YXRpYyBib29sIHBsdWdpblJlbW92ZVByb3BlcnR5KE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOwotc3RhdGljIGJvb2wgcGx1Z2luRW51bWVyYXRlKE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyICoqdmFsdWUsIHVpbnQzMl90ICpjb3VudCk7Ci0KLQotCi1zdGF0aWMgTlBDbGFzcyBwbHVnaW5DbGFzcyA9IHsKLSAgICBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKLSAgICBwbHVnaW5BbGxvY2F0ZSwKLSAgICBwbHVnaW5EZWFsbG9jYXRlLAotICAgIHBsdWdpbkludmFsaWRhdGUsCi0gICAgcGx1Z2luSGFzTWV0aG9kLAotICAgIHBsdWdpbkludm9rZSwKLSAgICBwbHVnaW5JbnZva2VEZWZhdWx0LAotICAgIHBsdWdpbkhhc1Byb3BlcnR5LAotICAgIHBsdWdpbkdldFByb3BlcnR5LAotICAgIHBsdWdpblNldFByb3BlcnR5LAotICAgIHBsdWdpblJlbW92ZVByb3BlcnR5LAotICAgIHBsdWdpbkVudW1lcmF0ZQotfTsKLQotTlBDbGFzcyAqZ2V0UGx1Z2luQ2xhc3Modm9pZCkKLXsKLSAgICByZXR1cm4gJnBsdWdpbkNsYXNzOwotfQotCi1zdGF0aWMgYm9vbCBpZGVudGlmaWVyc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSNkZWZpbmUgSURfVEVTVEZJTEVfUFJPUEVSVFkgICAgICAgICAgICAwCi0jZGVmaW5lIE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUyAgICAgICAgMQotCi1zdGF0aWMgTlBJZGVudGlmaWVyIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXTsKLXN0YXRpYyBjb25zdCBOUFVURjggKnBsdWdpblByb3BlcnR5SWRlbnRpZmllck5hbWVzW05VTV9QUk9QRVJUWV9JREVOVElGSUVSU10gPSB7Ci0gICAgInRlc3RmaWxlIgotfTsKLQotI2RlZmluZSBJRF9HRVRURVNURklMRV9NRVRIT0QgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBOVU1fTUVUSE9EX0lERU5USUZJRVJTICAgICAgICAgICAgICAgICAgMQotCi1zdGF0aWMgTlBJZGVudGlmaWVyIHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW05VTV9NRVRIT0RfSURFTlRJRklFUlNdOwotc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzW05VTV9NRVRIT0RfSURFTlRJRklFUlNdID0gewotICAgICJnZXRUZXN0RmlsZSIKLX07Ci0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVJZGVudGlmaWVycyh2b2lkKQotewotICAgIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXJzKHBsdWdpblByb3BlcnR5SWRlbnRpZmllck5hbWVzLCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlMsIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnMpOwotICAgIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXJzKHBsdWdpbk1ldGhvZElkZW50aWZpZXJOYW1lcywgTlVNX01FVEhPRF9JREVOVElGSUVSUywgcGx1Z2luTWV0aG9kSWRlbnRpZmllcnMpOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5IYXNQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTOyBpKyspCi0gICAgICAgIGlmIChuYW1lID09IHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbaV0pCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHBsdWdpbkhhc01ldGhvZChOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01FVEhPRF9JREVOVElGSUVSUzsgaSsrKQotICAgICAgICBpZiAobmFtZSA9PSBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tpXSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luR2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIE5QVmFyaWFudCAqdmFyaWFudCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7Ci0gICAgaWYgKG5hbWUgPT0gcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tJRF9URVNURklMRV9QUk9QRVJUWV0pIHsKLSAgICAgICAgQk9PTEVBTl9UT19OUFZBUklBTlQodHJ1ZSwgKnZhcmlhbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5TZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YXJpYW50KQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7Ci0gICAgaWYgKG5hbWUgPT0gcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbSURfR0VUVEVTVEZJTEVfTUVUSE9EXSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5JbnZva2VEZWZhdWx0KE5QT2JqZWN0ICpvYmosIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgcGx1Z2luSW52YWxpZGF0ZShOUE9iamVjdCAqb2JqKQotewotICAgIC8vIFJlbGVhc2UgYW55IHJlbWFpbmluZyByZWZlcmVuY2VzIHRvIEphdmFTY3JpcHQgb2JqZWN0cy4KLX0KLQotc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcykKLXsKLSAgICBQbHVnaW5PYmplY3QgKm5ld0luc3RhbmNlID0gKFBsdWdpbk9iamVjdCopIG1hbGxvYyhzaXplb2YoUGx1Z2luT2JqZWN0KSk7Ci0gICAgbmV3SW5zdGFuY2UtPmhlYWRlci5fY2xhc3MgPSB0aGVDbGFzczsKLSAgICBuZXdJbnN0YW5jZS0+aGVhZGVyLnJlZmVyZW5jZUNvdW50ID0gMTsKLQotICAgIGlmICghaWRlbnRpZmllcnNJbml0aWFsaXplZCkgewotICAgICAgICBpZGVudGlmaWVyc0luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgaW5pdGlhbGl6ZUlkZW50aWZpZXJzKCk7Ci0gICAgfQotCi0gICAgbmV3SW5zdGFuY2UtPm5wcCA9IG5wcDsKLQotICAgIHJldHVybiAmbmV3SW5zdGFuY2UtPmhlYWRlcjsKLX0KLQotc3RhdGljIHZvaWQgcGx1Z2luRGVhbGxvY2F0ZShOUE9iamVjdCAqb2JqKQotewotICAgIGZyZWUob2JqKTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luUmVtb3ZlUHJvcGVydHkoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHBsdWdpbkVudW1lcmF0ZShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciAqKnZhbHVlLCB1aW50MzJfdCAqY291bnQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU4ZDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgotIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sCi0gbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZQotIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCi0gcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCi0KLSBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCi0gdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4KLSB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kCi0gcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5Ci0gZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0Ci0gbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbAotIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKLSBvciBsb2dvcyBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gdGhlIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuIEV4Y2VwdCBhcyBleHByZXNzbHkKLSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQotIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91cgotIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCi0KLSBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PIFdBUlJBTlRJRVMsCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwKLSBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUwotIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KLQotIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKLSBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsCi0gUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAotIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IKLSBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBQbHVnaW5PYmplY3RfX0RFRklORUQKLSNkZWZpbmUgUGx1Z2luT2JqZWN0X19ERUZJTkVECi0KLSNpbmNsdWRlICJtYWluLmgiCi0KLWNsYXNzIFN1YlBsdWdpbiB7Ci1wdWJsaWM6Ci0gICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQotICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7Ci0KLSAgICBOUFAgaW5zdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdDsgfQotCi1wcml2YXRlOgotICAgIE5QUCBtX2luc3Q7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBQbHVnaW5PYmplY3QgewotICAgIE5QT2JqZWN0IGhlYWRlcjsKLSAgICBOUFAgbnBwOwotICAgIE5QV2luZG93KiB3aW5kb3c7Ci0KLSAgICBTdWJQbHVnaW4qIHN1YlBsdWdpbjsKLQotfSBQbHVnaW5PYmplY3Q7Ci0KLU5QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpOwotCi0jZW5kaWYgLy8gUGx1Z2luT2JqZWN0X19ERUZJTkVECmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmZjM5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiRXZlbnRQbHVnaW4uaCIKLSNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7Ci1leHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7Ci1leHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7Ci1leHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKLWV4dGVybiBBTlBUeXBlZmFjZUludGVyZmFjZVYwICBnVHlwZWZhY2VJOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUV2ZW50UGx1Z2luOjpFdmVudFBsdWdpbihOUFAgaW5zdCkgOiBTdWJQbHVnaW4oaW5zdCkgeyB9Ci0KLUV2ZW50UGx1Z2luOjp+RXZlbnRQbHVnaW4oKSB7IH0KLQotdm9pZCBFdmVudFBsdWdpbjo6ZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApIHsKLQotICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgZHJhd2luZyB0aGUgcGx1Z2luICglZCwlZCkiLAotICAgICAgICAgICAgICBpbnN0KCksIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCk7Ci0KLSAgICAvLyBnZXQgdGhlIHBsdWdpbidzIGRpbWVuc2lvbnMgYWNjb3JkaW5nIHRvIHRoZSBET00KLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0KCktPnBkYXRhOwotICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOwotICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKLQotICAgIC8vIGNvbXB1dGUgdGhlIGN1cnJlbnQgem9vbSBsZXZlbAotICAgIGNvbnN0IGZsb2F0IHpvb21GYWN0b3JXID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJpdG1hcC53aWR0aCkgLyBXOwotICAgIGNvbnN0IGZsb2F0IHpvb21GYWN0b3JIID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJpdG1hcC5oZWlnaHQpIC8gSDsKLQotICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgem9vbSBsZXZlbCBpcyB1bmlmb3JtCi0gICAgaWYgKHpvb21GYWN0b3JXICsgLjAxIDwgem9vbUZhY3RvckggJiYgem9vbUZhY3RvclcgLSAuMDEgPiB6b29tRmFjdG9ySCkKLSAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB6b29tIGlzIG91dCBvZiBzeW5jICglZiwlZikiLAotICAgICAgICAgICAgICAgICAgaW5zdCgpLCB6b29tRmFjdG9yVywgem9vbUZhY3RvckgpOwotCi0gICAgLy8gc2NhbGUgdGhlIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgem9vbSBsZXZlbAotICAgIGNvbnN0IGludCBmb250U2l6ZSA9IChpbnQpKHpvb21GYWN0b3JXICogMTYpOwotICAgIGNvbnN0IGludCBsZWZ0TWFyZ2luID0gKGludCkoem9vbUZhY3RvclcgKiAxMCk7Ci0KLSAgICAvLyBjcmVhdGUgYW5kIGNsaXAgYSBjYW52YXMKLSAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKLQotICAgIEFOUFJlY3RGIGNsaXBSOwotICAgIGNsaXBSLmxlZnQgPSBjbGlwLmxlZnQ7Ci0gICAgY2xpcFIudG9wID0gY2xpcC50b3A7Ci0gICAgY2xpcFIucmlnaHQgPSBjbGlwLnJpZ2h0OwotICAgIGNsaXBSLmJvdHRvbSA9IGNsaXAuYm90dG9tOwotICAgIGdDYW52YXNJLmNsaXBSZWN0KGNhbnZhcywgJmNsaXBSKTsKLQotICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZGRkZGRkYpOwotCi0gICAgLy8gY29uZmlndXJlIHRoZSBwYWludAotICAgIEFOUFBhaW50KiBwYWludCA9IGdQYWludEkubmV3UGFpbnQoKTsKLSAgICBnUGFpbnRJLnNldEZsYWdzKHBhaW50LCBnUGFpbnRJLmdldEZsYWdzKHBhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKLSAgICBnUGFpbnRJLnNldENvbG9yKHBhaW50LCAweEZGMDAwMEZGKTsKLSAgICBnUGFpbnRJLnNldFRleHRTaXplKHBhaW50LCBmb250U2l6ZSk7Ci0KLSAgICAvLyBjb25maWd1cmUgdGhlIGZvbnQKLSAgICBBTlBUeXBlZmFjZSogdGYgPSBnVHlwZWZhY2VJLmNyZWF0ZUZyb21OYW1lKCJzZXJpZiIsIGtJdGFsaWNfQU5QVHlwZWZhY2VTdHlsZSk7Ci0gICAgZ1BhaW50SS5zZXRUeXBlZmFjZShwYWludCwgdGYpOwotICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOwotCi0gICAgLy8gcmV0cmlldmUgdGhlIGZvbnQgbWV0cmljcwotICAgIEFOUEZvbnRNZXRyaWNzIGZtOwotICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MocGFpbnQsICZmbSk7Ci0KLSAgICAvLyB3cml0ZSB0ZXh0IG9uIHRoZSBjYW52YXMKLSAgICBjb25zdCBjaGFyIGNbXSA9ICJCcm93c2VyIFRlc3QgUGx1Z2luIjsKLSAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIGMsIHNpemVvZihjKS0xLCBsZWZ0TWFyZ2luLCAtZm0uZlRvcCwgcGFpbnQpOwotCi0gICAgLy8gY2xlYW4gdXAgdmFyaWFibGVzCi0gICAgZ1BhaW50SS5kZWxldGVQYWludChwYWludCk7Ci0gICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Ci19Ci0KLXZvaWQgRXZlbnRQbHVnaW46OnByaW50VG9EaXYoY29uc3QgY2hhciogdGV4dCwgaW50IGxlbmd0aCkgewotICAgIC8vIEdldCB0aGUgcGx1Z2luJ3MgRE9NIG9iamVjdAotICAgIE5QT2JqZWN0KiB3aW5kb3dPYmplY3QgPSBOVUxMOwotICAgIGJyb3dzZXItPmdldHZhbHVlKGluc3QoKSwgTlBOVldpbmRvd05QT2JqZWN0LCAmd2luZG93T2JqZWN0KTsKLQotICAgIGlmICghd2luZG93T2JqZWN0KQotICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFVuYWJsZSB0byByZXRyaWV2ZSBET00gV2luZG93IiwgaW5zdCgpKTsKLQotICAgIC8vIGNyZWF0ZSBhIHN0cmluZyAoSlMgY29kZSkgdGhhdCBpcyBzdG9yZWQgaW4gbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgYnJvd3NlcgotICAgIGNvbnN0IGNoYXIqIGpzQmVnaW4gPSAidmFyIG91dHB1dERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudE91dHB1dCcpOyBvdXRwdXREaXYuaW5uZXJIVE1MICs9ICcgIjsKLSAgICBjb25zdCBjaGFyKiBqc0VuZCA9ICInOyI7Ci0KLSAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNvbmZpZ3VyZSBwb2ludGVycwotICAgIGludCB0b3RhbExlbmd0aCA9IHN0cmxlbihqc0JlZ2luKSArIGxlbmd0aCArIHN0cmxlbihqc0VuZCk7Ci0gICAgY2hhciogYmVnaW5NZW0gPSAoY2hhciopYnJvd3Nlci0+bWVtYWxsb2ModG90YWxMZW5ndGgpOwotICAgIGNoYXIqIG1pZGRsZU1lbSA9IGJlZ2luTWVtICsgc3RybGVuKGpzQmVnaW4pOwotICAgIGNoYXIqIGVuZE1lbSA9IG1pZGRsZU1lbSArIGxlbmd0aDsKLQotICAgIC8vIGNvcHkgaW50byB0aGUgYWxsb2NhdGVkIG1lbW9yeQotICAgIG1lbWNweShiZWdpbk1lbSwganNCZWdpbiwgc3RybGVuKGpzQmVnaW4pKTsKLSAgICBtZW1jcHkobWlkZGxlTWVtLCB0ZXh0LCBsZW5ndGgpOwotICAgIG1lbWNweShlbmRNZW0sIGpzRW5kLCBzdHJsZW4oanNFbmQpKTsKLQotICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgInRleHQ6ICUuKnNcbiIsIHRvdGFsTGVuZ3RoLCAoY2hhciopYmVnaW5NZW0pOwotCi0gICAgLy8gZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBpbiB0aGUgcGx1Z2luJ3MgRE9NIG9iamVjdAotICAgIE5QU3RyaW5nIHNjcmlwdCA9IHsgKGNoYXIqKWJlZ2luTWVtLCB0b3RhbExlbmd0aCB9OwotICAgIE5QVmFyaWFudCBzY3JpcHRWYXJpYW50OwotICAgIGlmICghYnJvd3Nlci0+ZXZhbHVhdGUoaW5zdCgpLCB3aW5kb3dPYmplY3QsICZzY3JpcHQsICZzY3JpcHRWYXJpYW50KSkKLSAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBVbmFibGUgdG8gZXZhbCB0aGUgSlMuIiwgaW5zdCgpKTsKLQotICAgIC8vIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aGluIHRoZSBicm93c2VyCi0gICAgYnJvd3Nlci0+bWVtZnJlZShiZWdpbk1lbSk7Ci19Ci0KLWludDE2IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7Ci0gICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewotCi0gICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKLSAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBrT25Mb2FkX0FOUExpZmVjeWNsZUFjdGlvbjogewotICAgICAgICAgICAgICAgICAgICBjaGFyIG1zZ1tdID0gImxpZmVjeWNsZS1vbkxvYWQiOwotICAgICAgICAgICAgICAgICAgICBwcmludFRvRGl2KG1zZywgc3RybGVuKG1zZykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBrR2FpbkZvY3VzX0FOUExpZmVjeWNsZUFjdGlvbjogewotICAgICAgICAgICAgICAgICAgICBjaGFyIG1zZ1tdID0gImxpZmVjeWNsZS1nYWluRm9jdXMiOwotICAgICAgICAgICAgICAgICAgICBwcmludFRvRGl2KG1zZywgc3RybGVuKG1zZykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBrTG9zZUZvY3VzX0FOUExpZmVjeWNsZUFjdGlvbjogewotICAgICAgICAgICAgICAgICAgICBjaGFyIG1zZ1tdID0gImxpZmVjeWNsZS1sb3NlRm9jdXMiOwotICAgICAgICAgICAgICAgICAgICBwcmludFRvRGl2KG1zZywgc3RybGVuKG1zZykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOgotICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCB0b3VjaCBldmVudHMiLCBpbnN0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6Ci0gICAgICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHRoZSBwbHVnaW4gZGlkIG5vdCByZXF1ZXN0IGtleSBldmVudHMiLCBpbnN0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjdjOWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgotCi0jaWZuZGVmIGV2ZW50UGx1Z2luX19ERUZJTkVECi0jZGVmaW5lIGV2ZW50UGx1Z2luX19ERUZJTkVECi0KLWNsYXNzIEV2ZW50UGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7Ci1wdWJsaWM6Ci0gICAgRXZlbnRQbHVnaW4oTlBQIGluc3QpOwotICAgIHZpcnR1YWwgfkV2ZW50UGx1Z2luKCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKLSAgICB2b2lkIHByaW50VG9EaXYoY29uc3QgY2hhciogdGV4dCwgaW50IGxlbmd0aCk7Ci19OwotCi0jZW5kaWYgLy8gZXZlbnRQbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyYTdlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCi0jaW5jbHVkZSAiRXZlbnRQbHVnaW4uaCIKLQotTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyOwotI2RlZmluZSBFWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLQotTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKLSAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7Ci1OUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKLU5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOwotTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAotICAgICAgICB2b2lkKiBidWZmZXIpOwotdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwotdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwotdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCi0gICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwotTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwotTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwotCi1leHRlcm4gIkMiIHsKLUVYUE9SVCBOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2Vudik7Ci1FWFBPUlQgTlBFcnJvciBOUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7Ci1FWFBPUlQgY29uc3QgY2hhciogTlBfR2V0TUlNRURlc2NyaXB0aW9uKHZvaWQpOwotRVhQT1JUIHZvaWQgTlBfU2h1dGRvd24odm9pZCk7Ci19OwotCi1BTlBBdWRpb1RyYWNrSW50ZXJmYWNlVjAgICAgZ1NvdW5kSTsKLUFOUEJpdG1hcEludGVyZmFjZVYwICAgICAgICBnQml0bWFwSTsKLUFOUENhbnZhc0ludGVyZmFjZVYwICAgICAgICBnQ2FudmFzSTsKLUFOUExvZ0ludGVyZmFjZVYwICAgICAgICAgICBnTG9nSTsKLUFOUFBhaW50SW50ZXJmYWNlVjAgICAgICAgICBnUGFpbnRJOwotQU5QUGF0aEludGVyZmFjZVYwICAgICAgICAgIGdQYXRoSTsKLUFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgICAgICBnVHlwZWZhY2VJOwotQU5QV2luZG93SW50ZXJmYWNlVjAgICAgICAgIGdXaW5kb3dJOwotCi0jZGVmaW5lIEFSUkFZX0NPVU5UKGFycmF5KSAgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKLQotTlBFcnJvciBOUF9Jbml0aWFsaXplKE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlckZ1bmNzLCBOUFBsdWdpbkZ1bmNzKiBwbHVnaW5GdW5jcywgdm9pZCAqamF2YV9lbnYpCi17Ci0gICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBmdW5jdGlvbiB0YWJsZSBlcXVhbCBvciBsYXJnZXIgdGhhbiB3ZSBhcmUgYnVpbHQgYWdhaW5zdC4KLSAgICBpZiAoYnJvd3NlckZ1bmNzLT5zaXplIDwgc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpIHsKLSAgICAgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Ci0gICAgfQotCi0gICAgLy8gQ29weSB0aGUgZnVuY3Rpb24gdGFibGUgKHN0cnVjdHVyZSkKLSAgICBicm93c2VyID0gKE5QTmV0c2NhcGVGdW5jcyopIG1hbGxvYyhzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7Ci0gICAgbWVtY3B5KGJyb3dzZXIsIGJyb3dzZXJGdW5jcywgc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpOwotCi0gICAgLy8gQnVpbGQgdGhlIHBsdWdpbiBmdW5jdGlvbiB0YWJsZQotICAgIHBsdWdpbkZ1bmNzLT52ZXJzaW9uID0gMTE7Ci0gICAgcGx1Z2luRnVuY3MtPnNpemUgPSBzaXplb2YocGx1Z2luRnVuY3MpOwotICAgIHBsdWdpbkZ1bmNzLT5uZXdwID0gTlBQX05ldzsKLSAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveSA9IE5QUF9EZXN0cm95OwotICAgIHBsdWdpbkZ1bmNzLT5zZXR3aW5kb3cgPSBOUFBfU2V0V2luZG93OwotICAgIHBsdWdpbkZ1bmNzLT5uZXdzdHJlYW0gPSBOUFBfTmV3U3RyZWFtOwotICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95c3RyZWFtID0gTlBQX0Rlc3Ryb3lTdHJlYW07Ci0gICAgcGx1Z2luRnVuY3MtPmFzZmlsZSA9IE5QUF9TdHJlYW1Bc0ZpbGU7Ci0gICAgcGx1Z2luRnVuY3MtPndyaXRlcmVhZHkgPSBOUFBfV3JpdGVSZWFkeTsKLSAgICBwbHVnaW5GdW5jcy0+d3JpdGUgPSAoTlBQX1dyaXRlUHJvY1B0cilOUFBfV3JpdGU7Ci0gICAgcGx1Z2luRnVuY3MtPnByaW50ID0gTlBQX1ByaW50OwotICAgIHBsdWdpbkZ1bmNzLT5ldmVudCA9IE5QUF9IYW5kbGVFdmVudDsKLSAgICBwbHVnaW5GdW5jcy0+dXJsbm90aWZ5ID0gTlBQX1VSTE5vdGlmeTsKLSAgICBwbHVnaW5GdW5jcy0+Z2V0dmFsdWUgPSBOUFBfR2V0VmFsdWU7Ci0gICAgcGx1Z2luRnVuY3MtPnNldHZhbHVlID0gTlBQX1NldFZhbHVlOwotCi0gICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgICAgIE5QTlZhcmlhYmxlICAgICB2OwotICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZTsKLSAgICAgICAgQU5QSW50ZXJmYWNlKiAgIGk7Ci0gICAgfSBnUGFpcnNbXSA9IHsKLSAgICAgICAgeyBrQ2FudmFzSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnQ2FudmFzSSksICAgJmdDYW52YXNJIH0sCi0gICAgICAgIHsga0xvZ0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgICBzaXplb2YoZ0xvZ0kpLCAgICAgICZnTG9nSSB9LAotICAgICAgICB7IGtQYWludEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgc2l6ZW9mKGdQYWludEkpLCAgICAmZ1BhaW50SSB9LAotICAgICAgICB7IGtUeXBlZmFjZUludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgc2l6ZW9mKGdUeXBlZmFjZUkpLCAmZ1R5cGVmYWNlSSB9LAotICAgIH07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9DT1VOVChnUGFpcnMpOyBpKyspIHsKLSAgICAgICAgZ1BhaXJzW2ldLmktPmluU2l6ZSA9IGdQYWlyc1tpXS5zaXplOwotICAgICAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPmdldHZhbHVlKE5VTEwsIGdQYWlyc1tpXS52LCBnUGFpcnNbaV0uaSk7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci19Ci0KLXZvaWQgTlBfU2h1dGRvd24odm9pZCkKLXsKLQotfQotCi1jb25zdCBjaGFyICpOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCkKLXsKLSAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtYnJvd3NlcnRlc3RwbHVnaW46YnRwOkFuZHJvaWQgQnJvd3NlciBUZXN0IFBsdWdpbiI7Ci19Ci0KLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCi0gICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKLXsKLQotCi0gICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiY3JlYXRpbmcgcGx1Z2luIik7Ci0KLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IE5VTEw7Ci0KLSAgICAvLyBTY3JpcHRpbmcgZnVuY3Rpb25zIGFwcGVhcmVkIGluIE5QQVBJIHZlcnNpb24gMTQKLSAgICBpZiAoYnJvd3Nlci0+dmVyc2lvbiA+PSAxNCkgewotICAgIGluc3RhbmNlLT5wZGF0YSA9IGJyb3dzZXItPmNyZWF0ZW9iamVjdCAoaW5zdGFuY2UsIGdldFBsdWdpbkNsYXNzKCkpOwotICAgIG9iaiA9IHN0YXRpY19jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7Ci0gICAgbWVtc2V0KG9iaiwgMCwgc2l6ZW9mKCpvYmopKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBzZWxlY3QgdGhlIGRyYXdpbmcgbW9kZWwKLSAgICBBTlBEcmF3aW5nTW9kZWwgbW9kZWwgPSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDsKLQotICAgIC8vIG5vdGlmeSB0aGUgcGx1Z2luIEFQSSBvZiB0aGUgZHJhd2luZyBtb2RlbCB3ZSB3aXNoIHRvIHVzZS4gVGhpcyBtdXN0IGJlCi0gICAgLy8gZG9uZSBwcmlvciB0byBjcmVhdGluZyBjZXJ0YWluIHN1YlBsdWdpbiBvYmplY3RzIChlLmcuIHN1cmZhY2VWaWV3cykKLSAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBrUmVxdWVzdERyYXdpbmdNb2RlbF9BTlBTZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihtb2RlbCkpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAicmVxdWVzdCBtb2RlbCAlZCBlcnIgJWQiLCBtb2RlbCwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgdGhlIHN1Yi1wbHVnaW4KLSAgICBvYmotPnN1YlBsdWdpbiA9IG5ldyBFdmVudFBsdWdpbihpbnN0YW5jZSk7Ci0KLSAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpCi17Ci0gICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOwotICAgIGlmIChvYmopIHsKLSAgICAgICAgZGVsZXRlIG9iai0+c3ViUGx1Z2luOwotICAgICAgICBicm93c2VyLT5yZWxlYXNlb2JqZWN0KCZvYmotPmhlYWRlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotfQotCi1OUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KQotewotICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKLQotICAgIC8vIERvIG5vdGhpbmcgaWYgYnJvd3NlciBkaWRuJ3Qgc3VwcG9ydCBOUE5fQ3JlYXRlT2JqZWN0IHdoaWNoIHdvdWxkIGhhdmUgY3JlYXRlZCB0aGUgUGx1Z2luT2JqZWN0LgotICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICBvYmotPndpbmRvdyA9IHdpbmRvdzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQotewotICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7Ci0gICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotfQotCi1OUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKQotewotICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLX0KLQotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQotewotICAgIHJldHVybiAwOwotfQotCi1pbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQotewotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSkKLXsKLX0KLQotdm9pZCBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KQotewotfQotCi1pbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKLSAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKLQotICAgIGlmKCFvYmotPnN1YlBsdWdpbikgewotICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJ0aGUgc3ViLXBsdWdpbiBpcyBudWxsLiIpOwotICAgICAgICByZXR1cm4gMDsgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBvYmotPnN1YlBsdWdpbi0+aGFuZGxlRXZlbnQoZXZ0KTsKLSAgICB9Ci19Ci0KLXZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHVybCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKQotewotfQotCi1FWFBPUlQgTlBFcnJvciBOUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkgewotCi0gICAgaWYgKHZhcmlhYmxlID09IE5QUFZwbHVnaW5OYW1lU3RyaW5nKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipzdHIgPSAoY29uc3QgY2hhciAqKil2YWx1ZTsKLSAgICAgICAgKnN0ciA9ICJCcm93c2VyIFRlc3QgUGx1Z2luIjsKLSAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotICAgIH0KLQotICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luRGVzY3JpcHRpb25TdHJpbmcpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOwotICAgICAgICAqc3RyID0gIkRlc2NyaXB0aW9uIG9mIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwotICAgICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQotewotICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0KSB7Ci0gICAgICAgIHZvaWQgKip2ID0gKHZvaWQgKiopdmFsdWU7Ci0gICAgICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKLQotICAgICAgICBpZiAob2JqKQotICAgICAgICAgICAgYnJvd3Nlci0+cmV0YWlub2JqZWN0KChOUE9iamVjdCopb2JqKTsKLQotICAgICAgICAqdiA9IG9iajsKLSAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotfQotCi1OUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKLXsKLSAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZThjNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bnBhcGkuaD4KLSNpbmNsdWRlIDxucGZ1bmN0aW9ucy5oPgotI2luY2x1ZGUgPG5wcnVudGltZS5oPgotI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKLQotZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3Jlcy9kcmF3YWJsZS9icm93c2VyX3Rlc3RfcGx1Z2luLnBuZyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3Jlcy9kcmF3YWJsZS9icm93c2VyX3Rlc3RfcGx1Z2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdjNzlkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9yZXMvZHJhd2FibGUvYnJvd3Nlcl90ZXN0X3BsdWdpbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmMDI2NzNjLi44MzMxZjBjIDEwMDY0NAotLS0gYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0LDYgKzI0LDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9DT05GSUdVUkFUSU9OIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfQVBOX1NFVFRJTkdTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQlJPQURDQVNUX1NUSUNLWSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogCiAgICAgPCEtLSBsb2NhdGlvbiB0ZXN0IHBlcm1pc3Npb25zIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04iLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSHR0cEhlYWRlclRlc3QuamF2YSBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSHR0cEhlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ0ODU3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSHR0cEhlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb3JlOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkhlYWRlcnM7CisKK3B1YmxpYyBjbGFzcyBIdHRwSGVhZGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAiTGFzdC1Nb2RpZmllZDogRnJpLCAxOCBKdW4gMjAxMCAwOTo1Njo0NyBHTVQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ09OVFJPTF9NQVhfQUdFID0gIkNhY2hlLUNvbnRyb2w6bWF4LWFnZT0xNSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DT05UUk9MX1BSSVZBVEUgPSAiQ2FjaGUtQ29udHJvbDogcHJpdmF0ZSI7CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGNhY2hlIGNvbnRyb2wgaGVhZGVyIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgaGVhZGVyLAorICAgICAqIGFjY29yZGluZyB0byBIVFRQIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBUaGUgSFRUUCBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGUgZm9sbG93aW5nIGFib3V0IHRoZSBmaWVsZHM6CisgICAgICogTXVsdGlwbGUgbWVzc2FnZS1oZWFkZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgZmllbGQtbmFtZSBNQVkgYmUgcHJlc2VudAorICAgICAqIGluIGEgbWVzc2FnZSBpZiBhbmQgb25seSBpZiB0aGUgZW50aXJlIGZpZWxkLXZhbHVlIGZvciB0aGF0IGhlYWRlciBmaWVsZAorICAgICAqIGlzIGRlZmluZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBbaS5lLiwgIyh2YWx1ZXMpXS4gSXQgTVVTVCBiZQorICAgICAqIHBvc3NpYmxlIHRvIGNvbWJpbmUgdGhlIG11bHRpcGxlIGhlYWRlciBmaWVsZHMgaW50byBvbmUgImZpZWxkLW5hbWU6CisgICAgICogZmllbGQtdmFsdWUiIHBhaXIsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUgbWVzc2FnZSwgYnkKKyAgICAgKiBhcHBlbmRpbmcgZWFjaCBzdWJzZXF1ZW50IGZpZWxkLXZhbHVlIHRvIHRoZSBmaXJzdCwgZWFjaCBzZXBhcmF0ZWQgYnkgYQorICAgICAqIGNvbW1hLiBUaGUgb3JkZXIgaW4gd2hpY2ggaGVhZGVyIGZpZWxkcyB3aXRoIHRoZSBzYW1lIGZpZWxkLW5hbWUgYXJlCisgICAgICogcmVjZWl2ZWQgaXMgdGhlcmVmb3JlIHNpZ25pZmljYW50IHRvIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29tYmluZWQKKyAgICAgKiBmaWVsZCB2YWx1ZSwgYW5kIHRodXMgYSBwcm94eSBNVVNUIE5PVCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZXNlIGZpZWxkCisgICAgICogdmFsdWVzIHdoZW4gYSBtZXNzYWdlIGlzIGZvcndhcmRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVDb250cm9sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEhlYWRlcnMgaCA9IG5ldyBIZWFkZXJzKCk7CisgICAgICAgIENoYXJBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQ2hhckFycmF5QnVmZmVyKDY0KTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKENBQ0hFX0NPTlRST0xfTUFYX0FHRSk7CisgICAgICAgIGgucGFyc2VIZWFkZXIoYnVmZmVyKTsKKworICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChMQVNUX01PRElGSUVEKTsKKyAgICAgICAgaC5wYXJzZUhlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1heC1hZ2U9MTUiLCBoLmdldENhY2hlQ29udHJvbCgpKTsKKworICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChDQUNIRV9DT05UUk9MX1BSSVZBVEUpOworICAgICAgICBoLnBhcnNlSGVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscygibWF4LWFnZT0xNSxwcml2YXRlIiwgaC5nZXRDYWNoZUNvbnRyb2woKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9Qcm94eVRlc3QuamF2YSBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvUHJveHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhY2ZlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvUHJveHlUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHk7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworLyoqCisgKiBQcm94eSB0ZXN0cworICovCitwdWJsaWMgY2xhc3MgUHJveHlUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBIdHRwSG9zdCBtSHR0cEhvc3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICBtSHR0cEhvc3QgPSBudWxsOworICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChtQ29udGV4dCk7CisgICAgICAgIGludCBwcm94eVBvcnQgPSBQcm94eS5nZXRQb3J0KG1Db250ZXh0KTsKKyAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtSHR0cEhvc3QgPSBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBwcm94eVBvcnQsICJodHRwIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhZCB1cmwgcGFyYW1ldGVyIHNob3VsZCBub3QgY2F1c2UgYW55IGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlHZXRQcmVmZXJyZWRIdHRwSG9zdF9VcmxCYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiYmFkOiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJiYWQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiYmFkOlxcIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImJhZDovLyMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiOi8vIyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm94eSAoaWYgYXZhaWxhYmxlKSBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB1cmwgcGFyYW1ldGVyIGlzIG5vdCBsb2NhbGhvc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb3h5R2V0UHJlZmVycmVkSHR0cEhvc3RfVXJsTm90bExvY2FsaG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovL2V4YW1wbGUuY29tIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovLzE5Mi4xNjguMC4xLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJmaWxlOi8vL2Zvby9iYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAicnRzcDovL2V4YW1wbGUuY29tIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgInJ0c3A6Ly9leGFtcGxlLmNvbS8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiamF2YXNjcmlwdDphbGVydCgxKSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBwcm94eSBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB1cmwgcGFyYW1ldGVyIGlzIGxvY2FsaG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlHZXRQcmVmZXJyZWRIdHRwSG9zdF9VcmxMb2NhbGhvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly9sb2NhbGhvc3QiKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vbG9jYWxob3N0LyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly9sb2NhbGhvc3QvaGVqLmh0bWwiKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTI3LjAuMC4xIikpOworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovLzEyNy4wLjAuMS8iKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTI3LjAuMC4xL2hlai5odG1sIikpOworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovLzEyNy4wLjAuMTo4MC8iKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTI3LjAuMC4xOjgwODAvIikpOworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAicnRzcDovLzEyNy4wLjAuMS8iKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJydHNwOi8vbG9jYWxob3N0LyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHBzOi8vbG9jYWxob3N0LyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUxpc3QuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlTGlzdC5qYXZhCmluZGV4IGU3NDExNzcuLjczZDczNjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlTGlzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlTGlzdC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogCiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlTGlzdCBleHRlbmRzIExpc3RBY3Rpdml0eQpAQCAtMTc5LDEwICsxODAsOSBAQAogICAgICAgICBnZXRMaXN0VmlldygpLnNldFNlbGVjdGlvbihtRm9jdXNJbmRleCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBQYXRoKCkKLSAgICB7Ci0gICAgCW1QYXRoID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMiOwotICAgIAltQmFzZUxlbmd0aCA9IG1QYXRoLmxlbmd0aCgpOworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwUGF0aCgpIHsKKyAgICAgICAgbVBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHMiOworICAgICAgICBtQmFzZUxlbmd0aCA9IG1QYXRoLmxlbmd0aCgpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBTdHJpbmcgbVBhdGg7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQppbmRleCAzMjJiMGQyLi42Y2ZjZTQxIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5Gb3J3YXJkU2VydmljZTsKIAoraW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CkBAIC0zMiwxMSArMzMsMTcgQEAKIHB1YmxpYyBjbGFzcyBGc1V0aWxzIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiRnNVdGlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1RFU1RTX1BSRUZJWCA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1RFU1RTX1BSRUZJWCA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvc3NsLyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0xPQ0FMX1RFU1RTX1BSRUZJWCA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvbG9jYWwvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVESUFfVEVTVFNfUFJFRklYID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy9tZWRpYS8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9XTUxfVEVTVFNfUFJFRklYID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy93bWwvIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RJUiA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLnRvU3RyaW5nKCk7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1RFU1RTX1BSRUZJWCA9CisgICAgICAgIEVYVEVSTkFMX0RJUiArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfVEVTVFNfUFJFRklYID0KKyAgICAgICAgRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2xheW91dF90ZXN0cy9odHRwL3Rlc3RzL3NzbC8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9MT0NBTF9URVNUU19QUkVGSVggPQorICAgICAgICBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvbG9jYWwvIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVESUFfVEVTVFNfUFJFRklYID0KKyAgICAgICAgRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2xheW91dF90ZXN0cy9odHRwL3Rlc3RzL21lZGlhLyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1dNTF9URVNUU19QUkVGSVggPQorICAgICAgICBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvd21sLyI7CiAKICAgICBwcml2YXRlIEZzVXRpbHMoKSB7CiAgICAgICAgIC8vbm8gY3JlYXRpb24gb2YgaW5zdGFuY2VzCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCAwNDIxNThhLi45Y2NmNTQ5IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTE4LDEyICsxOCwxMiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuVGVzdFNoZWxsQWN0aXZpdHkuRHVtcERhdGFUeXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5BZGJVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZpY2U7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC05MiwxMCArOTIsMTEgQEAKIAogICAgIHB1YmxpYyBNeVRlc3RSZWNvcmRlcihib29sZWFuIHJlc3VtZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSByZXN1bHRzUGFzc2VkRmlsZSA9IG5ldyBGaWxlKCIvc2RjYXJkL2xheW91dF90ZXN0c19wYXNzZWQudHh0Iik7Ci0gICAgICAgICAgICBGaWxlIHJlc3VsdHNGYWlsZWRGaWxlID0gbmV3IEZpbGUoIi9zZGNhcmQvbGF5b3V0X3Rlc3RzX2ZhaWxlZC50eHQiKTsKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0c0lnbm9yZVJlc3VsdEZpbGUgPSBuZXcgRmlsZSgiL3NkY2FyZC9sYXlvdXRfdGVzdHNfaWdub3JlZC50eHQiKTsKLSAgICAgICAgICAgIEZpbGUgbm9FeHBlY3RlZFJlc3VsdEZpbGUgPSBuZXcgRmlsZSgiL3NkY2FyZC9sYXlvdXRfdGVzdHNfbm9udGV4dC50eHQiKTsKKyAgICAgICAgICAgIEZpbGUgZXh0ZXJuYWxEaXIgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIEZpbGUgcmVzdWx0c1Bhc3NlZEZpbGUgPSBuZXcgRmlsZShleHRlcm5hbERpciwgImxheW91dF90ZXN0c19wYXNzZWQudHh0Iik7CisgICAgICAgICAgICBGaWxlIHJlc3VsdHNGYWlsZWRGaWxlID0gbmV3IEZpbGUoZXh0ZXJuYWxEaXIsICJsYXlvdXRfdGVzdHNfZmFpbGVkLnR4dCIpOworICAgICAgICAgICAgRmlsZSByZXN1bHRzSWdub3JlUmVzdWx0RmlsZSA9IG5ldyBGaWxlKGV4dGVybmFsRGlyLCAibGF5b3V0X3Rlc3RzX2lnbm9yZWQudHh0Iik7CisgICAgICAgICAgICBGaWxlIG5vRXhwZWN0ZWRSZXN1bHRGaWxlID0gbmV3IEZpbGUoZXh0ZXJuYWxEaXIsICJsYXlvdXRfdGVzdHNfbm9udGV4dC50eHQiKTsKIAogICAgICAgICAgICAgbUJ1ZmZlcmVkT3V0cHV0UGFzc2VkU3RyZWFtID0KICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocmVzdWx0c1Bhc3NlZEZpbGUsIHJlc3VtZSkpOwpAQCAtMTI4LDExICsxMjksMTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIkxheW91dFRlc3RzIjsKICAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVF9JTl9NSUxMSVMgPSA1MDAwOwogCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfUk9PVCA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzLyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfUkVTVUxUX0RJUiA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX3Jlc3VsdHMvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfRVhQRUNURURfUkVTVUxUX0RJUiA9ICIvc2RjYXJkL2FuZHJvaWQvZXhwZWN0ZWRfcmVzdWx0cy8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RFU1RTX0xJU1RfRklMRSA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX2xpc3QudHh0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RBVFVTX0ZJTEUgPSAiL3NkY2FyZC9hbmRyb2lkL3J1bm5pbmdfdGVzdC50eHQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRElSID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19ST09UID0gRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2xheW91dF90ZXN0cy8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RFU1RTX1JFU1VMVF9ESVIgPSBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX3Jlc3VsdHMvIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfRVhQRUNURURfUkVTVUxUX0RJUiA9IEVYVEVSTkFMX0RJUiArICIvYW5kcm9pZC9leHBlY3RlZF9yZXN1bHRzLyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfTElTVF9GSUxFID0gRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2xheW91dF90ZXN0c19saXN0LnR4dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUQVRVU19GSUxFID0gRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL3J1bm5pbmdfdGVzdC50eHQiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RFU1RTX1JFU1VMVFNfUkVGRVJFTkNFX0ZJTEVTW10gPSB7CiAgICAgICAgICAgInJlc3VsdHMvbGF5b3V0X3Rlc3RzX3Bhc3NlZC50eHQiLAogICAgICAgICAgICJyZXN1bHRzL2xheW91dF90ZXN0c19mYWlsZWQudHh0IiwKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Mb2FkVGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xvYWRUZXN0c0F1dG9UZXN0LmphdmEKaW5kZXggMmVmMzQyZi4uOTM1MmYzOSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xvYWRUZXN0c0F1dG9UZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xvYWRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0zNSw3ICszNiw4IEBACiBwdWJsaWMgY2xhc3MgTG9hZFRlc3RzQXV0b1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxUZXN0U2hlbGxBY3Rpdml0eT4gewogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR1RBRyA9ICJMb2FkVGVzdCI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQURfVEVTVF9SRVNVTFQgPSAiL3NkY2FyZC9sb2FkX3Rlc3RfcmVzdWx0LnR4dCI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQURfVEVTVF9SRVNVTFQgPQorICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArICIvbG9hZF90ZXN0X3Jlc3VsdC50eHQiOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1RFU1RfUlVOTkVSX0ZJTEVTW10gPSB7CiAgICAgICAgICJydW5fcGFnZV9jeWNsZXIucHkiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQppbmRleCA4MjY3MWViLi45YzRiNTcyNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwpAQCAtMjgsNyArMjksOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FTlVfU1RBUlQgPSAweDAxOwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dUQUcgPSAiTWVudUFjdGl2aXR5IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19MSVNUX0ZJTEUgPSAiL3NkY2FyZC9hbmRyb2lkL2xheW91dF90ZXN0c19saXN0LnR4dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfTElTVF9GSUxFID0KKyAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX2xpc3QudHh0IjsKIAogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9SZWxpYWJpbGl0eVRlc3QuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9SZWxpYWJpbGl0eVRlc3QuamF2YQppbmRleCA5YmMwOTYyLi5kMTQ2ZmM3IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvUmVsaWFiaWxpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1JlbGlhYmlsaXR5VGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CkBAIC0zNywxMCArMzgsMTYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiUmVsaWFiaWxpdHlUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUUgPSAiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xJU1RfRklMRSA9ICIvc2RjYXJkL2FuZHJvaWQvcmVsaWFiaWxpdHlfdGVzdHNfbGlzdC50eHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUQVRVU19GSUxFID0gIi9zZGNhcmQvYW5kcm9pZC9yZWxpYWJpbGl0eV9ydW5uaW5nX3Rlc3QudHh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9USU1FT1VUX0ZJTEUgPSAiL3NkY2FyZC9hbmRyb2lkL3JlbGlhYmlsaXR5X3RpbWVvdXRfdGVzdC50eHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xPQURfVElNRV9GSUxFID0gIi9zZGNhcmQvYW5kcm9pZC9yZWxpYWJpbGl0eV9sb2FkX3RpbWUudHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRElSID0KKyAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MSVNUX0ZJTEUgPSBFWFRFUk5BTF9ESVIgKworICAgICAgICAiL2FuZHJvaWQvcmVsaWFiaWxpdHlfdGVzdHNfbGlzdC50eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUQVRVU19GSUxFID0gRVhURVJOQUxfRElSICsKKyAgICAgICAgIi9hbmRyb2lkL3JlbGlhYmlsaXR5X3J1bm5pbmdfdGVzdC50eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RJTUVPVVRfRklMRSA9IEVYVEVSTkFMX0RJUiArCisgICAgICAgICIvYW5kcm9pZC9yZWxpYWJpbGl0eV90aW1lb3V0X3Rlc3QudHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MT0FEX1RJTUVfRklMRSA9IEVYVEVSTkFMX0RJUiArCisgICAgICAgICIvYW5kcm9pZC9yZWxpYWJpbGl0eV9sb2FkX3RpbWUudHh0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ET05FID0gIiNET05FIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTElBQklMSVRZX1RFU1RfUlVOTkVSX0ZJTEVTW10gPSB7CiAgICAgICAgICJydW5fcmVsaWFiaWxpdHlfdGVzdHMucHkiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCmluZGV4IDgxZDViMDguLjc0NzU3MTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsRXJyb3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC04NjIsNyArODYzLDggQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1BR0UgPSAiU2F2ZUltYWdlIjsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJBV19SVU5TID0gNTsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERSQVdfVElNRV9MT0cgPSAiL3NkY2FyZC9hbmRyb2lkL3BhZ2VfZHJhd190aW1lLnR4dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXX1RJTUVfTE9HID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAiL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL2ZvcndhcmRlci9Gb3J3YXJkU2VydmljZS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL2ZvcndhcmRlci9Gb3J3YXJkU2VydmljZS5qYXZhCmluZGV4IDhiN2RlNmUuLjI1ZGQwNGZkIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvZm9yd2FyZGVyL0ZvcndhcmRTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL2ZvcndhcmRlci9Gb3J3YXJkU2VydmljZS5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIHB1YmxpYyBjbGFzcyBGb3J3YXJkU2VydmljZSB7CkBAIC0zMyw3ICszNCw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9URVNUX0hPU1QgPSAiYW5kcm9pZC1icm93c2VyLXRlc3QubXR2LmNvcnAuZ29vZ2xlLmNvbSI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9IT1NUX0NPTkYgPSAiL3NkY2FyZC9kcnRfZm9yd2FyZF9ob3N0LnR4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfSE9TVF9DT05GID0KKyAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyAiL2RydF9mb3J3YXJkX2hvc3QudHh0IjsKIAogICAgIHByaXZhdGUgRm9yd2FyZFNlcnZpY2UoKSB7CiAgICAgICAgIGludCBhZGRyID0gZ2V0Rm9yd2FyZEhvc3RBZGRyKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9Mb2NhdGlvblRyYWNrZXIvc3JjL2NvbS9hbmRyb2lkL2xvY2F0aW9udHJhY2tlci9UcmFja2VyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0xvY2F0aW9uVHJhY2tlci9zcmMvY29tL2FuZHJvaWQvbG9jYXRpb250cmFja2VyL1RyYWNrZXJBY3Rpdml0eS5qYXZhCmluZGV4IDk4ZDBhNTAuLjRjZmRmNmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0xvY2F0aW9uVHJhY2tlci9zcmMvY29tL2FuZHJvaWQvbG9jYXRpb250cmFja2VyL1RyYWNrZXJBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0xvY2F0aW9uVHJhY2tlci9zcmMvY29tL2FuZHJvaWQvbG9jYXRpb250cmFja2VyL1RyYWNrZXJBY3Rpdml0eS5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CkBAIC0yMTAsMTIgKzIxMSwxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZUZpbGVOYW1lKFN0cmluZyBleHQpIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZSgiL3NkY2FyZC9sb2NhdGlvbnRyYWNrZXIiKTsKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArICIvbG9jYXRpb250cmFja2VyIik7CiAgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBkaXIubWtkaXIoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gIi9zZGNhcmQvbG9jYXRpb250cmFja2VyL3RyYWNraW5nLSIgKwotICAgICAgICAgICAgRGF0ZVV0aWxzLmdldEN1cnJlbnRUaW1lc3RhbXAoKSArICIuIiArIGV4dDsKKyAgICAgICAgcmV0dXJuIGRpciArICIvdHJhY2tpbmctIiArIERhdGVVdGlscy5nZXRDdXJyZW50VGltZXN0YW1wKCkgKyAiLiIgKyBleHQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFNldHRpbmdzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQppbmRleCBjZmNlN2JkLi5iNzkzZDYyIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQpAQCAtMTYsMjQgKzE2LDE5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3RhdHVzYmFydGVzdDsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogCiBwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uVGVzdExpc3QgZXh0ZW5kcyBUZXN0QWN0aXZpdHkKQEAgLTcwLDcgKzY1LDggQEAKICAgICAgICAgICAgICAgICBwbS5nb1RvU2xlZXAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogCiAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbi5zb3VuZCA9IFVyaS5wYXJzZSgiZmlsZTovLy9zZGNhcmQvdmlydHVhbC12b2lkLm1wMyIpOworICAgICAgICAgICAgICAgIG4uc291bmQgPSBVcmkucGFyc2UoImZpbGU6Ly8iICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIi92aXJ0dWFsLXZvaWQubXAzIik7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibi5zb3VuZD0iICsgbi5zb3VuZCk7CiAKICAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9BYXB0QXNzZXRzLmNwcCBiL3Rvb2xzL2FhcHQvQWFwdEFzc2V0cy5jcHAKaW5kZXggZTRmNDQ3ZS4uMmIyZWM3YiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9BYXB0QXNzZXRzLmNwcAorKysgYi90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwCkBAIC02ODUsMTMgKzY4NSwxMSBAQAogICAgIGlmICgqYyAhPSAwKSByZXR1cm4gZmFsc2U7CiAgICAgaWYgKGMtdmFsID09IDAgfHwgYy12YWwgPiAzKSByZXR1cm4gZmFsc2U7CiAKLSAgICBpbnQgZCA9IGF0b2kodmFsKTsKLSAgICBpZiAoZCAhPSAwKSB7Ci0gICAgICAgIGlmIChvdXQpIG91dC0+bW5jID0gZDsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKG91dCkgeworICAgICAgICBvdXQtPm1uYyA9IGF0b2kodmFsKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS90b29scy9hYXB0L0J1bmRsZS5oIGIvdG9vbHMvYWFwdC9CdW5kbGUuaAppbmRleCBjNWFhNTczLi4xNTU3MGU0IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0J1bmRsZS5oCisrKyBiL3Rvb2xzL2FhcHQvQnVuZGxlLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgICBtUkNsYXNzRGlyKE5VTEwpLCBtUmVzb3VyY2VJbnRlcm1lZGlhdGVzRGlyKE5VTEwpLCBtTWFuaWZlc3RNaW5TZGtWZXJzaW9uKE5VTEwpLAogICAgICAgICAgIG1NaW5TZGtWZXJzaW9uKE5VTEwpLCBtVGFyZ2V0U2RrVmVyc2lvbihOVUxMKSwgbU1heFNka1ZlcnNpb24oTlVMTCksCiAgICAgICAgICAgbVZlcnNpb25Db2RlKE5VTEwpLCBtVmVyc2lvbk5hbWUoTlVMTCksIG1DdXN0b21QYWNrYWdlKE5VTEwpLAotICAgICAgICAgIG1NYXhSZXNWZXJzaW9uKE5VTEwpLCBtRGVidWdNb2RlKGZhbHNlKSwgbVByb2R1Y3QoTlVMTCksCisgICAgICAgICAgbU1heFJlc1ZlcnNpb24oTlVMTCksIG1EZWJ1Z01vZGUoZmFsc2UpLCBtTm9uQ29uc3RhbnRJZChmYWxzZSksIG1Qcm9kdWN0KE5VTEwpLAogICAgICAgICAgIG1BcmdjKDApLCBtQXJndihOVUxMKQogICAgICAgICB7fQogICAgIH5CdW5kbGUodm9pZCkge30KQEAgLTEzOSw2ICsxMzksOCBAQAogICAgIHZvaWQgc2V0TWF4UmVzVmVyc2lvbihjb25zdCBjaGFyICogdmFsKSB7IG1NYXhSZXNWZXJzaW9uID0gdmFsOyB9CiAgICAgYm9vbCBnZXREZWJ1Z01vZGUoKSB7IHJldHVybiBtRGVidWdNb2RlOyB9CiAgICAgdm9pZCBzZXREZWJ1Z01vZGUoYm9vbCB2YWwpIHsgbURlYnVnTW9kZSA9IHZhbDsgfQorICAgIGJvb2wgZ2V0Tm9uQ29uc3RhbnRJZCgpIHsgcmV0dXJuIG1Ob25Db25zdGFudElkOyB9CisgICAgdm9pZCBzZXROb25Db25zdGFudElkKGJvb2wgdmFsKSB7IG1Ob25Db25zdGFudElkID0gdmFsOyB9CiAgICAgY29uc3QgY2hhciogZ2V0UHJvZHVjdCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9kdWN0OyB9CiAgICAgdm9pZCBzZXRQcm9kdWN0KGNvbnN0IGNoYXIgKiB2YWwpIHsgbVByb2R1Y3QgPSB2YWw7IH0KIApAQCAtMjM5LDYgKzI0MSw3IEBACiAgICAgY29uc3QgY2hhciogbUN1c3RvbVBhY2thZ2U7CiAgICAgY29uc3QgY2hhciogbU1heFJlc1ZlcnNpb247CiAgICAgYm9vbCAgICAgICAgbURlYnVnTW9kZTsKKyAgICBib29sICAgICAgICBtTm9uQ29uc3RhbnRJZDsKICAgICBjb25zdCBjaGFyKiBtUHJvZHVjdDsKIAogICAgIC8qIGZpbGUgc3BlY2lmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9NYWluLmNwcCBiL3Rvb2xzL2FhcHQvTWFpbi5jcHAKaW5kZXggNzM5YjAxZi4uMjY2YTAyZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9NYWluLmNwcAorKysgYi90b29scy9hYXB0L01haW4uY3BwCkBAIC0xNjAsNyArMTYwLDExIEBACiAgICAgICAgICIgICAgICAgcHJvZHVjdCB2YXJpYW50c1xuIgogICAgICAgICAiICAgLS11dGYxNlxuIgogICAgICAgICAiICAgICAgIGNoYW5nZXMgZGVmYXVsdCBlbmNvZGluZyBmb3IgcmVzb3VyY2VzIHRvIFVURi0xNi4gIE9ubHkgdXNlZnVsIHdoZW4gQVBJXG4iCi0gICAgICAgICIgICAgICAgbGV2ZWwgaXMgc2V0IHRvIDcgb3IgaGlnaGVyIHdoZXJlIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIFVURi04LlxuIik7CisgICAgICAgICIgICAgICAgbGV2ZWwgaXMgc2V0IHRvIDcgb3IgaGlnaGVyIHdoZXJlIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIFVURi04LlxuIgorICAgICAgICAiICAgLS1ub24tY29uc3RhbnQtaWRcbiIKKyAgICAgICAgIiAgICAgICBNYWtlIHRoZSByZXNvdXJjZXMgSUQgbm9uIGNvbnN0YW50LiBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgYW4gUiBqYXZhIGNsYXNzXG4iCisgICAgICAgICIgICAgICAgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSBmaW5hbCB2YWx1ZSBidXQgaXMgdXNlZCB0byBtYWtlIHJldXNhYmxlIGNvbXBpbGVkXG4iCisgICAgICAgICIgICAgICAgbGlicmFyaWVzIHRoYXQgbmVlZCB0byBhY2Nlc3MgcmVzb3VyY2VzLlxuIik7CiB9CiAKIC8qCkBAIC00OTcsNiArNTAxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBidW5kbGUuc2V0UHJvZHVjdChhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChjcCwgIi1ub24tY29uc3RhbnQtaWQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5zZXROb25Db25zdGFudElkKHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IFVua25vd24gb3B0aW9uICctJXMnXG4iLCBjcCk7CiAgICAgICAgICAgICAgICAgICAgIHdhbnRVc2FnZSA9IHRydWU7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IGM4YmE5MDQuLjBhNGYyNGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCkBAIC0xNjU1LDcgKzE2NTUsOCBAQAogCiBzdGF0aWMgc3RhdHVzX3Qgd3JpdGVTeW1ib2xDbGFzcygKICAgICBGSUxFKiBmcCwgY29uc3Qgc3A8QWFwdEFzc2V0cz4mIGFzc2V0cywgYm9vbCBpbmNsdWRlUHJpdmF0ZSwKLSAgICBjb25zdCBzcDxBYXB0U3ltYm9scz4mIHN5bWJvbHMsIGNvbnN0IFN0cmluZzgmIGNsYXNzTmFtZSwgaW50IGluZGVudCkKKyAgICBjb25zdCBzcDxBYXB0U3ltYm9scz4mIHN5bWJvbHMsIGNvbnN0IFN0cmluZzgmIGNsYXNzTmFtZSwgaW50IGluZGVudCwKKyAgICBib29sIG5vbkNvbnN0YW50SWQpCiB7CiAgICAgZnByaW50ZihmcCwgIiVzcHVibGljICVzZmluYWwgY2xhc3MgJXMge1xuIiwKICAgICAgICAgICAgIGdldEluZGVudFNwYWNlKGluZGVudCksCkBAIC0xNjY1LDYgKzE2NjYsMTAgQEAKICAgICBzaXplX3QgaTsKICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKIAorICAgIGNvbnN0IGNoYXIgKiBpZF9mb3JtYXQgPSBub25Db25zdGFudElkID8KKyAgICAgICAgICAgICIlc3B1YmxpYyBzdGF0aWMgaW50ICVzPTB4JTA4eDtcbiIgOgorICAgICAgICAgICAgIiVzcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJXM9MHglMDh4O1xuIjsKKwogICAgIHNpemVfdCBOID0gc3ltYm9scy0+Z2V0U3ltYm9scygpLnNpemUoKTsKICAgICBmb3IgKGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgY29uc3QgQWFwdFN5bWJvbEVudHJ5JiBzeW0gPSBzeW1ib2xzLT5nZXRTeW1ib2xzKCkudmFsdWVBdChpKTsKQEAgLTE3MTcsNyArMTcyMiw3IEBACiAgICAgICAgIGlmIChkZXByZWNhdGVkKSB7CiAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXNARGVwcmVjYXRlZFxuIiwgZ2V0SW5kZW50U3BhY2UoaW5kZW50KSk7CiAgICAgICAgIH0KLSAgICAgICAgZnByaW50ZihmcCwgIiVzcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJXM9MHglMDh4O1xuIiwKKyAgICAgICAgZnByaW50ZihmcCwgaWRfZm9ybWF0LAogICAgICAgICAgICAgICAgIGdldEluZGVudFNwYWNlKGluZGVudCksCiAgICAgICAgICAgICAgICAgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSwgKGludClzeW0uaW50MzJWYWwpOwogICAgIH0KQEAgLTE3NjgsNyArMTc3Myw3IEBACiAgICAgICAgIGlmIChuY2xhc3NOYW1lID09ICJzdHlsZWFibGUiKSB7CiAgICAgICAgICAgICBzdHlsZWFibGVTeW1ib2xzID0gbnN5bWJvbHM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSB3cml0ZVN5bWJvbENsYXNzKGZwLCBhc3NldHMsIGluY2x1ZGVQcml2YXRlLCBuc3ltYm9scywgbmNsYXNzTmFtZSwgaW5kZW50KTsKKyAgICAgICAgICAgIGVyciA9IHdyaXRlU3ltYm9sQ2xhc3MoZnAsIGFzc2V0cywgaW5jbHVkZVByaXZhdGUsIG5zeW1ib2xzLCBuY2xhc3NOYW1lLCBpbmRlbnQsIG5vbkNvbnN0YW50SWQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xODM5LDcgKzE4NDQsNyBAQAogICAgICAgICAiXG4iCiAgICAgICAgICJwYWNrYWdlICVzO1xuXG4iLCBwYWNrYWdlLnN0cmluZygpKTsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSB3cml0ZVN5bWJvbENsYXNzKGZwLCBhc3NldHMsIGluY2x1ZGVQcml2YXRlLCBzeW1ib2xzLCBjbGFzc05hbWUsIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSB3cml0ZVN5bWJvbENsYXNzKGZwLCBhc3NldHMsIGluY2x1ZGVQcml2YXRlLCBzeW1ib2xzLCBjbGFzc05hbWUsIDAsIGJ1bmRsZS0+Z2V0Tm9uQ29uc3RhbnRJZCgpKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggMjk2NDRhNi4uODE4YzNjNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0xMzIyLDYgKzEzMjIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wMTYoYmxvY2suZ2V0RWxlbWVudE5hbWUoJmxlbiksIHN0cmluZ19hcnJheTE2LnN0cmluZygpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVzZSBzdHJpbmdzIG5lZWQgdmFsaWQgZm9ybWF0cy4KKyAgICAgICAgICAgICAgICAvLyAoc2ltcGxpZmllZCBmb3JtIG9mIHdoYXQgc3RyaW5nMTYgZG9lcyBhYm92ZSkKKyAgICAgICAgICAgICAgICBzaXplX3QgbiA9IGJsb2NrLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGF0dHIgPSBibG9jay5nZXRBdHRyaWJ1dGVOYW1lKGksICZsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wMTYoYXR0ciwgdHJhbnNsYXRhYmxlMTYuc3RyaW5nKCkpID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAxNihhdHRyLCBmb3JtYXR0ZWQxNi5zdHJpbmcoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIHZhbHVlID0gYmxvY2suZ2V0QXR0cmlidXRlU3RyaW5nVmFsdWUoaSwgJmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wMTYodmFsdWUsIGZhbHNlMTYuc3RyaW5nKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJc0Zvcm1hdHRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY3VyVGFnID0gJnN0cmluZ19hcnJheTE2OwogICAgICAgICAgICAgICAgIGN1clR5cGUgPSBhcnJheTE2OwogICAgICAgICAgICAgICAgIGN1ckZvcm1hdCA9IFJlc1RhYmxlX21hcDo6VFlQRV9SRUZFUkVOQ0V8UmVzVGFibGVfbWFwOjpUWVBFX1NUUklORzsKQEAgLTE3MjQsMTMgKzE3NDAsNiBAQAogICAgIAogICAgIC8vIElmIGEgcGFyZW50IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBzZXQgaXQuCiAgICAgaWYgKGJhZ1BhcmVudC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIFN0cmluZzE2IGN1clBhciA9IGUtPmdldFBhcmVudCgpOwotICAgICAgICBpZiAoY3VyUGFyLnNpemUoKSA+IDAgJiYgY3VyUGFyICE9IGJhZ1BhcmVudCkgewotICAgICAgICAgICAgc291cmNlUG9zLmVycm9yKCJDb25mbGljdGluZyBwYXJlbnRzIHNwZWNpZmllZCwgd2FzICclcycsIG5vdyAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoZS0+Z2V0UGFyZW50KCkpLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYmFnUGFyZW50KS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgICAgICBlLT5zZXRQYXJlbnQoYmFnUGFyZW50KTsKICAgICB9CiAKQEAgLTE3NzgsMTMgKzE3ODcsNiBAQAogCiAgICAgLy8gSWYgYSBwYXJlbnQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIHNldCBpdC4KICAgICBpZiAoYmFnUGFyZW50LnNpemUoKSA+IDApIHsKLSAgICAgICAgU3RyaW5nMTYgY3VyUGFyID0gZS0+Z2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJQYXIuc2l6ZSgpID4gMCAmJiBjdXJQYXIgIT0gYmFnUGFyZW50KSB7Ci0gICAgICAgICAgICBzb3VyY2VQb3MuZXJyb3IoIkNvbmZsaWN0aW5nIHBhcmVudHMgc3BlY2lmaWVkLCB3YXMgJyVzJywgbm93ICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoZS0+Z2V0UGFyZW50KCkpLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGJhZ1BhcmVudCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KICAgICAgICAgZS0+c2V0UGFyZW50KGJhZ1BhcmVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1hNTE5vZGUuY3BwIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAppbmRleCA4NTUxYjBmLi5jMGQ3NDI3IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1hNTE5vZGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKQEAgLTQ1MSwxMyArNDUxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiPT8weCV4IiwgKGludCl2YWx1ZS5kYXRhKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmRhdGFUeXBlID09IFJlc192YWx1ZTo6VFlQRV9TVFJJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI9XCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYmxvY2stPmdldEF0dHJpYnV0ZVN0cmluZ1ZhbHVlKGksICZsZW4pKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzVGFibGU6Om5vcm1hbGl6ZUZvck91dHB1dChTdHJpbmc4KGJsb2NrLT5nZXRBdHRyaWJ1dGVTdHJpbmdWYWx1ZShpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKS5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiPSh0eXBlIDB4JXgpMHgleCIsIChpbnQpdmFsdWUuZGF0YVR5cGUsIChpbnQpdmFsdWUuZGF0YSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIxNl90KiB2YWwgPSBibG9jay0+Z2V0QXR0cmlidXRlU3RyaW5nVmFsdWUoaSwgJmxlbik7CiAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiIChSYXc6IFwiJXNcIikiLCBTdHJpbmc4KHZhbCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAoUmF3OiBcIiVzXCIpIiwgUmVzVGFibGU6Om5vcm1hbGl6ZUZvck91dHB1dChTdHJpbmc4KHZhbCkuc3RyaW5nKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDI3ZTZhNzIuLmJmMmQwMzMgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTMyMiw2ICszMjIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNEbnNQcm9wTmFtZXM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVsZWFzZVdha2VMb2NrQ2FsbGJhY2s7CiAKICAgICAvKioKICAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgbGFzdCB0b2xkIHRoZSBiYXR0ZXJ5IHN0YXRzIHdlIGhhZCBzdGFydGVkLgpAQCAtMjQ0OSwxMSArMjQ1MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKICAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBnZXRQb3dlck1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzdXBwbGljYW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzdXBwbGljYW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UG93ZXJNb2RlQ29tbWFuZC4KICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FVVE87CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsK