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+CisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEJsdWV0b290aEFzc2lnbmVkTnVtYmVycyB7CisKKyAgICAvLy8vIEJsdWV0b290aCBTSUcgQ29tcGFueSBJRCB2YWx1ZXMKKworICAgIC8qCisgICAgICogRXJpY3Nzb24gVGVjaG5vbG9neSBMaWNlbnNpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJJQ1NTT05fVEVDSE5PTE9HWSA9IDB4MDAwMDsKKworICAgIC8qCisgICAgICogTm9raWEgTW9iaWxlIFBob25lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0tJQV9NT0JJTEVfUEhPTkVTID0gMHgwMDAxOworCisgICAgLyoKKyAgICAgKiBJbnRlbCBDb3JwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVMID0gMHgwMDAyOworCisgICAgLyoKKyAgICAgKiBJQk0gQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQk0gPSAweDAwMDM7CisKKyAgICAvKgorICAgICAqIFRvc2hpYmEgQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1NISUJBID0gMHgwMDA0OworCisgICAgLyoKKyAgICAgKiAzQ29tLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVFQ09NID0gMHgwMDA1OworCisgICAgLyoKKyAgICAgKiBNaWNyb3NvZnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlDUk9TT0ZUID0gMHgwMDA2OworCisgICAgLyoKKyAgICAgKiBMdWNlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFVDRU5UID0gMHgwMDA3OworCisgICAgLyoKKyAgICAgKiBNb3Rvcm9sYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1RPUk9MQSA9IDB4MDAwODsKKworICAgIC8qCisgICAgICogSW5maW5lb24gVGVjaG5vbG9naWVzIEFHLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklORU9OX1RFQ0hOT0xPR0lFUyA9IDB4MDAwOTsKKworICAgIC8qCisgICAgICogQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FNQlJJREdFX1NJTElDT05fUkFESU8gPSAweDAwMEE7CisKKyAgICAvKgorICAgICAqIFNpbGljb24gV2F2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUxJQ09OX1dBVkUgPSAweDAwMEI7CisKKyAgICAvKgorICAgICAqIERpZ2lhbnN3ZXIgQS9TLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lBTlNXRVIgPSAweDAwMEM7CisKKyAgICAvKgorICAgICAqIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhBU19JTlNUUlVNRU5UUyA9IDB4MDAwRDsKKworICAgIC8qCisgICAgICogUGFydGh1cyBUZWNobm9sb2dpZXMgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRIVVNfVEVDSE5PTE9HSUVTID0gMHgwMDBFOworCisgICAgLyoKKyAgICAgKiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENPTSA9IDB4MDAwRjsKKworICAgIC8qCisgICAgICogTWl0ZWwgU2VtaWNvbmR1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVRFTF9TRU1JQ09ORFVDVE9SID0gMHgwMDEwOworCisgICAgLyoKKyAgICAgKiBXaWRjb21tLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lEQ09NTSA9IDB4MDAxMTsKKworICAgIC8qCisgICAgICogWmVldm8sIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRUVWTyA9IDB4MDAxMjsKKworICAgIC8qCisgICAgICogQXRtZWwgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRNRUwgPSAweDAwMTM7CisKKyAgICAvKgorICAgICAqIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlUU1VCSVNISV9FTEVDVFJJQyA9IDB4MDAxNDsKKworICAgIC8qCisgICAgICogUlRYIFRlbGVjb20gQS9TLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJUWF9URUxFQ09NID0gMHgwMDE1OworCisgICAgLyoKKyAgICAgKiBLQyBUZWNobm9sb2d5IEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLQ19URUNITk9MT0dZID0gMHgwMDE2OworCisgICAgLyoKKyAgICAgKiBOZXdsb2dpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdMT0dJQyA9IDB4MDAxNzsKKworICAgIC8qCisgICAgICogVHJhbnNpbGljYSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUxJQ0EgPSAweDAwMTg7CisKKyAgICAvKgorICAgICAqIFJvaGRlICYgU2Nod2FyeiBHbWJIICYgQ28uIEtHLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPSERFX0FORF9TQ0hXQVJaID0gMHgwMDE5OworCisgICAgLyoKKyAgICAgKiBUVFBDb20gTGltaXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVFBDT00gPSAweDAwMUE7CisKKyAgICAvKgorICAgICAqIFNpZ25pYSBUZWNobm9sb2dpZXMsIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOSUFfVEVDSE5PTE9HSUVTID0gMHgwMDFCOworCisgICAgLyoKKyAgICAgKiBDb25leGFudCBTeXN0ZW1zIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05FWEFOVF9TWVNURU1TID0gMHgwMDFDOworCisgICAgLyoKKyAgICAgKiBRdWFsY29tbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMQ09NTSA9IDB4MDAxRDsKKworICAgIC8qCisgICAgICogSW52ZW50ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WRU5URUwgPSAweDAwMUU7CisKKyAgICAvKgorICAgICAqIEFWTSBCZXJsaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZNX0JFUkxJTiA9IDB4MDAxRjsKKworICAgIC8qCisgICAgICogQmFuZFNwZWVkLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFORFNQRUVEID0gMHgwMDIwOworCisgICAgLyoKKyAgICAgKiBNYW5zZWxsYSBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOU0VMTEEgPSAweDAwMjE7CisKKyAgICAvKgorICAgICAqIE5FQyBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORUMgPSAweDAwMjI7CisKKyAgICAvKgorICAgICAqIFdhdmVQbHVzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FWRVBMVVNfVEVDSE5PTE9HWSA9IDB4MDAyMzsKKworICAgIC8qCisgICAgICogQWxjYXRlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTENBVEVMID0gMHgwMDI0OworCisgICAgLyoKKyAgICAgKiBQaGlsaXBzIFNlbWljb25kdWN0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBISUxJUFNfU0VNSUNPTkRVQ1RPUlMgPSAweDAwMjU7CisKKyAgICAvKgorICAgICAqIEMgVGVjaG5vbG9naWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENfVEVDSE5PTE9HSUVTID0gMHgwMDI2OworCisgICAgLyoKKyAgICAgKiBPcGVuIEludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX0lOVEVSRkFDRSA9IDB4MDAyNzsKKworICAgIC8qCisgICAgICogUiBGIE1pY3JvIERldmljZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkZfTUlDUk9fREVWSUNFUyA9IDB4MDAyODsKKworICAgIC8qCisgICAgICogSGl0YWNoaSBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElUQUNISSA9IDB4MDAyOTsKKworICAgIC8qCisgICAgICogU3ltYm9sIFRlY2hub2xvZ2llcywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTUJPTF9URUNITk9MT0dJRVMgPSAweDAwMkE7CisKKyAgICAvKgorICAgICAqIFRlbm92aXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVOT1ZJUyA9IDB4MDAyQjsKKworICAgIC8qCisgICAgICogTWFjcm9uaXggSW50ZXJuYXRpb25hbCBDby4gTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BQ1JPTklYID0gMHgwMDJDOworCisgICAgLyoKKyAgICAgKiBHQ1QgU2VtaWNvbmR1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHQ1RfU0VNSUNPTkRVQ1RPUiA9IDB4MDAyRDsKKworICAgIC8qCisgICAgICogTm9yd29vZCBTeXN0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUldPT0RfU1lTVEVNUyA9IDB4MDAyRTsKKworICAgIC8qCisgICAgICogTWV3VGVsIFRlY2hub2xvZ3kgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FV1RFTF9URUNITk9MT0dZID0gMHgwMDJGOworCisgICAgLyoKKyAgICAgKiBTVCBNaWNyb2VsZWN0cm9uaWNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01JQ1JPRUxFQ1RST05JQ1MgPSAweDAwMzA7CisKKyAgICAvKgorICAgICAqIFN5bm9wc3lzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTk9QU1lTID0gMHgwMDMxOworCisgICAgLyoKKyAgICAgKiBSZWQtTSAoQ29tbXVuaWNhdGlvbnMpIEx0ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURfTSA9IDB4MDAzMjsKKworICAgIC8qCisgICAgICogQ29tbWlsIEx0ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NSUwgPSAweDAwMzM7CisKKyAgICAvKgorICAgICAqIENvbXB1dGVyIEFjY2VzcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uIChDQVRDKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRDID0gMHgwMDM0OworCisgICAgLyoKKyAgICAgKiBFY2xpcHNlIChIUSBFc3BhbmEpIFMuTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQ0xJUFNFID0gMHgwMDM1OworCisgICAgLyoKKyAgICAgKiBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU5FU0FTX1RFQ0hOT0xPR1kgPSAweDAwMzY7CisKKyAgICAvKgorICAgICAqIE1vYmlsaWFuIENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PQklMSUFOX0NPUlBPUkFUSU9OID0gMHgwMDM3OworCisgICAgLyoKKyAgICAgKiBUZXJheC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVJBWCA9IDB4MDAzODsKKworICAgIC8qCisgICAgICogSW50ZWdyYXRlZCBTeXN0ZW0gU29sdXRpb24gQ29ycC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR1JBVEVEX1NZU1RFTV9TT0xVVElPTiA9IDB4MDAzOTsKKworICAgIC8qCisgICAgICogTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVFNVU0hJVEFfRUxFQ1RSSUMgPSAweDAwM0E7CisKKyAgICAvKgorICAgICAqIEdlbm51bSBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5OVU0gPSAweDAwM0I7CisKKyAgICAvKgorICAgICAqIFJlc2VhcmNoIEluIE1vdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFQVJDSF9JTl9NT1RJT04gPSAweDAwM0M7CisKKyAgICAvKgorICAgICAqIElQZXh0cmVtZSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQRVhUUkVNRSA9IDB4MDAzRDsKKworICAgIC8qCisgICAgICogU3lzdGVtcyBhbmQgQ2hpcHMsIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU1TX0FORF9DSElQUyA9IDB4MDAzRTsKKworICAgIC8qCisgICAgICogQmx1ZXRvb3RoIFNJRywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMVUVUT09USF9TSUcgPSAweDAwM0Y7CisKKyAgICAvKgorICAgICAqIFNlaWtvIEVwc29uIENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFSUtPX0VQU09OID0gMHgwMDQwOworCisgICAgLyoKKyAgICAgKiBJbnRlZ3JhdGVkIFNpbGljb24gU29sdXRpb24gVGFpd2FuLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdSQVRFRF9TSUxJQ09OX1NPTFVUSU9OID0gMHgwMDQxOworCisgICAgLyoKKyAgICAgKiBDT05XSVNFIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTldJU0VfVEVDSE5PTE9HWSA9IDB4MDA0MjsKKworICAgIC8qCisgICAgICogUEFSUk9UIFNBLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlJPVCA9IDB4MDA0MzsKKworICAgIC8qCisgICAgICogU29ja2V0IE1vYmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfTU9CSUxFID0gMHgwMDQ0OworCisgICAgLyoKKyAgICAgKiBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRIRVJPU19DT01NVU5JQ0FUSU9OUyA9IDB4MDA0NTsKKworICAgIC8qCisgICAgICogTWVkaWFUZWssIEluYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQVRFSyA9IDB4MDA0NjsKKworICAgIC8qCisgICAgICogQmx1ZWdpZ2EuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRUdJR0EgPSAweDAwNDc7CisKKyAgICAvKgorICAgICAqIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFSVkVMTCA9IDB4MDA0ODsKKworICAgIC8qCisgICAgICogM0RTUCBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJFRV9EU1AgPSAweDAwNDk7CisKKyAgICAvKgorICAgICAqIEFjY2VsIFNlbWljb25kdWN0b3IgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VMX1NFTUlDT05EVUNUT1IgPSAweDAwNEE7CisKKyAgICAvKgorICAgICAqIENvbnRpbmVudGFsIEF1dG9tb3RpdmUgU3lzdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5FTlRBTF9BVVRPTU9USVZFID0gMHgwMDRCOworCisgICAgLyoKKyAgICAgKiBBcHBsZSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExFID0gMHgwMDRDOworCisgICAgLyoKKyAgICAgKiBTdGFjY2F0byBDb21tdW5pY2F0aW9ucywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUNDQVRPX0NPTU1VTklDQVRJT05TID0gMHgwMDREOworCisgICAgLyoKKyAgICAgKiBBdmFnbyBUZWNobm9sb2dpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBR08gPSAweDAwNEU7CisKKyAgICAvKgorICAgICAqIEFQVCBMaWNlbnNpbmcgTHRkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQVF9MSUNFTlNJTkcgPSAweDAwNEY7CisKKyAgICAvKgorICAgICAqIFNpUkYgVGVjaG5vbG9neSwgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJUkZfVEVDSE5PTE9HWSA9IDB4MDA1MDsKKworICAgIC8qCisgICAgICogVHplcm8gVGVjaG5vbG9naWVzLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFpFUk9fVEVDSE5PTE9HSUVTID0gMHgwMDUxOworCisgICAgLyoKKyAgICAgKiBKJk0gQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSl9BTkRfTSA9IDB4MDA1MjsKKworICAgIC8qCisgICAgICogRnJlZTJtb3ZlIEFCLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSRUUyTU9WRSA9IDB4MDA1MzsKKworICAgIC8qCisgICAgICogM0RpSm95IENvcnBvcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVFX0RJSk9ZID0gMHgwMDU0OworCisgICAgLyoKKyAgICAgKiBQbGFudHJvbmljcywgSW5jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQU5UUk9OSUNTID0gMHgwMDU1OworCisgICAgLyoKKyAgICAgKiBTb255IEVyaWNzc29uIE1vYmlsZSBDb21tdW5pY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT05ZX0VSSUNTU09OID0gMHgwMDU2OworCisgICAgLyoKKyAgICAgKiBIYXJtYW4gSW50ZXJuYXRpb25hbCBJbmR1c3RyaWVzLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFSTUFOX0lOVEVSTkFUSU9OQUwgPSAweDAwNTc7CisKKyAgICAvKgorICAgICAqIFZpemlvLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklaSU8gPSAweDAwNTg7CisKKyAgICAvKgorICAgICAqIE5vcmRpYyBTZW1pY29uZHVjdG9yIEFTQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JESUNfU0VNSUNPTkRVQ1RPUiA9IDB4MDA1OTsKKworICAgIC8qCisgICAgICogRU0gTWljcm9lbGVjdHJvbmljLU1hcmluIFNBLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNX01JQ1JPRUxFQ1RST05JQ19NQVJJTiA9IDB4MDA1QTsKKworICAgIC8qCisgICAgICogUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFMSU5LX1RFQ0hOT0xPR1kgPSAweDAwNUI7CisKKyAgICAvKgorICAgICAqIEJlbGtpbiBJbnRlcm5hdGlvbmFsLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVMS0lOX0lOVEVSTkFUSU9OQUwgPSAweDAwNUM7CisKKyAgICAvKgorICAgICAqIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFMVEVLX1NFTUlDT05EVUNUT1IgPSAweDAwNUQ7CisKKyAgICAvKgorICAgICAqIFN0b25lc3RyZWV0IE9uZSwgTExDLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT05FU1RSRUVUX09ORSA9IDB4MDA1RTsKKworICAgIC8qCisgICAgICogV2ljZW50cmljLCBJbmMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lDRU5UUklDID0gMHgwMDVGOworCisgICAgLyoKKyAgICAgKiBSaXZpZXJhV2F2ZXMgUy5BLlMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklWSUVSQVdBVkVTID0gMHgwMDYwOworCisgICAgLyoKKyAgICAgKiBZb3UgY2FuJ3QgaW5zdGFudGlhdGUgb25lIG9mIHRoZXNlLgorICAgICAqLworICAgIHByaXZhdGUgQmx1ZXRvb3RoQXNzaWduZWROdW1iZXJzKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IGY2ZDcwNzMuLjlkN2U2NDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKQEAgLTU5Niw3ICs1OTYsNiBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBsb2coIkluY29taW5nQTJkcCBTdGF0ZS0+UHJvY2Vzc2luZyBNZXNzYWdlOiAiICsgbWVzc2FnZS53aGF0KTsKLSAgICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOwogICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfT1VUR09JTkc6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCmluZGV4IDE5N2IwMjIuLmRhMWFhNDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQpAQCAtODUsNiArODUsNDMgQEAKICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLkRJU0NPTk5FQ1RfSU5JVElBVE9SIjsKIAogICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IEluZGljYXRlcyBhIGhlYWRzZXQgaGFzIHBvc3RlZCBhIHZlbmRvci1zcGVjaWZpYyBldmVudC4KKyAgICAgKiA8cD5BbHdheXMgY29udGFpbnMgdGhlIGV4dHJhIGZpZWxkcyB7QGxpbmsgI0VYVFJBX0RFVklDRX0sCisgICAgICoge0BsaW5rICNFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUR9LCBhbmQKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1N9LgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UID0KKyAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmFjdGlvbi5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVCI7CisKKyAgICAvKioKKyAgICAgKiBBIFN0cmluZyBleHRyYSBmaWVsZCBpbiB7QGxpbmsgI0FDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVH0KKyAgICAgKiBpbnRlbnRzIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUQiOworCisgICAgLyoqCisgICAgICogQW4gaW50IGV4dHJhIGZpZWxkIGluIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfQorICAgICAqIGludGVudHMgdGhhdCBjb250YWlucyB0aGUgQ29tcGFueSBJRCBvZiB0aGUgdmVuZG9yIGRlZmluaW5nIHRoZSB2ZW5kb3Itc3BlY2lmaWMKKyAgICAgKiBjb21tYW5kLgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy9UZWNobmljYWwvQXNzaWduZWROdW1iZXJzL2lkZW50aWZpZXJzLmh0bSI+CisgICAgICogQmx1ZXRvb3RoIFNJRyBBc3NpZ25lZCBOdW1iZXJzIC0gQ29tcGFueSBJZGVudGlmaWVyczwvYT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DT01QQU5ZX0lEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQiOworCisgICAgLyoqCisgICAgICogQSBQYXJjZWxhYmxlIFN0cmluZyBhcnJheSBleHRyYSBmaWVsZCBpbgorICAgICAqIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfSBpbnRlbnRzIHRoYXQgY29udGFpbnMKKyAgICAgKiB0aGUgYXJndW1lbnRzIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9BUkdTID0KKyAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1MiOworCisKKyAgICAvKioKICAgICAgKiBUT0RPKEFQSSByZWxlYXNlKTogQ29uc2lkZXIgaW5jb3Jwb3JhdGluZyBhcyBuZXcgc3RhdGUgaW4KICAgICAgKiBIRUFEU0VUX1NUQVRFX0NIQU5HRUQKICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9IZWFkc2V0QmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0hlYWRzZXRCYXNlLmphdmEKaW5kZXggMjI0OTVhNy4uOWVmMmViNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0hlYWRzZXRCYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0hlYWRzZXRCYXNlLmphdmEKQEAgLTc0LDggKzc0LDggQEAKIAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZURhdGFOYXRpdmUoKTsKIAotICAgIHB1YmxpYyBIZWFkc2V0QmFzZShQb3dlck1hbmFnZXIgcG0sIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgIGludCByZmNvbW1DaGFubmVsKSB7CisgICAgcHVibGljIEhlYWRzZXRCYXNlKFBvd2VyTWFuYWdlciBwbSwgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcmZjb21tQ2hhbm5lbCkgewogICAgICAgICBtRGlyZWN0aW9uID0gRElSRUNUSU9OX09VVEdPSU5HOwogICAgICAgICBtQ29ubmVjdFRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CkBAIC04OSw5ICs4OSwxMCBAQAogICAgICAgICBpbml0aWFsaXplTmF0aXZlRGF0YU5hdGl2ZSgtMSk7CiAgICAgfQogCi0gICAgLyogQ3JlYXRlIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyByZmNvbW0gY29ubmVjdGlvbiAqLwotICAgIHB1YmxpYyBIZWFkc2V0QmFzZShQb3dlck1hbmFnZXIgcG0sIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgIGludCBzb2NrZXRGZCwgaW50IHJmY29tbUNoYW5uZWwsIEhhbmRsZXIgaGFuZGxlcikgeworICAgIC8qIENyZWF0ZSBmcm9tIGFuIGV4aXN0aW5nIHJmY29tbSBjb25uZWN0aW9uICovCisgICAgcHVibGljIEhlYWRzZXRCYXNlKFBvd2VyTWFuYWdlciBwbSwgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2V0RmQsIGludCByZmNvbW1DaGFubmVsLCBIYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgbURpcmVjdGlvbiA9IERJUkVDVElPTl9JTkNPTUlORzsKICAgICAgICAgbUNvbm5lY3RUaW1lc3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOwpAQCAtMTQyLDggKzE0Myw5IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0UGFyc2VyKCkgewogICAgICAgICBtQXRQYXJzZXIgPSBuZXcgQXRQYXJzZXIoKTsKLSAgICAgICAgLy9UT0RPKCk6IEdldCByaWQgb2YgdGhpcyBhcyB0aGVyZSBhcmUgbm8gcGFyc2VycyByZWdpc3RlcmVkLiBCdXQgYmVjYXVzZSBvZiBkZXBlbmRlbmNpZXMsCi0gICAgICAgIC8vaXQgbmVlZHMgdG8gYmUgZG9uZSBhcyBwYXJ0IG9mIHJlZmFjdG9yaW5nIEhlYWRzZXRCYXNlIGFuZCBCbHVldG9vdGhIYW5kc2ZyZWUKKworICAgICAgICAvL1RPRE8oKTogR2V0IHJpZCBvZiB0aGlzIGFzIHRoZXJlIGFyZSBubyBwYXJzZXJzIHJlZ2lzdGVyZWQuIEJ1dCBiZWNhdXNlIG9mIGRlcGVuZGVuY2llcworICAgICAgICAvLyBpdCBuZWVkcyB0byBiZSBkb25lIGFzIHBhcnQgb2YgcmVmYWN0b3JpbmcgSGVhZHNldEJhc2UgYW5kIEJsdWV0b290aEhhbmRzZnJlZQogICAgIH0KIAogICAgIHB1YmxpYyBBdFBhcnNlciBnZXRBdFBhcnNlcigpIHsKQEAgLTE1OSw4ICsxNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0ID0gcmVhZE5hdGl2ZSg1MDApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yZWFkX2Vycm9yID0gZ2V0TGFzdFJlYWRTdGF0dXNOYXRpdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF9yZWFkX2Vycm9yICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiaGVhZHNldCByZWFkIGVycm9yICIgKyBsYXN0X3JlYWRfZXJyb3IpOwpAQCAtMTc5LDggKzE4MCw2IEBACiAgICAgICAgIG1FdmVudFRocmVhZC5zdGFydCgpOwogICAgIH0KIAotCi0KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgcmVhZE5hdGl2ZShpbnQgdGltZW91dF9tcyk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGdldExhc3RSZWFkU3RhdHVzTmF0aXZlKCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDgxZmY0MTQuLmQxNmIzZDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtMjAxLDYgKzIwMSw3IEBACiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGdldCB0eXBlIGZvcjogIiArIHVybCArICIgKCIgKyBlLmdldE1lc3NhZ2UoKSArICIpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CkBAIC0yMTYsNiArMjE3LDkgQEAKICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGdldCB0eXBlIGZvcjogIiArIHVybCArICIgKCIgKyBlLmdldE1lc3NhZ2UoKSArICIpIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM5NCw5ICsxMzk4LDExIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgQ2xvc2VHdWFyZCBzdXBwb3J0LgogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZighbUNsb3NlRmxhZykgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIudGhpcy5yZWxlYXNlUHJvdmlkZXIobUNvbnRlbnRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkN1cnNvciBmaW5hbGl6ZWQgd2l0aG91dCBwcmlvciBjbG9zZSgpIik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9VcmlNYXRjaGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1VyaU1hdGNoZXIuamF2YQppbmRleCA3MmVjNDY5Li44NDFjOGY0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1VyaU1hdGNoZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1VyaU1hdGNoZXIuamF2YQpAQCAtMjUsOCArMjUsOCBAQAogLyoqCiBVdGlsaXR5IGNsYXNzIHRvIGFpZCBpbiBtYXRjaGluZyBVUklzIGluIGNvbnRlbnQgcHJvdmlkZXJzLgogCi08cD5UbyB1c2UgdGhpcyBjbGFzcywgYnVpbGQgdXAgYSB0cmVlIG9mIFVyaU1hdGNoZXIgb2JqZWN0cy4KLVR5cGljYWxseSwgaXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKKzxwPlRvIHVzZSB0aGlzIGNsYXNzLCBidWlsZCB1cCBhIHRyZWUgb2YgPGNvZGU+VXJpTWF0Y2hlcjwvY29kZT4gb2JqZWN0cy4KK0ZvciBleGFtcGxlOgogPHByZT4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVPUExFID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVPUExFX0lEID0gMjsKQEAgLTQ4LDM2ICs0OCwzNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUxMU19JRCA9IDEyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUxMU19GSUxURVIgPSAxNTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc1VSSU1hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc1VSSU1hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcihVcmlNYXRjaGVyLk5PX01BVENIKTsKIAogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGVvcGxlIiwgUEVPUExFKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGVvcGxlLyMiLCBQRU9QTEVfSUQpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9wZW9wbGUvIy9waG9uZXMiLCBQRU9QTEVfUEhPTkVTKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGVvcGxlLyMvcGhvbmVzLyMiLCBQRU9QTEVfUEhPTkVTX0lEKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGVvcGxlLyMvY29udGFjdF9tZXRob2RzIiwgUEVPUExFX0NPTlRBQ1RNRVRIT0RTKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGVvcGxlLyMvY29udGFjdF9tZXRob2RzLyMiLCBQRU9QTEVfQ09OVEFDVE1FVEhPRFNfSUQpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9kZWxldGVkX3Blb3BsZSIsIERFTEVURURfUEVPUExFKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGhvbmVzIiwgUEhPTkVTKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvcGhvbmVzL2ZpbHRlci8qIiwgUEhPTkVTX0ZJTFRFUik7Ci0gICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAiL3Bob25lcy8jIiwgUEhPTkVTX0lEKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICIvY29udGFjdF9tZXRob2RzIiwgQ09OVEFDVE1FVEhPRFMpOwotICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgIi9jb250YWN0X21ldGhvZHMvIyIsIENPTlRBQ1RNRVRIT0RTX0lEKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICIvY2FsbHMiLCBDQUxMUyk7Ci0gICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY2FsbF9sb2ciLCAiL2NhbGxzL2ZpbHRlci8qIiwgQ0FMTFNfRklMVEVSKTsKLSAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICIvY2FsbHMvIyIsIENBTExTX0lEKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwZW9wbGUiLCBQRU9QTEUpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBlb3BsZS8jIiwgUEVPUExFX0lEKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwZW9wbGUvIy9waG9uZXMiLCBQRU9QTEVfUEhPTkVTKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJwZW9wbGUvIy9waG9uZXMvIyIsIFBFT1BMRV9QSE9ORVNfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBlb3BsZS8jL2NvbnRhY3RfbWV0aG9kcyIsIFBFT1BMRV9DT05UQUNUTUVUSE9EUyk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGVvcGxlLyMvY29udGFjdF9tZXRob2RzLyMiLCBQRU9QTEVfQ09OVEFDVE1FVEhPRFNfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgImRlbGV0ZWRfcGVvcGxlIiwgREVMRVRFRF9QRU9QTEUpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgInBob25lcyIsIFBIT05FUyk7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGhvbmVzL2ZpbHRlci8qIiwgUEhPTkVTX0ZJTFRFUik7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY29udGFjdHMiLCAicGhvbmVzLyMiLCBQSE9ORVNfSUQpOworICAgICAgICBzVVJJTWF0Y2hlci5hZGRVUkkoImNvbnRhY3RzIiwgImNvbnRhY3RfbWV0aG9kcyIsIENPTlRBQ1RNRVRIT0RTKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjb250YWN0cyIsICJjb250YWN0X21ldGhvZHMvIyIsIENPTlRBQ1RNRVRIT0RTX0lEKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICJjYWxscyIsIENBTExTKTsKKyAgICAgICAgc1VSSU1hdGNoZXIuYWRkVVJJKCJjYWxsX2xvZyIsICJjYWxscy9maWx0ZXIvKiIsIENBTExTX0ZJTFRFUik7CisgICAgICAgIHNVUklNYXRjaGVyLmFkZFVSSSgiY2FsbF9sb2ciLCAiY2FsbHMvIyIsIENBTExTX0lEKTsKICAgICB9CiA8L3ByZT4KLTxwPlRoZW4gd2hlbiB5b3UgbmVlZCB0byBtYXRjaCBtYXRjaCBhZ2FpbnN0IGEgVVJJLCBjYWxsIHtAbGluayAjbWF0Y2h9LCBwcm92aWRpbmcKLXRoZSB0b2tlbml6ZWQgdXJsIHlvdSd2ZSBiZWVuIGdpdmVuLCBhbmQgdGhlIHZhbHVlIHlvdSB3YW50IGlmIHRoZXJlIGlzbid0Ci1hIG1hdGNoLiAgWW91IGNhbiB1c2UgdGhlIHJlc3VsdCB0byBidWlsZCBhIHF1ZXJ5LCByZXR1cm4gYSB0eXBlLCBpbnNlcnQgb3IKLWRlbGV0ZSBhIHJvdywgb3Igd2hhdGV2ZXIgeW91IG5lZWQsIHdpdGhvdXQgZHVwbGljYXRpbmcgYWxsIG9mIHRoZSBpZi1lbHNlCi1sb2dpYyB5b3UnZCBvdGhlcndpc2UgbmVlZC4gIExpa2UgdGhpczoKKzxwPlRoZW4gd2hlbiB5b3UgbmVlZCB0byBtYXRjaCBhZ2FpbnN0IGEgVVJJLCBjYWxsIHtAbGluayAjbWF0Y2h9LCBwcm92aWRpbmcKK3RoZSBVUkwgdGhhdCB5b3UgaGF2ZSBiZWVuIGdpdmVuLiAgWW91IGNhbiB1c2UgdGhlIHJlc3VsdCB0byBidWlsZCBhIHF1ZXJ5LAorcmV0dXJuIGEgdHlwZSwgaW5zZXJ0IG9yIGRlbGV0ZSBhIHJvdywgb3Igd2hhdGV2ZXIgeW91IG5lZWQsIHdpdGhvdXQgZHVwbGljYXRpbmcKK2FsbCBvZiB0aGUgaWYtZWxzZSBsb2dpYyB0aGF0IHlvdSB3b3VsZCBvdGhlcndpc2UgbmVlZC4gIEZvciBleGFtcGxlOgogPHByZT4KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoU3RyaW5nW10gdXJsKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKQogICAgIHsKLSAgICAgICAgaW50IG1hdGNoID0gc1VSSU1hdGNoZXIubWF0Y2godXJsLCBOT19NQVRDSCk7CisgICAgICAgIGludCBtYXRjaCA9IHNVUklNYXRjaGVyLm1hdGNoKHVybCk7CiAgICAgICAgIHN3aXRjaCAobWF0Y2gpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgUEVPUExFOgpAQCAtOTMsMTkgKzkyLDIwIEBACiAgICAgICAgIH0KICAgICB9CiA8L3ByZT4KLWluc3RlYWQgb2YKK2luc3RlYWQgb2Y6CiA8cHJlPgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmdbXSB1cmwpCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpCiAgICAgewotICAgICAgICBpZiAodXJsLmxlbmd0aCA+PSAyKSB7Ci0gICAgICAgICAgICBpZiAodXJsWzFdLmVxdWFscygicGVvcGxlIikpIHsKLSAgICAgICAgICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAyKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwYXRoU2VnbWVudHMgPSB1cmwuZ2V0UGF0aFNlZ21lbnRzKCk7CisgICAgICAgIGlmIChwYXRoU2VnbWVudHMuc2l6ZSgpID49IDIpIHsKKyAgICAgICAgICAgIGlmICgicGVvcGxlIi5lcXVhbHMocGF0aFNlZ21lbnRzLmdldCgxKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aFNlZ21lbnRzLnNpemUoKSA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9wZXJzb24iOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmxlbmd0aCA9PSAzKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoU2VnbWVudHMuc2l6ZSgpID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9wZXJzb24iOwogLi4uIHNuaXAgLi4uCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9zbmFpbC1tYWlsIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5sZW5ndGggPT0gMykgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aFNlZ21lbnRzLnNpemUoKSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vc25haWwtbWFpbCI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDliYjNiNzUuLmU5YTI5MjkKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1vdmllOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ29uc3RhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTY2LDYgKzY3LDggQEAKICAgICAgICAgICAgID0gbmV3IExvbmdTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PENvbG9yU3RhdGVMaXN0PiBtUHJlbG9hZGVkQ29sb3JTdGF0ZUxpc3RzCiAgICAgICAgICAgICA9IG5ldyBTcGFyc2VBcnJheTxDb2xvclN0YXRlTGlzdD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gc1ByZWxvYWRlZENvbG9yRHJhd2FibGVzCisgICAgICAgICAgICA9IG5ldyBMb25nU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4oKTsKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1QcmVsb2FkZWQ7CiAKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBUeXBlZFZhbHVlIG1UbXBWYWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CkBAIC03NSw2ICs3OCw4IEBACiAgICAgICAgICAgICA9IG5ldyBMb25nU3BhcnNlQXJyYXk8V2Vha1JlZmVyZW5jZTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiA+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPENvbG9yU3RhdGVMaXN0PiA+IG1Db2xvclN0YXRlTGlzdENhY2hlCiAgICAgICAgICAgICA9IG5ldyBTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPENvbG9yU3RhdGVMaXN0PiA+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMb25nU3BhcnNlQXJyYXk8V2Vha1JlZmVyZW5jZTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiA+IG1Db2xvckRyYXdhYmxlQ2FjaGUKKyAgICAgICAgICAgID0gbmV3IExvbmdTcGFyc2VBcnJheTxXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+ID4oKTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVByZWxvYWRpbmc7CiAKICAgICAvKnBhY2thZ2UqLyBUeXBlZEFycmF5IG1DYWNoZWRTdHlsZWRBdHRyaWJ1dGVzID0gbnVsbDsKQEAgLTEyOTksMzcgKzEzMDQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKGludCkobU1ldHJpY3MuZGVuc2l0eSoxNjApLCBtQ29uZmlndXJhdGlvbi5rZXlib2FyZCwKICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmRIaWRkZW4sIG1Db25maWd1cmF0aW9uLm5hdmlnYXRpb24sIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uLnNjcmVlbkxheW91dCwgbUNvbmZpZ3VyYXRpb24udWlNb2RlLCBzU2RrVmVyc2lvbik7Ci0gICAgICAgICAgICBpbnQgTiA9IG1EcmF3YWJsZUNhY2hlLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChERUJVR19DT05GSUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDbGVhbmluZyB1cCBkcmF3YWJsZXMgY29uZmlnIGNoYW5nZXM6IDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbmZpZ0NoYW5nZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHJlZiA9IG1EcmF3YWJsZUNhY2hlLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgY3MgPSByZWYuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5uZWVkTmV3UmVzb3VyY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzLCBjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGTFVTSElORyAjMHgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMb25nLnRvSGV4U3RyaW5nKG1EcmF3YWJsZUNhY2hlLmtleUF0KGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAvICIgKyBjcyArICIgd2l0aCBjaGFuZ2VzOiAweCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoY3MuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZUNhY2hlLnNldFZhbHVlQXQoaSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHX0NPTkZJRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIihLZWVwaW5nICMweCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhtRHJhd2FibGVDYWNoZS5rZXlBdChpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAvICIgKyBjcyArICIgd2l0aCBjaGFuZ2VzOiAweCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhd2FibGVDYWNoZS5jbGVhcigpOworCisgICAgICAgICAgICBjbGVhckRyYXdhYmxlQ2FjaGUobURyYXdhYmxlQ2FjaGUsIGNvbmZpZ0NoYW5nZXMpOworICAgICAgICAgICAgY2xlYXJEcmF3YWJsZUNhY2hlKG1Db2xvckRyYXdhYmxlQ2FjaGUsIGNvbmZpZ0NoYW5nZXMpOworCiAgICAgICAgICAgICBtQ29sb3JTdGF0ZUxpc3RDYWNoZS5jbGVhcigpOworCisKICAgICAgICAgICAgIGZsdXNoTGF5b3V0Q2FjaGUoKTsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CkBAIC0xMzM5LDYgKzEzMjAsNDAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjbGVhckRyYXdhYmxlQ2FjaGUoCisgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8V2Vha1JlZmVyZW5jZTxDb25zdGFudFN0YXRlPj4gY2FjaGUsCisgICAgICAgICAgICBpbnQgY29uZmlnQ2hhbmdlcykgeworICAgICAgICBpbnQgTiA9IGNhY2hlLnNpemUoKTsKKyAgICAgICAgaWYgKERFQlVHX0NPTkZJRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2xlYW5pbmcgdXAgZHJhd2FibGVzIGNvbmZpZyBjaGFuZ2VzOiAweCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbmZpZ0NoYW5nZXMpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHJlZiA9IGNhY2hlLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIGNzID0gcmVmLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChjcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm5lZWROZXdSZXNvdXJjZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlcywgY3MuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZMVVNISU5HICMweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhtRHJhd2FibGVDYWNoZS5rZXlBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAvICIgKyBjcyArICIgd2l0aCBjaGFuZ2VzOiAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhjcy5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldFZhbHVlQXQoaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoREVCVUdfQ09ORklHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIoS2VlcGluZyAjMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhjYWNoZS5rZXlBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gIiArIGNzICsgIiB3aXRoIGNoYW5nZXM6IDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoY3MuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN5c3RlbSByZXNvdXJjZXMgY29uZmlndXJhdGlvbiBpZiB0aGV5IGhhdmUgcHJldmlvdXNseQogICAgICAqIGJlZW4gaW5pdGlhbGl6ZWQuCkBAIC0xNjYxLDEzICsxNjc2LDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBsb25nIGtleSA9ICgoKGxvbmcpIHZhbHVlLmFzc2V0Q29va2llKSA8PCAzMikgfCB2YWx1ZS5kYXRhOwotICAgICAgICBEcmF3YWJsZSBkciA9IGdldENhY2hlZERyYXdhYmxlKGtleSk7CisgICAgICAgIGJvb2xlYW4gaXNDb2xvckRyYXdhYmxlID0gZmFsc2U7CisgICAgICAgIGlmICh2YWx1ZS50eXBlID49IFR5cGVkVmFsdWUuVFlQRV9GSVJTVF9DT0xPUl9JTlQgJiYKKyAgICAgICAgICAgICAgICB2YWx1ZS50eXBlIDw9IFR5cGVkVmFsdWUuVFlQRV9MQVNUX0NPTE9SX0lOVCkgeworICAgICAgICAgICAgaXNDb2xvckRyYXdhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBEcmF3YWJsZSBkciA9IGdldENhY2hlZERyYXdhYmxlKGlzQ29sb3JEcmF3YWJsZSA/IG1Db2xvckRyYXdhYmxlQ2FjaGUgOiBtRHJhd2FibGVDYWNoZSwga2V5KTsKIAogICAgICAgICBpZiAoZHIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGRyOwogICAgICAgICB9CiAKLSAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjcyA9IHNQcmVsb2FkZWREcmF3YWJsZXMuZ2V0KGtleSk7CisgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgY3MgPSBpc0NvbG9yRHJhd2FibGUgPyBzUHJlbG9hZGVkQ29sb3JEcmF3YWJsZXMuZ2V0KGtleSkgOiBzUHJlbG9hZGVkRHJhd2FibGVzLmdldChrZXkpOwogICAgICAgICBpZiAoY3MgIT0gbnVsbCkgewogICAgICAgICAgICAgZHIgPSBjcy5uZXdEcmF3YWJsZSh0aGlzKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE3MjYsMTMgKzE3NDYsMjEgQEAKICAgICAgICAgICAgIGNzID0gZHIuZ2V0Q29uc3RhbnRTdGF0ZSgpOwogICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobVByZWxvYWRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgc1ByZWxvYWRlZERyYXdhYmxlcy5wdXQoa2V5LCBjcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbG9yRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcmVsb2FkZWRDb2xvckRyYXdhYmxlcy5wdXQoa2V5LCBjcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJlbG9hZGVkRHJhd2FibGVzLnB1dChrZXksIGNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL0xvZy5pKFRBRywgIlNhdmluZyBjYWNoZWQgZHJhd2FibGUgQCAjIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhrZXkuaW50VmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICArICIgaW4gIiArIHRoaXMgKyAiOiAiICsgY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ2FjaGUucHV0KGtleSwgbmV3IFdlYWtSZWZlcmVuY2U8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4oY3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbG9yRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sb3JEcmF3YWJsZUNhY2hlLnB1dChrZXksIG5ldyBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KGNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZUNhY2hlLnB1dChrZXksIG5ldyBXZWFrUmVmZXJlbmNlPERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KGNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNzQxLDkgKzE3NjksMTEgQEAKICAgICAgICAgcmV0dXJuIGRyOwogICAgIH0KIAotICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0Q2FjaGVkRHJhd2FibGUobG9uZyBrZXkpIHsKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldENhY2hlZERyYXdhYmxlKAorICAgICAgICAgICAgTG9uZ1NwYXJzZUFycmF5PFdlYWtSZWZlcmVuY2U8Q29uc3RhbnRTdGF0ZT4+IGRyYXdhYmxlQ2FjaGUsCisgICAgICAgICAgICBsb25nIGtleSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1UbXBWYWx1ZSkgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiB3ciA9IG1EcmF3YWJsZUNhY2hlLmdldChrZXkpOworICAgICAgICAgICAgV2Vha1JlZmVyZW5jZTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiB3ciA9IGRyYXdhYmxlQ2FjaGUuZ2V0KGtleSk7CiAgICAgICAgICAgICBpZiAod3IgIT0gbnVsbCkgeyAgIC8vIHdlIGhhdmUgdGhlIGtleQogICAgICAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgZW50cnkgPSB3ci5nZXQoKTsKICAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewpAQCAtMTc1Myw3ICsxNzgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm5ld0RyYXdhYmxlKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsgIC8vIG91ciBlbnRyeSBoYXMgYmVlbiBwdXJnZWQKLSAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ2FjaGUuZGVsZXRlKGtleSk7CisgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlQ2FjaGUuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9TdHJpbmdCbG9jay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvU3RyaW5nQmxvY2suamF2YQppbmRleCA1ZTkwYjkxLi4yM2E2Zjk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9TdHJpbmdCbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1N0cmluZ0Jsb2NrLmphdmEKQEAgLTg3LDIxICs4Nyw0OCBAQAogICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobVN0eWxlSURzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzID0gbmV3IFN0eWxlSURzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5ib2xkSWQgPSBuYXRpdmVJbmRleE9mU3RyaW5nKG1OYXRpdmUsICJiIik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5pdGFsaWNJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgImkiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnVuZGVybGluZUlkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAidSIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMudHRJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgInR0Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5iaWdJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgImJpZyIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc21hbGxJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgInNtYWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zdXBJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgInN1cCIpOwotICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc3ViSWQgPSBuYXRpdmVJbmRleE9mU3RyaW5nKG1OYXRpdmUsICJzdWIiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnN0cmlrZUlkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAic3RyaWtlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5saXN0SXRlbUlkID0gbmF0aXZlSW5kZXhPZlN0cmluZyhtTmF0aXZlLCAibGkiKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLm1hcnF1ZWVJZCA9IG5hdGl2ZUluZGV4T2ZTdHJpbmcobU5hdGl2ZSwgIm1hcnF1ZWUiKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLnYoVEFHLCAiQm9sZElkPSIgKyBtU3R5bGVJRHMuYm9sZElkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBJdGFsaWNJZD0iICsgbVN0eWxlSURzLml0YWxpY0lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBVbmRlcmxpbmVJZD0iICsgbVN0eWxlSURzLnVuZGVybGluZUlkKTsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3R5bGUgYXJyYXkgaXMgYSBmbGF0IGFycmF5IG9mIDx0eXBlLCBzdGFydCwgZW5kPiBoZW5jZQorICAgICAgICAgICAgICAgIC8vIHRoZSBtYWdpYyBjb25zdGFudCAzLgorICAgICAgICAgICAgICAgIGZvciAoaW50IHN0eWxlSW5kZXggPSAwOyBzdHlsZUluZGV4IDwgc3R5bGUubGVuZ3RoOyBzdHlsZUluZGV4ICs9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0eWxlSWQgPSBzdHlsZVtzdHlsZUluZGV4XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVJZCA9PSBtU3R5bGVJRHMuYm9sZElkIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLml0YWxpY0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMudW5kZXJsaW5lSWQgfHwgc3R5bGVJZCA9PSBtU3R5bGVJRHMudHRJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLmJpZ0lkIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLnNtYWxsSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHlsZUlkID09IG1TdHlsZUlEcy5zdWJJZCB8fCBzdHlsZUlkID09IG1TdHlsZUlEcy5zdXBJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLnN0cmlrZUlkIHx8IHN0eWxlSWQgPT0gbVN0eWxlSURzLmxpc3RJdGVtSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHlsZUlkID09IG1TdHlsZUlEcy5tYXJxdWVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlkIGFscmVhZHkgZm91bmQgc2tpcCB0byBuZXh0IHN0eWxlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZVRhZyA9IG5hdGl2ZUdldFN0cmluZyhtTmF0aXZlLCBzdHlsZUlkKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVUYWcuZXF1YWxzKCJiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5ib2xkSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygiaSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuaXRhbGljSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygidSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMudW5kZXJsaW5lSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygidHQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnR0SWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygiYmlnIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5iaWdJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJzbWFsbCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc21hbGxJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJzdXAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlSURzLnN1cElkID0gc3R5bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVRhZy5lcXVhbHMoInN1YiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMuc3ViSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlVGFnLmVxdWFscygic3RyaWtlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5zdHJpa2VJZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJsaSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3R5bGVJRHMubGlzdEl0ZW1JZCA9IHN0eWxlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVUYWcuZXF1YWxzKCJtYXJxdWVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHlsZUlEcy5tYXJxdWVlSWQgPSBzdHlsZUlkOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmVzID0gYXBwbHlTdHlsZXMoc3RyLCBzdHlsZSwgbVN0eWxlSURzKTsKQEAgLTExOSwxNyArMTQ2LDE3IEBACiAgICAgfQogCiAgICAgc3RhdGljIGZpbmFsIGNsYXNzIFN0eWxlSURzIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYm9sZElkOwotICAgICAgICBwcml2YXRlIGludCBpdGFsaWNJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgdW5kZXJsaW5lSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IHR0SWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGJpZ0lkOwotICAgICAgICBwcml2YXRlIGludCBzbWFsbElkOwotICAgICAgICBwcml2YXRlIGludCBzdWJJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc3VwSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IHN0cmlrZUlkOwotICAgICAgICBwcml2YXRlIGludCBsaXN0SXRlbUlkOwotICAgICAgICBwcml2YXRlIGludCBtYXJxdWVlSWQ7CisgICAgICAgIHByaXZhdGUgaW50IGJvbGRJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBpdGFsaWNJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCB1bmRlcmxpbmVJZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCB0dElkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IGJpZ0lkID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IHNtYWxsSWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3ViSWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3VwSWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3RyaWtlSWQgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGlzdEl0ZW1JZCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBtYXJxdWVlSWQgPSAtMTsKICAgICB9CiAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBhcHBseVN0eWxlcyhTdHJpbmcgc3RyLCBpbnRbXSBzdHlsZSwgU3R5bGVJRHMgaWRzKSB7CkBAIC00MDMsNiArNDMwLDUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldFNpemUoaW50IG9iaik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBuYXRpdmVHZXRTdHJpbmcoaW50IG9iaiwgaW50IGlkeCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludFtdIG5hdGl2ZUdldFN0eWxlKGludCBvYmosIGludCBpZHgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlSW5kZXhPZlN0cmluZyhpbnQgb2JqLCBTdHJpbmcgc3RyKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cm95KGludCBvYmopOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKaW5kZXggMDM4ZWVkZi4uYTVlNWU0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCkBAIC0yMDQsNyArMjA0LDcgQEAKICAgICAgKiBAcGFyYW0gd2luZG93CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmlsbFdpbmRvdyhpbnQgcG9zaXRpb24sIEN1cnNvcldpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IGdldENvdW50KCkpIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBnZXRDb3VudCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgd2luZG93LmFjcXVpcmVSZWZlcmVuY2UoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKaW5kZXggNjUzOTE1Ni4uZTMzOWE2MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKQEAgLTIxMSw3ICsyMTEsOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgY29sdW1uIGFzIGEgYnl0ZSBhcnJheS4KICAgICAgKgotICAgICAqIDxwPklmIHRoZSBuYXRpdmUgY29udGVudCBvZiB0aGF0IGNvbHVtbiBpcyBub3QgYmxvYiBleGNlcHRpb24gbWF5IHRocm93CisgICAgICogPHA+VGhlIHJlc3VsdCBhbmQgd2hldGhlciB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgICAgICogY29sdW1uIHZhbHVlIGlzIG51bGwgb3IgdGhlIGNvbHVtbiB0eXBlIGlzIG5vdCBhIGJsb2IgdHlwZSBpcworICAgICAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhhdCBjb2x1bW4gYXMgYSBieXRlIGFycmF5LgpAQCAtMjIxLDggKzIyMyw5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4gYXMgYSBTdHJpbmcuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IHRleHQgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gU3RyaW5nLnZhbHVlT2YoeCkuCisgICAgICogPHA+VGhlIHJlc3VsdCBhbmQgd2hldGhlciB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgICAgICogY29sdW1uIHZhbHVlIGlzIG51bGwgb3IgdGhlIGNvbHVtbiB0eXBlIGlzIG5vdCBhIHN0cmluZyB0eXBlIGlzCisgICAgICogaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IGNvbHVtbiBhcyBhIFN0cmluZy4KQEAgLTI0Miw4ICsyNDUsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGNvbHVtbiBhcyBhIHNob3J0LgogICAgICAqCi0gICAgICogPHA+SWYgdGhlIG5hdGl2ZSBjb250ZW50IG9mIHRoYXQgY29sdW1uIGlzIG5vdCBudW1lcmljIHRoZSByZXN1bHQgd2lsbCBiZQotICAgICAqIHRoZSByZXN1bHQgb2YgcGFzc2luZyB0aGUgY29sdW1uIHZhbHVlIHRvIFNob3J0LnZhbHVlT2YoeCkuCisgICAgICogPHA+VGhlIHJlc3VsdCBhbmQgd2hldGhlciB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgICAgICogY29sdW1uIHZhbHVlIGlzIG51bGwsIHRoZSBjb2x1bW4gdHlwZSBpcyBub3QgYW4gaW50ZWdyYWwgdHlwZSwgb3IgdGhlCisgICAgICogaW50ZWdlciB2YWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbPGNvZGU+U2hvcnQuTUlOX1ZBTFVFPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5TaG9ydC5NQVhfVkFMVUU8L2NvZGU+XSBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgY29sdW1uIGFzIGEgc2hvcnQuCkBAIC0yNTMsOCArMjU4LDEwIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBjb2x1bW4gYXMgYW4gaW50LgogICAgICAqCi0gICAgICogPHA+SWYgdGhlIG5hdGl2ZSBjb250ZW50IG9mIHRoYXQgY29sdW1uIGlzIG5vdCBudW1lcmljIHRoZSByZXN1bHQgd2lsbCBiZQotICAgICAqIHRoZSByZXN1bHQgb2YgcGFzc2luZyB0aGUgY29sdW1uIHZhbHVlIHRvIEludGVnZXIudmFsdWVPZih4KS4KKyAgICAgKiA8cD5UaGUgcmVzdWx0IGFuZCB3aGV0aGVyIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgICAgKiBjb2x1bW4gdmFsdWUgaXMgbnVsbCwgdGhlIGNvbHVtbiB0eXBlIGlzIG5vdCBhbiBpbnRlZ3JhbCB0eXBlLCBvciB0aGUKKyAgICAgKiBpbnRlZ2VyIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlIFs8Y29kZT5JbnRlZ2VyLk1JTl9WQUxVRTwvY29kZT4sCisgICAgICogPGNvZGU+SW50ZWdlci5NQVhfVkFMVUU8L2NvZGU+XSBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgY29sdW1uIGFzIGFuIGludC4KQEAgLTI2NCw4ICsyNzEsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGNvbHVtbiBhcyBhIGxvbmcuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IG51bWVyaWMgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gTG9uZy52YWx1ZU9mKHgpLgorICAgICAqIDxwPlRoZSByZXN1bHQgYW5kIHdoZXRoZXIgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZQorICAgICAqIGNvbHVtbiB2YWx1ZSBpcyBudWxsLCB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGFuIGludGVncmFsIHR5cGUsIG9yIHRoZQorICAgICAqIGludGVnZXIgdmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzxjb2RlPkxvbmcuTUlOX1ZBTFVFPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5Mb25nLk1BWF9WQUxVRTwvY29kZT5dIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhhdCBjb2x1bW4gYXMgYSBsb25nLgpAQCAtMjc1LDggKzI4NCwxMCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgY29sdW1uIGFzIGEgZmxvYXQuCiAgICAgICoKLSAgICAgKiA8cD5JZiB0aGUgbmF0aXZlIGNvbnRlbnQgb2YgdGhhdCBjb2x1bW4gaXMgbm90IG51bWVyaWMgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBjb2x1bW4gdmFsdWUgdG8gRmxvYXQudmFsdWVPZih4KS4KKyAgICAgKiA8cD5UaGUgcmVzdWx0IGFuZCB3aGV0aGVyIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgICAgKiBjb2x1bW4gdmFsdWUgaXMgbnVsbCwgdGhlIGNvbHVtbiB0eXBlIGlzIG5vdCBhIGZsb2F0aW5nLXBvaW50IHR5cGUsIG9yIHRoZQorICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlIGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGlzCisgICAgICogaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IGNvbHVtbiBhcyBhIGZsb2F0LgpAQCAtMjg2LDggKzI5NywxMCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgY29sdW1uIGFzIGEgZG91YmxlLgogICAgICAqCi0gICAgICogPHA+SWYgdGhlIG5hdGl2ZSBjb250ZW50IG9mIHRoYXQgY29sdW1uIGlzIG5vdCBudW1lcmljIHRoZSByZXN1bHQgd2lsbCBiZQotICAgICAqIHRoZSByZXN1bHQgb2YgcGFzc2luZyB0aGUgY29sdW1uIHZhbHVlIHRvIERvdWJsZS52YWx1ZU9mKHgpLgorICAgICAqIDxwPlRoZSByZXN1bHQgYW5kIHdoZXRoZXIgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZQorICAgICAqIGNvbHVtbiB2YWx1ZSBpcyBudWxsLCB0aGUgY29sdW1uIHR5cGUgaXMgbm90IGEgZmxvYXRpbmctcG9pbnQgdHlwZSwgb3IgdGhlCisgICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWUgaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIGlzCisgICAgICogaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IGNvbHVtbiBhcyBhIGRvdWJsZS4KQEAgLTU3Myw3ICs1ODYsOCBAQAogICAgICAqIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGZldGNoIGRhdGEgZm9yIHRoZSBjdXJzb3IuCiAgICAgICoKICAgICAgKiA8cD5UaGVzZSB2YWx1ZXMgbWF5IG9ubHkgY2hhbmdlIHdoZW4gcmVxdWVyeSBpcyBjYWxsZWQuCi0gICAgICogQHJldHVybiBjdXJzb3ItZGVmaW5lZCB2YWx1ZXMsIG9yIEJ1bmRsZS5FTVRQWSBpZiB0aGVyZSBhcmUgbm8gdmFsdWVzLiBOZXZlciBudWxsLgorICAgICAqIEByZXR1cm4gY3Vyc29yLWRlZmluZWQgdmFsdWVzLCBvciB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGUjRU1QVFkgQnVuZGxlLkVNUFRZfSBpZiB0aGVyZQorICAgICAqICAgICAgICAgYXJlIG5vIHZhbHVlcy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCiAgICAgQnVuZGxlIGdldEV4dHJhcygpOwogCkBAIC01ODMsOCArNTk3LDEwIEBACiAgICAgICoKICAgICAgKiA8cD5PbmUgdXNlIG9mIHRoaXMgaXMgdG8gdGVsbCBhIGN1cnNvciB0aGF0IGl0IHNob3VsZCByZXRyeSBpdHMgbmV0d29yayByZXF1ZXN0IGFmdGVyIGl0CiAgICAgICogcmVwb3J0ZWQgYW4gZXJyb3IuCi0gICAgICogQHBhcmFtIGV4dHJhcyBleHRyYSB2YWx1ZXMsIG9yIEJ1bmRsZS5FTVRQWS4gTmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIGV4dHJhIHZhbHVlcywgb3IgQnVuZGxlLkVNVFBZLiBOZXZlciBudWxsLgorICAgICAqIEBwYXJhbSBleHRyYXMgZXh0cmEgdmFsdWVzLCBvciB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGUjRU1QVFkgQnVuZGxlLkVNUFRZfS4KKyAgICAgKiAgICAgICAgIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gZXh0cmEgdmFsdWVzLCBvciB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGUjRU1QVFkgQnVuZGxlLkVNUFRZfS4KKyAgICAgKiAgICAgICAgIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqLwogICAgIEJ1bmRsZSByZXNwb25kKEJ1bmRsZSBleHRyYXMpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQppbmRleCBjNzU2ODI1Li43NmI5MWY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQpAQCAtMjQ1LDYgKzI0NSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgKDxjb2RlPnJvdzwvY29kZT4sIDxjb2RlPmNvbDwvY29kZT4pIGFzIGEgPGNvZGU+Ynl0ZTwvY29kZT4gYXJyYXkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4gSWYgdGhlCisgICAgICogdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBhIHN0cmluZyB0eXBlLCB0aGVuIHRoZSByZXN1bHQKKyAgICAgKiBpcyB0aGUgYXJyYXkgb2YgYnl0ZXMgdGhhdCBtYWtlIHVwIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBzdHJpbmcgdmFsdWUuIElmIHRoZSB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGludGVncmFsIG9yIGZsb2F0aW5nLXBvaW50LAorICAgICAqIHRoZW4gYW4ge0BsaW5rIFNRTGl0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgpAQCAtMzMyLDYgKzM0MSwxOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGF0ICg8Y29kZT5yb3c8L2NvZGU+LCA8Y29kZT5jb2w8L2NvZGU+KSBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4gSWYgdGhlCisgICAgICogdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBpbnRlZ3JhbCwgdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBzdHJpbmcKKyAgICAgKiB0aGF0IGlzIG9idGFpbmVkIGJ5IGZvcm1hdHRpbmcgdGhlIGludGVnZXIgdmFsdWUgd2l0aCB0aGUgPGNvZGU+cHJpbnRmPC9jb2RlPgorICAgICAqIGZhbWlseSBvZiBmdW5jdGlvbnMgdXNpbmcgZm9ybWF0IHNwZWNpZmllciA8Y29kZT4lbGxkPC9jb2RlPi4gSWYgdGhlCisgICAgICogdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBmbG9hdGluZy1wb2ludCwgdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBzdHJpbmcKKyAgICAgKiB0aGF0IGlzIG9idGFpbmVkIGJ5IGZvcm1hdHRpbmcgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIHdpdGggdGhlCisgICAgICogPGNvZGU+cHJpbnRmPC9jb2RlPiBmYW1pbHkgb2YgZnVuY3Rpb25zIHVzaW5nIGZvcm1hdCBzcGVjaWZpZXIgPGNvZGU+JWc8L2NvZGU+LgorICAgICAqIElmIHRoZSB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGEgYmxvYiB0eXBlLCB0aGVuIGFuCisgICAgICoge0BsaW5rIFNRTGl0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBnZXRTdHJpbmdfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCkBAIC0zODMsNiArNDA1LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgKDxjb2RlPnJvdzwvY29kZT4sIDxjb2RlPmNvbDwvY29kZT4pIGFzIGEgPGNvZGU+bG9uZzwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiA8Y29kZT4wTDwvY29kZT4gaXMgcmV0dXJuZWQuIElmIHRoZQorICAgICAqIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMgYSBzdHJpbmcgdHlwZSwgdGhlbiB0aGUgcmVzdWx0CisgICAgICogaXMgdGhlIDxjb2RlPmxvbmc8L2NvZGU+IHRoYXQgaXMgb2J0YWluZWQgYnkgcGFyc2luZyB0aGUgc3RyaW5nIHZhbHVlIHdpdGgKKyAgICAgKiA8Y29kZT5zdHJ0b2xsPC9jb2RlPi4gSWYgdGhlIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMKKyAgICAgKiBmbG9hdGluZy1wb2ludCwgdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSBjYXN0ZWQgdG8gYSA8Y29kZT5sb25nPC9jb2RlPi4KKyAgICAgKiBJZiB0aGUgdHlwZSBvZiBjb2x1bW4gPGNvZGU+Y29sPC9jb2RlPiBpcyBhIGJsb2IgdHlwZSwgdGhlbiBhbgorICAgICAqIHtAbGluayBTUUxpdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGdldExvbmdfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCkBAIC00MDIsNiArNDM1LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgKDxjb2RlPnJvdzwvY29kZT4sIDxjb2RlPmNvbDwvY29kZT4pIGFzIGEgPGNvZGU+ZG91YmxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIDxjb2RlPjAuMDwvY29kZT4gaXMgcmV0dXJuZWQuIElmIHRoZQorICAgICAqIHR5cGUgb2YgY29sdW1uIDxjb2RlPmNvbDwvY29kZT4gaXMgYSBzdHJpbmcgdHlwZSwgdGhlbiB0aGUgcmVzdWx0CisgICAgICogaXMgdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdGhhdCBpcyBvYnRhaW5lZCBieSBwYXJzaW5nIHRoZSBzdHJpbmcgdmFsdWUgd2l0aAorICAgICAqIDxjb2RlPnN0cnRvZDwvY29kZT4uIElmIHRoZSB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzCisgICAgICogaW50ZWdyYWwsIHRoZW4gdGhlIHJlc3VsdCBpcyB0aGUgaW50ZWdlciB2YWx1ZSBjYXN0ZWQgdG8gYSA8Y29kZT5kb3VibGU8L2NvZGU+LgorICAgICAqIElmIHRoZSB0eXBlIG9mIGNvbHVtbiA8Y29kZT5jb2w8L2NvZGU+IGlzIGEgYmxvYiB0eXBlLCB0aGVuIGFuCisgICAgICoge0BsaW5rIFNRTGl0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGRvdWJsZSBnZXREb3VibGVfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKaW5kZXggNjY0MDZjYS4uOTVmYzFmZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQpAQCAtNTAsOCArNTAsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBERUJVRyA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjb3VudFByb2plY3Rpb24gPSBuZXcgU3RyaW5nW117ImNvdW50KCopIn07Ci0KICAgICAvKioKICAgICAgKiBTcGVjaWFsIGZ1bmN0aW9uIGZvciB3cml0aW5nIGFuIGV4Y2VwdGlvbiByZXN1bHQgYXQgdGhlIGhlYWRlciBvZgogICAgICAqIGEgcGFyY2VsLCB0byBiZSB1c2VkIHdoZW4gcmV0dXJuaW5nIGFuIGV4Y2VwdGlvbiBmcm9tIGEgdHJhbnNhY3Rpb24uCkBAIC02MDQsMTQgKzYwMiw0MCBAQAogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBxdWVyeU51bUVudHJpZXMoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyB0YWJsZSkgewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkodGFibGUsIGNvdW50UHJvamVjdGlvbiwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9GaXJzdCgpOwotICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRMb25nKDApOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHF1ZXJ5TnVtRW50cmllcyhkYiwgdGFibGUsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB0YWJsZSBmb3IgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRoZSB0YWJsZSBpcyBpbgorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgZmlsdGVyIGRlY2xhcmluZyB3aGljaCByb3dzIHRvIHJldHVybiwKKyAgICAgKiAgICAgICAgICAgICAgZm9ybWF0dGVkIGFzIGFuIFNRTCBXSEVSRSBjbGF1c2UgKGV4Y2x1ZGluZyB0aGUgV0hFUkUgaXRzZWxmKS4KKyAgICAgKiAgICAgICAgICAgICAgUGFzc2luZyBudWxsIHdpbGwgY291bnQgYWxsIHJvd3MgZm9yIHRoZSBnaXZlbiB0YWJsZQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZSBmaWx0ZXJlZCBieSB0aGUgc2VsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHF1ZXJ5TnVtRW50cmllcyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgc2VsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBxdWVyeU51bUVudHJpZXMoZGIsIHRhYmxlLCBzZWxlY3Rpb24sIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB0YWJsZSBmb3IgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRoZSB0YWJsZSBpcyBpbgorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgZmlsdGVyIGRlY2xhcmluZyB3aGljaCByb3dzIHRvIHJldHVybiwKKyAgICAgKiAgICAgICAgICAgICAgZm9ybWF0dGVkIGFzIGFuIFNRTCBXSEVSRSBjbGF1c2UgKGV4Y2x1ZGluZyB0aGUgV0hFUkUgaXRzZWxmKS4KKyAgICAgKiAgICAgICAgICAgICAgUGFzc2luZyBudWxsIHdpbGwgY291bnQgYWxsIHJvd3MgZm9yIHRoZSBnaXZlbiB0YWJsZQorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFlvdSBtYXkgaW5jbHVkZSA/cyBpbiBzZWxlY3Rpb24sCisgICAgICogICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlcyBmcm9tIHNlbGVjdGlvbkFyZ3MsCisgICAgICogICAgICAgICAgICAgIGluIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgVGhlIHZhbHVlcyB3aWxsIGJlIGJvdW5kIGFzIFN0cmluZ3MuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlIGZpbHRlcmVkIGJ5IHRoZSBzZWxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgcXVlcnlOdW1FbnRyaWVzKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgdGFibGUsIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIFN0cmluZyBzID0gKCFUZXh0VXRpbHMuaXNFbXB0eShzZWxlY3Rpb24pKSA/ICIgd2hlcmUgIiArIHNlbGVjdGlvbiA6ICIiOworICAgICAgICByZXR1cm4gbG9uZ0ZvclF1ZXJ5KGRiLCAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIHRhYmxlICsgcywKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKaW5kZXggZDhkY2FmNy4uYzU5MjEzNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQpAQCAtMTMyLDExICsxMzIsMTEgQEAKICAgICAgICAgICAgIC8vIHRoZSBjdXJzb3IncyBzdGF0ZSBkb2Vzbid0IGNoYW5nZQogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJzb3JTdGF0ZSAhPSBtVGhyZWFkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnNvclN0YXRlICE9IG1UaHJlYWRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKQEAgLTIxOCw5ICsyMTgsOCBAQAogICAgICAgICBtQ29sdW1uTmFtZU1hcCA9IG51bGw7CiAgICAgICAgIG1RdWVyeSA9IHF1ZXJ5OwogCisgICAgICAgIGRiLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiLmxvY2soKTsKLQogICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGxpc3Qgb2YgY29sdW1ucwogICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbVF1ZXJ5LmNvbHVtbkNvdW50TG9ja2VkKCk7CiAgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbY29sdW1uQ291bnRdOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5QnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5QnVpbGRlci5qYXZhCmluZGV4IDYxMGJmNzAuLmI2YWNhMmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnlCdWlsZGVyLmphdmEKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIHNxbCA9IGJ1aWxkUXVlcnkoCi0gICAgICAgICAgICAgICAgcHJvamVjdGlvbkluLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIGdyb3VwQnksIGhhdmluZywKKyAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLAogICAgICAgICAgICAgICAgIHNvcnRPcmRlciwgbGltaXQpOwogCiAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKQEAgLTM0NSwxMCArMzQ1LDYgQEAKICAgICAgKiAgIGZvcm1hdHRlZCBhcyBhbiBTUUwgV0hFUkUgY2xhdXNlIChleGNsdWRpbmcgdGhlIFdIRVJFCiAgICAgICogICBpdHNlbGYpLiAgUGFzc2luZyBudWxsIHdpbGwgcmV0dXJuIGFsbCByb3dzIGZvciB0aGUgZ2l2ZW4KICAgICAgKiAgIFVSTC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBZb3UgbWF5IGluY2x1ZGUgP3MgaW4gc2VsZWN0aW9uLCB3aGljaAotICAgICAqICAgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmFsdWVzIGZyb20gc2VsZWN0aW9uQXJncywgaW4gb3JkZXIKLSAgICAgKiAgIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIHNlbGVjdGlvbi4gIFRoZSB2YWx1ZXMgd2lsbCBiZSBib3VuZAotICAgICAqICAgYXMgU3RyaW5ncy4KICAgICAgKiBAcGFyYW0gZ3JvdXBCeSBBIGZpbHRlciBkZWNsYXJpbmcgaG93IHRvIGdyb3VwIHJvd3MsIGZvcm1hdHRlZAogICAgICAqICAgYXMgYW4gU1FMIEdST1VQIEJZIGNsYXVzZSAoZXhjbHVkaW5nIHRoZSBHUk9VUCBCWSBpdHNlbGYpLgogICAgICAqICAgUGFzc2luZyBudWxsIHdpbGwgY2F1c2UgdGhlIHJvd3MgdG8gbm90IGJlIGdyb3VwZWQuCkBAIC0zNjUsOCArMzYxLDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgU1FMIFNFTEVDVCBzdGF0ZW1lbnQKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkUXVlcnkoCi0gICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uSW4sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCi0gICAgICAgICAgICBTdHJpbmcgZ3JvdXBCeSwgU3RyaW5nIGhhdmluZywgU3RyaW5nIHNvcnRPcmRlciwgU3RyaW5nIGxpbWl0KSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uSW4sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZyBncm91cEJ5LAorICAgICAgICAgICAgU3RyaW5nIGhhdmluZywgU3RyaW5nIHNvcnRPcmRlciwgU3RyaW5nIGxpbWl0KSB7CiAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBjb21wdXRlUHJvamVjdGlvbihwcm9qZWN0aW9uSW4pOwogCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgd2hlcmUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMzk0LDYgKzM5MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kJ3Mgc2lnbmF0dXJlIGlzIG1pc2xlYWRpbmcgc2luY2Ugbm8gU1FMIHBhcmFtZXRlcgorICAgICAqIHN1YnN0aXR1dGlvbiBpcyBjYXJyaWVkIG91dC4gIFRoZSBzZWxlY3Rpb24gYXJndW1lbnRzIHBhcmFtZXRlciBkb2VzIG5vdCBnZXQKKyAgICAgKiB1c2VkIGF0IGFsbC4gIFRvIGF2b2lkIGNvbmZ1c2lvbiwgY2FsbAorICAgICAqIHtAbGluayAjYnVpbGRRdWVyeShTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFN0cmluZyBidWlsZFF1ZXJ5KAorICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbkluLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIGdyb3VwQnksIFN0cmluZyBoYXZpbmcsIFN0cmluZyBzb3J0T3JkZXIsIFN0cmluZyBsaW1pdCkgeworICAgICAgICByZXR1cm4gYnVpbGRRdWVyeShwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLCBzb3J0T3JkZXIsIGxpbWl0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBTRUxFQ1Qgc3RhdGVtZW50IHN1aXRhYmxlIGZvciB1c2UgaW4gYSBncm91cCBvZgogICAgICAqIFNFTEVDVCBzdGF0ZW1lbnRzIHRoYXQgd2lsbCBiZSBqb2luZWQgdGhyb3VnaCBVTklPTiBvcGVyYXRvcnMKICAgICAgKiBpbiBidWlsZFVuaW9uUXVlcnkuCkBAIC00MjIsMTAgKzQzMSw2IEBACiAgICAgICogICBmb3JtYXR0ZWQgYXMgYW4gU1FMIFdIRVJFIGNsYXVzZSAoZXhjbHVkaW5nIHRoZSBXSEVSRQogICAgICAqICAgaXRzZWxmKS4gIFBhc3NpbmcgbnVsbCB3aWxsIHJldHVybiBhbGwgcm93cyBmb3IgdGhlIGdpdmVuCiAgICAgICogICBVUkwuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgWW91IG1heSBpbmNsdWRlID9zIGluIHNlbGVjdGlvbiwgd2hpY2gKLSAgICAgKiAgIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlcyBmcm9tIHNlbGVjdGlvbkFyZ3MsIGluIG9yZGVyCi0gICAgICogICB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBzZWxlY3Rpb24uICBUaGUgdmFsdWVzIHdpbGwgYmUgYm91bmQKLSAgICAgKiAgIGFzIFN0cmluZ3MuCiAgICAgICogQHBhcmFtIGdyb3VwQnkgQSBmaWx0ZXIgZGVjbGFyaW5nIGhvdyB0byBncm91cCByb3dzLCBmb3JtYXR0ZWQKICAgICAgKiAgIGFzIGFuIFNRTCBHUk9VUCBCWSBjbGF1c2UgKGV4Y2x1ZGluZyB0aGUgR1JPVVAgQlkgaXRzZWxmKS4KICAgICAgKiAgIFBhc3NpbmcgbnVsbCB3aWxsIGNhdXNlIHRoZSByb3dzIHRvIG5vdCBiZSBncm91cGVkLgpAQCAtNDQzLDcgKzQ0OCw2IEBACiAgICAgICAgICAgICBpbnQgY29tcHV0ZWRDb2x1bW5zT2Zmc2V0LAogICAgICAgICAgICAgU3RyaW5nIHR5cGVEaXNjcmltaW5hdG9yVmFsdWUsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBncm91cEJ5LAogICAgICAgICAgICAgU3RyaW5nIGhhdmluZykgewogICAgICAgICBpbnQgdW5pb25Db2x1bW5zQ291bnQgPSB1bmlvbkNvbHVtbnMubGVuZ3RoOwpAQCAtNDYzLDEyICs0NjcsMzYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gYnVpbGRRdWVyeSgKLSAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgZ3JvdXBCeSwgaGF2aW5nLAorICAgICAgICAgICAgICAgIHByb2plY3Rpb25Jbiwgc2VsZWN0aW9uLCBncm91cEJ5LCBoYXZpbmcsCiAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0T3JkZXIgKi8sCiAgICAgICAgICAgICAgICAgbnVsbCAvKiBsaW1pdCAqLyk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QncyBzaWduYXR1cmUgaXMgbWlzbGVhZGluZyBzaW5jZSBubyBTUUwgcGFyYW1ldGVyCisgICAgICogc3Vic3RpdHV0aW9uIGlzIGNhcnJpZWQgb3V0LiAgVGhlIHNlbGVjdGlvbiBhcmd1bWVudHMgcGFyYW1ldGVyIGRvZXMgbm90IGdldAorICAgICAqIHVzZWQgYXQgYWxsLiAgVG8gYXZvaWQgY29uZnVzaW9uLCBjYWxsCisgICAgICoge0BsaW5rICNidWlsZFVuaW9uU3ViUXVlcnl9CisgICAgICogaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRVbmlvblN1YlF1ZXJ5KAorICAgICAgICAgICAgU3RyaW5nIHR5cGVEaXNjcmltaW5hdG9yQ29sdW1uLAorICAgICAgICAgICAgU3RyaW5nW10gdW5pb25Db2x1bW5zLAorICAgICAgICAgICAgU2V0PFN0cmluZz4gY29sdW1uc1ByZXNlbnRJblRhYmxlLAorICAgICAgICAgICAgaW50IGNvbXB1dGVkQ29sdW1uc09mZnNldCwKKyAgICAgICAgICAgIFN0cmluZyB0eXBlRGlzY3JpbWluYXRvclZhbHVlLAorICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgZ3JvdXBCeSwKKyAgICAgICAgICAgIFN0cmluZyBoYXZpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkVW5pb25TdWJRdWVyeSgKKyAgICAgICAgICAgICAgICB0eXBlRGlzY3JpbWluYXRvckNvbHVtbiwgdW5pb25Db2x1bW5zLCBjb2x1bW5zUHJlc2VudEluVGFibGUsCisgICAgICAgICAgICAgICAgY29tcHV0ZWRDb2x1bW5zT2Zmc2V0LCB0eXBlRGlzY3JpbWluYXRvclZhbHVlLCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgZ3JvdXBCeSwgaGF2aW5nKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHaXZlbiBhIHNldCBvZiBzdWJxdWVyaWVzLCBhbGwgb2Ygd2hpY2ggYXJlIFNFTEVDVCBzdGF0ZW1lbnRzLAogICAgICAqIGNvbnN0cnVjdCBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgdW5pb24gb2Ygd2hhdCB0aG9zZQogICAgICAqIHN1YnF1ZXJpZXMgcmV0dXJuLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggY2Q1Y2VlYi4uNDk0ZTkyMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0yMSw2ICsyMSw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKwogLyoqCiAgKiBDbGFzcyB0aGF0IGFuc3dlcnMgcXVlcmllcyBhYm91dCB0aGUgc3RhdGUgb2YgbmV0d29yayBjb25uZWN0aXZpdHkuIEl0IGFsc28KICAqIG5vdGlmaWVzIGFwcGxpY2F0aW9ucyB3aGVuIG5ldHdvcmsgY29ubmVjdGl2aXR5IGNoYW5nZXMuIEdldCBhbiBpbnN0YW5jZQpAQCAtMzM3LDggKzM0MCwyOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgbmV0d29ya1R5cGUsIGludCBob3N0QWRkcmVzcykgeworICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKGhvc3RBZGRyZXNzKTsKKworICAgICAgICBpZiAoaW5ldEFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RSb3V0ZVRvSG9zdEFkZHJlc3MobmV0d29ya1R5cGUsIGluZXRBZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogaG9zdCB2aWEgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGludGVyZmFjZS4gQW4gYXR0ZW1wdCB0byBhZGQgYSByb3V0ZSB0aGF0CisgICAgICogYWxyZWFkeSBleGlzdHMgaXMgaWdub3JlZCwgYnV0IHRyZWF0ZWQgYXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya1R5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldHdvcmsgb3ZlciB3aGljaCB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBob3N0IGlzIHRvIGJlIHJvdXRlZAorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhpbnQgbmV0d29ya1R5cGUsIEluZXRBZGRyZXNzIGhvc3RBZGRyZXNzKSB7CisgICAgICAgIGJ5dGVbXSBhZGRyZXNzID0gaG9zdEFkZHJlc3MuZ2V0QWRkcmVzcygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlcXVlc3RSb3V0ZVRvSG9zdChuZXR3b3JrVHlwZSwgaG9zdEFkZHJlc3MpOworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlcXVlc3RSb3V0ZVRvSG9zdEFkZHJlc3MobmV0d29ya1R5cGUsIGFkZHJlc3MpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IGI3MzRhYzcuLmFmY2NkZDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC00Nyw2ICs0Nyw4IEBACiAKICAgICBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgbmV0d29ya1R5cGUsIGludCBob3N0QWRkcmVzcyk7CiAKKyAgICBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdEFkZHJlc3MoaW50IG5ldHdvcmtUeXBlLCBpbiBieXRlW10gaG9zdEFkZHJlc3MpOworCiAgICAgYm9vbGVhbiBnZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKTsKIAogICAgIHZvaWQgc2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKGJvb2xlYW4gYWxsb3dCYWNrZ3JvdW5kRGF0YSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA0ZDg5ZGYzLi4wNGIwZjEyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAoraW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yMyw3ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKQEAgLTQ5NSwxNyArNDk2LDE2IEBACiAgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAogICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgogICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgeworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewogICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgSW50ZWdlci50b0hleFN0cmluZyhob3N0QWRkcmVzcykgKworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIGhvc3RBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKwogICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUgKyAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgaG9zdEFkZHJlc3MgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcykgPT0gMDsKKyAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCmluZGV4IGFhM2U5MjJmLi4yMzNhZDIxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKQEAgLTE4LDEzICsxOCwxNCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogCkBAIC0xMzMsMTMgKzEzNCwxOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFtUHJpdmF0ZURuc1JvdXRlU2V0KSB7CiAgICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyU3RyaW5nIDogZ2V0TmFtZVNlcnZlcnMoKSkgewotICAgICAgICAgICAgICAgIGludCBhZGRyID0gTmV0d29ya1V0aWxzLmxvb2t1cEhvc3QoYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gLTEgJiYgYWRkciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiAgYWRkaW5nICIrYWRkclN0cmluZysiICgiK2FkZHIrIikiKTsKLSAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkclN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgIGFkZGluZyAiICsgYWRkclN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MsIG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBETlMgYWRkcmVzcyAiICsgYWRkclN0cmluZyArICIgOiBFeGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2Miw4ICsxNjgsMTUgQEAKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgbURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuc2V0RGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICBpZiAoaW5ldEFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIG1EZWZhdWx0R2F0ZXdheUFkZHIgRXJyb3IiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MsIG51bGwpOworICAgICAgICAgICAgICAgIGlmICghTmV0d29ya1V0aWxzLmFkZERlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MpICYmIERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIgIFVuYWJsZSB0byBhZGQgZGVmYXVsdCByb3V0ZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQwMCw3ICs0MTMsNyBAQAogICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgaG9zdEFkZHJlc3MpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCmluZGV4IDgxMzYyYzkuLjhiZGZkZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKQEAgLTE3LDI1ICsxNywzOSBAQAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NkFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCiAvKioKICAqIE5hdGl2ZSBtZXRob2RzIGZvciBtYW5hZ2luZyBuZXR3b3JrIGludGVyZmFjZXMuCiAgKgogICoge0BoaWRlfQogICovCiBwdWJsaWMgY2xhc3MgTmV0d29ya1V0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1V0aWxzIjsKKwogICAgIC8qKiBCcmluZyB0aGUgbmFtZWQgbmV0d29yayBpbnRlcmZhY2UgdXAuICovCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGVuYWJsZUludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKICAgICAvKiogQnJpbmcgdGhlIG5hbWVkIG5ldHdvcmsgaW50ZXJmYWNlIGRvd24uICovCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGRpc2FibGVJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUpOwogCi0gICAgLyoqIEFkZCBhIHJvdXRlIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCB2aWEgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgYWRkSG9zdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgaG9zdGFkZHIpOwotCi0gICAgLyoqIEFkZCBhIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IHNldERlZmF1bHRSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGd3YXlBZGRyKTsKKyAgICAvKioKKyAgICAgKiBBZGQgYSByb3V0ZSB0byB0aGUgcm91dGluZyB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIHRoZSBpbnRlcmZhY2UgdG8gcm91dGUgdGhyb3VnaC4KKyAgICAgKiBAcGFyYW0gZHN0IHRoZSBuZXR3b3JrIG9yIGhvc3QgdG8gcm91dGUgdG8uIE1heSBiZSBJUHY0IG9yIElQdjYsIGUuZy4KKyAgICAgKiAiMC4wLjAuMCIgb3IgIjIwMDE6NDg2MDo6Ii4KKyAgICAgKiBAcGFyYW0gcHJlZml4TGVuZ3RoIHRoZSBwcmVmaXggbGVuZ3RoIG9mIHRoZSByb3V0ZS4KKyAgICAgKiBAcGFyYW0gZ3cgdGhlIGdhdGV3YXkgdG8gdXNlLCBlLmcuLCAiMTkyLjE2OC4yNTEuMSIuIElmIG51bGwsCisgICAgICogaW5kaWNhdGVzIGEgZGlyZWN0bHktY29ubmVjdGVkIHJvdXRlLgorICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBhZGRSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGRzdCwKKyAgICAgICAgICBpbnQgcHJlZml4TGVuZ3RoLCBTdHJpbmcgZ3cpOwogCiAgICAgLyoqIFJldHVybiB0aGUgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKQEAgLTEwNiwyNyArMTIwLDc5IEBACiAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgaXBBZGRyZXNzLCBpbnQgbmV0bWFzaywgaW50IGdhdGV3YXksIGludCBkbnMxLCBpbnQgZG5zMik7CiAKICAgICAvKioKLSAgICAgKiBMb29rIHVwIGEgaG9zdCBuYW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhbiBpbnQuIFdvcmtzIGlmIHRoZSBhcmd1bWVudAotICAgICAqIGlzIGFuIElQIGFkZHJlc3MgaW4gZG90IG5vdGF0aW9uLiBPYnZpb3VzbHksIHRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3IgSVB2NAotICAgICAqIGFkZHJlc3Nlcy4KLSAgICAgKiBAcGFyYW0gaG9zdG5hbWUgdGhlIG5hbWUgb2YgdGhlIGhvc3QgKG9yIHRoZSBJUCBhZGRyZXNzKQotICAgICAqIEByZXR1cm4gdGhlIElQIGFkZHJlc3MgYXMgYW4ge0Bjb2RlIGludH0gaW4gbmV0d29yayBieXRlIG9yZGVyCisgICAgICogQ29udmVydCBhIElQdjQgYWRkcmVzcyBmcm9tIGFuIGludGVnZXIgdG8gYW4gSW5ldEFkZHJlc3MuCisgICAgICogQHBhcmFtIGhvc3RBZGRyIGlzIGFuIEludCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJUHY0IGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyCisgICAgICogQHJldHVybiB0aGUgSVAgYWRkcmVzcyBhcyBhbiB7QGNvZGUgSW5ldEFkZHJlc3N9LCByZXR1cm5zIG51bGwgaWYKKyAgICAgKiB1bmFibGUgdG8gY29udmVydCBvciBpZiB0aGUgaW50IGlzIGFuIGludmFsaWQgYWRkcmVzcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBsb29rdXBIb3N0KFN0cmluZyBob3N0bmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgaW50VG9JbmV0QWRkcmVzcyhpbnQgaG9zdEFkZHJlc3MpIHsKICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3M7CisgICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMgPSB7IChieXRlKSgweGZmICYgaG9zdEFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkoMHhmZiAmIChob3N0QWRkcmVzcyA+PiA4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSgweGZmICYgKGhvc3RBZGRyZXNzID4+IDE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSgweGZmICYgKGhvc3RBZGRyZXNzID4+IDI0KSkgfTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdG5hbWUpOwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlcyk7CisgICAgICAgIH0gY2F0Y2goVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBieXRlW10gYWRkckJ5dGVzOwotICAgICAgICBpbnQgYWRkcjsKLSAgICAgICAgYWRkckJ5dGVzID0gaW5ldEFkZHJlc3MuZ2V0QWRkcmVzcygpOwotICAgICAgICBhZGRyID0gKChhZGRyQnl0ZXNbM10gJiAweGZmKSA8PCAyNCkKLSAgICAgICAgICAgICAgICB8ICgoYWRkckJ5dGVzWzJdICYgMHhmZikgPDwgMTYpCi0gICAgICAgICAgICAgICAgfCAoKGFkZHJCeXRlc1sxXSAmIDB4ZmYpIDw8IDgpCi0gICAgICAgICAgICAgICAgfCAgKGFkZHJCeXRlc1swXSAmIDB4ZmYpOwotICAgICAgICByZXR1cm4gYWRkcjsKKworICAgICAgICByZXR1cm4gaW5ldEFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgZ2F0ZXdheS4KKyAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIHJvdXRlIHNob3VsZCBiZSBhZGRlZAorICAgICAqIEBwYXJhbSBndyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgZ2F0ZXdheSB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkRGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBJbmV0QWRkcmVzcyBndykgeworICAgICAgICBTdHJpbmcgZHN0U3RyOworICAgICAgICBTdHJpbmcgZ3dTdHIgPSBndy5nZXRIb3N0QWRkcmVzcygpOworCisgICAgICAgIGlmIChndyBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgeworICAgICAgICAgICAgZHN0U3RyID0gIjAuMC4wLjAiOworICAgICAgICB9IGVsc2UgaWYgKGd3IGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKSB7CisgICAgICAgICAgICBkc3RTdHIgPSAiOjoiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZhaWx1cmU6IGFkZHJlc3MgaXMgbmVpdGhlciBJUHY0IG5vciBJUHY2IiArCisgICAgICAgICAgICAgICAgICAgICAgICIoIiArIGd3U3RyICsgIikiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkUm91dGUoaW50ZXJmYWNlTmFtZSwgZHN0U3RyLCAwLCBnd1N0cikgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBob3N0IHJvdXRlLgorICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIGludGVyZmFjZSBvbiB3aGljaCB0aGUgcm91dGUgc2hvdWxkIGJlIGFkZGVkCisgICAgICogQHBhcmFtIGRzdCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiB0aGlzIHNob3VsZCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZ3cgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGdhdGV3YXkgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQsCisgICAgICogaWYgbnVsbCwgaW5kaWNhdGVzIGEgZGlyZWN0bHktY29ubmVjdGVkIHJvdXRlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRIb3N0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIEluZXRBZGRyZXNzIGRzdCwKKyAgICAgICAgICBJbmV0QWRkcmVzcyBndykgeworICAgICAgICBpZiAoZHN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImFkZEhvc3RSb3V0ZTogZHN0IHNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByZWZpeExlbmd0aDsKKyAgICAgICAgU3RyaW5nIGRzdFN0ciA9IGRzdC5nZXRIb3N0QWRkcmVzcygpOworICAgICAgICBTdHJpbmcgZ3dTdHIgPSAoZ3cgIT0gbnVsbCkgPyBndy5nZXRIb3N0QWRkcmVzcygpIDogbnVsbDsKKworICAgICAgICBpZiAoZHN0IGluc3RhbmNlb2YgSW5ldDRBZGRyZXNzKSB7CisgICAgICAgICAgICBwcmVmaXhMZW5ndGggPSAzMjsKKyAgICAgICAgfSBlbHNlIGlmIChkc3QgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIHsKKyAgICAgICAgICAgIHByZWZpeExlbmd0aCA9IDEyODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImFkZEhvc3RSb3V0ZSBmYWlsdXJlOiBhZGRyZXNzIGlzIG5laXRoZXIgSVB2NCBub3IgSVB2NiIgKworICAgICAgICAgICAgICAgICAgICAgICAiKCIgKyBkc3QgKyAiKSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRSb3V0ZShpbnRlcmZhY2VOYW1lLCBkc3RTdHIsIHByZWZpeExlbmd0aCwgZ3dTdHIpID09IDA7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgdjRTdHJpbmdUb0ludChTdHJpbmcgc3RyKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCmluZGV4IDY2ZWVmYjIuLmMxZmE1YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCkBAIC0xNiwxMiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEubmV0LlVSSTsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKIC8qKgpAQCAtMTIwLDQgKzEyNCw3MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHdyYXBwZXIKKyAgICAgKiBhcm91bmQge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0uIEN1cnJlbnRseSBubyBwcm94eSB3aWxsCisgICAgICogYmUgcmV0dXJuZWQgZm9yIGxvY2FsaG9zdCBvciBpZiB0aGUgYWN0aXZlIG5ldHdvcmsgaXMgV2ktRmkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0bworICAgICAqIHtAbGluayBhbmRyb2lkLm5ldC5Qcm94eSNnZXRIb3N0KCl9CisgICAgICogQHBhcmFtIHVybCB0aGUgdGFyZ2V0IFVSTCBmb3IgdGhlIHJlcXVlc3QKKyAgICAgKiBAbm90ZSBDYWxsaW5nIHRoaXMgbWV0aG9kIHJlcXVpcmVzIHBlcm1pc3Npb24KKyAgICAgKiBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUKKyAgICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgcHJveHkgdG8gYmUgdXNlZCBieSBjbGllbnRzLCBvciBudWxsIGlmIHRoZXJlCisgICAgICogaXMgbm8gcHJveHkuCisgICAgICoKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIHB1YmxpYyBIdHRwSG9zdCBnZXRQcmVmZXJyZWRIdHRwSG9zdChDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmICghaXNMb2NhbEhvc3QodXJsKSAmJiAhaXNOZXR3b3JrV2lmaShjb250ZXh0KSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3h5SG9zdCA9IFByb3h5LmdldEhvc3QoY29udGV4dCk7CisgICAgICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBIb3N0KHByb3h5SG9zdCwgUHJveHkuZ2V0UG9ydChjb250ZXh0KSwgImh0dHAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNMb2NhbEhvc3QoU3RyaW5nIHVybCkgeworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSh1cmwpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhvc3QgPSB1cmkuZ2V0SG9zdCgpOworICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IEluZXRBZGRyZXNzLmlzTG9vcGJhY2tBZGRyZXNzIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsaG9zdC4gSG93ZXZlciBubyBwdWJsaWMgZmFjdG9yeSBtZXRob2RzIGV4aXN0IHdoaWNoCisgICAgICAgICAgICAgICAgLy8gY2FuIGJlIHVzZWQgd2l0aG91dCB0cmlnZ2VyaW5nIEROUyBsb29rdXAgaWYgaG9zdCBpcyBub3QgbG9jYWxob3N0LgorICAgICAgICAgICAgICAgIGlmIChob3N0LmVxdWFsc0lnbm9yZUNhc2UoImxvY2FsaG9zdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LmVxdWFscygiMTI3LjAuMC4xIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZXF1YWxzKCJbOjoxXSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlleCkgeworICAgICAgICAgICAgLy8gSWdub3JlIChVUkkuY3JlYXRlKQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHkgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBpbmZvID0gY29ubmVjdGl2aXR5LmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCmluZGV4IDA3NTcyOTMuLjhkYzJhODYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKQEAgLTc5LDYgKzc5LDkgQEAKICAgICAvLyBHemlwIG9mIGRhdGEgc2hvcnRlciB0aGFuIHRoaXMgcHJvYmFibHkgd29uJ3QgYmUgd29ydGh3aGlsZQogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBERUZBVUxUX1NZTkNfTUlOX0daSVBfQllURVMgPSAyNTY7CiAKKyAgICAvLyBEZWZhdWx0IGNvbm5lY3Rpb24gYW5kIHNvY2tldCB0aW1lb3V0IG9mIDYwIHNlY29uZHMuICBUd2VhayB0byB0YXN0ZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX09QRVJBVElPTl9USU1FT1VUID0gNjAgKiAxMDAwOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbmRyb2lkSHR0cENsaWVudCI7CiAKIApAQCAtMTA3LDkgKzExMCw4IEBACiAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCB3b3J0aCBpdCB0byBwYXkgdGhlIHBlbmFsdHkgb2YgY2hlY2tpbmcgZXZlcnkgdGltZS4KICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U3RhbGVDaGVja2luZ0VuYWJsZWQocGFyYW1zLCBmYWxzZSk7CiAKLSAgICAgICAgLy8gRGVmYXVsdCBjb25uZWN0aW9uIGFuZCBzb2NrZXQgdGltZW91dCBvZiAyMCBzZWNvbmRzLiAgVHdlYWsgdG8gdGFzdGUuCi0gICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldENvbm5lY3Rpb25UaW1lb3V0KHBhcmFtcywgNjAgKiAxMDAwKTsKLSAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U29UaW1lb3V0KHBhcmFtcywgNjAgKiAxMDAwKTsKKyAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLCBTT0NLRVRfT1BFUkFUSU9OX1RJTUVPVVQpOworICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCBTT0NLRVRfT1BFUkFUSU9OX1RJTUVPVVQpOwogICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb2NrZXRCdWZmZXJTaXplKHBhcmFtcywgODE5Mik7CiAKICAgICAgICAgLy8gRG9uJ3QgaGFuZGxlIHJlZGlyZWN0cyAtLSByZXR1cm4gdGhlbSB0byB0aGUgY2FsbGVyLiAgT3VyIGNvZGUKQEAgLTEyNSw3ICsxMjcsOCBAQAogICAgICAgICBzY2hlbWVSZWdpc3RyeS5yZWdpc3RlcihuZXcgU2NoZW1lKCJodHRwIiwKICAgICAgICAgICAgICAgICBQbGFpblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpLCA4MCkpOwogICAgICAgICBzY2hlbWVSZWdpc3RyeS5yZWdpc3RlcihuZXcgU2NoZW1lKCJodHRwcyIsCi0gICAgICAgICAgICAgICAgU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmdldEh0dHBTb2NrZXRGYWN0b3J5KDMwICogMTAwMCwgc2Vzc2lvbkNhY2hlKSwgNDQzKSk7CisgICAgICAgICAgICAgICAgU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmdldEh0dHBTb2NrZXRGYWN0b3J5KAorICAgICAgICAgICAgICAgIFNPQ0tFVF9PUEVSQVRJT05fVElNRU9VVCwgc2Vzc2lvbkNhY2hlKSwgNDQzKSk7CiAKICAgICAgICAgQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgbWFuYWdlciA9CiAgICAgICAgICAgICAgICAgbmV3IFRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcihwYXJhbXMsIHNjaGVtZVJlZ2lzdHJ5KTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlVmFsaWRhdG9yQ2FjaGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlVmFsaWRhdG9yQ2FjaGUuamF2YQppbmRleCA0NzY2MWQ1Li5hODlmNzVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVWYWxpZGF0b3JDYWNoZS5qYXZhCkBAIC0xMzcsOCArMTM3LDggQEAKIAogICAgICAgICBpZiAoZG9tYWluICE9IG51bGwgJiYgZG9tYWluLmxlbmd0aCgpICE9IDApIHsKICAgICAgICAgICAgIGlmIChzZWN1cmVIYXNoICE9IG51bGwgJiYgc2VjdXJlSGFzaC5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KW1DYWNoZU1hcC5nZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG1CaWdTY3JldyBeIGRvbWFpbi5oYXNoQ29kZSgpKSk7CisgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihtQmlnU2NyZXcgXiBkb21haW4uaGFzaENvZGUoKSk7CisgICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbUNhY2hlTWFwLmdldChrZXkpOwogICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZUVudHJ5LmV4cGlyZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcnZhbCA9IGNhY2hlRW50cnkuaGFzKGRvbWFpbiwgc2VjdXJlSGFzaCk7CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRlYnVnIG9ubHkhCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVNYXAucmVtb3ZlKGNhY2hlRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlTWFwLnJlbW92ZShrZXkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSGVhZGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSGVhZGVycy5qYXZhCmluZGV4IDA5ZjZmNGYuLjc0YzBkZTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0hlYWRlcnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9IZWFkZXJzLmphdmEKQEAgLTI2Miw3ICsyNjIsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhBU0hfQ0FDSEVfQ09OVFJPTDoKICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhDQUNIRV9DT05UUk9MKSkgewotICAgICAgICAgICAgICAgIG1IZWFkZXJzW0lEWF9DQUNIRV9DT05UUk9MXSA9IHZhbDsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdoZXJlIHdlIHJlY2VpdmUgbW9yZSB0aGFuIG9uZSBoZWFkZXIsIGNyZWF0ZSBhICcsJyBzZXBhcmF0ZWQgbGlzdC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBvaywgYWNjb3JkaW5nIHRvIFJGQyAyNjE2IGNoYXB0ZXIgNC4yCisgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXJzW0lEWF9DQUNIRV9DT05UUk9MXSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzW0lEWF9DQUNIRV9DT05UUk9MXS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNbSURYX0NBQ0hFX0NPTlRST0xdICs9ICgnLCcgKyB2YWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzW0lEWF9DQUNIRV9DT05UUk9MXSA9IHZhbDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIQVNIX0xBU1RfTU9ESUZJRUQ6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9IdHRwc0Nvbm5lY3Rpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBzQ29ubmVjdGlvbi5qYXZhCmluZGV4IGIzNjFkY2EuLmQ3N2U5ZDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBzQ29ubmVjdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBzQ29ubmVjdGlvbi5qYXZhCkBAIC0yMDUsMTAgKzIwNSwxMyBAQAogICAgICAgICAgICAgICAgIEJhc2ljSHR0cFJlcXVlc3QgcHJveHlSZXEgPSBuZXcgQmFzaWNIdHRwUmVxdWVzdAogICAgICAgICAgICAgICAgICAgICAoIkNPTk5FQ1QiLCBtSG9zdC50b0hvc3RTdHJpbmcoKSk7CiAKLSAgICAgICAgICAgICAgICAvLyBhZGQgYWxsICdwcm94eScgaGVhZGVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0CisgICAgICAgICAgICAgICAgLy8gYWRkIGFsbCAncHJveHknIGhlYWRlcnMgZnJvbSB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgd2UgYWxzbyBuZWVkCisgICAgICAgICAgICAgICAgLy8gdG8gYWRkICdob3N0JyBoZWFkZXIgdW5sZXNzIHdlIHdhbnQgcHJveHkgdG8gYW5zd2VyIHVzIHdpdGggYQorICAgICAgICAgICAgICAgIC8vIDQwMCBCYWQgUmVxdWVzdAogICAgICAgICAgICAgICAgIGZvciAoSGVhZGVyIGggOiByZXEubUh0dHBSZXF1ZXN0LmdldEFsbEhlYWRlcnMoKSkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IGguZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLnN0YXJ0c1dpdGgoInByb3h5IikgfHwgaGVhZGVyTmFtZS5lcXVhbHMoImtlZXAtYWxpdmUiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS5zdGFydHNXaXRoKCJwcm94eSIpIHx8IGhlYWRlck5hbWUuZXF1YWxzKCJrZWVwLWFsaXZlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBoZWFkZXJOYW1lLmVxdWFscygiaG9zdCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVJlcS5hZGRIZWFkZXIoaCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0SGFuZGxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0SGFuZGxlLmphdmEKaW5kZXggMTAzZmQ5NC4uMmM0OGEwNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdEhhbmRsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL1JlcXVlc3RIYW5kbGUuamF2YQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgIFN0cmluZyBBMiA9IG1NZXRob2QgICsgIjoiICsgbVVybDsKIAogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvIG5vdCBwcmVlbXB0aXZlbHkgc2VuZCBhdXRob3JpemF0aW9uIGhlYWRlcnMsIG5jIGlzIGFsd2F5cyAxCi0gICAgICAgIFN0cmluZyBuYyA9ICIwMDAwMDEiOworICAgICAgICBTdHJpbmcgbmMgPSAiMDAwMDAwMDEiOwogICAgICAgICBTdHJpbmcgY25vbmNlID0gY29tcHV0ZUNub25jZSgpOwogICAgICAgICBTdHJpbmcgZGlnZXN0ID0gY29tcHV0ZURpZ2VzdChBMSwgQTIsIG5vbmNlLCBRT1AsIG5jLCBjbm9uY2UpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CYXR0ZXJ5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmF0dGVyeU1hbmFnZXIuamF2YQppbmRleCA0NGI3M2M1Li5iZDU3YjMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CYXR0ZXJ5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0JhdHRlcnlNYW5hZ2VyLmphdmEKQEAgLTk5LDYgKzk5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0hFQUxUSF9ERUFEID0gNDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0hFQUxUSF9PVkVSX1ZPTFRBR0UgPSA1OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfSEVBTFRIX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfSEVBTFRIX0NPTEQgPSA3OwogCiAgICAgLy8gdmFsdWVzIG9mIHRoZSAicGx1Z2dlZCIgZmllbGQgaW4gdGhlIEFDVElPTl9CQVRURVJZX0NIQU5HRUQgaW50ZW50LgogICAgIC8vIFRoZXNlIG11c3QgYmUgcG93ZXJzIG9mIDIuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CaW5kZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0JpbmRlci5qYXZhCmluZGV4IGY4MjYwY2EuLmE0MDJjOTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0JpbmRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0JpbmRlci5qYXZhCkBAIC0zMjQsNiArMzI0LDEwIEBACiAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmVwbHkud3JpdGVFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICByZXMgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gcmUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeSIsIGUpOworICAgICAgICAgICAgcmVwbHkud3JpdGVFeGNlcHRpb24ocmUpOworICAgICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKaW5kZXggMmUxNDY2Ny4uODZmOWE2YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCkBAIC05NCw3ICs5NCw4IEBACiAgICAgLyoqCiAgICAgICogRGVmYXVsdCB0cmFjZSBmaWxlIHBhdGggYW5kIGZpbGUKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFDRV9QQVRIX1BSRUZJWCA9ICIvc2RjYXJkLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFJBQ0VfUEFUSF9QUkVGSVggPQorICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyAiLyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFJBQ0VfQk9EWSA9ICJkbXRyYWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFDRV9FWFRFTlNJT04gPSAiLnRyYWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFDRV9GSUxFX1BBVEggPQpAQCAtMTI3LDcgKzEyOCw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgb3RoZXJQcml2YXRlRGlydHk7CiAgICAgICAgIC8qKiBUaGUgc2hhcmVkIGRpcnR5IHBhZ2VzIHVzZWQgYnkgZXZlcnl0aGluZyBlbHNlLiAqLwogICAgICAgICBwdWJsaWMgaW50IG90aGVyU2hhcmVkRGlydHk7Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBNZW1vcnlJbmZvKCkgewogICAgICAgICB9CiAKQEAgLTEzNywyMSArMTM4LDIxIEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxQc3MoKSB7CiAgICAgICAgICAgICByZXR1cm4gZGFsdmlrUHNzICsgbmF0aXZlUHNzICsgb3RoZXJQc3M7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybiB0b3RhbCBwcml2YXRlIGRpcnR5IG1lbW9yeSB1c2FnZSBpbiBrQi4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxQcml2YXRlRGlydHkoKSB7CiAgICAgICAgICAgICByZXR1cm4gZGFsdmlrUHJpdmF0ZURpcnR5ICsgbmF0aXZlUHJpdmF0ZURpcnR5ICsgb3RoZXJQcml2YXRlRGlydHk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybiB0b3RhbCBzaGFyZWQgZGlydHkgbWVtb3J5IHVzYWdlIGluIGtCLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRUb3RhbFNoYXJlZERpcnR5KCkgewogICAgICAgICAgICAgcmV0dXJuIGRhbHZpa1NoYXJlZERpcnR5ICsgbmF0aXZlU2hhcmVkRGlydHkgKyBvdGhlclNoYXJlZERpcnR5OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0xNzksNyArMTgwLDcgQEAKICAgICAgICAgICAgIG90aGVyUHJpdmF0ZURpcnR5ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgICAgIG90aGVyU2hhcmVkRGlydHkgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxNZW1vcnlJbmZvPiBDUkVBVE9SID0gbmV3IENyZWF0b3I8TWVtb3J5SW5mbz4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgTWVtb3J5SW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lbW9yeUluZm8oc291cmNlKTsKQEAgLTQ2MCw3ICs0NjEsNyBAQAogICAgICAqIExpa2Ugc3RhcnRNZXRob2RUcmFjaW5nKFN0cmluZywgaW50LCBpbnQpLCBidXQgdGFraW5nIGFuIGFscmVhZHktb3BlbmVkCiAgICAgICogRmlsZURlc2NyaXB0b3IgaW4gd2hpY2ggdGhlIHRyYWNlIGlzIHdyaXR0ZW4uICBUaGUgZmlsZSBuYW1lIGlzIGFsc28KICAgICAgKiBzdXBwbGllZCBzaW1wbHkgZm9yIGxvZ2dpbmcuICBNYWtlcyBhIGR1cCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqIAorICAgICAqCiAgICAgICogTm90IGV4cG9zZWQgaW4gdGhlIFNESyB1bmxlc3Mgd2UgYXJlIHJlYWxseSBjb21mb3J0YWJsZSB3aXRoIHN1cHBvcnRpbmcKICAgICAgKiB0aGlzIGFuZCBmaW5kIGl0IHdvdWxkIGJlIHVzZWZ1bC4KICAgICAgKiBAaGlkZQpAQCAtMTA3MCw3ICsxMDcxLDcgQEAKICAgICAgKiAgICBzdGF0aWMgewogICAgICAqICAgICAgICAvLyBTZXRzIGFsbCB0aGUgZmllbGRzCiAgICAgICogICAgICAgIERlYnVnLnNldEZpZWxkc09uKE15RGVidWdWYXJzLmNsYXNzKTsKLSAgICAgKiAKKyAgICAgKgogICAgICAqICAgICAgICAvLyBTZXRzIG9ubHkgdGhlIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCBARGVidWcuRGVidWdQcm9wZXJ0eQogICAgICAqICAgICAgICAvLyBEZWJ1Zy5zZXRGaWVsZHNPbihNeURlYnVnVmFycy5jbGFzcywgdHJ1ZSk7CiAgICAgICogICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRHJvcEJveE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0Ryb3BCb3hNYW5hZ2VyLmphdmEKaW5kZXggYTQ3YzY2YS4uZTFjMTY3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRHJvcEJveE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Ecm9wQm94TWFuYWdlci5qYXZhCkBAIC01OCw2ICs1OCwzMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNfQllURV9BUlJBWSA9IDg7CiAKICAgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBUaGlzIGlzIGJyb2FkY2FzdCB3aGVuIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGluIHRoZSBkcm9wYm94LgorICAgICAqIFlvdSBtdXN0IGhvbGQgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9MT0dTfSBwZXJtaXNzaW9uCisgICAgICogaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGlzIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIDxwIGNsYXNzPSJub3RlIj5UaGlzIGlzIGEgcHJvdGVjdGVkIGludGVudCB0aGF0IGNhbiBvbmx5IGJlIHNlbnQKKyAgICAgKiBieSB0aGUgc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9EUk9QQk9YX0VOVFJZX0FEREVEID0KKyAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5EUk9QQk9YX0VOVFJZX0FEREVEIjsKKworICAgIC8qKgorICAgICAqIEV4dHJhIGZvciB7QGxpbmsgYW5kcm9pZC5vcy5Ecm9wQm94TWFuYWdlciNBQ1RJT05fRFJPUEJPWF9FTlRSWV9BRERFRH06CisgICAgICogc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRyb3Bib3ggdGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RBRyA9ICJ0YWciOworCisgICAgLyoqCisgICAgICogRXh0cmEgZm9yIHtAbGluayBhbmRyb2lkLm9zLkRyb3BCb3hNYW5hZ2VyI0FDVElPTl9EUk9QQk9YX0VOVFJZX0FEREVEfToKKyAgICAgKiBsb25nIGludGVnZXIgdmFsdWUgY29udGFpbmluZyB0aW1lIChpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIDAwOjAwOjAwIFVUQykKKyAgICAgKiB3aGVuIHRoZSBlbnRyeSB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9USU1FID0gInRpbWUiOworCisgICAgLyoqCiAgICAgICogQSBzaW5nbGUgZW50cnkgcmV0cmlldmVkIGZyb20gdGhlIGRyb3AgYm94LgogICAgICAqIFRoaXMgbWF5IGluY2x1ZGUgYSByZWZlcmVuY2UgdG8gYSBzdHJlYW0sIHNvIHlvdSBtdXN0IGNhbGwKICAgICAgKiB7QGxpbmsgI2Nsb3NlKCl9IHdoZW4geW91IGFyZSBkb25lIHVzaW5nIGl0LgpAQCAtMTY5LDcgKzE5MywxMiBAQAogICAgICAgICAgICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW21heEJ5dGVzXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIE1hdGgubWF4KDAsIGlzLnJlYWQoYnVmKSkpOworICAgICAgICAgICAgICAgIGludCByZWFkQnl0ZXMgPSAwOworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobiA+PSAwICYmIChyZWFkQnl0ZXMgKz0gbikgPCBtYXhCeXRlcykgeworICAgICAgICAgICAgICAgICAgICBuID0gaXMucmVhZChidWYsIHJlYWRCeXRlcywgbWF4Qnl0ZXMgLSByZWFkQnl0ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIHJlYWRCeXRlcyk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCmluZGV4IDQ5YjcyZmUuLjdkMTI4ZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKQEAgLTg1LDkgKzg1LDkgQEAKICAgICAvLyBzb21ldGltZXMgd2Ugc3RvcmUgbGlua2VkIGxpc3RzIG9mIHRoZXNlIHRoaW5ncwogICAgIC8qcGFja2FnZSovIE1lc3NhZ2UgbmV4dDsKIAotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBtUG9vbFN5bmMgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBtUG9vbDsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbVBvb2xTaXplID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1Bvb2xTeW5jID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2Ugc1Bvb2w7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNQb29sU2l6ZSA9IDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BPT0xfU0laRSA9IDEwOwogICAgIApAQCAtOTYsMTEgKzk2LDEyIEBACiAgICAgICogYXZvaWQgYWxsb2NhdGluZyBuZXcgb2JqZWN0cyBpbiBtYW55IGNhc2VzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBvYnRhaW4oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVBvb2xTeW5jKSB7Ci0gICAgICAgICAgICBpZiAobVBvb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1Qb29sOwotICAgICAgICAgICAgICAgIG1Qb29sID0gbS5uZXh0OworICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sU3luYykgeworICAgICAgICAgICAgaWYgKHNQb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBzUG9vbDsKKyAgICAgICAgICAgICAgICBzUG9vbCA9IG0ubmV4dDsKICAgICAgICAgICAgICAgICBtLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIHNQb29sU2l6ZS0tOwogICAgICAgICAgICAgICAgIHJldHVybiBtOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzcsMTIgKzIzOCwxMiBAQAogICAgICAqIGZyZWVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVBvb2xTeW5jKSB7Ci0gICAgICAgICAgICBpZiAobVBvb2xTaXplIDwgTUFYX1BPT0xfU0laRSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sU3luYykgeworICAgICAgICAgICAgaWYgKHNQb29sU2l6ZSA8IE1BWF9QT09MX1NJWkUpIHsKICAgICAgICAgICAgICAgICBjbGVhckZvclJlY3ljbGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuZXh0ID0gbVBvb2w7Ci0gICAgICAgICAgICAgICAgbVBvb2wgPSB0aGlzOworICAgICAgICAgICAgICAgIG5leHQgPSBzUG9vbDsKKyAgICAgICAgICAgICAgICBzUG9vbCA9IHRoaXM7CisgICAgICAgICAgICAgICAgc1Bvb2xTaXplKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00NTMsNCArNDU0LDMgQEAKICAgICAgICAgcmVwbHlUbyA9IE1lc3Nlbmdlci5yZWFkTWVzc2VuZ2VyT3JOdWxsRnJvbVBhcmNlbChzb3VyY2UpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9EaWFsb2dQcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0RpYWxvZ1ByZWZlcmVuY2UuamF2YQppbmRleCBiYmFkMmI2Li40NWM4MTc0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0RpYWxvZ1ByZWZlcmVuY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0RpYWxvZ1ByZWZlcmVuY2UuamF2YQpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RJbnB1dE1ldGhvZChEaWFsb2cgZGlhbG9nKSB7CiAgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBkaWFsb2cuZ2V0V2luZG93KCk7CiAgICAgICAgIHdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX1ZJU0lCTEUgfAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX1JFU0laRSk7CisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUEFOKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTGlzdFByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTGlzdFByZWZlcmVuY2UuamF2YQppbmRleCBmODQyZDc1Li5mNDRjYmU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZS5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cmllczsKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyeVZhbHVlczsKICAgICBwcml2YXRlIFN0cmluZyBtVmFsdWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVN1bW1hcnk7CiAgICAgcHJpdmF0ZSBpbnQgbUNsaWNrZWREaWFsb2dFbnRyeUluZGV4OwogICAgIAogICAgIHB1YmxpYyBMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewpAQCAtNDksOCArNTAsMTYgQEAKICAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0UHJlZmVyZW5jZV9lbnRyaWVzKTsKICAgICAgICAgbUVudHJ5VmFsdWVzID0gYS5nZXRUZXh0QXJyYXkoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMpOwogICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgUHJlZmVyZW5jZSBzdW1tYXJ5IGF0dHJpYnV0ZSBzaW5jZSBpdCdzIHByaXZhdGUKKyAgICAgICAgICogaW4gdGhlIFByZWZlcmVuY2UgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2UsIDAsIDApOworICAgICAgICBtU3VtbWFyeSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2Vfc3VtbWFyeSk7CisgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKICAgICB9CkBAIC0xMjcsNiArMTM2LDQzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3VtbWFyeSBvZiB0aGlzIExpc3RQcmVmZXJlbmNlLiBJZiB0aGUgc3VtbWFyeQorICAgICAqIGhhcyBhIHtAbGlua3BsYWluIGphdmEubGFuZy5TdHJpbmcjZm9ybWF0IFN0cmluZyBmb3JtYXR0aW5nfQorICAgICAqIG1hcmtlciBpbiBpdCAoaS5lLiAiJXMiIG9yICIlMSRzIiksIHRoZW4gdGhlIGN1cnJlbnQgZW50cnkKKyAgICAgKiB2YWx1ZSB3aWxsIGJlIHN1YnN0aXR1dGVkIGluIGl0cyBwbGFjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN1bW1hcnkgd2l0aCBhcHByb3ByaWF0ZSBzdHJpbmcgc3Vic3RpdHV0aW9uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5KCkgeworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgZW50cnkgPSBnZXRFbnRyeSgpOworICAgICAgICBpZiAobVN1bW1hcnkgPT0gbnVsbCB8fCBlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQobVN1bW1hcnksIGVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN1bW1hcnkgZm9yIHRoaXMgUHJlZmVyZW5jZSB3aXRoIGEgQ2hhclNlcXVlbmNlLgorICAgICAqIElmIHRoZSBzdW1tYXJ5IGhhcyBhCisgICAgICoge0BsaW5rcGxhaW4gamF2YS5sYW5nLlN0cmluZyNmb3JtYXQgU3RyaW5nIGZvcm1hdHRpbmd9CisgICAgICogbWFya2VyIGluIGl0IChpLmUuICIlcyIgb3IgIiUxJHMiKSwgdGhlbiB0aGUgY3VycmVudCBlbnRyeQorICAgICAqIHZhbHVlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4gaXRzIHBsYWNlIHdoZW4gaXQncyByZXRyaWV2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgc3VtbWFyeSBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeShDaGFyU2VxdWVuY2Ugc3VtbWFyeSkgeworICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHN1bW1hcnkpOworICAgICAgICBpZiAoc3VtbWFyeSA9PSBudWxsICYmIG1TdW1tYXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdW1tYXJ5ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5ICE9IG51bGwgJiYgIXN1bW1hcnkuZXF1YWxzKG1TdW1tYXJ5KSkgeworICAgICAgICAgICAgbVN1bW1hcnkgPSBzdW1tYXJ5LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSB0byB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUgZW50cnkgdmFsdWVzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIHRvIHNldC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKaW5kZXggOTVlNTQzMjQuLmZhZTVmMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCkBAIC04MCw2ICs4MCw4IEBACiAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtUm9vdEFkYXB0ZXI7CiAgICAgCiAgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwogICAgIAogICAgIC8qKgogICAgICAqIERvIE5PVCB1c2UgdGhpcyBjb25zdHJ1Y3RvciwgdXNlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNjcmVhdGVQcmVmZXJlbmNlU2NyZWVuKENvbnRleHQpfS4KQEAgLTE0NSwxNSArMTQ3LDE4IEBACiAgICAgCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dEaWFsb2coQnVuZGxlIHN0YXRlKSB7CiAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcgPSBuZXcgTGlzdFZpZXcoY29udGV4dCk7Ci0gICAgICAgIGJpbmQobGlzdFZpZXcpOworICAgICAgICBpZiAobUxpc3RWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1MaXN0VmlldyA9IG5ldyBMaXN0Vmlldyhjb250ZXh0KTsKKyAgICAgICAgYmluZChtTGlzdFZpZXcpOwogCiAgICAgICAgIC8vIFNldCB0aGUgdGl0bGUgYmFyIGlmIHRpdGxlIGlzIGF2YWlsYWJsZSwgZWxzZSBubyB0aXRsZSBiYXIKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRpdGxlID0gZ2V0VGl0bGUoKTsKICAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG1EaWFsb2cgPSBuZXcgRGlhbG9nKGNvbnRleHQsIFRleHRVdGlscy5pc0VtcHR5KHRpdGxlKQogICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ob1RpdGxlQmFyCiAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lKTsKLSAgICAgICAgZGlhbG9nLnNldENvbnRlbnRWaWV3KGxpc3RWaWV3KTsKKyAgICAgICAgZGlhbG9nLnNldENvbnRlbnRWaWV3KG1MaXN0Vmlldyk7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpKSB7CiAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUodGl0bGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCAwZmYxOTc2Li4zOGM1ZGM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTM2NDAsNyArMzY0MCw3IEBACiAgICAgICAgICAgICAgICAgd2hpbGUgKGludGVudCA9PSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZW50VVJJID0gYy5nZXRTdHJpbmcoYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coSU5URU5UKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQuZ2V0SW50ZW50KGludGVudFVSSSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQucGFyc2VVcmkoaW50ZW50VVJJLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdG9yZWQgVVJMIGlzIGJhZC4uLiAgaWdub3JlIGl0LgogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewpAQCAtMzY5OCw3ICszNjk4LDcgQEAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB2YWx1ZXMucHV0KFRJVExFLCB0aXRsZSk7CiAgICAgICAgICAgICBpZiAoZm9sZGVyICE9IG51bGwpIHZhbHVlcy5wdXQoRk9MREVSLCBmb2xkZXIpOwotICAgICAgICAgICAgdmFsdWVzLnB1dChJTlRFTlQsIGludGVudC50b1VSSSgpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoSU5URU5ULCBpbnRlbnQudG9VcmkoMCkpOwogICAgICAgICAgICAgaWYgKHNob3J0Y3V0ICE9IDApIHZhbHVlcy5wdXQoU0hPUlRDVVQsIChpbnQpIHNob3J0Y3V0KTsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoT1JERVJJTkcsIG9yZGVyaW5nKTsKICAgICAgICAgICAgIHJldHVybiBjci5pbnNlcnQoQ09OVEVOVF9VUkksIHZhbHVlcyk7CkBAIC0zNzUwLDcgKzM3NTAsNyBAQAogCiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50OwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQuZ2V0SW50ZW50KGludGVudFVyaSk7CisgICAgICAgICAgICAgICAgaW50ZW50ID0gSW50ZW50LnBhcnNlVXJpKGludGVudFVyaSwgMCk7CiAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255LmphdmEKaW5kZXggZjBmMmVjYi4uNjJmNjZiNiAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TcWxpdGVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwpAQCAtNTYxLDE1ICs1NjIsMjQgQEAKICAgICAgICAgICAgICAqIHZhbHVlczo8L3A+CiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogPHVsPgotICAgICAgICAgICAgICogICA8bGk+PGVtPnRyYW5zYWN0aW9uSWQgKEludGVnZXIpPC9lbT4gLSBUaGUgV0FQIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgKiAgICBJRDwvbGk+CisgICAgICAgICAgICAgKiAgIDxsaT48ZW0+dHJhbnNhY3Rpb25JZCAoSW50ZWdlcik8L2VtPiAtIFRoZSBXQVAgdHJhbnNhY3Rpb24gSUQ8L2xpPgogICAgICAgICAgICAgICogICA8bGk+PGVtPnBkdVR5cGUgKEludGVnZXIpPC9lbT4gLSBUaGUgV0FQIFBEVSB0eXBlPC9saT4KICAgICAgICAgICAgICAqICAgPGxpPjxlbT5oZWFkZXIgKGJ5dGVbXSk8L2VtPiAtIFRoZSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2U8L2xpPgogICAgICAgICAgICAgICogICA8bGk+PGVtPmRhdGEgKGJ5dGVbXSk8L2VtPiAtIFRoZSBkYXRhIHBheWxvYWQgb2YgdGhlIG1lc3NhZ2U8L2xpPgorICAgICAgICAgICAgICogICA8bGk+PGVtPmNvbnRlbnRUeXBlUGFyYW1ldGVycyAoSGFzaE1hcCZsdDtTdHJpbmcsU3RyaW5nJmd0Oyk8L2VtPgorICAgICAgICAgICAgICogICAtIEFueSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCB0eXBlCisgICAgICAgICAgICAgKiAgIChkZWNvZGVkIGZyb20gdGhlIFdTUCBDb250ZW50LVR5cGUgaGVhZGVyKTwvbGk+CiAgICAgICAgICAgICAgKiA8L3VsPgogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqIDxwPklmIGEgQnJvYWRjYXN0UmVjZWl2ZXIgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZSBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgKiB0aGlzIGludGVudCBpdCBzaG91bGQgc2V0IHRoZSByZXN1bHQgY29kZSBhcHByb3ByaWF0ZWx5LjwvcD4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiA8cD5UaGUgY29udGVudFR5cGVQYXJhbWV0ZXJzIGV4dHJhIHZhbHVlIGlzIG1hcCBvZiBjb250ZW50IHBhcmFtZXRlcnMga2V5ZWQgYnkKKyAgICAgICAgICAgICAqIHRoZWlyIG5hbWVzLjwvcD4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiA8cD5JZiBhbnkgdW5hc3NpZ25lZCB3ZWxsLWtub3duIHBhcmFtZXRlcnMgYXJlIGVuY291bnRlcmVkLCB0aGUga2V5IG9mIHRoZSBtYXAgd2lsbAorICAgICAgICAgICAgICogYmUgJ3VuYXNzaWduZWQvMHguLi4nLCB3aGVyZSAnLi4uJyBpcyB0aGUgaGV4IHZhbHVlIG9mIHRoZSB1bmFzc2lnbmVkIHBhcmFtZXRlci4gIElmCisgICAgICAgICAgICAgKiBhIHBhcmFtZXRlciBoYXMgTm8tVmFsdWUgdGhlIHZhbHVlIGluIHRoZSBtYXAgd2lsbCBiZSBudWxsLjwvcD4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUF9QVVNIX1JFQ0VJVkVEX0FDVElPTiA9CkBAIC01ODIsNyArNTkyLDcgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTV9GVUxMX0FDVElPTiA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNJTV9GVUxMIjsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNJTV9GVUxMIjsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBBbiBpbmNvbWluZyBTTVMgaGFzIGJlZW4gcmVqZWN0ZWQgYnkgdGhlCkBAIC0xNTI1LDcgKzE1MzUsOCBAQAogICAgICAgICAgICAgICogd2hpY2ggc3RyZWFtcyB0aGUgY2FwdHVyZWQgaW1hZ2UgdG8gdGhlIHVyaS4gSW50ZXJuYWxseSB3ZSB3cml0ZSB0aGUgbWVkaWEgY29udGVudAogICAgICAgICAgICAgICogdG8gdGhpcyBmaWxlLiBJdCdzIG5hbWVkICcudGVtcC5qcGcnIHNvIEdhbGxlcnkgd29uJ3QgcGljayBpdCB1cC4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSQVBfRklMRV9QQVRIID0gIi9zZGNhcmQvbW1zL3NjcmFwU3BhY2UvLnRlbXAuanBnIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUkFQX0ZJTEVfUEFUSCA9CisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9tbXMvc2NyYXBTcGFjZS8udGVtcC5qcGciOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnRlbnRzIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQppbmRleCBjODc3YzVjLi41NjhkNDY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0zMCw2ICszMCw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworCiAKIC8qKgogICogVE9ETzogTW92ZSB0aGlzIHRvCkBAIC01MSw2ICs1Myw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhTZXJ2aWNlIG1CbHVldG9vdGhTZXJ2aWNlOwogICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoQWRhcHRlciBtQWRhcHRlcjsKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgLy8gVGhlIFdha2VMb2NrIGlzIHVzZWQgZm9yIGJyaW5naW5nIHVwIHRoZSBMQ0QgZHVyaW5nIGEgcGFpcmluZyByZXF1ZXN0CisgICAgLy8gZnJvbSByZW1vdGUgZGV2aWNlIHdoZW4gQW5kcm9pZCBpcyBpbiBTdXNwZW5kIHN0YXRlLgorICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1XYWtlTG9jazsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUQVJUX0JMVUVUT09USCA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1BBSVJJTkdfQ09OU0VOVF9ERUxBWUVEX0FDQ0VQVCA9IDI7CkBAIC0xMDUsNiArMTEwLDExIEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVBhc3NrZXlBZ2VudFJlcXVlc3REYXRhID0gbmV3IEhhc2hNYXAoKTsKICAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICAvL1dha2VMb2NrIGluc3RhbnRpYXRpb24gaW4gQmx1ZXRvb3RoRXZlbnRMb29wIGNsYXNzCisgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1XYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSyB8IFBvd2VyTWFuYWdlci5BQ1FVSVJFX0NBVVNFU19XQUtFVVAKKyAgICAgICAgICAgICAgICB8IFBvd2VyTWFuYWdlci5PTl9BRlRFUl9SRUxFQVNFLCBUQUcpOworICAgICAgICBtV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CiAgICAgICAgIGluaXRpYWxpemVOYXRpdmVEYXRhTmF0aXZlKCk7CiAgICAgfQogCkBAIC0zOTgsMzcgKzQwOCw0NiBAQAogICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1lc3NhZ2UsIDE1MDApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KKyAgICAgICAgLy8gQWNxdWlyZSB3YWtlbG9jayBkdXJpbmcgUElOIGNvZGUgcmVxdWVzdCB0byBicmluZyB1cCBMQ0QgZGlzcGxheQorICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcykpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwKICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfQ09OU0VOVCk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQURNSU5fUEVSTSk7CisgICAgICAgIC8vIFJlbGVhc2Ugd2FrZWxvY2sgdG8gYWxsb3cgdGhlIExDRCB0byBnbyBvZmYgYWZ0ZXIgdGhlIFBJTiBwb3B1cCBub3RpZmNhdGlvbi4KKyAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvblJlcXVlc3RQYXNza2V5Q29uZmlybWF0aW9uKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgcGFzc2tleSwgaW50IG5hdGl2ZURhdGEpIHsKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBjaGVja1BhaXJpbmdSZXF1ZXN0QW5kR2V0QWRkcmVzcyhvYmplY3RQYXRoLCBuYXRpdmVEYXRhKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOwotCisgICAgICAgIC8vIEFjcXVpcmUgd2FrZWxvY2sgZHVyaW5nIFBJTiBjb2RlIHJlcXVlc3QgdG8gYnJpbmcgdXAgTENEIGRpc3BsYXkKKyAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9QQUlSSU5HX1JFUVVFU1QpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQVNTS0VZLCBwYXNza2V5KTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQUlSSU5HX1ZBUklBTlQsCiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QQVNTS0VZX0NPTkZJUk1BVElPTik7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQURNSU5fUEVSTSk7CisgICAgICAgIC8vIFJlbGVhc2Ugd2FrZWxvY2sgdG8gYWxsb3cgdGhlIExDRCB0byBnbyBvZmYgYWZ0ZXIgdGhlIFBJTiBwb3B1cCBub3RpZmNhdGlvbi4KKyAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvblJlcXVlc3RQYXNza2V5KFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKG9iamVjdFBhdGgsIG5hdGl2ZURhdGEpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm47Ci0KKyAgICAgICAgLy8gQWNxdWlyZSB3YWtlbG9jayBkdXJpbmcgUElOIGNvZGUgcmVxdWVzdCB0byBicmluZyB1cCBMQ0QgZGlzcGxheQorICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcykpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwKICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BBU1NLRVkpOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0FETUlOX1BFUk0pOworICAgICAgICAvLyBSZWxlYXNlIHdha2Vsb2NrIHRvIGFsbG93IHRoZSBMQ0QgdG8gZ28gb2ZmIGFmdGVyIHRoZSBQSU4gcG9wdXAgbm90aWZjYXRpb24uCisgICAgICAgIG1XYWtlTG9jay5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQ2MSwxMCArNDgwLDE0IEBACiAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmF0dGVtcHRBdXRvUGFpcihhZGRyZXNzKSkgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gQWNxdWlyZSB3YWtlbG9jayBkdXJpbmcgUElOIGNvZGUgcmVxdWVzdCB0byBicmluZyB1cCBMQ0QgZGlzcGxheQorICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcykpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QSU4pOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0FETUlOX1BFUk0pOworICAgICAgICAvLyBSZWxlYXNlIHdha2Vsb2NrIHRvIGFsbG93IHRoZSBMQ0QgdG8gZ28gb2ZmIGFmdGVyIHRoZSBQSU4gcG9wdXAgbm90aWZjYXRpb24uCisgICAgICAgIG1XYWtlTG9jay5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQ3MiwxMiArNDk1LDE2IEBACiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gY2hlY2tQYWlyaW5nUmVxdWVzdEFuZEdldEFkZHJlc3Mob2JqZWN0UGF0aCwgbmF0aXZlRGF0YSk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKIAorICAgICAgICAvLyBBY3F1aXJlIHdha2Vsb2NrIGR1cmluZyBQSU4gY29kZSByZXF1ZXN0IHRvIGJyaW5nIHVwIExDRCBkaXNwbGF5CisgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNUKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfUEFTU0tFWSwgcGFzc2tleSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfUEFJUklOR19WQVJJQU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9ESVNQTEFZX1BBU1NLRVkpOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0FETUlOX1BFUk0pOworICAgICAgICAvL1JlbGVhc2Ugd2FrZWxvY2sgdG8gYWxsb3cgdGhlIExDRCB0byBnbyBvZmYgYWZ0ZXIgdGhlIFBJTiBwb3B1cCBub3RpZmNhdGlvbi4KKyAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb25SZXF1ZXN0T29iRGF0YShTdHJpbmcgb2JqZWN0UGF0aCAsIGludCBuYXRpdmVEYXRhKSB7CkBAIC01NjYsNiArNTkzLDggQEAKIAogICAgIHByaXZhdGUgdm9pZCBvbkRpc2NvdmVyU2VydmljZXNSZXN1bHQoU3RyaW5nIGRldmljZU9iamVjdFBhdGgsIGJvb2xlYW4gcmVzdWx0KSB7CiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKGRldmljZU9iamVjdFBhdGgpOworICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm47CisKICAgICAgICAgLy8gV2UgZG9uJ3QgcGFyc2UgdGhlIHhtbCBoZXJlLCBpbnN0ZWFkIGp1c3QgcXVlcnkgQmx1ZXogZm9yIHRoZSBwcm9wZXJ0aWVzLgogICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS51cGRhdGVSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FjaGUoYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKaW5kZXggMjYzNDZkMi4uOWYzNjJkMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQpAQCAtNTE0LDggKzUxNCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUxheW91dC53aW5kb3dBbmltYXRpb25zID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fV2FsbHBhcGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCA9IG5ldyBJbnB1dENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmFkZChtV2luZG93LCBtTGF5b3V0LCBWaWV3LlZJU0lCTEUsIG1Db250ZW50SW5zZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbi5hZGQobVdpbmRvdywgbUxheW91dCwgVmlldy5WSVNJQkxFLCBtQ29udGVudEluc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGFkZCB3aW5kb3cgd2hpbGUgdXBkYXRpbmcgd2FsbHBhcGVyIHN1cmZhY2UuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lucHV0RmlsdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lucHV0RmlsdGVyLmphdmEKaW5kZXggMmY1NTY3N2UuLjhkNGIwOGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSW5wdXRGaWx0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lucHV0RmlsdGVyLmphdmEKQEAgLTg4LDcgKzg4LDE0IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXAgPj0gZW5kIC0gc3RhcnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8ga2VlcCBvcmlnaW5hbAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YlNlcXVlbmNlKHN0YXJ0LCBzdGFydCArIGtlZXApOworICAgICAgICAgICAgICAgIGtlZXAgKz0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoc291cmNlLmNoYXJBdChrZWVwIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC0ta2VlcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtlZXAgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YlNlcXVlbmNlKHN0YXJ0LCBrZWVwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDM4YWM5YjcuLjRlMTk3Y2QKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCkBAIC03NDksNiArNzQ5LDkgQEAKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQogICAgICAgICAgICAgbWF4Kys7CiAKKyAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQorICAgICAgICAgICAgbWF4ID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZ2V0TGluZUVuZChsaW5lKSk7CisKICAgICAgICAgaW50IGJlc3QgPSBtaW47CiAgICAgICAgIGZsb2F0IGJlc3RkaXN0ID0gTWF0aC5hYnMoZ2V0UHJpbWFyeUhvcml6b250YWwoYmVzdCkgLSBob3Jpeik7CiAKQEAgLTg5Myw3ICs4OTYsNyBAQAogICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKIAogICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQtLTsKKyAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7CiAKICAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwogCkBAIC05OTMsNyArOTk2LDcgQEAKICAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKICAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07CisgICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBlbmQpOwogCiAgICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKIApAQCAtMTU2NCw3ICsxNTY3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHRhYnMpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBzdGFydCArIGopIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBqICsgMiwgbnVsbCk7CkBAIC0xOTU4LDQgKzE5NjIsMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IHNob3J0W10geyAwLCAzMjc2NyB9KTsKIAogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGYwMmFkMmEuLmQwZDI0ODIKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCkBAIC0zMTMsNyArMzEzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzKTsKIAogICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFdpZHRocyhzdWIsIGksIG5leHQsIHdpZHRocyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhY3R1YWxOdW0gPSBwYWludC5nZXRUZXh0V2lkdGhzKHN1YiwgaSwgbmV4dCwgd2lkdGhzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgLSBpID4gYWN0dWFsTnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0VGV4dFdpZHRocyh3aWR0aHMsIHN1YiwgaSwgbmV4dCwgYWN0dWFsTnVtKTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0zMjEsOSArMzIzLDExIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKIAotICAgICAgICAgICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZCwgaSwgbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhY3R1YWxOdW0gPSBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwYWludCwgbVdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmVkLCBpLCBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgZm0pOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAtIGkgPiBhY3R1YWxOdW0pCisgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUZXh0V2lkdGhzKHdpZHRocywgc3Bhbm5lZCwgaSwgbmV4dCwgYWN0dWFsTnVtKTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7CiAKQEAgLTk2Niw2ICs5NzAsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBsb3c7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGp1c3RUZXh0V2lkdGhzKGZsb2F0W10gd2lkdGhzLCBDaGFyU2VxdWVuY2UgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJQb3MsIGludCBuZXh0UG9zLCBpbnQgYWN0dWFsTnVtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZHN0SW5kZXggPSBuZXh0UG9zIC0gY3VyUG9zIC0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IHNyY0luZGV4ID0gYWN0dWFsTnVtIC0gMTsgc3JjSW5kZXggPj0gMDsgc3JjSW5kZXgtLSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHRleHQuY2hhckF0KGRzdEluZGV4ICsgY3VyUG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2RzdEluZGV4LS1dID0gMC4wZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2lkdGhzW2RzdEluZGV4LS1dID0gd2lkdGhzW3NyY0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgidGV4dCIsICJhZGp1c3QgdGV4dCB3aWR0aHMgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGludCBvdXQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJvdmUsIGludCBiZWxvdywgaW50IHRvcCwgaW50IGJvdHRvbSwgaW50IHYsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BhY2luZ211bHQsIGZsb2F0IHNwYWNpbmdhZGQsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDUxM2IyY2QuLjEzY2M0MmMKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhCkBAIC0yMDMsOSArMjAzLDEwIEBACiAJCQl9CiAJCX0KIAkKKyAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHdvcmtQYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgd29ya1BhaW50LmdldFRleHRXaWR0aHModGV4dCwgc3RhcnQsIGVuZCwgd2lkdGhzKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7CiAKQEAgLTIxNCw4ICsyMTUsOSBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2kgLSBzdGFydF0gPSAwOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZCAtIHN0YXJ0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvRGF0ZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9EYXRlVXRpbHMuamF2YQppbmRleCA0ZTJjM2MzLi4zNTNiNjI4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9EYXRlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9EYXRlVXRpbHMuamF2YQpAQCAtNTAyLDcgKzUwMiw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uIDwgV0VFS19JTl9NSUxMSVMgJiYgbWluUmVzb2x1dGlvbiA8IFdFRUtfSU5fTUlMTElTKSB7Ci0gICAgICAgICAgICBjb3VudCA9IGR1cmF0aW9uIC8gREFZX0lOX01JTExJUzsKKyAgICAgICAgICAgIGNvdW50ID0gZ2V0TnVtYmVyT2ZEYXlzUGFzc2VkKHRpbWUsIG5vdyk7CiAgICAgICAgICAgICBpZiAocGFzdCkgewogICAgICAgICAgICAgICAgIGlmIChhYmJyZXZSZWxhdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICByZXNJZCA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy5hYmJyZXZfbnVtX2RheXNfYWdvOwpAQCAtNTI3LDYgKzUyNywyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBwYXNzZWQgYmV0d2VlbiB0d28gZGF0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0ZTEgZmlyc3QgZGF0ZQorICAgICAqIEBwYXJhbSBkYXRlMiBzZWNvbmQgZGF0ZQorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGRheXMgcGFzc2VkIGJldHdlZW4gdG8gZGF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGxvbmcgZ2V0TnVtYmVyT2ZEYXlzUGFzc2VkKGxvbmcgZGF0ZTEsIGxvbmcgZGF0ZTIpIHsKKyAgICAgICAgaWYgKHNUaGVuVGltZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzVGhlblRpbWUgPSBuZXcgVGltZSgpOworICAgICAgICB9CisgICAgICAgIHNUaGVuVGltZS5zZXQoZGF0ZTEpOworICAgICAgICBpbnQgZGF5MSA9IFRpbWUuZ2V0SnVsaWFuRGF5KGRhdGUxLCBzVGhlblRpbWUuZ210b2ZmKTsKKyAgICAgICAgc1RoZW5UaW1lLnNldChkYXRlMik7CisgICAgICAgIGludCBkYXkyID0gVGltZS5nZXRKdWxpYW5EYXkoZGF0ZTIsIHNUaGVuVGltZS5nbXRvZmYpOworICAgICAgICByZXR1cm4gTWF0aC5hYnMoZGF5MiAtIGRheTEpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZWxhcHNlZCB0aW1lIHNpbmNlIHN0YXJ0VGltZSBmb3JtYXR0ZWQgbGlrZQogICAgICAqICJbcmVsYXRpdmUgdGltZS9kYXRlXSwgW3RpbWVdIi4KICAgICAgKiA8cD4KQEAgLTYyNCwxNCArNjQyLDE4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRGb3JtYXRTdHJpbmdzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2ZnID0gci5nZXRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc0xhc3RDb25maWcgPT0gbnVsbCB8fCAhc0xhc3RDb25maWcuZXF1YWxzKGNmZykpIHsKLSAgICAgICAgICAgICAgICBzTGFzdENvbmZpZyA9IGNmZzsKLSAgICAgICAgICAgICAgICBzU3RhdHVzVGltZUZvcm1hdCA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZShqYXZhLnRleHQuRGF0ZUZvcm1hdC5TSE9SVCk7Ci0gICAgICAgICAgICAgICAgc0VsYXBzZWRGb3JtYXRNTVNTID0gci5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyk7Ci0gICAgICAgICAgICAgICAgc0VsYXBzZWRGb3JtYXRITU1TUyA9IHIuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbml0Rm9ybWF0U3RyaW5nc0xvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0Rm9ybWF0U3RyaW5nc0xvY2tlZCgpIHsKKyAgICAgICAgUmVzb3VyY2VzIHIgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCk7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY2ZnID0gci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmIChzTGFzdENvbmZpZyA9PSBudWxsIHx8ICFzTGFzdENvbmZpZy5lcXVhbHMoY2ZnKSkgeworICAgICAgICAgICAgc0xhc3RDb25maWcgPSBjZmc7CisgICAgICAgICAgICBzU3RhdHVzVGltZUZvcm1hdCA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZShqYXZhLnRleHQuRGF0ZUZvcm1hdC5TSE9SVCk7CisgICAgICAgICAgICBzRWxhcHNlZEZvcm1hdE1NU1MgPSByLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5lbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzKTsKKyAgICAgICAgICAgIHNFbGFwc2VkRm9ybWF0SE1NU1MgPSByLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5lbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NDEsOCArNjYzLDEwIEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZSB0aW1lU3RyaW5nKGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIGluaXRGb3JtYXRTdHJpbmdzKCk7Ci0gICAgICAgIHJldHVybiBzU3RhdHVzVGltZUZvcm1hdC5mb3JtYXQobWlsbGlzKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaW5pdEZvcm1hdFN0cmluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBzU3RhdHVzVGltZUZvcm1hdC5mb3JtYXQobWlsbGlzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5NSw0MCArMTYxOSw0NSBAQAogICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoQ29udGV4dCBjLCBsb25nIG1pbGxpcywKICAgICAgICAgICAgIGJvb2xlYW4gd2l0aFByZXBvc2l0aW9uKSB7CiAKKyAgICAgICAgU3RyaW5nIHJlc3VsdDsKICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgbG9uZyBzcGFuID0gbm93IC0gbWlsbGlzOwogCi0gICAgICAgIGlmIChzTm93VGltZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzTm93VGltZSA9IG5ldyBUaW1lKCk7Ci0gICAgICAgICAgICBzVGhlblRpbWUgPSBuZXcgVGltZSgpOwotICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAoRGF0ZVV0aWxzLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoc05vd1RpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNOb3dUaW1lID0gbmV3IFRpbWUoKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBzTm93VGltZS5zZXQobm93KTsKLSAgICAgICAgc1RoZW5UaW1lLnNldChtaWxsaXMpOworICAgICAgICAgICAgaWYgKHNUaGVuVGltZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc1RoZW5UaW1lID0gbmV3IFRpbWUoKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcgcmVzdWx0OwotICAgICAgICBpbnQgcHJlcG9zaXRpb25JZDsKLSAgICAgICAgaWYgKHNwYW4gPCBEQVlfSU5fTUlMTElTICYmIHNOb3dUaW1lLndlZWtEYXkgPT0gc1RoZW5UaW1lLndlZWtEYXkpIHsKLSAgICAgICAgICAgIC8vIFNhbWUgZGF5Ci0gICAgICAgICAgICBpbnQgZmxhZ3MgPSBGT1JNQVRfU0hPV19USU1FOwotICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0RGF0ZVJhbmdlKGMsIG1pbGxpcywgbWlsbGlzLCBmbGFncyk7Ci0gICAgICAgICAgICBwcmVwb3NpdGlvbklkID0gUi5zdHJpbmcucHJlcG9zaXRpb25fZm9yX3RpbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc05vd1RpbWUueWVhciAhPSBzVGhlblRpbWUueWVhcikgewotICAgICAgICAgICAgLy8gRGlmZmVyZW50IHllYXJzCi0gICAgICAgICAgICBpbnQgZmxhZ3MgPSBGT1JNQVRfU0hPV19EQVRFIHwgRk9STUFUX1NIT1dfWUVBUiB8IEZPUk1BVF9OVU1FUklDX0RBVEU7Ci0gICAgICAgICAgICByZXN1bHQgPSBmb3JtYXREYXRlUmFuZ2UoYywgbWlsbGlzLCBtaWxsaXMsIGZsYWdzKTsKKyAgICAgICAgICAgIHNOb3dUaW1lLnNldChub3cpOworICAgICAgICAgICAgc1RoZW5UaW1lLnNldChtaWxsaXMpOwogCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGF0ZSAobGlrZSAiMTAvMzEvMjAwOCIgc28gdXNlIHRoZSBkYXRlIHByZXBvc2l0aW9uKQotICAgICAgICAgICAgcHJlcG9zaXRpb25JZCA9IFIuc3RyaW5nLnByZXBvc2l0aW9uX2Zvcl9kYXRlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRGVmYXVsdAotICAgICAgICAgICAgaW50IGZsYWdzID0gRk9STUFUX1NIT1dfREFURSB8IEZPUk1BVF9BQkJSRVZfTU9OVEg7Ci0gICAgICAgICAgICByZXN1bHQgPSBmb3JtYXREYXRlUmFuZ2UoYywgbWlsbGlzLCBtaWxsaXMsIGZsYWdzKTsKLSAgICAgICAgICAgIHByZXBvc2l0aW9uSWQgPSBSLnN0cmluZy5wcmVwb3NpdGlvbl9mb3JfZGF0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2l0aFByZXBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gYy5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlcy5nZXRTdHJpbmcocHJlcG9zaXRpb25JZCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGludCBwcmVwb3NpdGlvbklkOworICAgICAgICAgICAgaWYgKHNwYW4gPCBEQVlfSU5fTUlMTElTICYmIHNOb3dUaW1lLndlZWtEYXkgPT0gc1RoZW5UaW1lLndlZWtEYXkpIHsKKyAgICAgICAgICAgICAgICAvLyBTYW1lIGRheQorICAgICAgICAgICAgICAgIGludCBmbGFncyA9IEZPUk1BVF9TSE9XX1RJTUU7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0RGF0ZVJhbmdlKGMsIG1pbGxpcywgbWlsbGlzLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcHJlcG9zaXRpb25JZCA9IFIuc3RyaW5nLnByZXBvc2l0aW9uX2Zvcl90aW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChzTm93VGltZS55ZWFyICE9IHNUaGVuVGltZS55ZWFyKSB7CisgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHllYXJzCisgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gRk9STUFUX1NIT1dfREFURSB8IEZPUk1BVF9TSE9XX1lFQVIgfCBGT1JNQVRfTlVNRVJJQ19EQVRFOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdERhdGVSYW5nZShjLCBtaWxsaXMsIG1pbGxpcywgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRhdGUgKGxpa2UgIjEwLzMxLzIwMDgiIHNvIHVzZSB0aGUgZGF0ZSBwcmVwb3NpdGlvbikKKyAgICAgICAgICAgICAgICBwcmVwb3NpdGlvbklkID0gUi5zdHJpbmcucHJlcG9zaXRpb25fZm9yX2RhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERlZmF1bHQKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBGT1JNQVRfU0hPV19EQVRFIHwgRk9STUFUX0FCQlJFVl9NT05USDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXREYXRlUmFuZ2UoYywgbWlsbGlzLCBtaWxsaXMsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBwcmVwb3NpdGlvbklkID0gUi5zdHJpbmcucHJlcG9zaXRpb25fZm9yX2RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2l0aFByZXBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGMuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzLmdldFN0cmluZyhwcmVwb3NpdGlvbklkLCByZXN1bHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvVGltZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvVGltZS5qYXZhCmluZGV4IDhlYWUxMTEuLmMwNWE4ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvZm9ybWF0L1RpbWUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9UaW1lLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0RfVF9IX01fU18wMDAgPSAiJVktJW0tJWRUJUg6JU06JVMuMDAwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0RfVF9IX01fU18wMDBfWiA9ICIlWS0lbS0lZFQlSDolTTolUy4wMDBaIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0QgPSAiJVktJW0tJWQiOwotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfVVRDID0gIlVUQyI7CiAKICAgICAvKioKQEAgLTE3MCwxMSArMTcwLDExIEBACiAgICAgcHVibGljIFRpbWUoKSB7CiAgICAgICAgIHRoaXMoVGltZVpvbmUuZ2V0RGVmYXVsdCgpLmdldElEKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEEgY29weSBjb25zdHJ1Y3Rvci4gIENvbnN0cnVjdCBhIFRpbWUgb2JqZWN0IGJ5IGNvcHlpbmcgdGhlIGdpdmVuCiAgICAgICogVGltZSBvYmplY3QuICBObyBub3JtYWxpemF0aW9uIG9jY3Vycy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBvdGhlcgogICAgICAqLwogICAgIHB1YmxpYyBUaW1lKFRpbWUgb3RoZXIpIHsKQEAgLTE4NSwxNyArMTg1LDE3IEBACiAgICAgICogRW5zdXJlcyB0aGUgdmFsdWVzIGluIGVhY2ggZmllbGQgYXJlIGluIHJhbmdlLiBGb3IgZXhhbXBsZSBpZiB0aGUKICAgICAgKiBjdXJyZW50IHZhbHVlIG9mIHRoaXMgY2FsZW5kYXIgaXMgTWFyY2ggMzIsIG5vcm1hbGl6ZSgpIHdpbGwgY29udmVydCBpdAogICAgICAqIHRvIEFwcmlsIDEuIEl0IGFsc28gZmlsbHMgaW4gd2Vla0RheSwgeWVhckRheSwgaXNEc3QgYW5kIGdtdG9mZi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmICJpZ25vcmVEc3QiIGlzIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgc2V0cyB0aGUgImlzRHN0IiBmaWVsZCB0byAtMQogICAgICAqICh0aGUgInVua25vd24iIHZhbHVlKSBiZWZvcmUgbm9ybWFsaXppbmcuICBJdCB0aGVuIGNvbXB1dGVzIHRoZQogICAgICAqIGNvcnJlY3QgdmFsdWUgZm9yICJpc0RzdCIuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBTZWUge0BsaW5rICN0b01pbGxpcyhib29sZWFuKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiB0bwogICAgICAqIHVzZSA8dHQ+dHJ1ZTwvdHQ+IG9yIDx0dD5mYWxzZTwvdHQ+IGZvciAiaWdub3JlRHN0Ii4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBVVEMgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIFVUQyBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBsb25nIG5vcm1hbGl6ZShib29sZWFuIGlnbm9yZURzdCk7CiAKQEAgLTM3OSwxMyArMzc5LDEzIEBACiAgICAgICogUGFyc2VzIGEgZGF0ZS10aW1lIHN0cmluZyBpbiBlaXRoZXIgdGhlIFJGQyAyNDQ1IGZvcm1hdCBvciBhbiBhYmJyZXZpYXRlZAogICAgICAqIGZvcm1hdCB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlICJ0aW1lIiBmaWVsZC4gIEZvciBleGFtcGxlLCBhbGwgb2YgdGhlCiAgICAgICogZm9sbG93aW5nIHN0cmluZ3MgYXJlIHZhbGlkOgotICAgICAqIAorICAgICAqCiAgICAgICogPHVsPgogICAgICAqICAgPGxpPiIyMDA4MTAxM1QxNjAwMDBaIjwvbGk+CiAgICAgICogICA8bGk+IjIwMDgxMDEzVDE2MDAwMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4MTAxMyI8L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogCisgICAgICoKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lIGlzIGluIFVUQyAoZW5kcyB3aXRoIFopLiAgSWYgdGhlIHN0cmluZwogICAgICAqIGVuZHMgd2l0aCAiWiIgdGhlbiB0aGUgdGltZXpvbmUgaXMgc2V0IHRvIFVUQy4gIElmIHRoZSBkYXRlLXRpbWUgc3RyaW5nCiAgICAgICogaW5jbHVkZWQgb25seSBhIGRhdGUgYW5kIG5vIHRpbWUgZmllbGQsIHRoZW4gdGhlIDxjb2RlPmFsbERheTwvY29kZT4KQEAgLTM5NiwxMCArMzk2LDEwIEBACiAgICAgICogPGNvZGU+eWVhckRheTwvY29kZT4sIGFuZCA8Y29kZT5nbXRvZmY8L2NvZGU+IGFyZSBhbHdheXMgc2V0IHRvIHplcm8sCiAgICAgICogYW5kIHRoZSBmaWVsZCA8Y29kZT5pc0RzdDwvY29kZT4gaXMgc2V0IHRvIC0xICh1bmtub3duKS4gIFRvIHNldCB0aG9zZQogICAgICAqIGZpZWxkcywgY2FsbCB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0gYWZ0ZXIgcGFyc2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFRvIHBhcnNlIGEgZGF0ZS10aW1lIHN0cmluZyBhbmQgY29udmVydCBpdCB0byBVVEMgbWlsbGlzZWNvbmRzLCBkbwogICAgICAqIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cHJlPgogICAgICAqICAgVGltZSB0aW1lID0gbmV3IFRpbWUoKTsKICAgICAgKiAgIFN0cmluZyBkYXRlID0gIjIwMDgxMDEzVDE2MDAwMFoiOwpAQCAtNDI4LDI1ICs0MjgsMjUgQEAKICAgICAgKiBQYXJzZSBhIHRpbWUgaW4gUkZDIDMzMzkgZm9ybWF0LiAgVGhpcyBtZXRob2QgYWxzbyBwYXJzZXMgc2ltcGxlIGRhdGVzCiAgICAgICogKHRoYXQgaXMsIHN0cmluZ3MgdGhhdCBjb250YWluIG5vIHRpbWUgb3IgdGltZSBvZmZzZXQpLiAgRm9yIGV4YW1wbGUsCiAgICAgICogYWxsIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgdmFsaWQ6Ci0gICAgICogCisgICAgICoKICAgICAgKiA8dWw+CiAgICAgICogICA8bGk+IjIwMDgtMTAtMTNUMTY6MDA6MDAuMDAwWiI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzVDE2OjAwOjAwLjAwMCswNzowMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzVDE2OjAwOjAwLjAwMC0wNzowMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzIjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSB0aW1lIGFuZCB0aW1lIG9mZnNldCwgdGhlbiB0aGUgdGltZSBvZmZzZXQgd2lsbAogICAgICAqIGJlIHVzZWQgdG8gY29udmVydCB0aGUgdGltZSB2YWx1ZSB0byBVVEMuCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucyBqdXN0IGEgZGF0ZSAod2l0aCBubyB0aW1lIGZpZWxkKSwgdGhlbgogICAgICAqIHRoZSB7QGxpbmsgI2FsbERheX0gZmllbGQgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSB7QGxpbmsgI2hvdXJ9LAogICAgICAqIHtAbGluayAjbWludXRlfSwgYW5kICB7QGxpbmsgI3NlY29uZH0gZmllbGRzIGFyZSBzZXQgdG8gemVyby4KICAgICAgKiA8L3A+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlIGlzIGluIFVUQyB0aW1lLgogICAgICAqIDwvcD4KQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9Ci0gICAgIAorCiAgICAgIG5hdGl2ZSBwcml2YXRlIGJvb2xlYW4gbmF0aXZlUGFyc2UzMzM5KFN0cmluZyBzKTsKIAogICAgIC8qKgpAQCAtNDg0LDEzICs0ODQsMTMgQEAKICAgICAgKiA8ZW0+bm90PC9lbT4gY2hhbmdlIGFueSBvZiB0aGUgZmllbGRzIGluIHRoaXMgVGltZSBvYmplY3QuICBJZiB5b3Ugd2FudAogICAgICAqIHRvIG5vcm1hbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgVGltZSBvYmplY3QgYW5kIGFsc28gZ2V0IHRoZSBtaWxsaXNlY29uZHMKICAgICAgKiB0aGVuIHVzZSB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJZiAiaWdub3JlRHN0IiBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCB1c2VzIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlCiAgICAgICogImlzRHN0IiBmaWVsZCBhbmQgd2lsbCBhZGp1c3QgdGhlIHJldHVybmVkIHRpbWUgaWYgdGhlICJpc0RzdCIgZmllbGQgaXMKICAgICAgKiB3cm9uZyBmb3IgdGhlIGdpdmVuIHRpbWUuICBTZWUgdGhlIHNhbXBsZSBjb2RlIGJlbG93IGZvciBhbiBleGFtcGxlIG9mCiAgICAgICogdGhpcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmICJpZ25vcmVEc3QiIGlzIHRydWUsIHRoZW4gdGhpcyBtZXRob2QgaWdub3JlcyB0aGUgY3VycmVudCBzZXR0aW5nIG9mCiAgICAgICogdGhlICJpc0RzdCIgZmllbGQgaW4gdGhpcyBUaW1lIG9iamVjdCBhbmQgd2lsbCBpbnN0ZWFkIGZpZ3VyZSBvdXQgdGhlCkBAIC00OTksMjcgKzQ5OSwyNyBAQAogICAgICAqIGNvcnJlY3QgdmFsdWUgb2YgdGhlICJpc0RzdCIgZmllbGQgaXMgd2hlbiB0aGUgdGltZSBpcyBpbmhlcmVudGx5CiAgICAgICogYW1iaWd1b3VzIGJlY2F1c2UgaXQgZmFsbHMgaW4gdGhlIGhvdXIgdGhhdCBpcyByZXBlYXRlZCB3aGVuIHN3aXRjaGluZwogICAgICAqIGZyb20gRGF5bGlnaHQtU2F2aW5nIFRpbWUgdG8gU3RhbmRhcmQgVGltZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGVyZSA8dHQ+dG9NaWxsaXModHJ1ZSk8L3R0PiBhZGp1c3RzIHRoZSB0aW1lLAogICAgICAqIGFzc3VtaW5nIHRoYXQgRFNUIGNoYW5nZXMgYXQgMmFtIG9uIFN1bmRheSwgTm92IDQsIDIwMDcuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cHJlPgogICAgICAqIFRpbWUgdGltZSA9IG5ldyBUaW1lKCk7Ci0gICAgICogdGltZS5zZXQoMjAwNywgMTAsIDQpOyAgLy8gc2V0IHRoZSBkYXRlIHRvIE5vdiA0LCAyMDA3LCAxMmFtCisgICAgICogdGltZS5zZXQoNCwgMTAsIDIwMDcpOyAgLy8gc2V0IHRoZSBkYXRlIHRvIE5vdiA0LCAyMDA3LCAxMmFtCiAgICAgICogdGltZS5ub3JtYWxpemUoKTsgICAgICAgLy8gdGhpcyBzZXRzIGlzRHN0ID0gMQogICAgICAqIHRpbWUubW9udGhEYXkgKz0gMTsgICAgIC8vIGNoYW5nZXMgdGhlIGRhdGUgdG8gTm92IDUsIDIwMDcsIDEyYW0KICAgICAgKiBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKGZhbHNlKTsgICAvLyBtaWxsaXMgaXMgTm92IDQsIDIwMDcsIDExcG0KICAgICAgKiBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKHRydWUpOyAgICAvLyBtaWxsaXMgaXMgTm92IDUsIDIwMDcsIDEyYW0KICAgICAgKiA8L3ByZT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgdXNlIDx0dD50b01pbGxpcyh0cnVlKTwvdHQ+CiAgICAgICogYWZ0ZXIgYWRkaW5nIG9yIHN1YnRyYWN0aW5nIGRheXMgb3IgZXhwbGljaXRseSBzZXR0aW5nIHRoZSAibW9udGhEYXkiCiAgICAgICogZmllbGQuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGFyZSBhZGRpbmcKICAgICAgKiBvciBzdWJ0cmFjdGluZyBob3VycyBvciBtaW51dGVzLCB0aGVuIHlvdSBzaG91bGQgdXNlCiAgICAgICogPHR0PnRvTWlsbGlzKGZhbHNlKTwvdHQ+LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogWW91IHNob3VsZCBhbHNvIHVzZSA8dHQ+dG9NaWxsaXMoZmFsc2UpPC90dD4gaWYgeW91IHdhbnQKICAgICAgKiB0byByZWFkIGJhY2sgdGhlIHNhbWUgbWlsbGlzZWNvbmRzIHRoYXQgeW91IHNldCB3aXRoIHtAbGluayAjc2V0KGxvbmcpfQpAQCAtNTMxLDE0ICs1MzEsMTQgQEAKICAgICAgKiBTZXRzIHRoZSBmaWVsZHMgaW4gdGhpcyBUaW1lIG9iamVjdCBnaXZlbiB0aGUgVVRDIG1pbGxpc2Vjb25kcy4gIEFmdGVyCiAgICAgICogdGhpcyBtZXRob2QgcmV0dXJucywgYWxsIHRoZSBmaWVsZHMgYXJlIG5vcm1hbGl6ZWQuCiAgICAgICogVGhpcyBhbHNvIHNldHMgdGhlICJpc0RzdCIgZmllbGQgdG8gdGhlIGNvcnJlY3QgdmFsdWUuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbWlsbGlzIHRoZSB0aW1lIGluIFVUQyBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgdm9pZCBzZXQobG9uZyBtaWxsaXMpOwogCiAgICAgLyoqCiAgICAgICogRm9ybWF0IGFjY29yZGluZyB0byBSRkMgMjQ0NSBEQVRFVElNRSB0eXBlLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogVGhlIHNhbWUgYXMgZm9ybWF0KCIlWSVtJWRUJUglTSVTIikuCiAgICAgICovCkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgKiBTZXRzIHRoZSBkYXRlIGZyb20gdGhlIGdpdmVuIGZpZWxkcy4gIEFsc28gc2V0cyBhbGxEYXkgdG8gdHJ1ZS4KICAgICAgKiBTZXRzIHdlZWtEYXksIHllYXJEYXkgYW5kIGdtdG9mZiB0byAwLCBhbmQgaXNEc3QgdG8gLTEuCiAgICAgICogQ2FsbCB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0gaWYgeW91IG5lZWQgdGhvc2UuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbW9udGhEYXkgdGhlIGRheSBvZiB0aGUgbW9udGggKGluIHRoZSByYW5nZSBbMSwzMV0pCiAgICAgICogQHBhcmFtIG1vbnRoIHRoZSB6ZXJvLWJhc2VkIG1vbnRoIG51bWJlciAoaW4gdGhlIHJhbmdlIFswLDExXSkKICAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhcgpAQCAtNjA2LDcgKzYwNiw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgVGltZSBvYmplY3Qgb2NjdXJzIGJlZm9yZQogICAgICAqIHRoZSBnaXZlbiB0aW1lLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRoYXQgYSBnaXZlbiBUaW1lIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0aW1lIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gdGltZQogICAgICAqLwpAQCAtNjE4LDcgKzYxOCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgVGltZSBvYmplY3Qgb2NjdXJzIGFmdGVyCiAgICAgICogdGhlIGdpdmVuIHRpbWUuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdGhhdCBhIGdpdmVuIFRpbWUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRpbWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB0aW1lCiAgICAgICovCkBAIC02MzIsMTIgKzYzMiwxMiBAQAogICAgICAqIGNsb3Nlc3QgVGh1cnNkYXkgeWVhckRheS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzVGh1cnNkYXlPZmZzZXQgPSB7IC0zLCAzLCAyLCAxLCAwLCAtMSwgLTIgfTsKLSAgICAgICAgCisKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgd2VlayBudW1iZXIgYWNjb3JkaW5nIHRvIElTTyA4NjAxLiAgVGhlIGN1cnJlbnQgVGltZQogICAgICAqIG9iamVjdCBtdXN0IGFscmVhZHkgYmUgbm9ybWFsaXplZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHVzZXMgdGhlCiAgICAgICogeWVhckRheSBhbmQgd2Vla0RheSBmaWVsZHMuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJbiBJUzAgODYwMSwgd2Vla3Mgc3RhcnQgb24gTW9uZGF5LgogICAgICAqIFRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICh3ZWVrIDEpIGlzIGRlZmluZWQgYnkgSVNPIDg2MDEgYXMgdGhlCkBAIC02NDUsMTIgKzY0NSwxMiBAQAogICAgICAqIE9yIGVxdWl2YWxlbnRseSwgdGhlIHdlZWsgY29udGFpbmluZyBKYW51YXJ5IDQuICBPciBlcXVpdmFsZW50bHksCiAgICAgICogdGhlIHdlZWsgd2l0aCB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5IGluIGl0LgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRoZSB3ZWVrIG51bWJlciBjYW4gYmUgY2FsY3VsYXRlZCBieSBjb3VudGluZyBUaHVyc2RheXMuICBXZWVrIE4KICAgICAgKiBjb250YWlucyB0aGUgTnRoIFRodXJzZGF5IG9mIHRoZSB5ZWFyLgogICAgICAqIDwvcD4KLSAgICAgKiAgIAorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgSVNPIHdlZWsgbnVtYmVyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0V2Vla051bWJlcigpIHsKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICAgICBpZiAoY2xvc2VzdFRodXJzZGF5ID49IDAgJiYgY2xvc2VzdFRodXJzZGF5IDw9IDM2NCkgewogICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RUaHVyc2RheSAvIDcgKyAxOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoZSB3ZWVrIGNyb3NzZXMgYSB5ZWFyIGJvdW5kYXJ5LgogICAgICAgICBUaW1lIHRlbXAgPSBuZXcgVGltZSh0aGlzKTsKICAgICAgICAgdGVtcC5tb250aERheSArPSBzVGh1cnNkYXlPZmZzZXRbd2Vla0RheV07CkBAIC02NzAsNyArNjcwLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgaW4gdGhlIFJGQyAzMzM5IGZvcm1hdC4gCisgICAgICogUmV0dXJuIGEgc3RyaW5nIGluIHRoZSBSRkMgMzMzOSBmb3JtYXQuCiAgICAgICogPHA+CiAgICAgICogSWYgYWxsRGF5IGlzIHRydWUsIGV4cHJlc3NlcyB0aGUgdGltZSBhcyBZLU0tRDwvcD4KICAgICAgKiA8cD4KQEAgLTY5MSwxMyArNjkxLDEzIEBACiAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClNYXRoLmFicyhnbXRvZmYpOwogICAgICAgICAgICAgaW50IG1pbnV0ZXMgPSAob2Zmc2V0ICUgMzYwMCkgLyA2MDsKICAgICAgICAgICAgIGludCBob3VycyA9IG9mZnNldCAvIDM2MDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzJXMlMDJkOiUwMmQiLCBiYXNlLCBzaWduLCBob3VycywgbWludXRlcyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRheSBvZiB0aGUgZ2l2ZW4gdGltZSBpcyB0aGUgZXBvY2ggb24gdGhlIEp1bGlhbiBDYWxlbmRhciAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRheSBvZiB0aGUgZ2l2ZW4gdGltZSBpcyB0aGUgZXBvY2ggb24gdGhlIEp1bGlhbiBDYWxlbmRhcgogICAgICAqIChKYW51YXJ5IDEsIDE5NzAgb24gdGhlIEdyZWdvcmlhbiBjYWxlbmRhcikuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGltZSB0aGUgdGltZSB0byB0ZXN0CkBAIC03MDcsNyArNzA3LDcgQEAKICAgICAgICAgbG9uZyBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKHRydWUpOwogICAgICAgICByZXR1cm4gZ2V0SnVsaWFuRGF5KG1pbGxpcywgMCkgPT0gRVBPQ0hfSlVMSUFOX0RBWTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgSnVsaWFuIGRheSBudW1iZXIsIGdpdmVuIHRoZSBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICogYW5kIHRoZSBvZmZzZXQgKGluIHNlY29uZHMpIGZyb20gVVRDLiAgVGhlIEp1bGlhbiBkYXkgZm9yIGEgZ2l2ZW4KQEAgLTcxNiwxMCArNzE2LDEwIEBACiAgICAgICogd2hhdCB0aW1lem9uZSBpcyBiZWluZyB1c2VkLiAgVGhlIEp1bGlhbiBkYXkgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCiAgICAgICogaWYgdHdvIGV2ZW50cyBvY2N1ciBvbiB0aGUgc2FtZSBkYXkgYW5kIGZvciBkZXRlcm1pbmluZyB0aGUgcmVsYXRpdmUKICAgICAgKiB0aW1lIG9mIGFuIGV2ZW50IGZyb20gdGhlIHByZXNlbnQgKCJ5ZXN0ZXJkYXkiLCAiMyBkYXlzIGFnbyIsIGV0Yy4pLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogVXNlIHtAbGluayAjdG9NaWxsaXMoYm9vbGVhbil9IHRvIGdldCB0aGUgbWlsbGlzZWNvbmRzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICogQHBhcmFtIGdtdG9mZiB0aGUgb2Zmc2V0IGZyb20gVVRDIGluIHNlY29uZHMKICAgICAgKiBAcmV0dXJuIHRoZSBKdWxpYW4gZGF5CkBAIC03MjksNyArNzI5LDcgQEAKICAgICAgICAgbG9uZyBqdWxpYW5EYXkgPSAobWlsbGlzICsgb2Zmc2V0TWlsbGlzKSAvIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOwogICAgICAgICByZXR1cm4gKGludCkganVsaWFuRGF5ICsgRVBPQ0hfSlVMSUFOX0RBWTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiA8cD5TZXRzIHRoZSB0aW1lIGZyb20gdGhlIGdpdmVuIEp1bGlhbiBkYXkgbnVtYmVyLCB3aGljaCBtdXN0IGJlIGJhc2VkIG9uCiAgICAgICogdGhlIHNhbWUgdGltZXpvbmUgdGhhdCBpcyBzZXQgaW4gdGhpcyBUaW1lIG9iamVjdC4gIFRoZSAiZ210b2ZmIiBmaWVsZApAQCAtNzM4LDcgKzczOCw3IEBACiAgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlIG5vcm1hbGl6ZWQgYW5kIHRoZSB0aW1lCiAgICAgICogd2lsbCBiZSBzZXQgdG8gMTJhbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbiBKdWxpYW4gZGF5LgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmIDEyYW0gZG9lcyBub3QgZXhpc3QgZm9yIHRoYXQgZGF5IGJlY2F1c2UKICAgICAgKiBvZiBkYXlsaWdodCBzYXZpbmcgdGltZS4gIEZvciBleGFtcGxlLCBDYWlybywgRXF5cHQgbW92ZXMgdGltZSBhaGVhZCBvbmUKQEAgLTc0Niw3ICs3NDYsNyBAQAogICAgICAqIGFsc28gY2hhbmdlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGF0IDEyYW0uICBJbiB0aG9zZSBjYXNlcywgdGhlIHRpbWUKICAgICAgKiB3aWxsIGJlIHNldCB0byAxYW0uCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGp1bGlhbkRheSB0aGUgSnVsaWFuIGRheSBpbiB0aGUgdGltZXpvbmUgZm9yIHRoaXMgVGltZSBvYmplY3QKICAgICAgKiBAcmV0dXJuIHRoZSBVVEMgbWlsbGlzZWNvbmRzIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBKdWxpYW4gZGF5CiAgICAgICovCkBAIC03NTYsMTMgKzc1NiwxMyBAQAogICAgICAgICAvLyB0aGUgZGF5LgogICAgICAgICBsb25nIG1pbGxpcyA9IChqdWxpYW5EYXkgLSBFUE9DSF9KVUxJQU5fREFZKSAqIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOwogICAgICAgICBzZXQobWlsbGlzKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgY2xvc2Ugd2UgYXJlIHRvIHRoZSByZXF1ZXN0ZWQgSnVsaWFuIGRheS4KICAgICAgICAgLy8gV2UgY2FuJ3QgYmUgb2ZmIGJ5IG1vcmUgdGhhbiBhIGRheS4KICAgICAgICAgaW50IGFwcHJveGltYXRlRGF5ID0gZ2V0SnVsaWFuRGF5KG1pbGxpcywgZ210b2ZmKTsKICAgICAgICAgaW50IGRpZmYgPSBqdWxpYW5EYXkgLSBhcHByb3hpbWF0ZURheTsKICAgICAgICAgbW9udGhEYXkgKz0gZGlmZjsKLSAgICAgICAgCisKICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIHRvIDEyYW0gYW5kIHJlLW5vcm1hbGl6ZS4KICAgICAgICAgaG91ciA9IDA7CiAgICAgICAgIG1pbnV0ZSA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L3V0aWwvTGlua2lmeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnkuamF2YQppbmRleCA5ODYwNTg4OGMuLmUyMjkzZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnkuamF2YQpAQCAtNDk4LDEwICs0OTgsNiBAQAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAogICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpbmtzLCBjKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvdXRpbC9SZmM4MjJUb2tlbml6ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvdXRpbC9SZmM4MjJUb2tlbml6ZXIuamF2YQppbmRleCA2OWNmOTNjLi42ODMzNGU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L3V0aWwvUmZjODIyVG9rZW5pemVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC91dGlsL1JmYzgyMlRva2VuaXplci5qYXZhCkBAIC0yNTYsNyArMjU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcgJiYgaSArIDEgPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJygnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xcJyAmJiBpICsgMSA8IGxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1lVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltZVV0aWxzLmphdmEKaW5kZXggODVjZTVlMS4uNWMyODFjZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1lVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWVVdGlscy5qYXZhCkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICAgICAgICAgIGludCBwb3MgPSAwOwogICAgICAgICAgICAgZmllbGRMZW4gLT0gMTsKICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBmaWVsZExlbikgewotICAgICAgICAgICAgICAgIGZvcm1hdFN0cltwb3NdID0gJyAnOworICAgICAgICAgICAgICAgIGZvcm1hdFN0cltwb3MrK10gPSAnICc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3JtYXRTdHJbcG9zXSA9ICcwJzsKICAgICAgICAgICAgIHJldHVybiBwb3MrMTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRm9jdXNGaW5kZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRm9jdXNGaW5kZXIuamF2YQppbmRleCAxNWZiODM5Li44YWQ5YTYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Gb2N1c0ZpbmRlci5qYXZhCkBAIC0yNjYsNyArMjY2LDcgQEAKIAogCiAgICAgLyoqCi0gICAgICogRG8gdGhlICJiZWFtcyIgdy5yLnQgdGhlIGdpdmVuIGRpcmVjaXRpb24ncyBheG9zIG9mIHJlY3QxIGFuZCByZWN0MiBvdmVybGFwPworICAgICAqIERvIHRoZSAiYmVhbXMiIHcuci50IHRoZSBnaXZlbiBkaXJlY2l0aW9uJ3MgYXhpcyBvZiByZWN0MSBhbmQgcmVjdDIgb3ZlcmxhcD8KICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIHRoZSBkaXJlY3Rpb24gKHVwLCBkb3duLCBsZWZ0LCByaWdodCkKICAgICAgKiBAcGFyYW0gcmVjdDEgVGhlIGZpcnN0IHJlY3RhbmdsZQogICAgICAqIEBwYXJhbSByZWN0MiBUaGUgc2Vjb25kIHJlY3RhbmdsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCmluZGV4IDE5NGMwMTMuLmQ1ZTQxMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKICAqIGZvciB0aGUgZGV2aWNlIHlvdSBhcmUgcnVubmluZyBvbi4gIEZvciBleGFtcGxlOgogICoKICAqIDxwcmU+TGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlCi0gKiAgICAgIENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOzwvcHJlPgorICogICAgICAoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7PC9wcmU+CiAgKiAKICAqIDxwPgogICogVG8gY3JlYXRlIGEgbmV3IExheW91dEluZmxhdGVyIHdpdGggYW4gYWRkaXRpb25hbCB7QGxpbmsgRmFjdG9yeX0gZm9yIHlvdXIKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQppbmRleCBjMmZlYzk2Li45NTJmYWNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCkBAIC02MjAsNyArNjIwLDcgQEAKICAgICAgICAgZXYubUVkZ2VGbGFncyA9IG8ubUVkZ2VGbGFnczsKICAgICAgICAgZXYubURvd25UaW1lTmFubyA9IG8ubURvd25UaW1lTmFubzsKICAgICAgICAgZXYubUFjdGlvbiA9IG8ubUFjdGlvbjsKLSAgICAgICAgby5tRmxhZ3MgPSBvLm1GbGFnczsKKyAgICAgICAgZXYubUZsYWdzID0gby5tRmxhZ3M7CiAgICAgICAgIGV2Lm1NZXRhU3RhdGUgPSBvLm1NZXRhU3RhdGU7CiAgICAgICAgIGV2Lm1YT2Zmc2V0ID0gby5tWE9mZnNldDsKICAgICAgICAgZXYubVlPZmZzZXQgPSBvLm1ZT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQppbmRleCAxNzY2MzQ1Li4yMzJkZDZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpAQCAtMzk0NCw2ICszOTQ0LDcgQEAKICAgICAgICAgICAgICAgICBpbW0uZm9jdXNPdXQodGhpcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZW1vdmVMb25nUHJlc3NDYWxsYmFjaygpOworICAgICAgICAgICAgcmVtb3ZlVGFwQ2FsbGJhY2soKTsKICAgICAgICAgICAgIG9uRm9jdXNMb3N0KCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaW1tICE9IG51bGwgJiYgKG1Qcml2YXRlRmxhZ3MgJiBGT0NVU0VEKSAhPSAwKSB7CiAgICAgICAgICAgICBpbW0uZm9jdXNJbih0aGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCBjNTgyMDdlLi5jY2FlZjQwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCkBAIC0xMDY1LDEwICsxMDY1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJmYWNlIGludmFsaWQuCi0gICAgICAgICAgICAgICAgICAgIC8vbVN1cmZhY2VIb2xkZXIubVN1cmZhY2UuY29weUZyb20obVN1cmZhY2UpOwotICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlci5tU3VyZmFjZSA9IG5ldyBTdXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlID0gbmV3IFN1cmZhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQppbmRleCAwOTE4NDRlLi5kNmRjZDRjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQpAQCAtMTA1MCwxNCArMTA1MCw2IEBACiAgICAgICAgICAgICAgICAgZ3Jhdml0eSA9IG8uZ3Jhdml0eTsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IExBWU9VVF9DSEFOR0VEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvcml6b250YWxNYXJnaW4gIT0gby5ob3Jpem9udGFsTWFyZ2luKSB7Ci0gICAgICAgICAgICAgICAgaG9yaXpvbnRhbE1hcmdpbiA9IG8uaG9yaXpvbnRhbE1hcmdpbjsKLSAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IExBWU9VVF9DSEFOR0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZlcnRpY2FsTWFyZ2luICE9IG8udmVydGljYWxNYXJnaW4pIHsKLSAgICAgICAgICAgICAgICB2ZXJ0aWNhbE1hcmdpbiA9IG8udmVydGljYWxNYXJnaW47Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBMQVlPVVRfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gby5mb3JtYXQpIHsKICAgICAgICAgICAgICAgICBmb3JtYXQgPSBvLmZvcm1hdDsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IEZPUk1BVF9DSEFOR0VEOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhY2hlTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhY2hlTWFuYWdlci5qYXZhCmluZGV4IGQxNzE5OTAuLmVmZjhlNjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWNoZU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FjaGVNYW5hZ2VyLmphdmEKQEAgLTc1Miw2ICs3NTIsNyBAQAogICAgICAgICBTdHJpbmcgY2FjaGVDb250cm9sID0gaGVhZGVycy5nZXRDYWNoZUNvbnRyb2woKTsKICAgICAgICAgaWYgKGNhY2hlQ29udHJvbCAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBjb250cm9scyA9IGNhY2hlQ29udHJvbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCJbICw7XSIpOworICAgICAgICAgICAgYm9vbGVhbiBub0NhY2hlID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKE5PX1NUT1JFLmVxdWFscyhjb250cm9sc1tpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC03NjIsNyArNzYzLDEyIEBACiAgICAgICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgdXNlZCBpbiBDQUNIRV9NT0RFX0NBQ0hFX09OTFkgY2FzZQogICAgICAgICAgICAgICAgIGlmIChOT19DQUNIRS5lcXVhbHMoY29udHJvbHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldC5leHBpcmVzID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xzW2ldLnN0YXJ0c1dpdGgoTUFYX0FHRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9DYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gaWYgY2FjaGUgY29udHJvbCA9IG5vLWNhY2hlIGhhcyBiZWVuIHJlY2VpdmVkLCBpZ25vcmUgbWF4LWFnZQorICAgICAgICAgICAgICAgIC8vIGhlYWRlciwgYWNjb3JkaW5nIHRvIGh0dHAgc3BlYzoKKyAgICAgICAgICAgICAgICAvLyBJZiBhIHJlcXVlc3QgaW5jbHVkZXMgdGhlIG5vLWNhY2hlIGRpcmVjdGl2ZSwgaXQgU0hPVUxEIE5PVAorICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgbWluLWZyZXNoLCBtYXgtc3RhbGUsIG9yIG1heC1hZ2UuCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sc1tpXS5zdGFydHNXaXRoKE1BWF9BR0UpICYmICFub0NhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzZXBhcmF0b3IgPSBjb250cm9sc1tpXS5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBjb250cm9sc1tpXS5pbmRleE9mKCc6Jyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRnJhbWVMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCmluZGV4IGVjN2MwMzIuLjRiYzEyZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9GcmFtZUxvYWRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkV2ZW50SGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RIYW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlci5DYWNoZVJlc3VsdDsKIApAQCAtMzUsNiArMzYsNyBAQAogICAgIHByaXZhdGUgaW50IG1DYWNoZU1vZGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyOwogICAgIHByaXZhdGUgU3RyaW5nIG1Db250ZW50VHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVWFwcm9mSGVhZGVyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVSSV9QUk9UT0NPTCA9IDB4MTAwOwogCkBAIC01Nyw2ICs1OSw4IEBACiAgICAgICAgIG1NZXRob2QgPSBtZXRob2Q7CiAgICAgICAgIG1DYWNoZU1vZGUgPSBXZWJTZXR0aW5ncy5MT0FEX05PUk1BTDsKICAgICAgICAgbVNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgICAgIG1VYXByb2ZIZWFkZXIgPSBtTGlzdGVuZXIuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfdXNlcmFnZW50cHJvZmlsZV91cmwsIEJ1aWxkLk1PREVMKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcnJlcihTdHJpbmcgcmVmKSB7CkBAIC0zNTcsNiArMzYxLDExIEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1IZWFkZXJzLnB1dCgiVXNlci1BZ2VudCIsIG1TZXR0aW5ncy5nZXRVc2VyQWdlbnRTdHJpbmcoKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSB4LXdhcC1wcm9maWxlIGhlYWRlcgorICAgICAgICBpZiAobVVhcHJvZkhlYWRlciAhPSBudWxsICYmIG1VYXByb2ZIZWFkZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtSGVhZGVycy5wdXQoIngtd2FwLXByb2ZpbGUiLCBtVWFwcm9mSGVhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjYTlhZDUzLi5jMWFjMTgwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMzY5LDEwICszNjksMTMgQEAKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGZpZyIsICJmaWciKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJ4aHRtbCIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vM2dwcCIsICIzZ3BwIik7CisgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9hbXIiLCAiYW1yIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgIm1pZGkiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAia2FyIik7CisgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgInhtZiIpOworICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbW9iaWxlLXhtZiIsICJteG1mIik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wZ2EiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBlZ2EiKTsKICAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAyIik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCAxOTE1NDI1Li43ZjdhMjVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTMxMyw2ICszMTMsMTAgQEAKICAgICAvLyB0cnVlIG1lYW5zIHJlZHJhdyB0aGUgc2NyZWVuIGFsbC10aGUtdGltZS4gT25seSB3aXRoIEFVVE9fUkVEUkFXX0hBQ0sKICAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9SZWRyYXc7CiAKKyAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIEFsZXJ0RGlhbG9nIGRpc3BsYXllZCBieSBJbnZva2VMaXN0Qm94LgorICAgIC8vIEl0J3MgdXNlZCB0byBkaXNtaXNzIHRoZSBkaWFsb2cgaW4gZGVzdHJveSBpZiBub3QgZG9uZSBiZWZvcmUuCisgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtTGlzdEJveERpYWxvZyA9IG51bGw7CisKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewpAQCAtMTMwMSw2ICsxMzA1LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgY2xlYXJIZWxwZXJzKCk7CisgICAgICAgIGlmIChtTGlzdEJveERpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdEJveERpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICBtTGlzdEJveERpYWxvZyA9IG51bGw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBTZXQgdGhlIGhhbmRsZXJzIHRvIG51bGwgYmVmb3JlIGRlc3Ryb3lpbmcgV2ViVmlld0NvcmUgc28gbm8KICAgICAgICAgICAgIC8vIG1vcmUgbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQuCkBAIC00MTczLDYgKzQxODEsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfUEFHRV9VUCkgeworICAgICAgICAgICAgcGFnZVVwKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QQUdFX0RPV04pIHsKKyAgICAgICAgICAgIHBhZ2VEb3duKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7CkBAIC03NTQwLDcgKzc1NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIC0yLCAwKTsKICAgICAgICAgICAgICAgICB9fSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBiLmNyZWF0ZSgpOworICAgICAgICAgICAgbUxpc3RCb3hEaWFsb2cgPSBiLmNyZWF0ZSgpOwogICAgICAgICAgICAgbGlzdFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKICAgICAgICAgICAgIGxpc3RWaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwogICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBidWcgKDEyNTAxMDMpIHdoZXJlIHRoZSBjaGVja3MgaW4gYSBMaXN0VmlldyB3aXRoCkBAIC03NTYyLDcgKzc1ODAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIChpbnQpaWQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uICE9IC0xKSB7CkBAIC03NTc0LDEzICs3NTkzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLnNldE9uQ2FuY2VsTGlzdGVuZXIobmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5TSU5HTEVfTElTVEJPWF9DSE9JQ0UsIC0yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RCb3hEaWFsb2cgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgIG1MaXN0Qm94RGlhbG9nLnNob3coKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQppbmRleCBmNTRiMjA3Li5lMzY2MDJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtNTgsNyArNTgsMTEgQEAKICAgICAgICAgLy8gTG9hZCBsaWJ3ZWJjb3JlIGR1cmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24uIFRoaXMgaGFwcGVucyBpbiB0aGUKICAgICAgICAgLy8genlnb3RlIHByb2Nlc3Mgc28gaXQgd2lsbCBiZSBzaGFyZWQgcmVhZC1vbmx5IGFjcm9zcyBhbGwgYXBwCiAgICAgICAgIC8vIHByb2Nlc3Nlcy4KLSAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ3ZWJjb3JlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIndlYmNvcmUiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiVW5hYmxlIHRvIGxvYWQgd2ViY29yZSBsaWJyYXJ5Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic29sdXRlTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQuamF2YQppbmRleCBiODI5NjU1Li45NzBjYmUzNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic29sdXRlTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic29sdXRlTGF5b3V0LmphdmEKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gYyB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQKLSAgICAgICAgICogQHBhcmFtIGF0dHJzIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBmb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgbGF5b3V0CisgICAgICAgICAqIEBwYXJhbSBhdHRycyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBsYXlvdXQKICAgICAgICAgICogICAgICAgICAgICAgIHBhcmFtZXRlcnMgdmFsdWVzCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgTGF5b3V0UGFyYW1zKENvbnRleHQgYywgQXR0cmlidXRlU2V0IGF0dHJzKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKaW5kZXggMzJlNTUwNC4uMDNhZGE5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTgzLDcgKzg0LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmeU9uQ2hhbmdlID0gdHJ1ZTsKIAotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsgICAgCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VD4gbU9yaWdpbmFsVmFsdWVzOwogICAgIHByaXZhdGUgQXJyYXlGaWx0ZXIgbUZpbHRlcjsKQEAgLTE4MSw2ICsxODIsNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBDb2xsZWN0aW9uIHRvIGFkZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gY29sbGVjdGlvbikgeworICAgICAgICBpZiAobU9yaWdpbmFsVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBtT3JpZ2luYWxWYWx1ZXMuYWRkQWxsKGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChtTm90aWZ5T25DaGFuZ2UpIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT2JqZWN0cy5hZGRBbGwoY29sbGVjdGlvbik7CisgICAgICAgICAgICBpZiAobU5vdGlmeU9uQ2hhbmdlKSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGl0ZW1zIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0byBhZGQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxsKFQgLi4uIGl0ZW1zKSB7CisgICAgICAgIGlmIChtT3JpZ2luYWxWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGZvciAoVCBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsVmFsdWVzLmFkZChpdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlPbkNoYW5nZSkgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoVCBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICBtT2JqZWN0cy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU5vdGlmeU9uQ2hhbmdlKSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBhcnJheS4KICAgICAgKgogICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNlcnQgaW50byB0aGUgYXJyYXkuCkBAIC0yMzYsNyArMjc1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzb3J0KENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CiAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobU9iamVjdHMsIGNvbXBhcmF0b3IpOwotICAgICAgICBpZiAobU5vdGlmeU9uQ2hhbmdlKSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOyAgICAgICAgCisgICAgICAgIGlmIChtTm90aWZ5T25DaGFuZ2UpIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhCmluZGV4IDQxNmJlODYuLmExMWRlNmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhCkBAIC0zMTcsNiArMzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVkgPSBtRWRnZVNjYWxlWVN0YXJ0ICsKICAgICAgICAgICAgICAgICAgICAgICAgIChtRWRnZVNjYWxlWUZpbmlzaCAtIG1FZGdlU2NhbGVZU3RhcnQpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAgKiBmYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQ0VERTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9SRUNFREU6CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lETEU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRmFzdFNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRmFzdFNjcm9sbGVyLmphdmEKaW5kZXggNTRjNGIzNi4uYWE2OGE3NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Zhc3RTY3JvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GYXN0U2Nyb2xsZXIuamF2YQpAQCAtMTU0LDYgKzE1NCwxMSBAQAogICAgICAgICBpbnQgdGV4dENvbG9yTm9ybWFsID0gdGV4dENvbG9yLmdldERlZmF1bHRDb2xvcigpOwogICAgICAgICBtUGFpbnQuc2V0Q29sb3IodGV4dENvbG9yTm9ybWFsKTsKICAgICAgICAgbVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTExfQU5EX1NUUk9LRSk7CisKKyAgICAgICAgLy8gdG8gc2hvdyBtT3ZlcmxheURyYXdhYmxlIHByb3Blcmx5CisgICAgICAgIGlmIChtTGlzdC5nZXRXaWR0aCgpID4gMCAmJiBtTGlzdC5nZXRIZWlnaHQoKSA+IDApIHsKKyAgICAgICAgICAgIG9uU2l6ZUNoYW5nZWQobUxpc3QuZ2V0V2lkdGgoKSwgbUxpc3QuZ2V0SGVpZ2h0KCksIDAsIDApOworICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtU3RhdGUgPSBTVEFURV9OT05FOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9OdW1iZXJQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9OdW1iZXJQaWNrZXIuamF2YQppbmRleCA0NDgyYjViLi4xMGU3NjM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTnVtYmVyUGlja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlci5qYXZhCkBAIC02Niw3ICs2Niw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOdW1iZXJQaWNrZXIuRm9ybWF0dGVyIFRXT19ESUdJVF9GT1JNQVRURVIgPQogICAgICAgICAgICAgbmV3IE51bWJlclBpY2tlci5Gb3JtYXR0ZXIoKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlciBtRm10ID0gbmV3IGphdmEudXRpbC5Gb3JtYXR0ZXIobUJ1aWxkZXIpOworICAgICAgICAgICAgICAgIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIgbUZtdCA9IG5ldyBqYXZhLnV0aWwuRm9ybWF0dGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIsIGphdmEudXRpbC5Mb2NhbGUuVVMpOwogICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIG1BcmdzID0gbmV3IE9iamVjdFsxXTsKICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICBtQXJnc1swXSA9IHZhbHVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlckJ1dHRvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L051bWJlclBpY2tlckJ1dHRvbi5qYXZhCmluZGV4IDFjODU3OWMuLjI5MmI2NjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9OdW1iZXJQaWNrZXJCdXR0b24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTnVtYmVyUGlja2VyQnV0dG9uLmphdmEKQEAgLTg1LDQgKzg1LDEyIEBACiAgICAgICAgICAgICBtTnVtYmVyUGlja2VyLmNhbmNlbERlY3JlbWVudCgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgeworICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7CisgICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMpIHsKKyAgICAgICAgICAgIGNhbmNlbExvbmdwcmVzcygpOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCmluZGV4IGVjN2Q5MjcuLjJhNjk1ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCkBAIC02NjYsOCArNjY2LDggQEAKIAogICAgICAgICAgICAgaWYgKG1Qcm9ncmVzcyA+IG1heCkgewogICAgICAgICAgICAgICAgIG1Qcm9ncmVzcyA9IG1heDsKLSAgICAgICAgICAgICAgICByZWZyZXNoUHJvZ3Jlc3MoUi5pZC5wcm9ncmVzcywgbVByb2dyZXNzLCBmYWxzZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZyZXNoUHJvZ3Jlc3MoUi5pZC5wcm9ncmVzcywgbVByb2dyZXNzLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFiV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFiV2lkZ2V0LmphdmEKaW5kZXggYWZhZTdlZi4uYjRiMzU1YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYldpZGdldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQuamF2YQpAQCAtMTA5LDcgKzEwOSw2IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRUYWJXaWRnZXQoKSB7Ci0gICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5IT1JJWk9OVEFMKTsKICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19VU0VfQ0hJTERfRFJBV0lOR19PUkRFUjsKIAogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggNTcyYmQ4Yy4uNjg2MDBjZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTk4Miw2ICs5ODIsMjIgQEAKICAgICAgICAgc2V0VHlwZWZhY2UodGYsIHN0eWxlSW5kZXgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGlmIChlbmFibGVkID09IGlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHNvZnQgaW5wdXQgaWYgdGhlIGN1cnJlbnRseSBhY3RpdmUgVGV4dFZpZXcgaXMgZGlzYWJsZWQKKyAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdHlwZWZhY2UgYW5kIHN0eWxlIGluIHdoaWNoIHRoZSB0ZXh0IHNob3VsZCBiZSBkaXNwbGF5ZWQsCiAgICAgICogYW5kIHR1cm5zIG9uIHRoZSBmYWtlIGJvbGQgYW5kIGl0YWxpYyBiaXRzIGluIHRoZSBQYWludCBpZiB0aGUKQEAgLTQ1OTIsNyArNDYwOCw3IEBACiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZSBwdWJsaWMgSW5wdXRDb25uZWN0aW9uIG9uQ3JlYXRlSW5wdXRDb25uZWN0aW9uKEVkaXRvckluZm8gb3V0QXR0cnMpIHsKLSAgICAgICAgaWYgKG9uQ2hlY2tJc1RleHRFZGl0b3IoKSkgeworICAgICAgICBpZiAob25DaGVja0lzVGV4dEVkaXRvcigpICYmIGlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBpZiAobUlucHV0TWV0aG9kU3RhdGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1JbnB1dE1ldGhvZFN0YXRlID0gbmV3IElucHV0TWV0aG9kU3RhdGUoKTsKICAgICAgICAgICAgIH0KQEAgLTQ2NjYsNiArNDY4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGFydE9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbmRPZmZzZXQgPSBOOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB1c2UgdGhlIGRlbHRhIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGFtb3VudCBvZiB0ZXh0CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQuCisgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbmRPZmZzZXQgKz0gZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBvZmZzZXRzIHRvIGVuc3VyZSB3ZSBjb250YWluIGZ1bGwgc3BhbnMuCiAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgU3Bhbm5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpY29udGVudDsKQEAgLTQ2ODEsMTAgKzQ3MDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG91dFRleHQucGFydGlhbFN0YXJ0T2Zmc2V0ID0gcGFydGlhbFN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBvdXRUZXh0LnBhcnRpYWxFbmRPZmZzZXQgPSBwYXJ0aWFsRW5kT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdXNlIHRoZSBkZWx0YSB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBhbW91bnQgb2YgdGV4dAotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkLgotICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsRW5kT2Zmc2V0ICs9IGRlbHRhOworICAgICAgICAgICAgICAgICAgICBvdXRUZXh0LnBhcnRpYWxFbmRPZmZzZXQgPSBwYXJ0aWFsRW5kT2Zmc2V0IC0gZGVsdGE7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpYWxTdGFydE9mZnNldCA+IE4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGFydE9mZnNldCA9IE47CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydGlhbFN0YXJ0T2Zmc2V0IDwgMCkgewpAQCAtNDc0OCw2ICs0NzY1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBpbXMubVRtcEV4dHJhY3RlZC50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0udXBkYXRlRXh0cmFjdGVkVGV4dCh0aGlzLCByZXEudG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNZXRob2RTdGF0ZS5tVG1wRXh0cmFjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXMubUNoYW5nZWRTdGFydCA9IEVYVFJBQ1RfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXMubUNoYW5nZWRFbmQgPSBFWFRSQUNUX1VOS05PV047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkRGVsdGEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcy5tQ29udGVudENoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjM0OCw4ICs2MzY5LDggQEAKICAgICAgICAgICAgICAgICBpbXMubUNoYW5nZWRTdGFydCA9IHN0YXJ0OwogICAgICAgICAgICAgICAgIGltcy5tQ2hhbmdlZEVuZCA9IHN0YXJ0K2JlZm9yZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGltcy5tQ2hhbmdlZFN0YXJ0ID4gc3RhcnQpIGltcy5tQ2hhbmdlZFN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGltcy5tQ2hhbmdlZEVuZCA8IChzdGFydCtiZWZvcmUpKSBpbXMubUNoYW5nZWRFbmQgPSBzdGFydCtiZWZvcmU7CisgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkU3RhcnQgPSBNYXRoLm1pbihpbXMubUNoYW5nZWRTdGFydCwgc3RhcnQpOworICAgICAgICAgICAgICAgIGltcy5tQ2hhbmdlZEVuZCA9IE1hdGgubWF4KGltcy5tQ2hhbmdlZEVuZCwgc3RhcnQgKyBiZWZvcmUgLSBpbXMubUNoYW5nZWREZWx0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbXMubUNoYW5nZWREZWx0YSArPSBhZnRlci1iZWZvcmU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlci5qYXZhCmluZGV4IDgxY2E5MTIuLmZlZmRjZWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YQpAQCAtNDM0LDYgKzQzNCw3IEBACiAgICAgICAgICAgICAgICAgVmlldyB0aXRsZVRlbXBsYXRlID0gbVdpbmRvdy5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgdGl0bGVUZW1wbGF0ZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB0b3BQYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgaGFzVGl0bGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9OZXRJbml0aWF0ZWRBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9OZXRJbml0aWF0ZWRBY3Rpdml0eS5qYXZhCmluZGV4IDM2ZjQ1YjIuLjYwMzljYzIgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTmV0SW5pdGlhdGVkQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL05ldEluaXRpYXRlZEFjdGl2aXR5LmphdmEKQEAgLTI2LDYgKzI2LDggQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNOZXRJbml0aWF0ZWRIYW5kbGVyOwogCiAvKioKQEAgLTQyLDEwICs0NCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU0lUSVZFX0JVVFRPTiA9IEFsZXJ0RGlhbG9nLkJVVFRPTl9QT1NJVElWRTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVfQlVUVE9OID0gQWxlcnREaWFsb2cuQlVUVE9OX05FR0FUSVZFOwogCi0gICAgLy8gRGlhbG9nIGJ1dHRvbiB0ZXh0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OX1RFWFRfQUNDRVBUID0gIkFjY2VwdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OX1RFWFRfREVOWSA9ICJEZW55IjsKLQogICAgIC8vIFJlY2VpdmVkIElEIGZyb20gaW50ZW50LCAtMSB3aGVuIG5vIG5vdGlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcwogICAgIHByaXZhdGUgaW50IG5vdGlmaWNhdGlvbklkID0gLTE7CiAKQEAgLTY3LDEyICs2NSwxMyBAQAogICAgICAgICAvLyBTZXQgdXAgdGhlICJkaWFsb2ciCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKICAgICAgICAgZmluYWwgQWxlcnRDb250cm9sbGVyLkFsZXJ0UGFyYW1zIHAgPSBtQWxlcnRQYXJhbXM7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpOwogICAgICAgICBwLm1JY29uSWQgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX2RpYWxvZ191c2I7CiAgICAgICAgIHAubVRpdGxlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEdwc05ldEluaXRpYXRlZEhhbmRsZXIuTklfSU5URU5UX0tFWV9USVRMRSk7CiAgICAgICAgIHAubU1lc3NhZ2UgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoR3BzTmV0SW5pdGlhdGVkSGFuZGxlci5OSV9JTlRFTlRfS0VZX01FU1NBR0UpOwotICAgICAgICBwLm1Qb3NpdGl2ZUJ1dHRvblRleHQgPSBCVVRUT05fVEVYVF9BQ0NFUFQ7CisgICAgICAgIHAubVBvc2l0aXZlQnV0dG9uVGV4dCA9IFN0cmluZy5mb3JtYXQoY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZ3BzVmVyaWZZZXMpKTsKICAgICAgICAgcC5tUG9zaXRpdmVCdXR0b25MaXN0ZW5lciA9IHRoaXM7Ci0gICAgICAgIHAubU5lZ2F0aXZlQnV0dG9uVGV4dCA9IEJVVFRPTl9URVhUX0RFTlk7CisgICAgICAgIHAubU5lZ2F0aXZlQnV0dG9uVGV4dCA9IFN0cmluZy5mb3JtYXQoY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZ3BzVmVyaWZObykpOwogICAgICAgICBwLm1OZWdhdGl2ZUJ1dHRvbkxpc3RlbmVyID0gdGhpczsKIAogICAgICAgICBub3RpZmljYXRpb25JZCA9IGludGVudC5nZXRJbnRFeHRyYShHcHNOZXRJbml0aWF0ZWRIYW5kbGVyLk5JX0lOVEVOVF9LRVlfTk9USUZfSUQsIC0xKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU2h1dGRvd25UaHJlYWQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU2h1dGRvd25UaHJlYWQuamF2YQppbmRleCBiNzI1NWJiLi5jZDFiNTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1NodXRkb3duVGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TaHV0ZG93blRocmVhZC5qYXZhCkBAIC03MSw3ICs3MSw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1BY3Rpb25Eb25lOwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOwotICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1XYWtlTG9jazsKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtQ3B1V2FrZUxvY2s7CisgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVNjcmVlbldha2VMb2NrOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKICAgICAKICAgICBwcml2YXRlIFNodXRkb3duVGhyZWFkKCkgewpAQCAtMTM4LDcgKzEzOSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBiZWdpblNodXRkb3duU2VxdWVuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0lzU3RhcnRlZEd1YXJkKSB7CiAgICAgICAgICAgICBpZiAoc0lzU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlcXVlc3QgdG8gc2h1dGRvd24gYWxyZWFkeSBydW5uaW5nLCByZXR1cm5pbmcuIik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2h1dGRvd24gc2VxdWVuY2UgYWxyZWFkeSBydW5uaW5nLCByZXR1cm5pbmcuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc0lzU3RhcnRlZCA9IHRydWU7CkBAIC0xNTksMjAgKzE2MCwzNiBAQAogCiAgICAgICAgIHBkLnNob3coKTsKIAotICAgICAgICAvLyBzdGFydCB0aGUgdGhyZWFkIHRoYXQgaW5pdGlhdGVzIHNodXRkb3duCiAgICAgICAgIHNJbnN0YW5jZS5tQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIHNJbnN0YW5jZS5tUG93ZXJNYW5hZ2VyID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgc0luc3RhbmNlLm1XYWtlTG9jayA9IG51bGw7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIG5ldmVyIGZhbGwgYXNsZWVwIGFnYWluCisgICAgICAgIHNJbnN0YW5jZS5tQ3B1V2FrZUxvY2sgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc0luc3RhbmNlLm1DcHVXYWtlTG9jayA9IHNJbnN0YW5jZS5tUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKAorICAgICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyArICItY3B1Iik7CisgICAgICAgICAgICBzSW5zdGFuY2UubUNwdVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgc0luc3RhbmNlLm1DcHVXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIk5vIHBlcm1pc3Npb24gdG8gYWNxdWlyZSB3YWtlIGxvY2siLCBlKTsKKyAgICAgICAgICAgIHNJbnN0YW5jZS5tQ3B1V2FrZUxvY2sgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxzbyBtYWtlIHN1cmUgdGhlIHNjcmVlbiBzdGF5cyBvbiBmb3IgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZQorICAgICAgICBzSW5zdGFuY2UubVNjcmVlbldha2VMb2NrID0gbnVsbDsKICAgICAgICAgaWYgKHNJbnN0YW5jZS5tUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UubVdha2VMb2NrID0gc0luc3RhbmNlLm1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZXIuRlVMTF9XQUtFX0xPQ0ssICJTaHV0ZG93biIpOwotICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tU2NyZWVuV2FrZUxvY2sgPSBzSW5zdGFuY2UubVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywgVEFHICsgIi1zY3JlZW4iKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UubVNjcmVlbldha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZS5tU2NyZWVuV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk5vIHBlcm1pc3Npb24gdG8gYWNxdWlyZSB3YWtlIGxvY2siLCBlKTsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UubVdha2VMb2NrID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UubVNjcmVlbldha2VMb2NrID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIHN0YXJ0IHRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZXMgc2h1dGRvd24KICAgICAgICAgc0luc3RhbmNlLm1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIH07CiAgICAgICAgIHNJbnN0YW5jZS5zdGFydCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKaW5kZXggNTAwMDUxNy4uMTMzOWI0NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCkBAIC05ODQsNyArOTg0LDcgQEAKICAgICAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEtlcm5lbFdha2Vsb2NrU3RhdHM+IHJlYWRLZXJuZWxXYWtlbG9ja1N0YXRzKCkgewogICAgICAgICAKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07CiAgICAgICAgIGludCBsZW47CiAgICAgICAgIAogICAgICAgICB0cnkgewpAQCAtMTAzMSw5ICsxMDMxLDExIEBACiAgICAgICAgICAgICAgICAgZm9yIChlbmRJbmRleD1zdGFydEluZGV4OyAKICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4IDwgbGVuICYmIHdsQnVmZmVyW2VuZEluZGV4XSAhPSAnXG4nICYmIHdsQnVmZmVyW2VuZEluZGV4XSAhPSAnXDAnOyAKICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4KyspOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGdvIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4Kys7IC8vIGVuZEluZGV4IGlzIGFuIGV4Y2x1c2l2ZSB1cHBlciBib3VuZC4KKyAgICAgICAgICAgICAgICBlbmRJbmRleCsrOyAvLyBlbmRJbmRleCBpcyBhbiBleGNsdXNpdmUgdXBwZXIgYm91bmQuCisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ28gb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIFByb2Nlc3MucGFyc2VQcm9jTGluZSBtaWdodAorICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIHdsQnVmZmVyW2VuZEluZGV4XQorICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA+PSAobGVuIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVTdHJpbmdBcnJheSA9IG1Qcm9jV2FrZWxvY2tzTmFtZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQppbmRleCBhM2VmYmM4Li5lYTI3OGE2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCkBAIC05Niw3ICs5Niw4IEBACiAgICAgICAgICAgICBwZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9ICIvc2RjYXJkL3NuYXBzaG90cyI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFyc2VyLmphdmEgYi9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFyc2VyLmphdmEKaW5kZXggNmRmNGM2My4uM2YxODVhYSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9tbXMvcGR1L1BkdVBhcnNlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3BkdS9QZHVQYXJzZXIuamF2YQpAQCAtMTY1LDYgKzE2NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBvciAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQucmVsYXRlZCIKICAgICAgICAgICAgICAgICAgICAgLy8gb3IgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmFsdGVybmF0aXZlIgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0cmlldmVDb25mOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RUeXBlU3RyLmVxdWFscyhDb250ZW50VHlwZS5NVUxUSVBBUlRfQUxURVJOQVRJVkUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5hbHRlcm5hdGl2ZSIKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHRha2Ugb25seSB0aGUgZmlyc3QgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgUGR1UGFydCBmaXJzdFBhcnQgPSBtQm9keS5nZXRQYXJ0KDApOworICAgICAgICAgICAgICAgICAgICBtQm9keS5yZW1vdmVBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJvZHkuYWRkUGFydCgwLCBmaXJzdFBhcnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0cmlldmVDb25mOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIGNhc2UgUGR1SGVhZGVycy5NRVNTQUdFX1RZUEVfREVMSVZFUllfSU5EOgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9tbXMvdXRpbC9QZHVDYWNoZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9tbXMvdXRpbC9QZHVDYWNoZS5qYXZhCmluZGV4IDdjM2ZhZDcuLjg2NmNhMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3V0aWwvUGR1Q2FjaGUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL1BkdUNhY2hlLmphdmEKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tTWVzc2FnZUJveGVzKFVyaSBrZXksIFBkdUNhY2hlRW50cnkgZW50cnkpIHsKLSAgICAgICAgSGFzaFNldDxVcmk+IG1zZ0JveCA9IG1UaHJlYWRzLmdldChlbnRyeS5nZXRNZXNzYWdlQm94KCkpOworICAgICAgICBIYXNoU2V0PFVyaT4gbXNnQm94ID0gbVRocmVhZHMuZ2V0KExvbmcudmFsdWVPZihlbnRyeS5nZXRNZXNzYWdlQm94KCkpKTsKICAgICAgICAgaWYgKG1zZ0JveCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtc2dCb3gucmVtb3ZlKGtleSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQuY3BwCmluZGV4IDMxZWJmOGMuLmE2MjUzN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0LmNwcApAQCAtNDQ4LDcgKzQ0OCw3IEBACiAjaWZkZWYgSEFWRV9CTFVFVE9PVEgKICAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CiAKLSAgICBpbnQgcmV0OworICAgIGludCByZXQsIHRvdGFsOwogICAgIGpieXRlICpiOwogICAgIGludCBzejsKICAgICBzdHJ1Y3QgYXNvY2tldCAqcyA9IGdldF9zb2NrZXREYXRhKGVudiwgb2JqKTsKQEAgLTQ3MSwxNSArNDcxLDIxIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXQgPSBhc29ja2V0X3dyaXRlKHMsICZiW29mZnNldF0sIGxlbmd0aCwgLTEpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpiLCBiLCBKTklfQUJPUlQpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgdG90YWwgPSAwOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIHJldCA9IGFzb2NrZXRfd3JpdGUocywgJmJbb2Zmc2V0XSwgbGVuZ3RoLCAtMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICAgICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamIsIGIsIEpOSV9BQk9SVCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgdG90YWwgKz0gcmV0OworICAgICAgICBsZW5ndGggLT0gcmV0OwogICAgIH0KIAogICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpiLCBiLCBKTklfQUJPUlQpOyAgLy8gbm8gbmVlZCB0byBjb21taXQKLSAgICByZXR1cm4gKGppbnQpcmV0OworICAgIHJldHVybiAoamludCl0b3RhbDsKIAogI2VuZGlmCiAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVOT1NZUyk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKaW5kZXggZmUxNTFjZC4uNGQ5YmIzYiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcApAQCAtMjUsOSArMjUsOCBAQAogZXh0ZXJuICJDIiB7CiBpbnQgaWZjX2VuYWJsZShjb25zdCBjaGFyICppZm5hbWUpOwogaW50IGlmY19kaXNhYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX2FkZF9ob3N0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgdWludDMyX3QgYWRkcik7CitpbnQgaWZjX2FkZF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIGNvbnN0IGNoYXIgKmRlc3RTdHIsIHVpbnQzMl90IHByZWZpeExlbiwgY29uc3QgY2hhciAqZ3dTdHIpOwogaW50IGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMoY29uc3QgY2hhciAqaWZuYW1lKTsKLWludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBnYXRld2F5KTsKIGludCBpZmNfZ2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKIGludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKIGludCBpZmNfcmVzZXRfY29ubmVjdGlvbnMoY29uc3QgY2hhciAqaWZuYW1lKTsKQEAgLTk2LDEzICs5NSwyMyBAQAogICAgIHJldHVybiAoamludClyZXN1bHQ7CiB9CiAKLXN0YXRpYyBqaW50IGFuZHJvaWRfbmV0X3V0aWxzX2FkZEhvc3RSb3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBpZm5hbWUsIGppbnQgYWRkcikKK3N0YXRpYyBqaW50IGFuZHJvaWRfbmV0X3V0aWxzX2FkZFJvdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIGlmbmFtZSwKKyAgICAgICAgICBqc3RyaW5nIGRzdCwgamludCBwcmVmaXhMZW5ndGgsIGpzdHJpbmcgZ3cpCiB7CiAgICAgaW50IHJlc3VsdDsKIAogICAgIGNvbnN0IGNoYXIgKm5hbWVTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGlmbmFtZSwgTlVMTCk7Ci0gICAgcmVzdWx0ID0gOjppZmNfYWRkX2hvc3Rfcm91dGUobmFtZVN0ciwgYWRkcik7CisgICAgY29uc3QgY2hhciAqZHN0U3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkc3QsIE5VTEwpOworICAgIGNvbnN0IGNoYXIgKmd3U3RyID0gTlVMTDsKKyAgICBpZiAoZ3cgIT0gTlVMTCkgeworICAgICAgICBnd1N0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZ3csIE5VTEwpOworICAgIH0KKyAgICByZXN1bHQgPSA6OmlmY19hZGRfcm91dGUobmFtZVN0ciwgZHN0U3RyLCBwcmVmaXhMZW5ndGgsIGd3U3RyKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhpZm5hbWUsIG5hbWVTdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRzdCwgZHN0U3RyKTsKKyAgICBpZiAoZ3cgIT0gTlVMTCkgeworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhndywgZ3dTdHIpOworICAgIH0KICAgICByZXR1cm4gKGppbnQpcmVzdWx0OwogfQogCkBAIC0xMTYsMTYgKzEyNSw2IEBACiAgICAgcmV0dXJuIChqaW50KXJlc3VsdDsKIH0KIAotc3RhdGljIGppbnQgYW5kcm9pZF9uZXRfdXRpbHNfc2V0RGVmYXVsdFJvdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIGlmbmFtZSwgamludCBnYXRld2F5KQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBjb25zdCBjaGFyICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhpZm5hbWUsIE5VTEwpOwotICAgIHJlc3VsdCA9IDo6aWZjX3NldF9kZWZhdWx0X3JvdXRlKG5hbWVTdHIsIGdhdGV3YXkpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGlmbmFtZSwgbmFtZVN0cik7Ci0gICAgcmV0dXJuIChqaW50KXJlc3VsdDsKLX0KLQogc3RhdGljIGppbnQgYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIGlmbmFtZSkKIHsKICAgICBpbnQgcmVzdWx0OwpAQCAtMjUzLDkgKzI1Miw5IEBACiAKICAgICB7ICJlbmFibGVJbnRlcmZhY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZW5hYmxlSW50ZXJmYWNlIH0sCiAgICAgeyAiZGlzYWJsZUludGVyZmFjZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19kaXNhYmxlSW50ZXJmYWNlIH0sCi0gICAgeyAiYWRkSG9zdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19hZGRIb3N0Um91dGUgfSwKKyAgICB7ICJhZGRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2FkZFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlSG9zdFJvdXRlcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVIb3N0Um91dGVzIH0sCi0gICAgeyAic2V0RGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19zZXREZWZhdWx0Um91dGUgfSwKICAgICB7ICJnZXREZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlRGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZURlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlc2V0Q29ubmVjdGlvbnMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVzZXRDb25uZWN0aW9ucyB9LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAKaW5kZXggNzY5NmJiMy4uNTMwMjhjMyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3RleHRfQW5kcm9pZEJpZGkuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQW5kcm9pZFVuaWNvZGUiCiAKLSNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgogI2luY2x1ZGUgInV0aWxzL0xvZy5oIgpAQCAtMjUsMTQgKzI1LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogICAgIAotc3RhdGljIHZvaWQgam5pVGhyb3dFeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGV4YywgY29uc3QgY2hhciogbXNnID0gTlVMTCkKLXsKLSAgICBqY2xhc3MgZXhjQ2xhenogPSBlbnYtPkZpbmRDbGFzcyhleGMpOwotICAgIExPR19BU1NFUlQoZXhjQ2xhenosICJVbmFibGUgdG8gZmluZCBjbGFzcyAlcyIsIGV4Yyk7Ci0KLSAgICBlbnYtPlRocm93TmV3KGV4Y0NsYXp6LCBtc2cpOwotfQotCiBzdGF0aWMgamludCBydW5CaWRpKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgamludCBkaXIsIGpjaGFyQXJyYXkgY2hzQXJyYXksIAogICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGluZm9BcnJheSwgaW50IG4sIGpib29sZWFuIGhhdmVJbmZvKQogewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRDaGFyYWN0ZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF90ZXh0X0FuZHJvaWRDaGFyYWN0ZXIuY3BwCmluZGV4IDVkOGQ0MTkuLjZiOTA1NDEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJBbmRyb2lkVW5pY29kZSIKIAotI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KICNpbmNsdWRlICJ1dGlscy9taXNjLmgiCiAjaW5jbHVkZSAidXRpbHMvTG9nLmgiCkBAIC01MCwxNCArNTAsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAgICAgCi1zdGF0aWMgdm9pZCBqbmlUaHJvd0V4Y2VwdGlvbihKTklFbnYqIGVudiwgY29uc3QgY2hhciogZXhjLCBjb25zdCBjaGFyKiBtc2cgPSBOVUxMKQotewotICAgIGpjbGFzcyBleGNDbGF6eiA9IGVudi0+RmluZENsYXNzKGV4Yyk7Ci0gICAgTE9HX0FTU0VSVChleGNDbGF6eiwgIlVuYWJsZSB0byBmaW5kIGNsYXNzICVzIiwgZXhjKTsKLQotICAgIGVudi0+VGhyb3dOZXcoZXhjQ2xhenosIG1zZyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGdldERpcmVjdGlvbmFsaXRpZXMoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBqY2hhckFycmF5IHNyY0FycmF5LCBqYnl0ZUFycmF5IGRlc3RBcnJheSwgaW50IGNvdW50KQogewogICAgIGpjaGFyKiBzcmMgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHNyY0FycmF5LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9TdHJpbmdCbG9jay5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3V0aWxfU3RyaW5nQmxvY2suY3BwCmluZGV4IDY0MWZiY2UuLmEwMjFlZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9TdHJpbmdCbG9jay5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF91dGlsX1N0cmluZ0Jsb2NrLmNwcApAQCAtMTQ3LDI1ICsxNDcsNiBAQAogICAgIHJldHVybiBhcnJheTsKIH0KIAotc3RhdGljIGppbnQgYW5kcm9pZF9jb250ZW50X1N0cmluZ0Jsb2NrX25hdGl2ZUluZGV4T2ZTdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHRva2VuLCBqc3RyaW5nIHN0cikKLXsKLSAgICBSZXNTdHJpbmdQb29sKiBvc2IgPSAoUmVzU3RyaW5nUG9vbCopdG9rZW47Ci0gICAgaWYgKG9zYiA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIGRvVGhyb3coZW52LCAiamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIxNl90KiBzdHIxNiA9IGVudi0+R2V0U3RyaW5nQ2hhcnMoc3RyLCBOVUxMKTsKLSAgICBqc2l6ZSBzdHJMZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChzdHIpOwotCi0gICAgc3NpemVfdCBpZHggPSBvc2ItPmluZGV4T2ZTdHJpbmcoc3RyMTYsIHN0ckxlbik7Ci0KLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhzdHIsIHN0cjE2KTsKLQotICAgIHJldHVybiBpZHg7Ci19Ci0KIHN0YXRpYyB2b2lkIGFuZHJvaWRfY29udGVudF9TdHJpbmdCbG9ja19uYXRpdmVEZXN0cm95KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCB0b2tlbikKIHsKQEAgLTE5Myw4ICsxNzQsNiBAQAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX2NvbnRlbnRfU3RyaW5nQmxvY2tfbmF0aXZlR2V0U3RyaW5nIH0sCiAgICAgeyAibmF0aXZlR2V0U3R5bGUiLCAgICAiKElJKVtJIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9jb250ZW50X1N0cmluZ0Jsb2NrX25hdGl2ZUdldFN0eWxlIH0sCi0gICAgeyAibmF0aXZlSW5kZXhPZlN0cmluZyIsIihJTGphdmEvbGFuZy9TdHJpbmc7KUkiLAotICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX2NvbnRlbnRfU3RyaW5nQmxvY2tfbmF0aXZlSW5kZXhPZlN0cmluZyB9LAogICAgIHsgIm5hdGl2ZURlc3Ryb3kiLCAgICAgICIoSSlWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9jb250ZW50X1N0cmluZ0Jsb2NrX25hdGl2ZURlc3Ryb3kgfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2Fsd2F5c191c2VfY2hlY2tib3gueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbHdheXNfdXNlX2NoZWNrYm94LnhtbAppbmRleCBiYWE0YmVlLi5hOTU1MzUyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2Fsd2F5c191c2VfY2hlY2tib3gueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWx3YXlzX3VzZV9jaGVja2JveC54bWwKQEAgLTI2LDE0ICsyNiwxNCBAQAogICAgIAogICAgIDxDaGVja0JveAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Fsd2F5c1VzZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgogICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIgLz4KICAgICAKICAgICA8VGV4dFZpZXcgCiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJEZWZhdWx0SGludCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzZkaXAiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3RhYl9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdGFiX2NvbnRlbnQueG1sCmluZGV4IDBlZTg3Y2UuLjc5MTQ3ZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdGFiX2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdGFiX2NvbnRlbnQueG1sCkBAIC0yMiw4ICsyMiw5IEBACiAJYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgogCTxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KLSAgICAgICAgPFRhYldpZGdldCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90YWJzIiBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAJYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIgLz4KKyAgICA8VGFiV2lkZ2V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RhYnMiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CiAgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90YWJjb250ZW50IgogICAgICAgICAJYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIi8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LWFyL2xvYWRlcnJvci5odG1sIGIvY29yZS9yZXMvcmVzL3Jhdy1hci9sb2FkZXJyb3IuaHRtbAppbmRleCBlZGNkNjNhLi5hYTk4MDVjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvcmF3LWFyL2xvYWRlcnJvci5odG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctYXIvbG9hZGVycm9yLmh0bWwKQEAgLTIsNyArMiw3IEBACiAgICAgPGhlYWQ+CiAgICAgICAgIDx0aXRsZT7YtdmB2K3YqSDYp9mE2YjZitioINi62YrYsSDZhdiq2YjZgdix2Kk8L3RpdGxlPgogICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgZGlyZWN0aW9uOiBydGw7IH0KICAgICAgICAgICAgIGgyICAgeyBtYXJnaW4tdG9wOiA1cHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KICAgICAgICAgPC9zdHlsZT4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1hci9ub2RvbWFpbi5odG1sIGIvY29yZS9yZXMvcmVzL3Jhdy1hci9ub2RvbWFpbi5odG1sCmluZGV4IGJjMDcwZjYuLjJlNTg0OWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9yYXctYXIvbm9kb21haW4uaHRtbAorKysgYi9jb3JlL3Jlcy9yZXMvcmF3LWFyL25vZG9tYWluLmh0bWwKQEAgLTIsNyArMiw3IEBACiAgICAgPGhlYWQ+CiAgICAgICAgIDx0aXRsZT7YtdmB2K3YqSDYp9mE2YjZitioINi62YrYsSDZhdiq2YjZgdix2Kk8L3RpdGxlPgogICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgZGlyZWN0aW9uOiBydGw7IH0KICAgICAgICAgICAgIGgyICAgeyBtYXJnaW4tdG9wOiA1cHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KICAgICAgICAgPC9zdHlsZT4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1pdy9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctaXcvbG9hZGVycm9yLmh0bWwKaW5kZXggODE1NTQzMi4uOGQ1YTUzZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3Jhdy1pdy9sb2FkZXJyb3IuaHRtbAorKysgYi9jb3JlL3Jlcy9yZXMvcmF3LWl3L2xvYWRlcnJvci5odG1sCkBAIC0yLDcgKzIsNyBAQAogICAgIDxoZWFkPgogICAgICAgICA8dGl0bGU+15PXoyDXkNeZ16DXmNeo16DXmCDXnNeQINeW157XmdefPC90aXRsZT4KICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IGRpcmVjdGlvbjogcnRsOyB9CiAgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CiAgICAgICAgIDwvc3R5bGU+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9yYXctaXcvbm9kb21haW4uaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctaXcvbm9kb21haW4uaHRtbAppbmRleCBmN2I5ZjQyLi4wZGNkN2Y4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvcmF3LWl3L25vZG9tYWluLmh0bWwKKysrIGIvY29yZS9yZXMvcmVzL3Jhdy1pdy9ub2RvbWFpbi5odG1sCkBAIC0yLDcgKzIsNyBAQAogICAgIDxoZWFkPgogICAgICAgICA8dGl0bGU+15PXoyDXkNeZ16DXmNeo16DXmCDXnNeQINeW157XmdefPC90aXRsZT4KICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IGRpcmVjdGlvbjogcnRsOyB9CiAgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CiAgICAgICAgIDwvc3R5bGU+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCA1YTk1NTFlLi5jYmI1ODUyIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0yNzMsNiArMjczLDIxIEBACiAgICAgPCEtLSBEZWZhdWx0IExFRCBvZmYgdGltZSBmb3Igbm90aWZpY2F0aW9uIExFRCBpbiBtaWxsaXNlY29uZHMuIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19kZWZhdWx0Tm90aWZpY2F0aW9uTGVkT2ZmIj4yMDAwPC9pbnRlZ2VyPgogCisgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciBsZWQgY29sb3Igd2hlbiBiYXR0ZXJ5IGlzIGxvdyBvbiBjaGFyZ2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TG93QVJHQiI+MHhGRkZGMDAwMDwvaW50ZWdlcj4KKworICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgbGVkIGNvbG9yIHdoZW4gYmF0dGVyeSBpcyBtZWRpdW0gY2hhcmdlZCAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlNZWRpdW1BUkdCIj4weEZGRkZGRjAwPC9pbnRlZ2VyPgorCisgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciBsZWQgY29sb3Igd2hlbiBiYXR0ZXJ5IGlzIGZ1bGx5IGNoYXJnZWQgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5RnVsbEFSR0IiPjB4RkYwMEZGMDA8L2ludGVnZXI+CisKKyAgICA8IS0tIERlZmF1bHQgdmFsdWUgZm9yIExFRCBvbiB0aW1lIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IG9uIGNoYXJnZSBpbiBtaWxpc2Vjb25kcyAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbm90aWZpY2F0aW9uc0JhdHRlcnlMZWRPbiI+MTI1PC9pbnRlZ2VyPgorCisgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciBMRUQgb2ZmIHRpbWUgd2hlbiB0aGUgYmF0dGVyeSBpcyBsb3cgb24gY2hhcmdlIGluIG1pbGlzZWNvbmRzIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19ub3RpZmljYXRpb25zQmF0dGVyeUxlZE9mZiI+Mjg3NTwvaW50ZWdlcj4KKwogICAgIDwhLS0gQWxsb3cgdGhlIG1lbnUgaGFyZCBrZXkgdG8gYmUgZGlzYWJsZWQgaW4gTG9ja1NjcmVlbiBvbiBzb21lIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2Rpc2FibGVNZW51S2V5SW5Mb2NrU2NyZWVuIj5mYWxzZTwvYm9vbD4KIApAQCAtMzc0LDYgKzM4OSwxMyBAQAogICAgIDwhLS0gVGhlIHJlc3RvcmluZyBpcyBoYW5kbGVkIGJ5IG1vZGVtIGlmIGl0IGlzIHRydWUtLT4KICAgICA8Ym9vbCB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJza2lwX3Jlc3RvcmluZ19uZXR3b3JrX3NlbGVjdGlvbiI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIFRoZSBVUkwgdGhhdCBzaG91bGQgYmUgc2VudCBpbiBhbiB4LXdhcC1wcm9maWxlIGhlYWRlciB3aXRoIGFuIEhUVFAgcmVxdWVzdCwKKyAgICAgICAgIGFzIGRlZmluZWQgaW4gdGhlIE9wZW4gTW9iaWxlIEFsbGlhbmNlIFVzZXIgQWdlbnQgUHJvZmlsZSBzcGVjaWZpY2F0aW9uCisgICAgICAgICBPTUEtVFMtVUFQcm9mLVYyXzAtMjAwNjAyMDYtQSBTZWN0aW9uIDguMS4xLjEuIElmIHRoZSBVUkwgY29udGFpbnMgYSAnJXMnCisgICAgICAgICBmb3JtYXQgc3RyaW5nIHRoZW4gdGhhdCBzdWJzdHJpbmcgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSBvZgorICAgICAgICAgQnVpbGQuTU9ERUwuIFRoZSBmb3JtYXQgc3RyaW5nIHNoYWxsIG5vdCBiZSBlc2NhcGVkLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ191c2VyYWdlbnRwcm9maWxlX3VybCI+PC9zdHJpbmc+CisKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIERlZmluZXMgdGhlIHNsb3RzIGlzIFR3byBEaWdpdCBOdW1iZXIgZm9yIGRpYWxpbmcgbm9ybWFsbHkgbm90IFVTU0QgLS0+CiAgICAgPHN0cmluZy1hcnJheSBuYW1lPSJjb25maWdfdHdvRGlnaXROdW1iZXJQYXR0ZXJuIj4KICAgICA8L3N0cmluZy1hcnJheT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDYxM2U2MTEuLmFlM2NkMDIgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMjM2Miw0ICsyMzYyLDE5IEBACiAgICAgPCEtLSBUZXh0IGZvciBtZXNzYWdlIGZvciBhbiB1bmtub3duIGV4dGVybmFsIG1lZGlhIHN0YXRlIFtDSEFSIExJTUlUPU5PTkVdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibWVkaWFfdW5rbm93bl9zdGF0ZSI+RXh0ZXJuYWwgbWVkaWEgaW4gdW5rbm93biBzdGF0ZS48L3N0cmluZz4KIAorICAgIDwhLS0gTmV0d29yayBwb3NpdGlvbmluZyBub3RpZmljYXRpb24gdGlja2VyLiBUaGUgbmFtZSBvZiB0aGUgdXNlciAoZS5nLiBKb2huIERvZSkgd2hvIHNlbnQKKyAgICAgICAgIHRoZSByZXF1ZXN0IGlzIHNob3duIGFzIGEgZHluYW1pYyBzdHJpbmcuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzTm90aWZUaWNrZXIiPkxvY2F0aW9uIHJlcXVlc3QgZnJvbSA8eGxpZmY6ZyBpZD0ibmFtZSI+JXM8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPCEtLSBOZXR3b3JrIHBvc2l0aW9uaW5nIG5vdGlmaWNhdGlvbiBhbmQgdmVyaWZpY2F0aW9uIHRpdGxlIHRvIGluZm9ybSB0aGUgdXNlciBhYm91dAorICAgICAgICAgYW4gaW5jb21pbmcgbG9jYXRpb24gcmVxdWVzdC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJncHNOb3RpZlRpdGxlIj5Mb2NhdGlvbiByZXF1ZXN0PC9zdHJpbmc+CisgICAgPCEtLSBOZXR3b3JrIHBvc2l0aW9uaW5nIG5vdGlmaWNhdGlvbiBtZXNzYWdlLiBUaGUgbmFtZSBvZiB0aGUgdXNlciAoZS5nLiBKb2huIERvZSkgYW5kCisgICAgICAgICBzZXJ2aWNlIChTVVBMLXNlcnZpY2UpIHdobyBzZW50IHRoZSByZXF1ZXN0IGlzIHNob3duIGFzIGR5bmFtaWMgc3RyaW5ncy4KKyAgICAgICAgIFRyYW5zbGF0aW9uIHNob3VsZCBub3QgYmUgbG9uZ2VyIHRoYW4gbWFzdGVyIHRleHQuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzTm90aWZNZXNzYWdlIj5SZXF1ZXN0ZWQgYnkgPHhsaWZmOmcgaWQ9Im5hbWUiPiUxJHM8L3hsaWZmOmc+ICg8eGxpZmY6ZyBpZD0ic2VydmljZSIgZXhhbXBsZT0iU1VQTC1zZXJ2aWNlIj4lMiRzPC94bGlmZjpnPik8L3N0cmluZz4KKyAgICA8IS0tIE5ldHdvcmsgcG9zaXRpb25pbmcgdmVyaWZpY2F0aW9uIFllcy4gQnV0dG9uIHRvIHB1c2ggdG8gc2hhcmUgbG9jYXRpb24gaW5mb3JtYXRpb24uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzVmVyaWZZZXMiPlllczwvc3RyaW5nPgorICAgIDwhLS0gTmV0d29yayBwb3NpdGlvbmluZyB2ZXJpZmljYXRpb24gTm8uIEJ1dHRvbiB0byBwdXNoIHRvIGRlbnkgc2hhcmluZyBvZiBsb2NhdGlvbgorICAgICAgICAgaW5mb3JtYXRpb24uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzVmVyaWZObyI+Tm88L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZkZWU4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb250ZW50UmVzb2x2ZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yRmluYWxpemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IFdhbnQgYSB0ZXN0IGNhc2UgdGhhdCBtb3JlIHByZWRpY3RhYmx5IHJlcHJvZHVjZSB0aGlzIGlzc3VlLiBTZWxlY3RlZAorICAgICAgICAvLyA2MDAgYXMgdGhpcyBjYXVzZXMgdGhlIHByb2JsZW0gMTAwJSBvZiB0aGUgcnVucyBvbiBjdXJyZW50IGh3LCBpdCBtaWdodCBub3QKKyAgICAgICAgLy8gZG8gc28gb24gc29tZSBvdGhlciBjb25maWd1cmF0aW9uIHRob3VnaC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MDA7IGkrKykgeworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5xdWVyeShDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZUhlbHBlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VIZWxwZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTEyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VIZWxwZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VIZWxwZXI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuSU1vdW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBQYWNrYWdlSGVscGVyVGVzdHMgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gdHJ1ZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGFja2FnZUhlbHBlclRlc3RzIjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJhbmRyb2lkLmNvbnRlbnQucG0iOworICAgIHByaXZhdGUgSU1vdW50U2VydmljZSBtTXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgZnVsbElkOworICAgIHByaXZhdGUgU3RyaW5nIGZ1bGxJZDI7CisKKyAgICBwcml2YXRlIElNb3VudFNlcnZpY2UgZ2V0TXMoKSB7CisgICAgICAgIElCaW5kZXIgc2VydmljZSA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoIm1vdW50Iik7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTW91bnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBnZXQgbW91bnQgc2VydmljZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwQ29udGFpbmVycygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBMb2cuZChUQUcsImNsZWFuVXAiKTsKKyAgICAgICAgSU1vdW50U2VydmljZSBtcyA9IGdldE1zKCk7CisgICAgICAgIFN0cmluZ1tdIGNvbnRhaW5lcnMgPSBtcy5nZXRTZWN1cmVDb250YWluZXJMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lcnNbaV0uc3RhcnRzV2l0aChQUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJjbGVhaW5nIHVwICIrY29udGFpbmVyc1tpXSk7CisgICAgICAgICAgICAgICAgbXMuZGVzdHJveVNlY3VyZUNvbnRhaW5lcihjb250YWluZXJzW2ldLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZmFpbFN0cihTdHJpbmcgZXJyTXNnKSB7CisgICAgICAgIExvZy53KFRBRywgImVyck1zZz0iICsgZXJyTXNnKTsKKyAgICAgICAgZmFpbChlcnJNc2cpOworICAgIH0KKworICAgIHZvaWQgZmFpbFN0cihFeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsU3RyKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cuaShUQUcsICJDbGVhbmluZyBvdXQgb2xkIHRlc3QgY29udGFpbmVycyIpOworICAgICAgICBjbGVhbnVwQ29udGFpbmVycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy5pKFRBRywgIkNsZWFuaW5nIG91dCBvbGQgdGVzdCBjb250YWluZXJzIik7CisgICAgICAgIGNsZWFudXBDb250YWluZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1vdW50QW5kUHVsbFNkQ2FyZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ1bGxJZCA9IFBSRUZJWDsKKyAgICAgICAgICAgIGZ1bGxJZDIgPSBQYWNrYWdlSGVscGVyLmNyZWF0ZVNkRGlyKDEwMjQsIGZ1bGxJZCwgIm5vbmUiLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSk7CisKKyAgICAgICAgICAgIExvZy5kKFRBRyxQYWNrYWdlSGVscGVyLmdldFNkRGlyKGZ1bGxJZCkpOworICAgICAgICAgICAgUGFja2FnZUhlbHBlci51bk1vdW50U2REaXIoZnVsbElkKTsKKworICAgICAgICAgICAgUnVubmFibGUgcjEgPSBnZXRNb3VudFJ1bm5hYmxlKCk7CisgICAgICAgICAgICBSdW5uYWJsZSByMiA9IGdldERlc3Ryb3lSdW5uYWJsZSgpOworICAgICAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocjEpOworICAgICAgICAgICAgVGhyZWFkIHRocmVhZDIgPSBuZXcgVGhyZWFkKHIyKTsKKyAgICAgICAgICAgIHRocmVhZDIuc3RhcnQoKTsKKyAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbFN0cihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSdW5uYWJsZSBnZXRNb3VudFJ1bm5hYmxlKCkgeworICAgICAgICBSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlICgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biAoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IFBhY2thZ2VIZWxwZXIubW91bnRTZERpcihmdWxsSWQsICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm1vdW50IGRvbmUgIiArIHBhdGgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm1vdW50IGZhaWxlZCIsIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgcHVibGljIFJ1bm5hYmxlIGdldERlc3Ryb3lSdW5uYWJsZSgpIHsKKyAgICAgICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSAoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4gKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VIZWxwZXIuZGVzdHJveVNkRGlyKGZ1bGxJZCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImRlc3Ryb3kgZG9uZTogIiArIGZ1bGxJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZGVzdHJveSBmYWlsZWQiLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiByOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UvTGlzdFByZWZlcmVuY2VUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjhlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTGlzdFByZWZlcmVuY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFByZWZlcmVuY2VTdW1tYXJ5RnJvbUVudHJpZXMoKSB7CisgICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBTdHJpbmdbXSBlbnRyeVZhbHVlcyA9IHsgIjEiICwgIjIiLCAiMyIgfTsKKyAgICAgICAgTGlzdFByZWZlcmVuY2UgbHAgPSBuZXcgTGlzdFByZWZlcmVuY2UoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbHAuc2V0RW50cmllcyhlbnRyaWVzKTsKKyAgICAgICAgbHAuc2V0RW50cnlWYWx1ZXMoZW50cnlWYWx1ZXMpOworCisgICAgICAgIGxwLnNldFZhbHVlKGVudHJ5VmFsdWVzWzFdKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShscC5nZXRTdW1tYXJ5KCkgPT0gbnVsbCk7CisKKyAgICAgICAgbHAuc2V0U3VtbWFyeSgiJTEkcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc1sxXSwgbHAuZ2V0U3VtbWFyeSgpKTsKKworICAgICAgICBscC5zZXRWYWx1ZShlbnRyeVZhbHVlc1syXSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzWzJdLCBscC5nZXRTdW1tYXJ5KCkpOworCisgICAgICAgIGxwLnNldFN1bW1hcnkobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUobHAuZ2V0U3VtbWFyeSgpID09IG51bGwpOworCisgICAgICAgIGxwLnNldFN1bW1hcnkoIlRoZSBjb2xvciBpcyAlMSRzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIGNvbG9yIGlzICIgKyBlbnRyaWVzWzJdLCBscC5nZXRTdW1tYXJ5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvVGV4dFV0aWxzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHNUZXN0LmphdmEKaW5kZXggZTExMTY2Mi4uNzlkNTdmMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHNUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHNUZXN0LmphdmEKQEAgLTI1NSw2ICsyNTUsMjMgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb28gQmFyIiwgdG9rZW5zWzBdLmdldEFkZHJlc3MoKSk7CiAgICAgfQogCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZmM4MjJGaW5kVG9rZW4oKSB7CisgICAgICAgIFJmYzgyMlRva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgUmZjODIyVG9rZW5pemVyKCk7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgICAzICAgICAgICAgNAorICAgICAgICAvLyAgICAgICAgICAgICAgICAwIDEyMzQgNTY3ODkwMTIzNDU2Nzg5MDEyMzQgNTY3OCA5MDEyMzQ1Njc4OTAxMjM0NQorICAgICAgICBTdHJpbmcgYWRkcmVzcyA9ICJcIkZvb1wiIDxmb29AZ29vZ2xlLmNvbT4sIFwiQmFyXCIgPGJhckBnb29nbGUuY29tPiI7CisgICAgICAgIGFzc2VydEVxdWFscygwLCB0b2tlbml6ZXIuZmluZFRva2VuU3RhcnQoYWRkcmVzcywgMjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIyLCB0b2tlbml6ZXIuZmluZFRva2VuRW5kKGFkZHJlc3MsIDIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyNCwgdG9rZW5pemVyLmZpbmRUb2tlblN0YXJ0KGFkZHJlc3MsIDI1KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NiwgdG9rZW5pemVyLmZpbmRUb2tlbkVuZChhZGRyZXNzLCAyNSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmZjODIyRmluZFRva2VuV2l0aEVycm9yKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgbmV3IFJmYzgyMlRva2VuaXplcigpLmZpbmRUb2tlbkVuZCgiXCJGb28gQmFyXFwiLCAwKSk7CisgICAgfQorCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbGxpcHNpemUoKSB7CiAgICAgICAgIENoYXJTZXF1ZW5jZSBzMSA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgXHUwMEZFaGUgbGF6eSBkb2cuIjsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL0FuZHJvaWQubWsgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDAwMDEyMDEuLjA3ZDk5Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL0FuZHJvaWQubWsKKysrIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvQW5kcm9pZC5tawpAQCAtMjMsNyArMjMsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gRnJhbWV3b3JrQ29yZUhvc3RUZXN0cwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBob3N0dGVzdGxpYiBkZG1saWIganVuaXQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGhvc3R0ZXN0bGliIGRkbWxpYi1wcmVidWlsdCBqdW5pdAogCiBpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCiAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCmluZGV4IGZlZDM5YzkuLmViZTEzZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKKysrIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQpAQCAtMTYsMjQgKzE2LDI0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtOwogCitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JU2hlbGxPdXRwdXRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5NdWx0aUxpbmVSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuSVN5bmNQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLlN5bmNSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0U3VpdGU7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKIGltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKIGltcG9ydCBqYXZhLmxhbmcuUHJvY2VzczsKQEAgLTQ0LDcgKzQ0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdENhc2U7CiAKIC8qKgogICogU2V0IG9mIHRlc3RzIHRoYXQgdmVyaWZ5IGhvc3Qgc2lkZSBpbnN0YWxsIGNhc2VzCkBAIC0xMjgsMTEgKzEyNywxNiBAQAogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIChvcHRpb25hbCkgVGhlIG1ldGhvZCBpbiB0aGUgY2xhc3Mgb2Ygd2hpY2ggdG8gdGVzdAogICAgICAqIEBwYXJhbSBydW5uZXJOYW1lIChvcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFRlc3RSdW5uZXIgb2YgdGhlIHRlc3Qgb24gdGhlIGRldmljZSB0byBiZSBydW4KICAgICAgKiBAcGFyYW0gcGFyYW1zIChvcHRpb25hbCkgQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIGludG8gdGhlIFRlc3QgUnVubmVyCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICogQHJldHVybiB0aGUge0BsaW5rIENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXJ9CiAgICAgICovCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGRvUnVuVGVzdHMoU3RyaW5nIHBrZ05hbWUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZwotICAgICAgICAgICAgbWV0aG9kTmFtZSwgU3RyaW5nIHJ1bm5lck5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCisgICAgcHJpdmF0ZSBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGRvUnVuVGVzdHMoU3RyaW5nIHBrZ05hbWUsIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHJ1bm5lck5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIocGtnTmFtZSwgcnVubmVyTmFtZSwKICAgICAgICAgICAgICAgICBtRGV2aWNlKTsKIApAQCAtMTYzLDcgKzE2Nyw4IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRlc3QgcGFzc2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcnVuRGV2aWNlVGVzdHNEaWRBbGxUZXN0c1Bhc3MoU3RyaW5nIHBrZ05hbWUsIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHJ1bm5lck5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBydW5uZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyID0gZG9SdW5UZXN0cyhwa2dOYW1lLCBjbGFzc05hbWUsIG1ldGhvZE5hbWUsCiAgICAgICAgICAgICAgICAgcnVubmVyTmFtZSwgcGFyYW1zKTsKICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmRpZEFsbFRlc3RzUGFzcygpOwpAQCAtMTczLDkgKzE3OCwxNSBAQAogICAgICAqIFJ1bnMgdGhlIHNwZWNpZmllZCBwYWNrYWdlcyB0ZXN0cywgYW5kIHJldHVybnMgd2hldGhlciBhbGwgdGVzdHMgcGFzc2VkIG9yIG5vdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwa2dOYW1lIEFuZHJvaWQgYXBwbGljYXRpb24gcGFja2FnZSBmb3IgdGVzdHMKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnkgdGVzdCBwYXNzZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBydW5EZXZpY2VUZXN0c0RpZEFsbFRlc3RzUGFzcyhTdHJpbmcgcGtnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBydW5EZXZpY2VUZXN0c0RpZEFsbFRlc3RzUGFzcyhTdHJpbmcgcGtnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyID0gZG9SdW5UZXN0cyhwa2dOYW1lLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmRpZEFsbFRlc3RzUGFzcygpOwogICAgIH0KQEAgLTE4MywyMiArMTk0LDI2IEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCB0byBwdXNoIGEgZmlsZSB0byBkZXZpY2UKICAgICAgKiBAcGFyYW0gYXBrQXBwUHJpdmF0ZVBhdGgKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwdXNoRmlsZShmaW5hbCBTdHJpbmcgbG9jYWxGaWxlUGF0aCwgZmluYWwgU3RyaW5nIGRlc3RGaWxlUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gbURldmljZS5nZXRTeW5jU2VydmljZSgpLnB1c2hGaWxlKAotICAgICAgICAgICAgICAgIGxvY2FsRmlsZVBhdGgsIGRlc3RGaWxlUGF0aCwgbmV3IE51bGxTeW5jUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3luY1NlcnZpY2UuUkVTVUxUX09LLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZS5nZXRTeW5jU2VydmljZSgpLnB1c2hGaWxlKGxvY2FsRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgZGVzdEZpbGVQYXRoLCBuZXcgTnVsbFN5bmNQcm9ncmVzc01vbml0b3IoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YWxsIGEgZmlsZQogICAgICAqIEBwYXJhbSBsb2NhbEZpbGVQYXRoIHRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBwYXRoIHRvIGZpbGUgb24gbG9jYWwgaG9zdCB0byBpbnN0YWxsCiAgICAgICogQHBhcmFtIHJlaW5zdGFsbCBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmUtaW5zdGFsbCBvZiBhcHAgc2hvdWxkIGJlIHBlcmZvcm1lZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnN0YWxsRmlsZShmaW5hbCBTdHJpbmcgbG9jYWxGaWxlUGF0aCwgZmluYWwgYm9vbGVhbiByZXBsYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxGaWxlKGZpbmFsIFN0cmluZyBsb2NhbEZpbGVQYXRoLCBmaW5hbCBib29sZWFuIHJlcGxhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbURldmljZS5pbnN0YWxsUGFja2FnZShsb2NhbEZpbGVQYXRoLCByZXBsYWNlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHJlc3VsdCk7CiAgICAgfQpAQCAtMjA4LDEwICsyMjMsMTEgQEAKICAgICAgKiBAcGFyYW0gbG9jYWxGaWxlUGF0aCB0aGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBmaWxlIG9uIGxvY2FsIGhvc3QgdG8gaW5zdGFsbAogICAgICAqIEBwYXJhbSByZWluc3RhbGwgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlLWluc3RhbGwgb2YgYXBwIHNob3VsZCBiZSBwZXJmb3JtZWQKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgb3V0cHV0IG9mIHRoZSBmYWlsZWQgaW5zdGFsbCBhdHRlbXB0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgaW5zdGFsbEZpbGVGYWlsKGZpbmFsIFN0cmluZyBsb2NhbEZpbGVQYXRoLCBmaW5hbCBib29sZWFuIHJlcGxhY2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1EZXZpY2UuaW5zdGFsbFBhY2thZ2UobG9jYWxGaWxlUGF0aCwgcmVwbGFjZSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIyMSwxMCArMjM3LDE3IEBACiAgICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YWxsIGEgZmlsZSB0byBkZXZpY2UgYXMgZm9yd2FyZCBsb2NrZWQKICAgICAgKiBAcGFyYW0gbG9jYWxGaWxlUGF0aCB0aGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBmaWxlIG9uIGxvY2FsIGhvc3QgdG8gaW5zdGFsbAogICAgICAqIEBwYXJhbSByZWluc3RhbGwgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlLWluc3RhbGwgb2YgYXBwIHNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGluc3RhbGxGaWxlRm9yd2FyZExvY2tlZChmaW5hbCBTdHJpbmcgbG9jYWxGaWxlUGF0aCwgZmluYWwgYm9vbGVhbiByZXBsYWNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHJlbW90ZUZpbGVQYXRoID0gbURldmljZS5zeW5jUGFja2FnZVRvRGV2aWNlKGxvY2FsRmlsZVBhdGgpOwogICAgICAgICBJbnN0YWxsUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgSW5zdGFsbFJlY2VpdmVyKCk7CiAgICAgICAgIFN0cmluZyBjbWQgPSBTdHJpbmcuZm9ybWF0KHJlcGxhY2UgPyAicG0gaW5zdGFsbCAtciAtbCBcIiUxJHNcIiIgOgpAQCAtMjM5LDkgKzI2MiwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGRlc3RQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGZpbGUgb24gZGV2aWNlIHRvIGNoZWNrCiAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlIGV4aXN0cywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvZXNSZW1vdGVGaWxlRXhpc3QoU3RyaW5nIGRlc3RQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGRvZXNSZW1vdGVGaWxlRXhpc3QoU3RyaW5nIGRlc3RQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBsc0dyZXAgPSBleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImxzICVzIiwgZGVzdFBhdGgpKTsKICAgICAgICAgcmV0dXJuICFsc0dyZXAuY29udGFpbnMoIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKICAgICB9CkBAIC0yNTIsMTAgKzI4MCwxNSBAQAogICAgICAqIEBwYXJhbSBkZXN0UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZQogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZSBleGlzdHMgY29udGFpbmluZyBnaXZlbiBzdHJpbmcsCiAgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZG9lc1JlbW90ZUZpbGVFeGlzdENvbnRhaW5pbmdTdHJpbmcoU3RyaW5nIGRlc3RQYXRoLCBTdHJpbmcgc2VhcmNoU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGxzUmVzdWx0ID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJscyAlcyIsIGRlc3RQYXRoKSk7CiAgICAgICAgIHJldHVybiBsc1Jlc3VsdC5jb250YWlucyhzZWFyY2hTdHJpbmcpOwogICAgIH0KQEAgLTI2NSw5ICsyOTgsMTQgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgQW5kcm9pZCBtYW5pZmVzdCBwYWNrYWdlIHRvIGNoZWNrLgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFja2FnZSBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvZXNQYWNrYWdlRXhpc3QoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGRvZXNQYWNrYWdlRXhpc3QoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBwa2dHcmVwID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJwbSBwYXRoICVzIiwgcGFja2FnZU5hbWUpKTsKICAgICAgICAgcmV0dXJuIHBrZ0dyZXAuY29udGFpbnMoInBhY2thZ2U6Iik7CiAgICAgfQpAQCAtMjc3LDkgKzMxNSwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2UgbmFtZSB0byBjaGVjayBmb3IKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGUgZXhpc3RzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZG9lc0FwcEV4aXN0T25EZXZpY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGRvZXNBcHBFeGlzdE9uRGV2aWNlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZG9lc1JlbW90ZUZpbGVFeGlzdENvbnRhaW5pbmdTdHJpbmcoREVWSUNFX0FQUF9QQVRILCBwYWNrYWdlTmFtZSk7CiAgICAgfQogCkBAIC0yODgsOSArMzMxLDE0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBuYW1lIHRvIGNoZWNrIGZvcgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZSBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzQXBwRXhpc3RPblNEQ2FyZChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gZG9lc0FwcEV4aXN0T25TRENhcmQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBkb2VzUmVtb3RlRmlsZUV4aXN0Q29udGFpbmluZ1N0cmluZyhTRENBUkRfQVBQX1BBVEgsIHBhY2thZ2VOYW1lKTsKICAgICB9CiAKQEAgLTI5OSw5ICszNDcsMTQgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG5hbWUgdG8gY2hlY2sgZm9yCiAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlIGV4aXN0cywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvZXNBcHBFeGlzdEFzRm9yd2FyZExvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gZG9lc0FwcEV4aXN0QXNGb3J3YXJkTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZG9lc1JlbW90ZUZpbGVFeGlzdENvbnRhaW5pbmdTdHJpbmcoQVBQX1BSSVZBVEVfUEFUSCwgcGFja2FnZU5hbWUpOwogICAgIH0KIApAQCAtMzA5LDkgKzM2MiwxNCBAQAogICAgICAqIFdhaXRzIGZvciBkZXZpY2UncyBwYWNrYWdlIG1hbmFnZXIgdG8gcmVzcG9uZC4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdEZvclBhY2thZ2VNYW5hZ2VyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd2FpdEZvclBhY2thZ2VNYW5hZ2VyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIndhaXRpbmcgZm9yIGRldmljZSIpOwogICAgICAgICBpbnQgY3VycmVudFdhaXRUaW1lID0gMDsKICAgICAgICAgLy8gcG9sbCB0aGUgcGFja2FnZSBtYW5hZ2VyIHVudGlsIGl0IHJldHVybnMgc29tZXRoaW5nIGZvciBhbmRyb2lkCkBAIC0zNzcsOSArNDM1LDE0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCB0byBsb2FkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yQXBwKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd2FpdEZvckFwcChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJ3YWl0aW5nIGZvciBhcHAgdG8gbGF1bmNoIik7CiAgICAgICAgIGludCBjdXJyZW50V2FpdFRpbWUgPSAwOwogICAgICAgICAvLyBwb2xsIHRoZSBwYWNrYWdlIG1hbmFnZXIgdW50aWwgaXQgcmV0dXJucyBzb21ldGhpbmcgZm9yIHRoZSBwYWNrYWdlIHdlJ3JlIGxvb2tpbmcgZm9yCkBAIC0zOTYsOSArNDU5LDE0IEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCB3aGljaCBleGVjdXRlcyBhIGFkYiBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm5zIG91dHB1dCBhcyBhIHtAbGluayBTdHJpbmd9CiAgICAgICogQHJldHVybiB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU3RyaW5nIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiYWRiIHNoZWxsICVzIiwgY29tbWFuZCkpOwogICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7CiAgICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kLCByZWNlaXZlcik7CkBAIC00MTAsOSArNDc4LDE0IEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCBlbnN1cmVzIHdlIGFyZSBpbiByb290IG1vZGUgb24gdGhlIGhvc3Qgc2lkZS4gSXQgcmV0dXJucyBvbmx5IGFmdGVyCiAgICAgICogUGFja2FnZU1hbmFnZXIgaXMgYWN0dWFsbHkgdXAgYW5kIHJ1bm5pbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkFkYlJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBydW5BZGJSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgImFkYiByb290Iik7CiAgICAgICAgIFJ1bnRpbWUgcnVudGltZSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwogICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBydW50aW1lLmV4ZWMoImFkYiByb290Iik7IC8vIGFkYiBzaG91bGQgYmUgaW4gdGhlIHBhdGgKQEAgLTQzMCwxMCArNTAzLDE1IEBACiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCB3aGljaCByZWJvb3RzIHRoZSBkZXZpY2UgYW5kIHJldHVybnMgb25jZSB0aGUgZGV2aWNlIGlzIG9ubGluZSBhZ2FpbgogICAgICAqIGFuZCBwYWNrYWdlIG1hbmFnZXIgaXMgdXAgYW5kIHJ1bm5pbmcgKG5vdGUgdGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cyB0byBjYWxsZXJzKS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYm9vdERldmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHJlYm9vdERldmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjb21tYW5kID0gInJlYm9vdCI7IC8vIG5vIG5lZWQgZm9yIC1zIHNpbmNlIG1EZXZpY2UgaXMgYWxyZWFkeSB0aWVkIHRvIGEgZGV2aWNlCiAgICAgICAgIExvZy5pKExPR19UQUcsIGNvbW1hbmQpOwogICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7CkBAIC00OTgsNyArNTc2LDcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BbGxUZXN0c1Bhc3NlZCA9IHRydWU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UnVuRXJyb3JNZXNzYWdlID0gbnVsbDsKIAotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kZWQoVGVzdElkZW50aWZpZXIgdGVzdCkgeworICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kZWQoVGVzdElkZW50aWZpZXIgdGVzdCwgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRyaWNzKSB7CiAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgfQogCkBAIC01MDksNyArNTg3LDcgQEAKICAgICAgICAgICAgIG1BbGxUZXN0c1Bhc3NlZCA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkVuZGVkKGxvbmcgZWxhcHNlZFRpbWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkVuZGVkKGxvbmcgZWxhcHNlZFRpbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0QnVuZGxlKSB7CiAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgfQogCkBAIC01MTksNyArNTk3LDcgQEAKICAgICAgICAgICAgIG1UZXN0UnVuRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoaW50IHRlc3RDb3VudCkgeworICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3RhcnRlZChTdHJpbmcgcnVuTmFtZSwgaW50IHRlc3RDb3VudCkgewogICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgIH0KIApAQCAtNTg2LDE3ICs2NjQsMjMgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbnN0YWxsaW5nIGFuIGFwcCB0byB3aGVyZXZlciBpcyBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LCBhbmQKICAgICAgKiB0aGVuIHZlcmlmeWluZyB0aGUgYXBwIHdhcyBpbnN0YWxsZWQgb250byBTRCBDYXJkLgorICAgICAqIDxwLz4KKyAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGhlIHBhdGggb2YgdGhlIGFwayB0byBpbnN0YWxsCiAgICAgICogQHBhcmFtIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCiAgICAgICogQHBhcmFtIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcHAgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCi0gICAgICogPHAvPgotICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc3RhbGxBcHBBbmRWZXJpZnlFeGlzdHNPblNEQ2FyZChTdHJpbmcgYXBrUGF0aCwgU3RyaW5nIHBrZ05hbWUsIGJvb2xlYW4gb3ZlcndyaXRlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUgaWYgd2UncmUgbm90IG92ZXJ3cml0aW5nCiAgICAgICAgIGlmICghb3ZlcndyaXRlKSB7CiAgICAgICAgICAgICAvLyBjbGVhbnVwIHRlc3QgYXBwIGp1c3QgaW4gY2FzZSBpdCBhbHJlYWR5IGV4aXN0cwpAQCAtNjE3LDE3ICs3MDEsMjMgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbnN0YWxsaW5nIGFuIGFwcCB0byB3aGVyZXZlciBpcyBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LCBhbmQKICAgICAgKiB0aGVuIHZlcmlmeWluZyB0aGUgYXBwIHdhcyBpbnN0YWxsZWQgb250byBkZXZpY2UuCisgICAgICogPHAvPgorICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKgogICAgICAqIEBwYXJhbSB0aGUgcGF0aCBvZiB0aGUgYXBrIHRvIGluc3RhbGwKICAgICAgKiBAcGFyYW0gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKICAgICAgKiBAcGFyYW0gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFwcCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKLSAgICAgKiA8cC8+Ci0gICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbEFwcEFuZFZlcmlmeUV4aXN0c09uRGV2aWNlKFN0cmluZyBhcGtQYXRoLCBTdHJpbmcgcGtnTmFtZSwgYm9vbGVhbiBvdmVyd3JpdGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sCisgICAgICAgICAgICBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZSBpZiB3ZSdyZSBub3Qgb3ZlcndyaXRpbmcKICAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHsKICAgICAgICAgICAgIC8vIGNsZWFudXAgdGVzdCBhcHAganVzdCBpbiBjYXNlIGl0IGFscmVhZHkgZXhpc3RzCkBAIC02NDgsMTcgKzczOCwyNCBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgZm9yIGluc3RhbGxpbmcgYW4gYXBwIGFzIGZvcndhcmQtbG9ja2VkLCBhbmQKICAgICAgKiB0aGVuIHZlcmlmeWluZyB0aGUgYXBwIHdhcyBpbnN0YWxsZWQgaW4gdGhlIHByb3BlciBmb3J3YXJkLWxvY2tlZCBsb2NhdGlvbi4KKyAgICAgKiA8cC8+CisgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqCiAgICAgICogQHBhcmFtIHRoZSBwYXRoIG9mIHRoZSBhcGsgdG8gaW5zdGFsbAogICAgICAqIEBwYXJhbSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZQogICAgICAqIEBwYXJhbSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXBwIHNob3VsZCBiZSBvdmVyd3JpdHRlbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAotICAgICAqIDxwLz4KLSAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnN0YWxsRndkTG9ja2VkQXBwQW5kVmVyaWZ5RXhpc3RzKFN0cmluZyBhcGtQYXRoLAotICAgICAgICAgICAgU3RyaW5nIHBrZ05hbWUsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lLCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZSBpZiB3ZSdyZSBub3Qgb3ZlcndyaXRpbmcKICAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHsKICAgICAgICAgICAgIC8vIGNsZWFudXAgdGVzdCBhcHAganVzdCBpbiBjYXNlIGl0IGFscmVhZHkgZXhpc3RzCkBAIC02NzksMTQgKzc3NiwyMSBAQAogCiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCBmb3IgdW5pbnN0YWxsaW5nIGFuIGFwcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwa2dOYW1lIHBhY2thZ2UgbmFtZSB0byB1bmluc3RhbGwKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBrZ05hbWUgcGFja2FnZSBuYW1lIHRvIHVuaW5zdGFsbAorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIHVuaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdW5pbnN0YWxsQXBwKFN0cmluZyBwa2dOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB1bmluc3RhbGxBcHAoU3RyaW5nIHBrZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBtRGV2aWNlLnVuaW5zdGFsbFBhY2thZ2UocGtnTmFtZSk7CiAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdHMgbm90IGluc3RhbGxlZCBhbnltb3JlCiAgICAgICAgIGFzc2VydEZhbHNlKGRvZXNQYWNrYWdlRXhpc3QocGtnTmFtZSkpOwpAQCAtNjk2LDEyICs4MDAsMTggQEAKICAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjbGVhcmluZyBhbnkgaW5zdGFsbGVkIG5vbi1zeXN0ZW0gYXBwcy4KICAgICAgKiBVc2VmdWwgZW5zdXJpbmcgbm8gbm9uLXN5c3RlbSBhcHBzIGFyZSBpbnN0YWxsZWQsIGFuZCBmb3IgY2xlYW5pbmcgdXAgc3RhbGUgZmlsZXMgdGhhdAogICAgICAqIG1heSBiZSBsaW5nZXJpbmcgb24gdGhlIHN5c3RlbSBmb3Igd2hhdGV2ZXIgcmVhc29uLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSB1bmluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpcGVOb25TeXN0ZW1BcHBzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3aXBlTm9uU3lzdGVtQXBwcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgIFN0cmluZyBhbGxJbnN0YWxsZWRQYWNrYWdlcyA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGxpc3QgcGFja2FnZXMgLWYiKTsKICAgICAgIEJ1ZmZlcmVkUmVhZGVyIG91dHB1dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGFsbEluc3RhbGxlZFBhY2thZ2VzKSk7CiAKQEAgLTcyNiw4ICs4MzYsMTQgQEAKICAgICAgKgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV2aWNlUHJlZmVycmVkSW5zdGFsbExvY2F0aW9uKEluc3RhbGxMb2NQcmVmZXJlbmNlIHByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2V0RGV2aWNlUHJlZmVycmVkSW5zdGFsbExvY2F0aW9uKEluc3RhbGxMb2NQcmVmZXJlbmNlIHByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAicG0gc2V0SW5zdGFsbExvY2F0aW9uICVkIjsKICAgICAgICAgaW50IGxvY1ZhbHVlID0gMDsKICAgICAgICAgc3dpdGNoIChwcmVmKSB7CkBAIC03NDksOCArODY1LDE0IEBACiAgICAgICoKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgogICAgICAqLwotICAgIHB1YmxpYyBJbnN0YWxsTG9jUHJlZmVyZW5jZSBnZXREZXZpY2VQcmVmZXJyZWRJbnN0YWxsTG9jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBJbnN0YWxsTG9jUHJlZmVyZW5jZSBnZXREZXZpY2VQcmVmZXJyZWRJbnN0YWxsTG9jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJwbSBnZXRJbnN0YWxsTG9jYXRpb24iKTsKICAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKCcwJykgIT0gLTEpIHsKICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0cy5qYXZhCmluZGV4IDFiNzk3ZDUuLjIyYTJiZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RzLmphdmEKQEAgLTE2LDEzICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JU2hlbGxPdXRwdXRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JbnN0YWxsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk11bHRpTGluZVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuSVN5bmNQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLlN5bmNSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0U3VpdGU7CiAKQEAgLTE1NiwxMCArMTU1LDE4IEBACiAgICAgICogdGhlIGFwcCwgYW5kIG90aGVyd2lzZSBjYXVzZSB0aGUgc3lzdGVtIHRvIGJsb3cgdXAuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQdXNoQXBwUHJpdmF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RQdXNoQXBwUHJpdmF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFN5bmNFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdGluZyBwdXNoaW5nIGFuIGFwayB0byAvZGF0YS9hcHAtcHJpdmF0ZSIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYXBrQXBwUHJpdmF0ZVBhdGggPSAgYXBwUHJpdmF0ZVBhdGggKyBTSU1QTEVfQVBLOwogCkBAIC0xODcsMTIgKzE5NCwxOCBAQAogICAgICAqIEBwYXJhbSBhcGtOYW1lIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHRlc3QgYXBwIGFwawogICAgICAqIEBwYXJhbSBwa2dOYW1lIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3QgYXBwIGFwawogICAgICAqIEBwYXJhbSBleHBlY3RlZExvY2F0aW9uIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHRlc3QgYXBwIGFwawotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGRvU3RhbmRhcmRJbnN0YWxsKFN0cmluZyBhcGtOYW1lLCBTdHJpbmcgcGtnTmFtZSwKICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24gZXhwZWN0ZWRMb2NhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoZXhwZWN0ZWRMb2NhdGlvbiA9PSBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLkRFVklDRSkgewogICAgICAgICAgICAgbVBNSG9zdFV0aWxzLmluc3RhbGxBcHBBbmRWZXJpZnlFeGlzdHNPbkRldmljZSgKQEAgLTIxMSwxMiArMjI0LDE4IEBACiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlIHRoZSBkZXZpY2UncyBwcmVmZXJyZWQgbG9jYXRpb24gb2Ygd2hlcmUgdG8gaW5zdGFsbCBhcHBzCiAgICAgICogQHBhcmFtIGV4cGVjdGVkTG9jYXRpb24gdGhlIGV4cGVjdGVkIGxvY2F0aW9uIG9mIHdoZXJlIHRoZSBhcGsgd2FzIGluc3RhbGxlZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbEFwcEF1dG9Mb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHByZWZlcmVuY2UsCiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uIGV4cGVjdGVkTG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7CiAKICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHNhdmVkUHJlZiA9CiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLkFVVE87CkBAIC0yMzksMTAgKzI1OCwxNiBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGF1dG8uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwQXV0b0xvY1ByZWZJc0F1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEF1dG9Mb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWF1dG8sIHByZWZlcj1hdXRvIGdldHMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogICAgICAgICBpbnN0YWxsQXBwQXV0b0xvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuQVVUTywKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLkRFVklDRSk7CkBAIC0yNTMsMTAgKzI3OCwxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGludGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEF1dG9Mb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwQXV0b0xvY1ByZWZJc0ludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxMb2NhdGlvbj1hdXRvLCBwcmVmZXI9aW50ZXJuYWwgZ2V0cyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAgICAgICAgIGluc3RhbGxBcHBBdXRvTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5JTlRFUk5BTCwKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLkRFVklDRSk7CkBAIC0yNjcsMTAgKzI5OSwxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBTRCBjYXJkIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBleHRlcm5hbC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBBdXRvTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEF1dG9Mb2NQcmVmSXNFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249YXV0bywgcHJlZmVyPWV4dGVybmFsIGdldHMgaW5zdGFsbGVkIG9uIGRldmljZSIpOwogICAgICAgICBpbnN0YWxsQXBwQXV0b0xvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuRVhURVJOQUwsCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpOwpAQCAtMjgzLDEyICszMjIsMTggQEAKICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2UgdGhlIGRldmljZSdzIHByZWZlcnJlZCBsb2NhdGlvbiBvZiB3aGVyZSB0byBpbnN0YWxsIGFwcHMKICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRMb2NhdGlvbiB0aGUgZXhwZWN0ZWQgbG9jYXRpb24gb2Ygd2hlcmUgdGhlIGFwayB3YXMgaW5zdGFsbGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSAodW4paW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbEFwcEludGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBwcmVmZXJlbmNlLAogICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbiBleHBlY3RlZExvY2F0aW9uKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24gewogCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZSBzYXZlZFByZWYgPQogICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLkFVVE87CkBAIC0zMTEsMTAgKzM1NiwxNyBAQAogICAgICAqIHdpbGwgaW5zdGFsbCB0aGUgYXBwIHRvIHRoZSBkZXZpY2Ugd2hlbiBkZXZpY2UncyBwcmVmZXJlbmNlIGlzIGF1dG8uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBJbnRlcm5hbExvY1ByZWZJc0F1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbExvY2F0aW9uPWludGVybmFsLCBwcmVmZXI9YXV0byBnZXRzIGluc3RhbGxlZCBvbiBkZXZpY2UiKTsKICAgICAgICAgaW5zdGFsbEFwcEludGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uREVWSUNFKTsKQEAgLTMyNSwxMCArMzc3LDE3IEBACiAgICAgICogd2lsbCBpbnN0YWxsIHRoZSBhcHAgdG8gdGhlIGRldmljZSB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgaW50ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwSW50ZXJuYWxMb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249aW50ZXJuYWwsIHByZWZlcj1pbnRlcm5hbCBpcyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAgICAgICAgIGluc3RhbGxBcHBJbnRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UuSU5URVJOQUwsCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NhdGlvbi5ERVZJQ0UpOwpAQCAtMzM5LDEwICszOTgsMTcgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgZGV2aWNlIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBleHRlcm5hbC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBJbnRlcm5hbExvY1ByZWZJc0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBJbnRlcm5hbExvY1ByZWZJc0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxMb2NhdGlvbj1pbnRlcm5hbCwgcHJlZmVyPWV4dGVybmFsIGlzIGluc3RhbGxlZCBvbiBkZXZpY2UiKTsKICAgICAgICAgaW5zdGFsbEFwcEludGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5FWFRFUk5BTCwKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY2F0aW9uLkRFVklDRSk7CkBAIC0zNTUsMTIgKzQyMSwxOCBAQAogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZSB0aGUgZGV2aWNlJ3MgcHJlZmVycmVkIGxvY2F0aW9uIG9mIHdoZXJlIHRvIGluc3RhbGwgYXBwcwogICAgICAqIEBwYXJhbSBleHBlY3RlZExvY2F0aW9uIHRoZSBleHBlY3RlZCBsb2NhdGlvbiBvZiB3aGVyZSB0aGUgYXBrIHdhcyBpbnN0YWxsZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc3RhbGxBcHBFeHRlcm5hbExvYyhQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2UgcHJlZmVyZW5jZSwKICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24gZXhwZWN0ZWRMb2NhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKIAogICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2Ugc2F2ZWRQcmVmID0KICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPOwpAQCAtMzg0LDEwICs0NTYsMTcgQEAKICAgICAgKiB3aWxsIGluc3RhbGwgdGhlIGFwcCB0byB0aGUgZGV2aWNlIHdoZW4gZGV2aWNlJ3MgcHJlZmVyZW5jZSBpcyBhdXRvLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcEV4dGVybmFsTG9jUHJlZklzQXV0bygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwRXh0ZXJuYWxMb2NQcmVmSXNBdXRvKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxMb2NhdGlvbj1leHRlcm5hbCwgcHJlZj1hdXRvIGdldHMgaW5zdGFsbGVkIG9uIFNEIENhcmQiKTsKICAgICAgICAgaW5zdGFsbEFwcEV4dGVybmFsTG9jKFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jUHJlZmVyZW5jZS5BVVRPLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uU0RDQVJEKTsKQEAgLTM5OCwxMCArNDc3LDE3IEBACiAgICAgICogd2lsbCBpbnN0YWxsIHRoZSBhcHAgdG8gdGhlIGRldmljZSB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgaW50ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwRXh0ZXJuYWxMb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwRXh0ZXJuYWxMb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249ZXh0ZXJuYWwsIHByZWY9aW50ZXJuYWwgZ2V0cyBpbnN0YWxsZWQgb24gU0QgQ2FyZCIpOwogICAgICAgICBpbnN0YWxsQXBwRXh0ZXJuYWxMb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLklOVEVSTkFMLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uU0RDQVJEKTsKQEAgLTQxMiwxMCArNDk4LDE3IEBACiAgICAgICogd2lsbCBpbnN0YWxsIHRoZSBhcHAgdG8gdGhlIGRldmljZSB3aGVuIGRldmljZSdzIHByZWZlcmVuY2UgaXMgZXh0ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwRXh0ZXJuYWxMb2NQcmVmSXNFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwRXh0ZXJuYWxMb2NQcmVmSXNFeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsTG9jYXRpb249ZXh0ZXJuYWwsIHByZWY9ZXh0ZXJuYWwgZ2V0cyBpbnN0YWxsZWQgb24gU0QgQ2FyZCIpOwogICAgICAgICBpbnN0YWxsQXBwRXh0ZXJuYWxMb2MoUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlLkVYVEVSTkFMLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5JbnN0YWxsTG9jYXRpb24uU0RDQVJEKTsKQEAgLTQyNywxMCArNTIwLDE3IEBACiAgICAgICogc3lzdGVtIGRlY2lkZS4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBcHBOb0xvY1ByZWZJc0F1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcE5vTG9jUHJlZklzQXV0bygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBhbiBhcHAgd2l0aCBubyBpbnN0YWxsTG9jYXRpb24gZ2V0cyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAKICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHNhdmVkUHJlZiA9CkBAIC00NTYsMTAgKzU1NiwxNyBAQAogICAgICAqIGV4dGVybmFsLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcE5vTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFwcE5vTG9jUHJlZklzRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggbm8gaW5zdGFsbExvY2F0aW9uIGdldHMgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICBQYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuSW5zdGFsbExvY1ByZWZlcmVuY2Ugc2F2ZWRQcmVmID0KQEAgLTQ4NSwxMCArNTkyLDE3IEBACiAgICAgICogaW50ZXJuYWwuCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwTm9Mb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQXBwTm9Mb2NQcmVmSXNJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBhbiBhcHAgd2l0aCBubyBpbnN0YWxsTG9jYXRpb24gZ2V0cyBpbnN0YWxsZWQgb24gZGV2aWNlIik7CiAKICAgICAgICAgUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkluc3RhbGxMb2NQcmVmZXJlbmNlIHNhdmVkUHJlZiA9CkBAIC01MTMsMTAgKzYyNywxOCBAQAogICAgICAqIGZvcndhcmQtbG9ja2VkIHdpbGwgZ2V0IGluc3RhbGxlZCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgU3luY0V4Y2VwdGlvbiBpZiB0aGUgc3luYyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxGd2RMb2NrZWRBcHBJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRndkTG9ja2VkQXBwSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggaW5zdGFsbExvYyBzZXQgdG8gSW50ZXJuYWwgZ2V0cyBpbnN0YWxsZWQgdG8gYXBwLXByaXZhdGUiKTsKIAogICAgICAgICB0cnkgewpAQCAtNTM0LDEwICs2NTYsMTggQEAKICAgICAgKiBmb3J3YXJkLWxvY2tlZCB3aWxsIGdldCBpbnN0YWxsZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRndkTG9ja2VkQXBwRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcEV4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGFuIGFwcCB3aXRoIGluc3RhbGxMb2Mgc2V0IHRvIEludGVybmFsIGdldHMgaW5zdGFsbGVkIHRvIGFwcC1wcml2YXRlIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTU1NSwxMCArNjg1LDE4IEBACiAgICAgICogZm9yd2FyZC1sb2NrZWQgd2lsbCBnZXQgaW5zdGFsbGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcEF1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZ3ZExvY2tlZEFwcEF1dG8oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgYW4gYXBwIHdpdGggaW5zdGFsbExvYyBzZXQgdG8gQXV0byBnZXRzIGluc3RhbGxlZCB0byBhcHAtcHJpdmF0ZSIpOwogCiAgICAgICAgIHRyeSB7CkBAIC01NzYsMTAgKzcxNCwxOCBAQAogICAgICAqIGZvcndhcmQtbG9ja2VkIGluc3RhbGxlZCB3aWxsIGdldCBpbnN0YWxsZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRndkTG9ja2VkQXBwTm9uZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRndkTG9ja2VkQXBwTm9uZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBTeW5jRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBhbiBhcHAgd2l0aCBubyBpbnN0YWxsTG9jIHNldCBnZXRzIGluc3RhbGxlZCB0byBhcHAtcHJpdmF0ZSIpOwogCiAgICAgICAgIHRyeSB7CkBAIC01OTcsMTQgKzc0MywyMSBAQAogICAgICAqIHVuaW5zdGFsbCBpdCwgYW5kIHJlaW5zdGFsbCBpdCBvbnRvIHRoZSBTRCBjYXJkLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICAvLyBUT0RPOiBUaGlzIGN1cnJlbnRseSByZWxpZXMgb24gdGhlIGFwcCdzIG1hbmlmZXN0IHRvIHN3aXRjaCBmcm9tIGRldmljZSB0bwogICAgIC8vIFNEIGNhcmQgaW5zdGFsbCBsb2NhdGlvbnMuIFdlIG1pZ2h0IHdhbnQgdG8gbWFrZSBEZXZpY2UncyBpbnN0YWxsUGFja2FnZSgpCiAgICAgLy8gYWNjZXB0IGEgaW5zdGFsbExvY2F0aW9uIGZsYWcgc28gd2UgY2FuIGluc3RhbGwgYSBwYWNrYWdlIHRvIHRoZQogICAgIC8vIGRlc3RpbmF0aW9uIG9mIG91ciBjaG9vc2luZy4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVpbnN0YWxsSW50ZXJuYWxUb0V4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFJlaW5zdGFsbEludGVybmFsVG9FeHRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBpbnN0YWxsaW5nIGFuIGFwcCBmaXJzdCB0byB0aGUgZGV2aWNlLCB0aGVuIHRvIHRoZSBTRCBDYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTYyNSwxNCArNzc4LDIxIEBACiAgICAgICogdW5pbnN0YWxsIGl0LCBhbmQgcmVpbnN0YWxsIGl0IG9udG8gdGhlIGRldmljZS4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgLy8gVE9ETzogVGhpcyBjdXJyZW50bHkgcmVsaWVzIG9uIHRoZSBhcHAncyBtYW5pZmVzdCB0byBzd2l0Y2ggZnJvbSBkZXZpY2UgdG8KICAgICAvLyBTRCBjYXJkIGluc3RhbGwgbG9jYXRpb25zLiBXZSBtaWdodCB3YW50IHRvIG1ha2UgRGV2aWNlJ3MgaW5zdGFsbFBhY2thZ2UoKQogICAgIC8vIGFjY2VwdCBhIGluc3RhbGxMb2NhdGlvbiBmbGFnIHNvIHdlIGNhbiBpbnN0YWxsIGEgcGFja2FnZSB0byB0aGUKICAgICAvLyBkZXN0aW5hdGlvbiBvZiBvdXIgY2hvb3NpbmcuCi0gICAgcHVibGljIHZvaWQgdGVzdFJlaW5zdGFsbEV4dGVybmFsVG9JbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWluc3RhbGxFeHRlcm5hbFRvSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbGluZyBhbiBhcHAgZmlyc3QgdG8gdGhlIFNEIENhcmUsIHRoZW4gdG8gdGhlIGRldmljZSIpOwogCiAgICAgICAgIHRyeSB7CkBAIC02NTUsMTAgKzgxNSwxNiBAQAogICAgICAqIHRoZSB1cGRhdGUgb250byB0aGUgU0QgY2FyZCBhcyB3ZWxsIHdoZW4gbG9jYXRpb24gaXMgc2V0IHRvIGV4dGVybmFsIGZvciBib3RoIHZlcnNpb25zCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVCb3RoRXh0ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQm90aEV4dGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYW4gYXBwIG9uIHRoZSBTRCBjYXJkIHN0YXlzIG9uIHRoZSBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTY4MSwxMCArODQ3LDE2IEBACiAgICAgICogdXBkYXRlZCBhcHBzJyBtYW5pZmVzdCBmaWxlLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVG9TRENhcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVG9TRENhcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLAorICAgICAgICAgICAgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCB1cGRhdGluZyBhbiBhcHAgb24gdGhlIFNEIGNhcmQgc3RheXMgb24gdGhlIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtNzA2LDEwICs4NzgsMTcgQEAKICAgICAgKiB0aGUgdXBkYXRlIG9udG8gdGhlIGRldmljZSBpZiB0aGUgbWFuaWZlc3QgaGFzIGNoYW5nZWQgdG8gaW5zdGFsbExvY2F0aW9uPWludGVybmFsT25seQogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU0RDYXJkVG9EZXZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU0RDYXJkVG9EZXZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYW4gYXBwIG9uIHRoZSBTRCBjYXJkIHRvIHRoZSBEZXZpY2UgdGhyb3VnaCBtYW5pZmVzdCBjaGFuZ2UiKTsKIAogICAgICAgICB0cnkgewpAQCAtNzMxLDExICs5MTAsMTggQEAKICAgICAgKiB0aGUgdXBkYXRlIG9udG8gdGhlIGRldmljZSdzIGZvcndhcmQtbG9ja2VkIGxvY2F0aW9uCiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFkYiBzaGVsbCBjb21tYW5kIGZhaWxlZAogICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRpbWVvdXQgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24gaWYgYWRiIHJlamVjdHMgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBpZiB0aGUgZGV2aWNlIGRpZCBub3Qgb3V0cHV0IGFueXRoaW5nIGZvcgorICAgICAqIGEgcGVyaW9kIGxvbmdlciB0aGFuIHRoZSBtYXggdGltZSB0byBvdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBjb25uZWN0aW9uIHRvIGRldmljZSB3YXMgbG9zdC4KKyAgICAgKiBAdGhyb3dzIFN5bmNFeGNlcHRpb24gaWYgdGhlIHN5bmMgZmFpbGVkIGZvciBhbm90aGVyIHJlYXNvbi4KKyAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGluc3RhbGwgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQW5kVXBkYXRlRXh0ZXJuYWxMb2NGb3J3YXJkTG9ja2VkQXBwKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgU3luY0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYSBmb3J3YXJkLWxvY2tlZCBhcHAgbWFya2VkIHByZWZlckV4dGVybmFsIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTc1NywxMSArOTQzLDE4IEBACiAgICAgICogdGhlIHVwZGF0ZSBvbnRvIHRoZSBkZXZpY2UncyBmb3J3YXJkLWxvY2tlZCBsb2NhdGlvbgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBTeW5jRXhjZXB0aW9uIGlmIHRoZSBzeW5jIGZhaWxlZCBmb3IgYW5vdGhlciByZWFzb24uCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZFVwZGF0ZU5vTG9jRm9yd2FyZExvY2tlZEFwcCgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEluc3RhbGxFeGNlcHRpb24sIFN5bmNFeGNlcHRpb24sCisgICAgICAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IHVwZGF0aW5nIGEgZm9yd2FyZC1sb2NrZWQgYXBwIHdpdGggbm8gaW5zdGFsbExvY2F0aW9uIHByZWYgc2V0Iik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTc4MywxMSArOTc2LDE4IEBACiAgICAgICogYW5kIHRoZW4gbGF1bmNoZWQgd2l0aG91dCBjcmFzaGluZy4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgU3luY0V4Y2VwdGlvbiBpZiB0aGUgc3luYyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hBbGxQZXJtc0FwcE9uU0QoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBsYXVuY2hpbmcgYW4gYXBwIHdpdGggYWxsIHBlcm1zIHNldCwgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtODA4LDExICsxMDA4LDE3IEBACiAgICAgICogcnVuIHdpdGhvdXQgcGVybWlzc2lvbnMgZXJyb3JzLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZExhdW5jaEZMUGVybXNBcHBPblNEKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIGxvY2F0aW9uIHBlcm1zIHNldCwgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtODMzLDExICsxMDM5LDE3IEBACiAgICAgICogcnVuIHdpdGhvdXQgcGVybWlzc2lvbnMgZXJyb3JzLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZExhdW5jaEJUUGVybXNBcHBPblNEKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIGJsdWV0b290aCBwZXJtcyBzZXQsIGluc3RhbGxlZCBvbiBTRCBjYXJkIik7CiAKICAgICAgICAgdHJ5IHsKQEAgLTg1OCwxMSArMTA3MCwxNyBAQAogICAgICAqIFNlY3VyaXR5RXhjZXB0aW9uIHdoZW4gbGF1bmNoZWQgaWYgaXRzIG90aGVyIHNoYXJlZCBhcHBzIGFyZSBub3QgaW5zdGFsbGVkLgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZExhdW5jaFNoYXJlZFBlcm1zQXBwT25TRF9Ob1Blcm1zKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIG5vIGV4cGxpY2l0IHBlcm1zIHNldCwgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtODg4LDExICsxMTA2LDE3IEBACiAgICAgICogc2hhcmVkIGFwcHMgYXJlIGluc3RhbGxlZC4KICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hTaGFyZWRQZXJtc0FwcE9uU0RfR3JhbnRlZFBlcm1zKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgbGF1bmNoaW5nIGFuIGFwcCB3aXRoIG5vIGV4cGxpY2l0IHBlcm1zIHNldCwgaW5zdGFsbGVkIG9uIFNEIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtOTIxLDExICsxMTQ1LDE3IEBACiAgICAgICogcnVuIHdpdGhvdXQgcGVybWlzc2lvbnMgZXJyb3JzIGV2ZW4gYWZ0ZXIgYSByZWJvb3QKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYWRiIHNoZWxsIGNvbW1hbmQgZmFpbGVkCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGltZW91dCBvbiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiBpZiBhZGIgcmVqZWN0cyB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBvdXRwdXQgYW55dGhpbmcgZm9yCisgICAgICogYSBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlIG1heCB0aW1lIHRvIG91dHB1dC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGNvbm5lY3Rpb24gdG8gZGV2aWNlIHdhcyBsb3N0LgorICAgICAqIEB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFsbCBmYWlsZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbmRMYXVuY2hGTFBlcm1zQXBwT25TRF9SZWJvb3QoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBsYXVuY2hpbmcgYW4gYXBwIHdpdGggbG9jYXRpb24gcGVybXMgc2V0LCBpbnN0YWxsZWQgb24gU0QgY2FyZCIpOwogCiAgICAgICAgIHRyeSB7CkBAIC05NTEsMTEgKzExODEsMTcgQEAKICAgICAgKiBzaGFyZWQgYXBwcyBhcmUgaW5zdGFsbGVkLCBldmVuIGFmdGVyIGEgcmVib290LgogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhZGIgc2hlbGwgY29tbWFuZCBmYWlsZWQKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0aW1lb3V0IG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uIGlmIGFkYiByZWplY3RzIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gaWYgdGhlIGRldmljZSBkaWQgbm90IG91dHB1dCBhbnl0aGluZyBmb3IKKyAgICAgKiBhIHBlcmlvZCBsb25nZXIgdGhhbiB0aGUgbWF4IHRpbWUgdG8gb3V0cHV0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byBkZXZpY2Ugd2FzIGxvc3QuCisgICAgICogQHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIGZhaWxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFuZExhdW5jaFNoYXJlZFBlcm1zQXBwT25TRF9SZWJvb3QoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLAorICAgICAgICAgICAgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLCBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCBsYXVuY2hpbmcgYW4gYXBwIG9uIFNELCB3aXRoIG5vIGV4cGxpY2l0IHBlcm1zIHNldCBhZnRlciByZWJvb3QiKTsKIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlclN0cmVzc0hvc3RUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlclN0cmVzc0hvc3RUZXN0cy5qYXZhCmluZGV4IDcxNWM1NWIuLmEyYTVkZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJTdHJlc3NIb3N0VGVzdHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyU3RyZXNzSG9zdFRlc3RzLmphdmEKQEAgLTE2LDggKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaG9zdHRlc3QuRGV2aWNlVGVzdFN1aXRlOwogCkBAIC0xMzgsNyArMTQxLDkgQEAKICAgICAgKiA8cC8+CiAgICAgICogQXNzdW1lcyBhZGIgaXMgcnVubmluZyBhcyByb290IGluIGRldmljZSB1bmRlciB0ZXN0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBcHBNYW55VGltZXNPblNEKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFwcE1hbnlUaW1lc09uU0QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgdXBkYXRpbmcgYW4gYXBwIG9uIFNEIG51bWVyb3VzIHRpbWVzIik7CiAKICAgICAgICAgLy8gY2xlYW51cCB0ZXN0IGFwcCBqdXN0IGluIGNhc2UgaXQgYWxyZWFkeSBleGlzdHMKQEAgLTE3Myw3ICsxNzgsOSBAQAogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbFJlaW5zdGFsbEFwcE9uU0RNYW55VGltZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsUmVpbnN0YWxsQXBwT25TRE1hbnlUaW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBJbnN0YWxsRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBBZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb24sCisgICAgICAgICAgICBTaGVsbENvbW1hbmRVbnJlc3BvbnNpdmVFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiVGVzdCB1cGRhdGluZyBhbiBhcHAgb24gdGhlIFNEIGNhcmQgc3RheXMgb24gdGhlIFNEIGNhcmQiKTsKIAogICAgICAgICAvLyBjbGVhbnVwIHRlc3QgYXBwIGp1c3QgaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBleGlzdHMKQEAgLTIwNyw3ICsyMTQsOSBAQAogICAgICAqIDxwLz4KICAgICAgKiBBc3N1bWVzIGFkYiBpcyBydW5uaW5nIGFzIHJvb3QgaW4gZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxNYW55TGFyZ2VBcHBzT25TRCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTWFueUxhcmdlQXBwc09uU0QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW5zdGFsbEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgQWRiQ29tbWFuZFJlamVjdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlRlc3QgaW5zdGFsbGluZyAyMCBsYXJnZSBhcHBzIG9udG8gdGhlIHNkIGNhcmQiKTsKIAogICAgICAgICB0cnkgewpAQCAtMjUxLDcgKzI2MCw5IEBACiAgICAgICogPHAvPgogICAgICAqIEFzc3VtZXMgYWRiIGlzIHJ1bm5pbmcgYXMgcm9vdCBpbiBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE1hbnlBcHBzT25TRCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTWFueUFwcHNPblNEKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbGxFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEFkYkNvbW1hbmRSZWplY3RlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNoZWxsQ29tbWFuZFVucmVzcG9uc2l2ZUV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJUZXN0IGluc3RhbGxpbmcgNTAwIHNtYWxsIGFwcHMgb250byBTRCIpOwogCiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VySG9zdFRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VySG9zdFRlc3RzLmphdmEKaW5kZXggZGY3ODFiZi4uYTk0NTU1YyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvbmV0L0Rvd25sb2FkTWFuYWdlckhvc3RUZXN0cy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXJIb3N0VGVzdHMuamF2YQpAQCAtMTcsMjAgKzE3LDEyIEBACiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlsczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLkNvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTXVsdGlMaW5lUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5JU3luY1Byb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuU3luY1Jlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5ob3N0dGVzdC5EZXZpY2VUZXN0U3VpdGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9BVlJDUC5rbCBiL2RhdGEva2V5Ym9hcmRzL0FWUkNQLmtsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjNjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9BVlJDUC5rbApAQCAtMCwwICsxLDcgQEAKK2tleSAyMDAgICBNRURJQV9QTEFZX1BBVVNFICAgIFdBS0UKK2tleSAyMDEgICBNRURJQV9QTEFZX1BBVVNFICAgIFdBS0UKK2tleSAxNjYgICBNRURJQV9TVE9QICAgICAgICAgIFdBS0UKK2tleSAxNjMgICBNRURJQV9ORVhUICAgICAgICAgIFdBS0UKK2tleSAxNjUgICBNRURJQV9QUkVWSU9VUyAgICAgIFdBS0UKK2tleSAxNjggICBNRURJQV9SRVdJTkQgICAgICAgIFdBS0UKK2tleSAyMDggICBNRURJQV9GQVNUX0ZPUldBUkQgIFdBS0UKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL0FuZHJvaWQubWsgYi9kYXRhL2tleWJvYXJkcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWM1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gcXdlcnR5LmtjbQoraW5jbHVkZSAkKEJVSUxEX0tFWV9DSEFSX01BUCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gcXdlcnR5Mi5rY20KK2luY2x1ZGUgJChCVUlMRF9LRVlfQ0hBUl9NQVApCisKK2ZpbGUgOj0gJChUQVJHRVRfT1VUX0tFWUxBWU9VVCkvcXdlcnR5LmtsCitBTExfUFJFQlVJTFQgKz0gJChmaWxlKQorJChmaWxlKTogJChMT0NBTF9QQVRIKS9xd2VydHkua2wgfCAkKEFDUCkKKwkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCisKK2ZpbGUgOj0gJChUQVJHRVRfT1VUX0tFWUxBWU9VVCkvQVZSQ1Aua2wKK0FMTF9QUkVCVUlMVCArPSAkKGZpbGUpCiskKGZpbGUpIDogJChMT0NBTF9QQVRIKS9BVlJDUC5rbCB8ICQoQUNQKQorCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL3F3ZXJ0eS5rY20gYi9kYXRhL2tleWJvYXJkcy9xd2VydHkua2NtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTYzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9xd2VydHkua2NtCkBAIC0wLDAgKzEsNjQgQEAKK1t0eXBlPVFXRVJUWV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyBrZXljb2RlICAgICAgIGRpc3BsYXkgbnVtYmVyICBiYXNlICAgIGNhcHMgICAgZm4gICAgICBjYXBzX2ZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQSAgICAgICAgICAgICAgICdBJyAgICAgJzInICAgICAnYScgICAgICdBJyAgICAgJyMnICAgICAweDAwCitCICAgICAgICAgICAgICAgJ0InICAgICAnMicgICAgICdiJyAgICAgJ0InICAgICAnPCcgICAgIDB4MDAKK0MgICAgICAgICAgICAgICAnQycgICAgICcyJyAgICAgJ2MnICAgICAnQycgICAgICc5JyAgICAgMHgwMEU3CitEICAgICAgICAgICAgICAgJ0QnICAgICAnMycgICAgICdkJyAgICAgJ0QnICAgICAnNScgICAgIDB4MDAKK0UgICAgICAgICAgICAgICAnRScgICAgICczJyAgICAgJ2UnICAgICAnRScgICAgICcyJyAgICAgMHgwMzAxCitGICAgICAgICAgICAgICAgJ0YnICAgICAnMycgICAgICdmJyAgICAgJ0YnICAgICAnNicgICAgIDB4MDBBNQorRyAgICAgICAgICAgICAgICdHJyAgICAgJzQnICAgICAnZycgICAgICdHJyAgICAgJy0nICAgICAnXycKK0ggICAgICAgICAgICAgICAnSCcgICAgICc0JyAgICAgJ2gnICAgICAnSCcgICAgICdbJyAgICAgJ3snCitJICAgICAgICAgICAgICAgJ0knICAgICAnNCcgICAgICdpJyAgICAgJ0knICAgICAnJCcgICAgIDB4MDMwMgorSiAgICAgICAgICAgICAgICdKJyAgICAgJzUnICAgICAnaicgICAgICdKJyAgICAgJ10nICAgICAnfScKK0sgICAgICAgICAgICAgICAnSycgICAgICc1JyAgICAgJ2snICAgICAnSycgICAgICciJyAgICAgJ34nCitMICAgICAgICAgICAgICAgJ0wnICAgICAnNScgICAgICdsJyAgICAgJ0wnICAgICAnJycgICAgICdgJworTSAgICAgICAgICAgICAgICdNJyAgICAgJzYnICAgICAnbScgICAgICdNJyAgICAgJyEnICAgICAweDAwCitOICAgICAgICAgICAgICAgJ04nICAgICAnNicgICAgICduJyAgICAgJ04nICAgICAnPicgICAgIDB4MDMwMworTyAgICAgICAgICAgICAgICdPJyAgICAgJzYnICAgICAnbycgICAgICdPJyAgICAgJygnICAgICAweDAwCitQICAgICAgICAgICAgICAgJ1AnICAgICAnNycgICAgICdwJyAgICAgJ1AnICAgICAnKScgICAgIDB4MDAKK1EgICAgICAgICAgICAgICAnUScgICAgICc3JyAgICAgJ3EnICAgICAnUScgICAgICcqJyAgICAgMHgwMzAwCitSICAgICAgICAgICAgICAgJ1InICAgICAnNycgICAgICdyJyAgICAgJ1InICAgICAnMycgICAgIDB4MjBBQworUyAgICAgICAgICAgICAgICdTJyAgICAgJzcnICAgICAncycgICAgICdTJyAgICAgJzQnICAgICAweDAwREYKK1QgICAgICAgICAgICAgICAnVCcgICAgICc4JyAgICAgJ3QnICAgICAnVCcgICAgICcrJyAgICAgMHgwMEEzCitVICAgICAgICAgICAgICAgJ1UnICAgICAnOCcgICAgICd1JyAgICAgJ1UnICAgICAnJicgICAgIDB4MDMwOAorViAgICAgICAgICAgICAgICdWJyAgICAgJzgnICAgICAndicgICAgICdWJyAgICAgJz0nICAgICAnXicKK1cgICAgICAgICAgICAgICAnVycgICAgICc5JyAgICAgJ3cnICAgICAnVycgICAgICcxJyAgICAgMHgwMAorWCAgICAgICAgICAgICAgICdYJyAgICAgJzknICAgICAneCcgICAgICdYJyAgICAgJzgnICAgICAweEVGMDAKK1kgICAgICAgICAgICAgICAnWScgICAgICc5JyAgICAgJ3knICAgICAnWScgICAgICclJyAgICAgMHgwMEExCitaICAgICAgICAgICAgICAgJ1onICAgICAnOScgICAgICd6JyAgICAgJ1onICAgICAnNycgICAgIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIG9uIHBjIGtleWJvYXJkcworQ09NTUEgICAgICAgICAgICcsJyAgICAgJywnICAgICAnLCcgICAgICc7JyAgICAgJzsnICAgICAnfCcKK1BFUklPRCAgICAgICAgICAnLicgICAgICcuJyAgICAgJy4nICAgICAnOicgICAgICc6JyAgICAgMHgyMDI2CitBVCAgICAgICAgICAgICAgJ0AnICAgICAnMCcgICAgICdAJyAgICAgJzAnICAgICAnMCcgICAgIDB4MjAyMgorU0xBU0ggICAgICAgICAgICcvJyAgICAgJy8nICAgICAnLycgICAgICc/JyAgICAgJz8nICAgICAnXCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitTUEFDRSAgICAgICAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHgyMCAgICAweEVGMDEgIDB4RUYwMQorRU5URVIgICAgICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorVEFCICAgICAgICAgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkKKzAgICAgICAgICAgICAgICAnMCcgICAgICcwJyAgICAgJzAnICAgICAnKScgICAgICcpJyAgICAgJyknCisxICAgICAgICAgICAgICAgJzEnICAgICAnMScgICAgICcxJyAgICAgJyEnICAgICAnIScgICAgICchJworMiAgICAgICAgICAgICAgICcyJyAgICAgJzInICAgICAnMicgICAgICdAJyAgICAgJ0AnICAgICAnQCcKKzMgICAgICAgICAgICAgICAnMycgICAgICczJyAgICAgJzMnICAgICAnIycgICAgICcjJyAgICAgJyMnCis0ICAgICAgICAgICAgICAgJzQnICAgICAnNCcgICAgICc0JyAgICAgJyQnICAgICAnJCcgICAgICckJworNSAgICAgICAgICAgICAgICc1JyAgICAgJzUnICAgICAnNScgICAgICclJyAgICAgJyUnICAgICAnJScKKzYgICAgICAgICAgICAgICAnNicgICAgICc2JyAgICAgJzYnICAgICAnXicgICAgICdeJyAgICAgJ14nCis3ICAgICAgICAgICAgICAgJzcnICAgICAnNycgICAgICc3JyAgICAgJyYnICAgICAnJicgICAgICcmJworOCAgICAgICAgICAgICAgICc4JyAgICAgJzgnICAgICAnOCcgICAgICcqJyAgICAgJyonICAgICAnKicKKzkgICAgICAgICAgICAgICAnOScgICAgICc5JyAgICAgJzknICAgICAnKCcgICAgICcoJyAgICAgJygnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorR1JBVkUgICAgICAgICAgICdgJyAgICAgJ2AnICAgICAnYCcgICAgICd+JyAgICAgJ2AnICAgICAnficKK01JTlVTICAgICAgICAgICAnLScgICAgICctJyAgICAgJy0nICAgICAnXycgICAgICctJyAgICAgJ18nCitFUVVBTFMgICAgICAgICAgJz0nICAgICAnPScgICAgICc9JyAgICAgJysnICAgICAnPScgICAgICcrJworTEVGVF9CUkFDS0VUICAgICdbJyAgICAgJ1snICAgICAnWycgICAgICd7JyAgICAgJ1snICAgICAneycKK1JJR0hUX0JSQUNLRVQgICAnXScgICAgICddJyAgICAgJ10nICAgICAnfScgICAgICddJyAgICAgJ30nCitCQUNLU0xBU0ggICAgICAgJ1wnICAgICAnXCcgICAgICdcJyAgICAgJ3wnICAgICAnXCcgICAgICd8JworU0VNSUNPTE9OICAgICAgICc7JyAgICAgJzsnICAgICAnOycgICAgICc6JyAgICAgJzsnICAgICAnOicKK0FQT1NUUk9QSEUgICAgICAnJycgICAgICcnJyAgICAgJycnICAgICAnIicgICAgICcnJyAgICAgJyInCitTVEFSICAgICAgICAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJworUE9VTkQgICAgICAgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycKK1BMVVMgICAgICAgICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvcXdlcnR5LmtsIGIvZGF0YS9rZXlib2FyZHMvcXdlcnR5LmtsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9xd2VydHkua2wKQEAgLTAsMCArMSw5MSBAQAora2V5IDM5OSAgIEdSQVZFCitrZXkgMiAgICAgMQora2V5IDMgICAgIDIKK2tleSA0ICAgICAzCitrZXkgNSAgICAgNAora2V5IDYgICAgIDUKK2tleSA3ICAgICA2CitrZXkgOCAgICAgNwora2V5IDkgICAgIDgKK2tleSAxMCAgICA5CitrZXkgMTEgICAgMAora2V5IDE1OCAgIEJBQ0sgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDIzMCAgIFNPRlRfUklHSFQgICAgICAgIFdBS0UKK2tleSA2MCAgICBTT0ZUX1JJR0hUICAgICAgICBXQUtFCitrZXkgMTA3ICAgRU5EQ0FMTCAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgNjIgICAgRU5EQ0FMTCAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMjI5ICAgTUVOVSAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMTM5ICAgTUVOVSAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgNTkgICAgTUVOVSAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMTI3ICAgU0VBUkNIICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMjE3ICAgU0VBUkNIICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMjI4ICAgUE9VTkQKK2tleSAyMjcgICBTVEFSCitrZXkgMjMxICAgQ0FMTCAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgNjEgICAgQ0FMTCAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMjMyICAgRFBBRF9DRU5URVIgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMTA4ICAgRFBBRF9ET1dOICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMTAzICAgRFBBRF9VUCAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgMTAyICAgSE9NRSAgICAgICAgICAgICAgV0FLRQora2V5IDEwNSAgIERQQURfTEVGVCAgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDEwNiAgIERQQURfUklHSFQgICAgICAgIFdBS0VfRFJPUFBFRAora2V5IDExNSAgIFZPTFVNRV9VUCAgICAgICAgIFdBS0UKK2tleSAxMTQgICBWT0xVTUVfRE9XTiAgICAgICBXQUtFCitrZXkgMTE2ICAgUE9XRVIgICAgICAgICAgICAgV0FLRQora2V5IDIxMiAgIENBTUVSQQorCitrZXkgMTYgICAgUQora2V5IDE3ICAgIFcKK2tleSAxOCAgICBFCitrZXkgMTkgICAgUgora2V5IDIwICAgIFQKK2tleSAyMSAgICBZCitrZXkgMjIgICAgVQora2V5IDIzICAgIEkKK2tleSAyNCAgICBPCitrZXkgMjUgICAgUAora2V5IDI2ICAgIExFRlRfQlJBQ0tFVAora2V5IDI3ICAgIFJJR0hUX0JSQUNLRVQKK2tleSA0MyAgICBCQUNLU0xBU0gKKwora2V5IDMwICAgIEEKK2tleSAzMSAgICBTCitrZXkgMzIgICAgRAora2V5IDMzICAgIEYKK2tleSAzNCAgICBHCitrZXkgMzUgICAgSAora2V5IDM2ICAgIEoKK2tleSAzNyAgICBLCitrZXkgMzggICAgTAora2V5IDM5ICAgIFNFTUlDT0xPTgora2V5IDQwICAgIEFQT1NUUk9QSEUKK2tleSAxNCAgICBERUwKKyAgICAgICAgCitrZXkgNDQgICAgWgora2V5IDQ1ICAgIFgKK2tleSA0NiAgICBDCitrZXkgNDcgICAgVgora2V5IDQ4ICAgIEIKK2tleSA0OSAgICBOCitrZXkgNTAgICAgTQora2V5IDUxICAgIENPTU1BCitrZXkgNTIgICAgUEVSSU9ECitrZXkgNTMgICAgU0xBU0gKK2tleSAyOCAgICBFTlRFUgorICAgICAgICAKK2tleSA1NiAgICBBTFRfTEVGVAora2V5IDEwMCAgIEFMVF9SSUdIVAora2V5IDQyICAgIFNISUZUX0xFRlQKK2tleSA1NCAgICBTSElGVF9SSUdIVAora2V5IDE1ICAgIFRBQgora2V5IDU3ICAgIFNQQUNFCitrZXkgMTUwICAgRVhQTE9SRVIKK2tleSAxNTUgICBFTlZFTE9QRSAgICAgICAgCisKK2tleSAxMiAgICBNSU5VUwora2V5IDEzICAgIEVRVUFMUwora2V5IDIxNSAgIEFUCisKKyMgT24gYW4gQVQga2V5Ym9hcmQ6IEVTQywgRjEwCitrZXkgMSAgICAgQkFDSyAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECitrZXkgNjggICAgTUVOVSAgICAgICAgICAgICAgV0FLRV9EUk9QUEVECmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9xd2VydHkyLmtjbSBiL2RhdGEva2V5Ym9hcmRzL3F3ZXJ0eTIua2NtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODdmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9xd2VydHkyLmtjbQpAQCAtMCwwICsxLDgxIEBACitbdHlwZT1RV0VSVFldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgdGhpcyBrZXltYXAgaXMgdG8gYmUgdXNlZCBpbiB0aGUgZW11bGF0b3Igb25seS4gbm90ZQorIyB0aGF0IEkgaGF2ZSBsaWJlcmFsbHkgbW9kaWZpZWQgY2VydGFpbiBrZXkgc3Ryb2tlcyB0bworIyBtYWtlIGl0IG1vcmUgdXNhYmxlIGluIHRoaXMgY29udGV4dC4gdGhlIG1haW4gZGlmZmVyZW5jZXMKKyMgd2l0aCB0aGUgcmVmZXJlbmNlIGtleWJvYXJkIGltYWdlIGFyZToKKyMKKyMgIC0gY2FwLTIgcHJvZHVjZXMgJ0AnLCBhbmQgbm90ICciJywgd2l0aG91dCB0aGF0LCB0eXBpbmcKKyMgICAgZW1haWwgYWRkcmVzc2VzIGJlY29tZXMgYSBtYWpvciBwYWluIHdpdGggYSBxd2VydHkKKyMgICAga2V5Ym9hcmQuIG5vdGUgdGhhdCB5b3UgY2FuIHR5cGUgJyInIHdpdGggZm4tRSBhbnl3YXkuCisjCisjICAtIGNhcC1DT01NQSBhbmQgY2FwLVBFUklPRCByZXR1cm4gJzwnIGFuZCAnPicsIGluc3RlYWQKKyMgICAgb2Ygbm90aGluZy4KKyMKKyMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIGtleWNvZGUgICAgICAgZGlzcGxheSAgbnVtYmVyIGJhc2UgICAgY2FwcyAgICBmbiAgICAgIGNhcHNfZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitBICAgICAgICAgICAgICAgJ0EnICAgICAnMicgICAgICdhJyAgICAgJ0EnICAgICAnYScgICAgICdBJworQiAgICAgICAgICAgICAgICdCJyAgICAgJzInICAgICAnYicgICAgICdCJyAgICAgJ2InICAgICAnQicKK0MgICAgICAgICAgICAgICAnQycgICAgICcyJyAgICAgJ2MnICAgICAnQycgICAgIDB4MDBlNyAgMHgwMEU3CitEICAgICAgICAgICAgICAgJ0QnICAgICAnMycgICAgICdkJyAgICAgJ0QnICAgICAnJycgICAgICcnJworRSAgICAgICAgICAgICAgICdFJyAgICAgJzMnICAgICAnZScgICAgICdFJyAgICAgJyInICAgICAweDAzMDEKK0YgICAgICAgICAgICAgICAnRicgICAgICczJyAgICAgJ2YnICAgICAnRicgICAgICdbJyAgICAgJ1snCitHICAgICAgICAgICAgICAgJ0cnICAgICAnNCcgICAgICdnJyAgICAgJ0cnICAgICAnXScgICAgICddJworSCAgICAgICAgICAgICAgICdIJyAgICAgJzQnICAgICAnaCcgICAgICdIJyAgICAgJzwnICAgICAnPCcKK0kgICAgICAgICAgICAgICAnSScgICAgICc0JyAgICAgJ2knICAgICAnSScgICAgICctJyAgICAgMHgwMzAyCitKICAgICAgICAgICAgICAgJ0onICAgICAnNScgICAgICdqJyAgICAgJ0onICAgICAnPicgICAgICc+JworSyAgICAgICAgICAgICAgICdLJyAgICAgJzUnICAgICAnaycgICAgICdLJyAgICAgJzsnICAgICAnficKK0wgICAgICAgICAgICAgICAnTCcgICAgICc1JyAgICAgJ2wnICAgICAnTCcgICAgICc6JyAgICAgJ2AnCitNICAgICAgICAgICAgICAgJ00nICAgICAnNicgICAgICdtJyAgICAgJ00nICAgICAnJScgICAgIDB4MDAKK04gICAgICAgICAgICAgICAnTicgICAgICc2JyAgICAgJ24nICAgICAnTicgICAgIDB4MDAgICAgMHgwMzAzCitPICAgICAgICAgICAgICAgJ08nICAgICAnNicgICAgICdvJyAgICAgJ08nICAgICAnKycgICAgICcrJworUCAgICAgICAgICAgICAgICdQJyAgICAgJzcnICAgICAncCcgICAgICdQJyAgICAgJz0nICAgICAweDAwQTUKK1EgICAgICAgICAgICAgICAnUScgICAgICc3JyAgICAgJ3EnICAgICAnUScgICAgICd8JyAgICAgMHgwMzAwCitSICAgICAgICAgICAgICAgJ1InICAgICAnNycgICAgICdyJyAgICAgJ1InICAgICAnYCcgICAgIDB4MjBBQworUyAgICAgICAgICAgICAgICdTJyAgICAgJzcnICAgICAncycgICAgICdTJyAgICAgJ1wnICAgICAweDAwREYKK1QgICAgICAgICAgICAgICAnVCcgICAgICc4JyAgICAgJ3QnICAgICAnVCcgICAgICd7JyAgICAgMHgwMEEzCitVICAgICAgICAgICAgICAgJ1UnICAgICAnOCcgICAgICd1JyAgICAgJ1UnICAgICAnXycgICAgIDB4MDMwOAorViAgICAgICAgICAgICAgICdWJyAgICAgJzgnICAgICAndicgICAgICdWJyAgICAgJ3YnICAgICAnVicKK1cgICAgICAgICAgICAgICAnVycgICAgICc5JyAgICAgJ3cnICAgICAnVycgICAgICd+JyAgICAgJ34nCitYICAgICAgICAgICAgICAgJ1gnICAgICAnOScgICAgICd4JyAgICAgJ1gnICAgICAneCcgICAgIDB4RUYwMAorWSAgICAgICAgICAgICAgICdZJyAgICAgJzknICAgICAneScgICAgICdZJyAgICAgJ30nICAgICAweDAwQTEKK1ogICAgICAgICAgICAgICAnWicgICAgICc5JyAgICAgJ3onICAgICAnWicgICAgICd6JyAgICAgJ1onCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQ09NTUEgICAgICAgICAgICcsJyAgICAgJywnICAgICAnLCcgICAgICc8JyAgICAgJywnICAgICAnLCcKK1BFUklPRCAgICAgICAgICAnLicgICAgICcuJyAgICAgJy4nICAgICAnPicgICAgICcuJyAgICAgMHgyMDI2CitBVCAgICAgICAgICAgICAgJ0AnICAgICAnQCcgICAgICdAJyAgICAgJ0AnICAgICAnQCcgICAgIDB4MjAyMgorU0xBU0ggICAgICAgICAgICcvJyAgICAgJy8nICAgICAnLycgICAgICc/JyAgICAgJz8nICAgICAnPycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitTUEFDRSAgICAgICAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHgyMCAgICAweEVGMDEgIDB4RUYwMQorRU5URVIgICAgICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorMCAgICAgICAgICAgICAgICcwJyAgICAgJzAnICAgICAnMCcgICAgICcpJyAgICAgJyknICAgICAnKScKKzEgICAgICAgICAgICAgICAnMScgICAgICcxJyAgICAgJzEnICAgICAnIScgICAgICchJyAgICAgJyEnCisyICAgICAgICAgICAgICAgJzInICAgICAnMicgICAgICcyJyAgICAgJ0AnICAgICAnQCcgICAgICdAJworMyAgICAgICAgICAgICAgICczJyAgICAgJzMnICAgICAnMycgICAgICcjJyAgICAgJyMnICAgICAnIycKKzQgICAgICAgICAgICAgICAnNCcgICAgICc0JyAgICAgJzQnICAgICAnJCcgICAgICckJyAgICAgJyQnCis1ICAgICAgICAgICAgICAgJzUnICAgICAnNScgICAgICc1JyAgICAgJyUnICAgICAnJScgICAgICclJworNiAgICAgICAgICAgICAgICc2JyAgICAgJzYnICAgICAnNicgICAgICdeJyAgICAgJ14nICAgICAnXicKKzcgICAgICAgICAgICAgICAnNycgICAgICc3JyAgICAgJzcnICAgICAnJicgICAgICcmJyAgICAgJyYnCis4ICAgICAgICAgICAgICAgJzgnICAgICAnOCcgICAgICc4JyAgICAgJyonICAgICAnKicgICAgICcqJworOSAgICAgICAgICAgICAgICc5JyAgICAgJzknICAgICAnOScgICAgICcoJyAgICAgJygnICAgICAnKCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIHRoZSByZXN0IGlzIGZvciBhIHF3ZXJ0eSBrZXlib2FyZAorIworVEFCICAgICAgICAgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkKK0dSQVZFICAgICAgICAgICAnYCcgICAgICdgJyAgICAgJ2AnICAgICAnficgICAgICdgJyAgICAgJ34nCitNSU5VUyAgICAgICAgICAgJy0nICAgICAnLScgICAgICctJyAgICAgJ18nICAgICAnLScgICAgICdfJworRVFVQUxTICAgICAgICAgICc9JyAgICAgJz0nICAgICAnPScgICAgICcrJyAgICAgJz0nICAgICAnKycKK0xFRlRfQlJBQ0tFVCAgICAnWycgICAgICdbJyAgICAgJ1snICAgICAneycgICAgICdbJyAgICAgJ3snCitSSUdIVF9CUkFDS0VUICAgJ10nICAgICAnXScgICAgICddJyAgICAgJ30nICAgICAnXScgICAgICd9JworQkFDS1NMQVNIICAgICAgICdcJyAgICAgJ1wnICAgICAnXCcgICAgICd8JyAgICAgJ1wnICAgICAnfCcKK1NFTUlDT0xPTiAgICAgICAnOycgICAgICc7JyAgICAgJzsnICAgICAnOicgICAgICc7JyAgICAgJzonCitBUE9TVFJPUEhFICAgICAgJycnICAgICAnJycgICAgICcnJyAgICAgJyInICAgICAnJycgICAgICciJworU1RBUiAgICAgICAgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicKK1BPVU5EICAgICAgICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnCitQTFVTICAgICAgICAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsgYi9kYXRhL3NvdW5kcy9BbGxBdWRpby5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsKQEAgLTAsMCArMSwyMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL09yaWdpbmFsQXVkaW8ubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvQXVkaW9QYWNrYWdlMi5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9BdWRpb1BhY2thZ2UzLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL0F1ZGlvUGFja2FnZTQubWspCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvY29tbXVuaXR5L2luZGV4LmpkIGIvZG9jcy9odG1sL2NvbW11bml0eS9pbmRleC5qZAppbmRleCAzZTY5ZGU0Li4yMzIwM2MxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvY29tbXVuaXR5L2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9jb21tdW5pdHkvaW5kZXguamQKQEAgLTQsMTAgKzQsMTAgQEAKIAogCTxkaXYgaWQ9Im1haW5Cb2R5Rmx1aWQiPgogPGgxPkNvbW11bml0eTwvaDE+Ci08cD5XZWxjb21lIHRvIHRoZSBBbmRyb2lkIGRldmVsb3BlcnMgY29tbXVuaXR5ISBXZSdyZSBnbGFkIHlvdSdyZSBoZXJlIGFuZCBpbnZpdGUgeW91IHRvIHBhcnRpY2lwYXRlIGluIHRoZXNlIGRpc2N1c3Npb25zLiBCZWZvcmUgcG9zdGluZywgcGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3Vzcy9hbmRyb2lkLWRpc2N1c3Npb24tZ3JvdXBzLWNoYXJ0ZXIiPkdyb3VwcyBDaGFydGVyPC9hPiB0aGF0IGNvdmVycyB0aGUgY29tbXVuaXR5IGd1aWRlbGluZXMuPC9wPgorPHA+V2VsY29tZSB0byB0aGUgQW5kcm9pZCBkZXZlbG9wZXJzIGNvbW11bml0eSEgV2UncmUgZ2xhZCB5b3UncmUgaGVyZSBhbmQgaW52aXRlIHlvdSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGVzZSBkaXNjdXNzaW9ucy4gQmVmb3JlIHBvc3RpbmcsIHBsZWFzZSByZWFkIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj5Hcm91cHMgQ2hhcnRlcjwvYT4gdGhhdCBjb3ZlcnMgdGhlIGNvbW11bml0eSBndWlkZWxpbmVzLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGFyZSBzZWVraW5nIGRpc2N1c3Npb24gYWJvdXQgQW5kcm9pZCBzb3VyY2UgY29kZSAobm90IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50KSwKLXRoZW4gcGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MiPk9wZW4gU291cmNlIFByb2plY3QgTWFpbGluZyBsaXN0czwvYT4uPC9wPgordGhlbiBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5Ij5PcGVuIFNvdXJjZSBQcm9qZWN0IE1haWxpbmcgbGlzdHM8L2E+LjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206LjVlbSI+PHN0cm9uZz5Db250ZW50czwvc3Ryb25nPjwvcD4KIDxvbCBjbGFzcz0idG9jIj4KQEAgLTMxLDcgKzMxLDcgQEAKIEFzIHlvdSB3cml0ZSB5b3VyIHBvc3QsIHBsZWFzZSBkbyB0aGUgZm9sbG93aW5nOgogPG9sPgogPGxpPjxiPlJlYWQKLXRoZSA8YSBocmVmPSJodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9hL2FuZHJvaWQuY29tL29wZW5zb3VyY2UvZGlzY3Vzcy9hbmRyb2lkLWRpc2N1c3Npb24tZ3JvdXBzLWNoYXJ0ZXIiPm1haWxpbmcgbGlzdCBjaGFydGVyPC9hPjwvYj4gdGhhdCBjb3ZlcnMgdGhlIGNvbW11bml0eSBndWlkZWxpbmVzLiAKK3RoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj5tYWlsaW5nIGxpc3QgY2hhcnRlcjwvYT48L2I+IHRoYXQgY292ZXJzIHRoZSBjb21tdW5pdHkgZ3VpZGVsaW5lcy4gCiA8L2xpPgogPGxpPjxiPlNlbGVjdCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtYWlsaW5nIGxpc3QgZm9yIHlvdXIgcXVlc3Rpb248L2I+LiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgbGlzdHMgZm9yIAogZGV2ZWxvcGVycywgZGVzY3JpYmVkIGJlbG93LjwvbGk+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuamQKaW5kZXggZTBjZTA1MS4uOTcyZGQ3MiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvYW5pbWF0aW9uLXJlc291cmNlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2FuaW1hdGlvbi1yZXNvdXJjZS5qZApAQCAtNjUsMTAgKzY1LDEwIEBACiAgICAgICAgIGFuZHJvaWQ6cGl2b3RYPSI8ZW0+ZmxvYXQ8L2VtPiIKICAgICAgICAgYW5kcm9pZDpwaXZvdFk9IjxlbT5mbG9hdDwvZW0+IiAvJmd0OwogICAgICZsdDs8YSBocmVmPSIjdHJhbnNsYXRlLWVsZW1lbnQiPnRyYW5zbGF0ZTwvYT4KLSAgICAgICAgYW5kcm9pZDpmcm9tWD0iPGVtPmZsb2F0PC9lbT4iCi0gICAgICAgIGFuZHJvaWQ6dG9YPSI8ZW0+ZmxvYXQ8L2VtPiIKLSAgICAgICAgYW5kcm9pZDpmcm9tWT0iPGVtPmZsb2F0PC9lbT4iCi0gICAgICAgIGFuZHJvaWQ6dG9ZPSI8ZW0+ZmxvYXQ8L2VtPiIgLyZndDsKKyAgICAgICAgYW5kcm9pZDpmcm9tWERlbHRhPSI8ZW0+ZmxvYXQ8L2VtPiIKKyAgICAgICAgYW5kcm9pZDp0b1hEZWx0YT0iPGVtPmZsb2F0PC9lbT4iCisgICAgICAgIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iPGVtPmZsb2F0PC9lbT4iCisgICAgICAgIGFuZHJvaWQ6dG9ZRGVsdGE9IjxlbT5mbG9hdDwvZW0+IiAvJmd0OwogICAgICZsdDs8YSBocmVmPSIjcm90YXRlLWVsZW1lbnQiPnJvdGF0ZTwvYT4KICAgICAgICAgYW5kcm9pZDpmcm9tRGVncmVlcz0iPGVtPmZsb2F0PC9lbT4iCiAgICAgICAgIGFuZHJvaWQ6dG9EZWdyZWVzPSI8ZW0+ZmxvYXQ8L2VtPiIKQEAgLTIxMiwxMCArMjEyLDEwIEBACiAgICAgYW5kcm9pZDpzaGFyZUludGVycG9sYXRvcj0iZmFsc2UiPgogICAgICZsdDtzY2FsZQogICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuZHJvaWQ6YW5pbS9hY2NlbGVyYXRlX2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgotICAgICAgICBhbmRyb2lkOmZyb21YU2NhbGU9IjEuMCIgCi0gICAgICAgIGFuZHJvaWQ6dG9YU2NhbGU9IjEuNCIgCi0gICAgICAgIGFuZHJvaWQ6ZnJvbVlTY2FsZT0iMS4wIiAKLSAgICAgICAgYW5kcm9pZDp0b1lTY2FsZT0iMC42IiAKKyAgICAgICAgYW5kcm9pZDpmcm9tWFNjYWxlPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6dG9YU2NhbGU9IjEuNCIKKyAgICAgICAgYW5kcm9pZDpmcm9tWVNjYWxlPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6dG9ZU2NhbGU9IjAuNiIKICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjUwJSIKICAgICAgICAgYW5kcm9pZDpwaXZvdFk9IjUwJSIKICAgICAgICAgYW5kcm9pZDpmaWxsQWZ0ZXI9ImZhbHNlIgpAQCAtMjI0LDE4ICsyMjQsMTggQEAKICAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmRyb2lkOmFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCiAgICAgICAgIGFuZHJvaWQ6c3RhcnRPZmZzZXQ9IjcwMCI+CiAgICAgICAgICZsdDtzY2FsZQotICAgICAgICAgICAgYW5kcm9pZDpmcm9tWFNjYWxlPSIxLjQiIAorICAgICAgICAgICAgYW5kcm9pZDpmcm9tWFNjYWxlPSIxLjQiCiAgICAgICAgICAgICBhbmRyb2lkOnRvWFNjYWxlPSIwLjAiCiAgICAgICAgICAgICBhbmRyb2lkOmZyb21ZU2NhbGU9IjAuNiIKLSAgICAgICAgICAgIGFuZHJvaWQ6dG9ZU2NhbGU9IjAuMCIgCi0gICAgICAgICAgICBhbmRyb2lkOnBpdm90WD0iNTAlIiAKLSAgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RZPSI1MCUiIAorICAgICAgICAgICAgYW5kcm9pZDp0b1lTY2FsZT0iMC4wIgorICAgICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjUwJSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RZPSI1MCUiCiAgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI0MDAiIC8+CiAgICAgICAgICZsdDtyb3RhdGUKLSAgICAgICAgICAgIGFuZHJvaWQ6ZnJvbURlZ3JlZXM9IjAiIAorICAgICAgICAgICAgYW5kcm9pZDpmcm9tRGVncmVlcz0iMCIKICAgICAgICAgICAgIGFuZHJvaWQ6dG9EZWdyZWVzPSItNDUiCi0gICAgICAgICAgICBhbmRyb2lkOnRvWVNjYWxlPSIwLjAiIAotICAgICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjUwJSIgCisgICAgICAgICAgICBhbmRyb2lkOnRvWVNjYWxlPSIwLjAiCisgICAgICAgICAgICBhbmRyb2lkOnBpdm90WD0iNTAlIgogICAgICAgICAgICAgYW5kcm9pZDpwaXZvdFk9IjUwJSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjQwMCIgLz4KICAgICAmbHQ7L3NldD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCmluZGV4IDVkMDBkYjEuLjYwMDMwZjAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZApAQCAtNDk0LDYgKzQ5NCw3IEBACiAgICAgICA8dGQ+S2V5Ym9hcmQgYXZhaWxhYmlsaXR5PC90ZD4KICAgICAgIDx0ZD4KICAgICAgICAgPGNvZGU+a2V5c2V4cG9zZWQ8L2NvZGU+PGJyLz4KKyAgICAgICAgPGNvZGU+a2V5c2hpZGRlbjwvY29kZT48YnIvPgogICAgICAgICA8Y29kZT5rZXlzc29mdDwvY29kZT4KICAgICAgIDwvdGQ+CiAgICAgICA8dGQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQgYi9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQKaW5kZXggNjU5YWVlNy4uNDkwYjIzZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZApAQCAtNCw5ICs0LDkgQEAKIAogCTxkaXYgaWQ9Im1haW5Cb2R5Rmx1aWQiPgogCQkJPGgxPuOCs+ODn+ODpeODi+ODhuOCozwvaDE+Ci0JCQk8cD5BbmRyb2lkIOODh+ODmeODreODg+ODkeODvCDjgrPjg5/jg6Xjg4vjg4bjgqPjgbjjgojjgYbjgZPjgZ3jgILjgrPjg5/jg6Xjg4vjg4bjgqPjgafjga7jg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7PjgavjgZzjgbLlj4LliqDjgZfjgabjgY/jgaDjgZXjgYTjgILmipXnqL/jgZnjgovliY3jgavjgIHjgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+44Kw44Or44O844OX44Gu6Laj5oSPPC9hPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgjwvcD4KKwkJCTxwPkFuZHJvaWQg44OH44OZ44Ot44OD44OR44O8IOOCs+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+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj7jgrDjg6vjg7zjg5fjga7otqPmhI88L2E+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCPC9wPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz7ms6g6PC9zdHJvbmc+IEFuZHJvaWQg44K944O844K5IOOCs+ODvOODie+8iOOCouODl+ODquOCseODvOOCt+ODp+ODs+mWi+eZuuOBp+OBr+OBquOBj++8ieOBq+mWouOBmeOCi+ODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBr+OAgTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3VzcyI+44Kq44O844OX44Oz44K944O844K5IOODl+ODreOCuOOCp+OCr+ODiOOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4g8L2E+77yI6Iux6Kqe77yJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCPC9wPgorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+5rOoOjwvc3Ryb25nPiBBbmRyb2lkIOOCveODvOOCuSDjgrPjg7zjg4nvvIjjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pplovnmbrjgafjga/jgarjgY/vvInjgavplqLjgZnjgovjg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7Pjga/jgIE8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eSI+44Kq44O844OX44Oz44K944O844K5IOODl+ODreOCuOOCp+OCr+ODiOOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4g8L2E+77yI6Iux6Kqe77yJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTouNWVtIj48c3Ryb25nPuebruasoTwvc3Ryb25nPjwvcD4KIDxvbCBjbGFzcz0idG9jIj4KQEAgLTI4LDcgKzI4LDcgQEAKIAogPHA+6LOq5ZWP44G444Gu562U44GI44GM6KaL44Gk44GL44KJ44Gq44GE5aC05ZCI44CB44Kz44Of44Ol44OL44OG44Kj44Gn6LOq5ZWP44GZ44KL44GT44Go44KS44GK44GZ44GZ44KB44GX44G+44GZ44CC5oqV56i/44GZ44KL6Zqb44Gv44CB5qyh44Gu5omL6aCG44Gr5b6T44Gj44Gm44GP44Gg44GV44GE44CCCiA8b2w+Ci08bGk+44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxiPjxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL2EvYW5kcm9pZC5jb20vb3BlbnNvdXJjZS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+QW5kcm9pZCDjg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjga7otqPmhI88L2E+PC9iPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgiAKKzxsaT7jgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGI+PGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuaHRtbCI+QW5kcm9pZCDjg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjga7otqPmhI88L2E+PC9iPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgiAKIDwvbGk+CiA8bGk+PGI+6LOq5ZWP44Gr5pyA6YGp44Gq44Oh44O844Oq44Oz44KwIOODquOCueODiOOCkumBuOaKnuOBl+OBpuOBj+OBoOOBleOBhDwvYj7jgILlvozov7DjgZnjgovjgojjgYbjgavjgIHjg4fjg5njg63jg4Pjg5Hjg7zlkJHjgZHjga7jg6Hjg7zjg6rjg7PjgrAg44Oq44K544OI44Gv5L2V56iu6aGe44GL44Gr5YiG44GL44KM44Gm44GE44G+44GZ44CCPC9saT4KIDxsaT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkIGIvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKaW5kZXggYzk5YjFmOC4uZWNlZGRlMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKKysrIGIvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKQEAgLTQsOSArNCw5IEBACiAKIAk8ZGl2IGlkPSJtYWluQm9keUZsdWlkIj4KIAkJCTxoMT7jgrPjg5/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+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmpkCmluZGV4IDkyMWY0ZGYuLjE3Y2VjMzUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmpkCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgbmV3IERvd25sb2FkSW1hZ2VUYXNrKCkuZXhlY3V0ZSgiaHR0cDovL2V4YW1wbGUuY29tL2ltYWdlLnBuZyIpOwogfQogCi1wcml2YXRlIGNsYXNzIERvd25sb2FkSW1hZ2VUYXNrIGV4dGVuZHMgQXN5bmNUYXNrJmx0O3N0cmluZywgdm9pZCw9IiIgYml0bWFwPSIiJmd0OyB7Citwcml2YXRlIGNsYXNzIERvd25sb2FkSW1hZ2VUYXNrIGV4dGVuZHMgQXN5bmNUYXNrJmx0O1N0cmluZywgVm9pZCwgQml0bWFwJmd0OyB7CiAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoU3RyaW5nLi4uIHVybHMpIHsKICAgICAgICAgIHJldHVybiBsb2FkSW1hZ2VGcm9tTmV0d29yayh1cmxzWzBdKTsKICAgICAgfQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCmluZGV4IGVmMTk2MGIuLjU5OWM0YWUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKQEAgLTIyLDcgKzIyLDcgQEAKIAogPHA+V2VsY29tZSB0byB0aGUgQW5kcm9pZCBkZXZlbG9wZXJzIGNvbW11bml0eSEgV2UncmUgZ2xhZCB5b3UncmUgaGVyZSBhbmQgaW52aXRlIHlvdSB0byBwYXJ0aWNpcGF0ZSBpbiBkaXNjdXNzaW9ucyB3aXRoIG90aGVyIEFuZHJvaWQgYXBwbGljYXRpb24gZGV2ZWxvcGVycyBvbiB0b3BpY3MgdGhhdCBpbnRlcmVzdCB5b3UuPC9wPgogCi08cD5UaGUgbGlzdHMgb24gdGhpcyBwYWdlIGFyZSBwcmltYXJpbHkgZm9yIGRpc2N1c3Npb24gYWJvdXQgQW5kcm9pZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gSWYgeW91IGFyZSBzZWVraW5nIGRpc2N1c3Npb24gYWJvdXQgQW5kcm9pZCBzb3VyY2UgY29kZSAobm90IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50KSwgdGhlbiBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3VzcyI+T3BlbiBTb3VyY2UgUHJvamVjdCBNYWlsaW5nIGxpc3RzPC9hPi48L3A+Cis8cD5UaGUgbGlzdHMgb24gdGhpcyBwYWdlIGFyZSBwcmltYXJpbHkgZm9yIGRpc2N1c3Npb24gYWJvdXQgQW5kcm9pZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gSWYgeW91IGFyZSBzZWVraW5nIGRpc2N1c3Npb24gYWJvdXQgQW5kcm9pZCBzb3VyY2UgY29kZSAobm90IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50KSwgdGhlbiBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5Ij5PcGVuIFNvdXJjZSBQcm9qZWN0IE1haWxpbmcgbGlzdHM8L2E+LjwvcD4KIAogPGgyIGlkPSJTdGFja092ZXJmbG93Ij5TdGFjayBPdmVyZmxvdzwvaDI+CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5tayBiL2RybS9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzlhOTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgRHJtQ29uc3RyYWludHMuY3BwIFwKKyAgICBEcm1NZXRhZGF0YS5jcHAgXAorICAgIERybUNvbnZlcnRlZFN0YXR1cy5jcHAgXAorICAgIERybUVuZ2luZUJhc2UuY3BwIFwKKyAgICBEcm1JbmZvLmNwcCBcCisgICAgRHJtSW5mb1JlcXVlc3QuY3BwIFwKKyAgICBEcm1JbmZvU3RhdHVzLmNwcCBcCisgICAgRHJtUmlnaHRzLmNwcCBcCisgICAgRHJtU3VwcG9ydEluZm8uY3BwIFwKKyAgICBJRHJtSU9TZXJ2aWNlLmNwcCBcCisgICAgSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBcCisgICAgSURybVNlcnZpY2VMaXN0ZW5lci5jcHAgXAorICAgIERybUluZm9FdmVudC5jcHAgXAorICAgIFJlYWRXcml0ZVV0aWxzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBsaWJkcm1mcmFtZXdvcmtjb21tb24KKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1Db25zdHJhaW50cy5jcHAgYi9kcm0vY29tbW9uL0RybUNvbnN0cmFpbnRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRkNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1Db25zdHJhaW50cy5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybUNvbnN0cmFpbnRzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpNQVhfUkVQRUFUX0NPVU5UKCJtYXhfcmVwZWF0X2NvdW50Iik7Citjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpSRU1BSU5JTkdfUkVQRUFUX0NPVU5UKCJyZW1haW5pbmdfcmVwZWF0X2NvdW50Iik7Citjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpMSUNFTlNFX1NUQVJUX1RJTUUoImxpY2Vuc2Vfc3RhcnRfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TElDRU5TRV9FWFBJUllfVElNRSgibGljZW5zZV9leHBpcnlfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TElDRU5TRV9BVkFJTEFCTEVfVElNRSgibGljZW5zZV9hdmFpbGFibGVfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6RVhURU5ERURfTUVUQURBVEEoImV4dGVuZGVkX21ldGFkYXRhIik7CisKK2ludCBEcm1Db25zdHJhaW50czo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtQ29uc3RyYWludE1hcC5zaXplKCk7Cit9CisKK3N0YXR1c190IERybUNvbnN0cmFpbnRzOjpwdXQoY29uc3QgU3RyaW5nOCoga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4odmFsdWUpOworICAgIGNoYXIqIGNoYXJWYWx1ZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdOworICAgIGlmIChOVUxMICE9IGNoYXJWYWx1ZSkgeworICAgICAgICBzdHJuY3B5KGNoYXJWYWx1ZSwgdmFsdWUsIGxlbmd0aCk7CisgICAgICAgIGNoYXJWYWx1ZVtsZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgbUNvbnN0cmFpbnRNYXAuYWRkKCprZXksIGNoYXJWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtQ29uc3RyYWludHM6OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTlVMTCAhPSBnZXRWYWx1ZSgma2V5KSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOChnZXRWYWx1ZSgma2V5KSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KCIiKTsKK30KKworY29uc3QgY2hhciogRHJtQ29uc3RyYWludHM6OmdldFZhbHVlKGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3QgeworICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBtQ29uc3RyYWludE1hcC5pbmRleE9mS2V5KCprZXkpKSB7CisgICAgICAgIHJldHVybiBtQ29uc3RyYWludE1hcC52YWx1ZUZvcigqa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIERybUNvbnN0cmFpbnRzOjpnZXRBc0J5dGVBcnJheShjb25zdCBTdHJpbmc4KiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoa2V5KTsKK30KKworYm9vbCBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1Db25zdHJhaW50cy0+bUNvbnN0cmFpbnRNYXAuc2l6ZSgpOworfQorCitjb25zdCBTdHJpbmc4JiBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Om5leHQoKSB7CisgICAgY29uc3QgU3RyaW5nOCYga2V5ID0gbURybUNvbnN0cmFpbnRzLT5tQ29uc3RyYWludE1hcC5rZXlBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiBrZXk7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBEcm1Db25zdHJhaW50czo6a2V5SXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEtleUl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yKGNvbnN0IERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpCisgICAgOiBtRHJtQ29uc3RyYWludHMoa2V5SXRlcmF0b3IubURybUNvbnN0cmFpbnRzKSwKKyAgICAgIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKK30KKworRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yJiBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKSB7CisgICAgbURybUNvbnN0cmFpbnRzID0ga2V5SXRlcmF0b3IubURybUNvbnN0cmFpbnRzOworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yIERybUNvbnN0cmFpbnRzOjppdGVyYXRvcigpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1Db25zdHJhaW50cyhpdGVyYXRvci5tRHJtQ29uc3RyYWludHMpLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKK30KKworRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yJiBEcm1Db25zdHJhaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1Db25zdHJhaW50czo6SXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybUNvbnN0cmFpbnRzID0gaXRlcmF0b3IubURybUNvbnN0cmFpbnRzOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtQ29uc3RyYWludHMtPm1Db25zdHJhaW50TWFwLnNpemUoKTsKK30KKworU3RyaW5nOCBEcm1Db25zdHJhaW50czo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCB2YWx1ZSA9IFN0cmluZzgobURybUNvbnN0cmFpbnRzLT5tQ29uc3RyYWludE1hcC5lZGl0VmFsdWVBdChtSW5kZXgpKTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhIGIvZHJtL2NvbW1vbi9Ecm1Db252ZXJ0ZWRTdGF0dXMuY3BwCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQpjb3B5IHRvIGRybS9jb21tb24vRHJtQ29udmVydGVkU3RhdHVzLmNwcAppbmRleCA4NmRlMzY2Li41ZDAzNWY1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQorKysgYi9kcm0vY29tbW9uL0RybUNvbnZlcnRlZFN0YXR1cy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CisjaW5jbHVkZSA8ZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oPgogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorRHJtQ29udmVydGVkU3RhdHVzOjpEcm1Db252ZXJ0ZWRTdGF0dXMoCisgICAgaW50IF9zdGF0dXNDb2RlLCBjb25zdCBEcm1CdWZmZXIqIF9jb252ZXJ0ZWREYXRhLCBpbnQgX29mZnNldCkgOgorICAgIHN0YXR1c0NvZGUoX3N0YXR1c0NvZGUpLAorICAgIGNvbnZlcnRlZERhdGEoX2NvbnZlcnRlZERhdGEpLAorICAgIG9mZnNldChfb2Zmc2V0KSB7CiAKLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBleGNlcHRpb25zIGluIFNUSyBzZXJ2aWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotY2xhc3MgU3RrRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFN0a0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CiB9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzYwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkRybUVuZ2luZUJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybUVuZ2luZUJhc2U6OkRybUVuZ2luZUJhc2UoKSB7CisKK30KKworRHJtRW5naW5lQmFzZTo6fkRybUVuZ2luZUJhc2UoKSB7CisKK30KKworRHJtQ29uc3RyYWludHMqIERybUVuZ2luZUJhc2U6OmdldENvbnN0cmFpbnRzKAorICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIHJldHVybiBvbkdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitEcm1NZXRhZGF0YSogRHJtRW5naW5lQmFzZTo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGEodW5pcXVlSWQsIHBhdGgpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBvbkluaXRpYWxpemUodW5pcXVlSWQpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRPbkluZm9MaXN0ZW5lcigKKyAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICByZXR1cm4gb25TZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgaW5mb0xpc3RlbmVyKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6dGVybWluYXRlKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBvblRlcm1pbmF0ZSh1bmlxdWVJZCk7Cit9CisKK2Jvb2wgRHJtRW5naW5lQmFzZTo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBvbkNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK0RybUluZm9TdGF0dXMqIERybUVuZ2luZUJhc2U6OnByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIHJldHVybiBvblByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6c2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIHJldHVybiBvblNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworfQorCitEcm1JbmZvKiBEcm1FbmdpbmVCYXNlOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIHJldHVybiBvbkFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7Cit9CisKK1N0cmluZzggRHJtRW5naW5lQmFzZTo6Z2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICByZXR1cm4gb25HZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworaW50IERybUVuZ2luZUJhc2U6OmdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIHJldHVybiBvbkdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKK30KKworaW50IERybUVuZ2luZUJhc2U6OmNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIHJldHVybiBvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjb25zdW1lUmlnaHRzKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgcmV0dXJuIG9uQ29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6c2V0UGxheWJhY2tTdGF0dXMoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiBvblNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworfQorCitib29sIERybUVuZ2luZUJhc2U6OnZhbGlkYXRlQWN0aW9uKAorICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICByZXR1cm4gb25WYWxpZGF0ZUFjdGlvbih1bmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICByZXR1cm4gb25SZW1vdmVSaWdodHModW5pcXVlSWQsIHBhdGgpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CisgICAgcmV0dXJuIG9uUmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIHJldHVybiBvbk9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1FbmdpbmVCYXNlOjpjb252ZXJ0RGF0YSgKKyAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgcmV0dXJuIG9uQ29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1FbmdpbmVCYXNlOjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIHJldHVybiBvbkNsb3NlQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7Cit9CisKK0RybVN1cHBvcnRJbmZvKiBEcm1FbmdpbmVCYXNlOjpnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gb25HZXRTdXBwb3J0SW5mbyh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKSB7CisgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmkpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIHJldHVybiBvbkNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgcmV0dXJuIG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZGVjcnlwdCgKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICByZXR1cm4gb25EZWNyeXB0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICByZXR1cm4gb25GaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKK30KKworc3NpemVfdCBEcm1FbmdpbmVCYXNlOjpwcmVhZCgKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIG9uUHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtSW5mby5jcHAgYi9kcm0vY29tbW9uL0RybUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2FiMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybUluZm8uY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGRybS9Ecm1JbmZvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1JbmZvOjpEcm1JbmZvKGludCBpbmZvVHlwZSwgY29uc3QgRHJtQnVmZmVyJiBkcm1CdWZmZXIsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA6CisgICAgbUluZm9UeXBlKGluZm9UeXBlKSwKKyAgICBtRGF0YShkcm1CdWZmZXIpLAorICAgIG1NaW1lVHlwZShtaW1lVHlwZSkgeworCit9CisKK2ludCBEcm1JbmZvOjpnZXRJbmZvVHlwZSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmZvVHlwZTsKK30KKworU3RyaW5nOCBEcm1JbmZvOjpnZXRNaW1lVHlwZSh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1NaW1lVHlwZTsKK30KKworY29uc3QgRHJtQnVmZmVyJiBEcm1JbmZvOjpnZXREYXRhKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK2ludCBEcm1JbmZvOjpnZXRDb3VudCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1BdHRyaWJ1dGVzLnNpemUoKTsKK30KKworc3RhdHVzX3QgRHJtSW5mbzo6cHV0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpIHsKKyAgICBtQXR0cmlidXRlcy5hZGQoa2V5LCB2YWx1ZSk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworU3RyaW5nOCBEcm1JbmZvOjpnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7CisgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IG1BdHRyaWJ1dGVzLmluZGV4T2ZLZXkoa2V5KSkgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXMudmFsdWVGb3Ioa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgoIiIpOworfQorCitpbnQgRHJtSW5mbzo6aW5kZXhPZktleShjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gbUF0dHJpYnV0ZXMuaW5kZXhPZktleShrZXkpOworfQorCitEcm1JbmZvOjpLZXlJdGVyYXRvciBEcm1JbmZvOjprZXlJdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gS2V5SXRlcmF0b3IodGhpcyk7Cit9CisKK0RybUluZm86Okl0ZXJhdG9yIERybUluZm86Oml0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBJdGVyYXRvcih0aGlzKTsKK30KKworLy8gS2V5SXRlcmF0b3IgaW1wbGVtZW50YXRpb24KK0RybUluZm86OktleUl0ZXJhdG9yOjpLZXlJdGVyYXRvcihjb25zdCBEcm1JbmZvOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpIDoKKyAgICBtRHJtSW5mbyhrZXlJdGVyYXRvci5tRHJtSW5mbyksIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKKworfQorCitib29sIERybUluZm86OktleUl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiAobUluZGV4IDwgbURybUluZm8tPm1BdHRyaWJ1dGVzLnNpemUoKSk7Cit9CisKK2NvbnN0IFN0cmluZzgmIERybUluZm86OktleUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIGNvbnN0IFN0cmluZzgmIGtleSA9IG1Ecm1JbmZvLT5tQXR0cmlidXRlcy5rZXlBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiBrZXk7Cit9CisKK0RybUluZm86OktleUl0ZXJhdG9yJiBEcm1JbmZvOjpLZXlJdGVyYXRvcjo6b3BlcmF0b3I9KGNvbnN0IERybUluZm86OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgeworICAgIG1Ecm1JbmZvID0ga2V5SXRlcmF0b3IubURybUluZm87CisgICAgbUluZGV4ID0ga2V5SXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworLy8gSXRlcmF0b3IgaW1wbGVtZW50YXRpb24KK0RybUluZm86Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBEcm1JbmZvOjpJdGVyYXRvciYgaXRlcmF0b3IpCisgICAgOiBtRHJtSW5mbyhpdGVyYXRvci5tRHJtSW5mbyksIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKKworfQorCitEcm1JbmZvOjpJdGVyYXRvciYgRHJtSW5mbzo6SXRlcmF0b3I6Om9wZXJhdG9yPShjb25zdCBEcm1JbmZvOjpJdGVyYXRvciYgaXRlcmF0b3IpIHsKKyAgICBtRHJtSW5mbyA9IGl0ZXJhdG9yLm1Ecm1JbmZvOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtSW5mbzo6SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1JbmZvLT5tQXR0cmlidXRlcy5zaXplKCk7Cit9CisKK1N0cmluZzgmIERybUluZm86Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbURybUluZm8tPm1BdHRyaWJ1dGVzLmVkaXRWYWx1ZUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUluZm9FdmVudC5jcHAgYi9kcm0vY29tbW9uL0RybUluZm9FdmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxMTVhOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb0V2ZW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1JbmZvRXZlbnQ6OkRybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSkKKyAgICA6IG1VbmlxdWVJZCh1bmlxdWVJZCksCisgICAgICBtSW5mb1R5cGUoaW5mb1R5cGUpLAorICAgICAgbU1lc3NhZ2UobWVzc2FnZSkgeworCit9CisKK2ludCBEcm1JbmZvRXZlbnQ6OmdldFVuaXF1ZUlkKCkgY29uc3QgeworICAgIHJldHVybiBtVW5pcXVlSWQ7Cit9CisKK2ludCBEcm1JbmZvRXZlbnQ6OmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmZvVHlwZTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtSW5mb0V2ZW50OjpnZXRNZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBtTWVzc2FnZTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1JbmZvUmVxdWVzdC5jcHAgYi9kcm0vY29tbW9uL0RybUluZm9SZXF1ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQ2ODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1JbmZvUmVxdWVzdC5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybUluZm9SZXF1ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdCBTdHJpbmc4IERybUluZm9SZXF1ZXN0OjpBQ0NPVU5UX0lEKCJhY2NvdW50X2lkIik7Citjb25zdCBTdHJpbmc4IERybUluZm9SZXF1ZXN0OjpTVUJTQ1JJUFRJT05fSUQoInN1YnNjcmlwdGlvbl9pZCIpOworCitEcm1JbmZvUmVxdWVzdDo6RHJtSW5mb1JlcXVlc3QoaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgOgorICAgIG1JbmZvVHlwZShpbmZvVHlwZSksIG1NaW1lVHlwZShtaW1lVHlwZSkgeworCit9CisKK1N0cmluZzggRHJtSW5mb1JlcXVlc3Q6OmdldE1pbWVUeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pbWVUeXBlOworfQorCitpbnQgRHJtSW5mb1JlcXVlc3Q6OmdldEluZm9UeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZm9UeXBlOworfQorCitpbnQgRHJtSW5mb1JlcXVlc3Q6OmdldENvdW50KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5zaXplKCk7Cit9CisKK3N0YXR1c190IERybUluZm9SZXF1ZXN0OjpwdXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgeworICAgIG1SZXF1ZXN0SW5mb3JtYXRpb25NYXAuYWRkKGtleSwgdmFsdWUpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtSW5mb1JlcXVlc3Q6OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gbVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5pbmRleE9mS2V5KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0SW5mb3JtYXRpb25NYXAudmFsdWVGb3Ioa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgoIiIpOworfQorCitEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3IgRHJtSW5mb1JlcXVlc3Q6OmtleUl0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBLZXlJdGVyYXRvcih0aGlzKTsKK30KKworRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yIERybUluZm9SZXF1ZXN0OjppdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKKy8vIEtleUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uCitEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yKGNvbnN0IERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpCisgICAgOiBtRHJtSW5mb1JlcXVlc3Qoa2V5SXRlcmF0b3IubURybUluZm9SZXF1ZXN0KSwKKyAgICAgIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKKworfQorCitib29sIERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gKG1JbmRleCA8IG1Ecm1JbmZvUmVxdWVzdC0+bVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5zaXplKCkpOworfQorCitjb25zdCBTdHJpbmc4JiBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3I6Om5leHQoKSB7CisgICAgY29uc3QgU3RyaW5nOCYga2V5ID0gbURybUluZm9SZXF1ZXN0LT5tUmVxdWVzdEluZm9ybWF0aW9uTWFwLmtleUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIGtleTsKK30KKworRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yJiBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKSB7CisgICAgbURybUluZm9SZXF1ZXN0ID0ga2V5SXRlcmF0b3IubURybUluZm9SZXF1ZXN0OworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uCitEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IERybUluZm9SZXF1ZXN0OjpJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtRHJtSW5mb1JlcXVlc3QoaXRlcmF0b3IubURybUluZm9SZXF1ZXN0KSwgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworfQorCitEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3ImIERybUluZm9SZXF1ZXN0OjpJdGVyYXRvcjo6b3BlcmF0b3I9KAorICAgIGNvbnN0IERybUluZm9SZXF1ZXN0OjpJdGVyYXRvciYgaXRlcmF0b3IpIHsKKyAgICBtRHJtSW5mb1JlcXVlc3QgPSBpdGVyYXRvci5tRHJtSW5mb1JlcXVlc3Q7CisgICAgbUluZGV4ID0gaXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1JbmZvUmVxdWVzdC0+bVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5zaXplKCk7Cit9CisKK1N0cmluZzgmIERybUluZm9SZXF1ZXN0OjpJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBTdHJpbmc4JiB2YWx1ZSA9IG1Ecm1JbmZvUmVxdWVzdC0+bVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5lZGl0VmFsdWVBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3Rlc3RwbHVnaW4vVGVzdFBsdWdpbi5qYXZhIGIvZHJtL2NvbW1vbi9Ecm1JbmZvU3RhdHVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSB0ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9zcmMvY29tL2FuZHJvaWQvdGVzdHBsdWdpbi9UZXN0UGx1Z2luLmphdmEKcmVuYW1lIHRvIGRybS9jb21tb24vRHJtSW5mb1N0YXR1cy5jcHAKaW5kZXggN2JiNGMzNS4uOGVjNzMxMSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3Rlc3RwbHVnaW4vVGVzdFBsdWdpbi5qYXZhCisrKyBiL2RybS9jb21tb24vRHJtSW5mb1N0YXR1cy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdHBsdWdpbjsKKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgogCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1wdWJsaWMgY2xhc3MgVGVzdFBsdWdpbiBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CitEcm1JbmZvU3RhdHVzOjpEcm1JbmZvU3RhdHVzKAorICAgIGludCBfc3RhdHVzQ29kZSwgaW50IF9pbmZvVHlwZSwgY29uc3QgRHJtQnVmZmVyKiBfZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBfbWltZVR5cGUpIDoKKyAgICBzdGF0dXNDb2RlKF9zdGF0dXNDb2RlKSwKKyAgICBpbmZvVHlwZShfaW5mb1R5cGUpLAorICAgIGRybUJ1ZmZlcihfZHJtQnVmZmVyKSwKKyAgICBtaW1lVHlwZShfbWltZVR5cGUpIHsKIAogfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybU1ldGFkYXRhLmNwcCBiL2RybS9jb21tb24vRHJtTWV0YWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybU1ldGFkYXRhLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBEcm1NZXRhZGF0YTo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworCXJldHVybiBtTWV0YWRhdGFNYXAuc2l6ZSgpOworfQorCitzdGF0dXNfdCBEcm1NZXRhZGF0YTo6cHV0KGNvbnN0IFN0cmluZzgqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBpZigodmFsdWUgIT0gTlVMTCkgJiYgKGtleSAhPSBOVUxMKSkgeworICAgICAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKKyAgICAgICAgY2hhciogY2hhclZhbHVlID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CisKKyAgICAgICAgbWVtY3B5KGNoYXJWYWx1ZSwgdmFsdWUsIGxlbmd0aCk7CisgICAgICAgIGNoYXJWYWx1ZVtsZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgbU1ldGFkYXRhTWFwLmFkZCgqa2V5LCBjaGFyVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtTWV0YWRhdGE6OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTlVMTCAhPSBnZXRWYWx1ZSgma2V5KSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOChnZXRWYWx1ZSgma2V5KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBEcm1NZXRhZGF0YTo6Z2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdCB7CisgICAgaWYoa2V5ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IG1NZXRhZGF0YU1hcC5pbmRleE9mS2V5KCprZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhTWFwLnZhbHVlRm9yKCprZXkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIERybU1ldGFkYXRhOjpnZXRBc0J5dGVBcnJheShjb25zdCBTdHJpbmc4KiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoa2V5KTsKK30KKworYm9vbCBEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLnNpemUoKTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIGNvbnN0IFN0cmluZzgmIGtleSA9IG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLmtleUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIGtleTsKK30KKworRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIERybU1ldGFkYXRhOjprZXlJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gS2V5SXRlcmF0b3IodGhpcyk7Cit9CisKK0RybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6S2V5SXRlcmF0b3IoY29uc3QgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgOgorICAgIG1Ecm1NZXRhZGF0YShrZXlJdGVyYXRvci5tRHJtTWV0YWRhdGEpLAorICAgIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yIik7Cit9CisKK0RybU1ldGFkYXRhOjpLZXlJdGVyYXRvciYgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgeworICAgIExPR1YoIkRybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6b3BlcmF0b3I9Iik7CisgICAgbURybU1ldGFkYXRhID0ga2V5SXRlcmF0b3IubURybU1ldGFkYXRhOworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworRHJtTWV0YWRhdGE6Okl0ZXJhdG9yIERybU1ldGFkYXRhOjppdGVyYXRvcigpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKK0RybU1ldGFkYXRhOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1NZXRhZGF0YShpdGVyYXRvci5tRHJtTWV0YWRhdGEpLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6SXRlcmF0b3I6Okl0ZXJhdG9yIik7Cit9CisKK0RybU1ldGFkYXRhOjpJdGVyYXRvciYgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIExPR1YoIkRybU1ldGFkYXRhOjpJdGVyYXRvcjo6b3BlcmF0b3I9Iik7CisgICAgbURybU1ldGFkYXRhID0gaXRlcmF0b3IubURybU1ldGFkYXRhOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtTWV0YWRhdGEtPm1NZXRhZGF0YU1hcC5zaXplKCk7Cit9CisKK1N0cmluZzggRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzggdmFsdWUgPSBTdHJpbmc4KG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLmVkaXRWYWx1ZUF0KG1JbmRleCkpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtUmlnaHRzLmNwcCBiL2RybS9jb21tb24vRHJtUmlnaHRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjYjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1SaWdodHMuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybVJpZ2h0cy5oPgorI2luY2x1ZGUgPFJlYWRXcml0ZVV0aWxzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1SaWdodHM6OkRybVJpZ2h0cyhjb25zdCBTdHJpbmc4JiByaWdodHNGaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQsIGNvbnN0IFN0cmluZzgmIHN1YnNjcmlwdGlvbklkKSA6CisgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKKyAgICBtQWNjb3VudElkKGFjY291bnRJZCksCisgICAgbVN1YnNjcmlwdGlvbklkKHN1YnNjcmlwdGlvbklkKSwKKyAgICBtUmlnaHRzRnJvbUZpbGUoTlVMTCkgeworICAgIGludCByaWdodHNMZW5ndGggPSAwOworICAgIGlmIChTdHJpbmc4KCIiKSAhPSByaWdodHNGaWxlUGF0aCkgeworICAgICAgICByaWdodHNMZW5ndGggPSBSZWFkV3JpdGVVdGlsczo6cmVhZEJ5dGVzKHJpZ2h0c0ZpbGVQYXRoLCAmbVJpZ2h0c0Zyb21GaWxlKTsKKyAgICB9CisgICAgbURhdGEgPSBEcm1CdWZmZXIobVJpZ2h0c0Zyb21GaWxlLCByaWdodHNMZW5ndGgpOworfQorCitEcm1SaWdodHM6OkRybVJpZ2h0cyhjb25zdCBEcm1CdWZmZXImIHJpZ2h0c0RhdGEsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWNjb3VudElkLCBjb25zdCBTdHJpbmc4JiBzdWJzY3JpcHRpb25JZCkgOgorICAgIG1EYXRhKHJpZ2h0c0RhdGEpLAorICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgbUFjY291bnRJZChhY2NvdW50SWQpLAorICAgIG1TdWJzY3JpcHRpb25JZChzdWJzY3JpcHRpb25JZCksCisgICAgbVJpZ2h0c0Zyb21GaWxlKE5VTEwpIHsKK30KKworRHJtUmlnaHRzOjp+RHJtUmlnaHRzKCkgeworICAgIGRlbGV0ZVtdIG1SaWdodHNGcm9tRmlsZTsgbVJpZ2h0c0Zyb21GaWxlID0gTlVMTDsKK30KKworY29uc3QgRHJtQnVmZmVyJiBEcm1SaWdodHM6OmdldERhdGEodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworU3RyaW5nOCBEcm1SaWdodHM6OmdldE1pbWVUeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pbWVUeXBlOworfQorCitTdHJpbmc4IERybVJpZ2h0czo6Z2V0QWNjb3VudElkKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFjY291bnRJZDsKK30KKworU3RyaW5nOCBEcm1SaWdodHM6OmdldFN1YnNjcmlwdGlvbklkKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN1YnNjcmlwdGlvbklkOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzg5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybVN1cHBvcnRJbmZvOjpEcm1TdXBwb3J0SW5mbygpIHsKKworfQorCitEcm1TdXBwb3J0SW5mbzo6RHJtU3VwcG9ydEluZm8oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKToKKyAgICBtTWltZVR5cGVWZWN0b3IoZHJtU3VwcG9ydEluZm8ubU1pbWVUeXBlVmVjdG9yKSwKKyAgICBtRmlsZVN1ZmZpeFZlY3Rvcihkcm1TdXBwb3J0SW5mby5tRmlsZVN1ZmZpeFZlY3RvciksCisgICAgbURlc2NyaXB0aW9uKGRybVN1cHBvcnRJbmZvLm1EZXNjcmlwdGlvbikgeworCit9CisKK2Jvb2wgRHJtU3VwcG9ydEluZm86Om9wZXJhdG9yPChjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pIGNvbnN0IHsKKyAgICAvLyBEbyB3ZSBuZWVkIHRvIGNoZWNrIG1NaW1lVHlwZVZlY3RvciAmIG1GaWxlU3VmZml4VmVjdG9yID8KKyAgICAvLyBOb3RlIFZlY3RvciBkb2Vzbid0IG92ZXJyaWRlcyAiPCIgb3BlcmF0b3IKKyAgICByZXR1cm4gbURlc2NyaXB0aW9uIDwgZHJtU3VwcG9ydEluZm8ubURlc2NyaXB0aW9uOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpvcGVyYXRvcj09KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbykgY29uc3QgeworICAgIC8vIERvIHdlIG5lZWQgdG8gY2hlY2sgbU1pbWVUeXBlVmVjdG9yICYgbUZpbGVTdWZmaXhWZWN0b3IgPworICAgIC8vIE5vdGUgVmVjdG9yIGRvZXNuJ3Qgb3ZlcnJpZGVzICI9PSIgb3BlcmF0b3IKKyAgICByZXR1cm4gKG1EZXNjcmlwdGlvbiA9PSBkcm1TdXBwb3J0SW5mby5tRGVzY3JpcHRpb24pOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtTWltZVR5cGVWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBpdGVtID0gbU1pbWVUeXBlVmVjdG9yLml0ZW1BdChpKTsKKworICAgICAgICBpZiAoU3RyaW5nOCgiIikgIT0gbWltZVR5cGUgJiYgaXRlbS5maW5kKG1pbWVUeXBlKSAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1GaWxlU3VmZml4VmVjdG9yLml0ZW1BdChpKTsKKworICAgICAgICBpZiAoU3RyaW5nOCgiIikgIT0gZmlsZVR5cGUgJiYgaXRlbS5maW5kKGZpbGVUeXBlKSAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitEcm1TdXBwb3J0SW5mbyYgRHJtU3VwcG9ydEluZm86Om9wZXJhdG9yPShjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pIHsKKyAgICBtTWltZVR5cGVWZWN0b3IgPSBkcm1TdXBwb3J0SW5mby5tTWltZVR5cGVWZWN0b3I7CisgICAgbUZpbGVTdWZmaXhWZWN0b3IgPSBkcm1TdXBwb3J0SW5mby5tRmlsZVN1ZmZpeFZlY3RvcjsKKyAgICBtRGVzY3JpcHRpb24gPSBkcm1TdXBwb3J0SW5mby5tRGVzY3JpcHRpb247CisgICAgcmV0dXJuICp0aGlzOworfQorCitpbnQgRHJtU3VwcG9ydEluZm86OmdldE1pbWVUeXBlQ291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtTWltZVR5cGVWZWN0b3Iuc2l6ZSgpOworfQorCitpbnQgRHJtU3VwcG9ydEluZm86OmdldEZpbGVTdWZmaXhDb3VudCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsKK30KKworc3RhdHVzX3QgRHJtU3VwcG9ydEluZm86OmFkZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgbU1pbWVUeXBlVmVjdG9yLnB1c2gobWltZVR5cGUpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVN1cHBvcnRJbmZvOjphZGRGaWxlU3VmZml4KGNvbnN0IFN0cmluZzgmIGZpbGVTdWZmaXgpIHsKKyAgICBtRmlsZVN1ZmZpeFZlY3Rvci5wdXNoKGZpbGVTdWZmaXgpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVN1cHBvcnRJbmZvOjpzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbikgeworICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtU3VwcG9ydEluZm86OmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRGVzY3JpcHRpb247Cit9CisKK0RybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3IgRHJtU3VwcG9ydEluZm86OmdldEZpbGVTdWZmaXhJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gRmlsZVN1ZmZpeEl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciBEcm1TdXBwb3J0SW5mbzo6Z2V0TWltZVR5cGVJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gTWltZVR5cGVJdGVyYXRvcih0aGlzKTsKK30KKworRHJtU3VwcG9ydEluZm86OkZpbGVTdWZmaXhJdGVyYXRvcjo6RmlsZVN1ZmZpeEl0ZXJhdG9yKAorICAgIGNvbnN0IERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3ImIGl0ZXJhdG9yKSA6CisgICAgbURybVN1cHBvcnRJbmZvKGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbyksCisgICAgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK0RybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3ImIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1TdXBwb3J0SW5mbyA9IGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbzsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1TdXBwb3J0SW5mby0+bUZpbGVTdWZmaXhWZWN0b3Iuc2l6ZSgpOworfQorCitTdHJpbmc4JiBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbURybVN1cHBvcnRJbmZvLT5tRmlsZVN1ZmZpeFZlY3Rvci5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvcjo6TWltZVR5cGVJdGVyYXRvcigKKyAgICBjb25zdCBEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtRHJtU3VwcG9ydEluZm8oaXRlcmF0b3IubURybVN1cHBvcnRJbmZvKSwKKyAgICBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7CisKK30KKworRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3ImIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybVN1cHBvcnRJbmZvID0gaXRlcmF0b3IubURybVN1cHBvcnRJbmZvOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1TdXBwb3J0SW5mby0+bU1pbWVUeXBlVmVjdG9yLnNpemUoKTsKK30KKworU3RyaW5nOCYgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCYgdmFsdWUgPSBtRHJtU3VwcG9ydEluZm8tPm1NaW1lVHlwZVZlY3Rvci5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1JT1NlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtSU9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRjYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9JRHJtSU9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlICJJRHJtSU9TZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit2b2lkIEJwRHJtSU9TZXJ2aWNlOjp3cml0ZVRvRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgZGF0YUJ1ZmZlcikgeworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtSU9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGZpbGVQYXRoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkYXRhQnVmZmVyKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChXUklURV9UT19GSUxFLCBkYXRhLCAmcmVwbHkpOworfQorCitTdHJpbmc4IEJwRHJtSU9TZXJ2aWNlOjpyZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpIHsKKworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtSU9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGZpbGVQYXRoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0ZST01fRklMRSwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZFN0cmluZzgoKTsKK30KKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERybUlPU2VydmljZSwgImRybS5JRHJtSU9TZXJ2aWNlIik7CisKK3N0YXR1c190IEJuRHJtSU9TZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgV1JJVEVfVE9fRklMRToKKyAgICB7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtSU9TZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgd3JpdGVUb0ZpbGUoZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUkVBRF9GUk9NX0ZJTEU6CisgICAgeworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybUlPU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIFN0cmluZzggZGF0YUJ1ZmZlciA9IHJlYWRGcm9tRmlsZShkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYjUwZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE1MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklEcm1NYW5hZ2VyU2VydmljZShOYXRpdmUpIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisKKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NZXRhZGF0YS5oPgorI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKworI2luY2x1ZGUgIklEcm1NYW5hZ2VyU2VydmljZS5oIgorCisjZGVmaW5lIElOVkFMSURfQlVGRkVSX0xFTkdUSCAtMQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoImFkZCB1bmlxdWVpZCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFERF9VTklRVUVJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3ZvaWQgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigicmVtb3ZlIHVuaXF1ZWlkIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VOSVFVRUlELCBkYXRhLCAmcmVwbHkpOworfQorCit2b2lkIEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZENsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChBRERfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworfQorCit2b2lkIEJwRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpIHsKKyAgICBMT0dWKCJzZXREcm1TZXJ2aWNlTGlzdGVuZXIiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkcm1TZXJ2aWNlTGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfRFJNX1NFUlZJQ0VfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgeworICAgIExPR1YoIkluc3RhbGwgRFJNIEVuZ2luZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1FbmdpbmVGaWxlKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTlNUQUxMX0RSTV9FTkdJTkUsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEcm1Db25zdHJhaW50cyogQnBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJHZXQgQ29uc3RyYWludHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKnBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT05TVFJBSU5UU19GUk9NX0NPTlRFTlQsIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEcm0gQ29uc3RyYWludHMKKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybUNvbnN0cmFpbnRzLT5wdXQoJmtleSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnN0cmFpbnRzOworfQorCitEcm1NZXRhZGF0YSogQnBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgTE9HVigiR2V0IE1ldGFkYXRhIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSA9IE5VTEw7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKnBhdGgpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUVUQURBVEFfRlJPTV9DT05URU5ULCBkYXRhLCAmcmVwbHkpOworCisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERybSBNZXRhZGF0YQorICAgICAgICBkcm1NZXRhZGF0YSA9IG5ldyBEcm1NZXRhZGF0YSgpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShyZXBseS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHJtTWV0YWRhdGEtPnB1dCgma2V5LCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHJtTWV0YWRhdGE7Cit9CisKK2Jvb2wgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJDYW4gSGFuZGxlIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZVN0cmluZzgocGF0aCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTl9IQU5ETEUsIGRhdGEsICZyZXBseSk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpOworfQorCitEcm1JbmZvU3RhdHVzKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICBMT0dWKCJQcm9jZXNzIERSTSBJbmZvIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgLy9GaWxsaW5nIERSTSBpbmZvCisgICAgZGF0YS53cml0ZUludDMyKGRybUluZm8tPmdldEluZm9UeXBlKCkpOworICAgIGNvbnN0IERybUJ1ZmZlciBkYXRhQnVmZmVyID0gZHJtSW5mby0+Z2V0RGF0YSgpOworICAgIGNvbnN0IGludCBkYXRhQnVmZmVyU2l6ZSA9IGRhdGFCdWZmZXIubGVuZ3RoOworICAgIGRhdGEud3JpdGVJbnQzMihkYXRhQnVmZmVyU2l6ZSk7CisgICAgaWYgKDAgPCBkYXRhQnVmZmVyU2l6ZSkgeworICAgICAgICBkYXRhLndyaXRlKGRhdGFCdWZmZXIuZGF0YSwgZGF0YUJ1ZmZlclNpemUpOworICAgIH0KKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkcm1JbmZvLT5nZXRDb3VudCgpKTsKKyAgICBEcm1JbmZvOjpLZXlJdGVyYXRvciBrZXlJdCA9IGRybUluZm8tPmtleUl0ZXJhdG9yKCk7CisKKyAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChrZXkpOworICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlID0gZHJtSW5mby0+Z2V0KGtleSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KCh2YWx1ZSA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiB2YWx1ZSk7CisgICAgfQorCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBST0NFU1NfRFJNX0lORk8sIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1JbmZvU3RhdHVzKiBkcm1JbmZvU3RhdHVzID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRFJNIEluZm8gU3RhdHVzCisgICAgICAgIGNvbnN0IGludCBzdGF0dXNDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBpbmZvVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEcm1CdWZmZXIqIGRybUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybUJ1ZmZlciA9IG5ldyBEcm1CdWZmZXIoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZHJtSW5mb1N0YXR1cyA9IG5ldyBEcm1JbmZvU3RhdHVzKHN0YXR1c0NvZGUsIGluZm9UeXBlLCBkcm1CdWZmZXIsIG1pbWVUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7Cit9CisKK0RybUluZm8qIEJwRHJtTWFuYWdlclNlcnZpY2U6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KSB7CisgICAgTE9HVigiQWNxdWlyZSBEUk0gSW5mbyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIC8vRmlsbGluZyBEUk0gSW5mbyBSZXF1ZXN0CisgICAgZGF0YS53cml0ZUludDMyKGRybUluZm9yZXF1ZXN0LT5nZXRJbmZvVHlwZSgpKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1JbmZvcmVxdWVzdC0+Z2V0TWltZVR5cGUoKSk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZHJtSW5mb3JlcXVlc3QtPmdldENvdW50KCkpOworICAgIERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciBrZXlJdCA9IGRybUluZm9yZXF1ZXN0LT5rZXlJdGVyYXRvcigpOworCisgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZSA9IGRybUluZm9yZXF1ZXN0LT5nZXQoa2V5KTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoKHZhbHVlID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHZhbHVlKTsKKyAgICB9CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUNRVUlSRV9EUk1fSU5GTywgZGF0YSwgJnJlcGx5KTsKKworICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEUk0gSW5mbworICAgICAgICBjb25zdCBpbnQgaW5mb1R5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisKKyAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICByZXBseS5yZWFkKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGRybUluZm8gPSBuZXcgRHJtSW5mbyhpbmZvVHlwZSwgRHJtQnVmZmVyKGRhdGEsIGJ1ZmZlclNpemUpLCByZXBseS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlKHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgZHJtSW5mby0+cHV0KGtleSwgKHZhbHVlID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIExPR1YoIlNhdmUgUmlnaHRzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgLy9GaWxsaW5nIERybSBSaWdodHMKKyAgICBjb25zdCBEcm1CdWZmZXIgZGF0YUJ1ZmZlciA9IGRybVJpZ2h0cy5nZXREYXRhKCk7CisgICAgZGF0YS53cml0ZUludDMyKGRhdGFCdWZmZXIubGVuZ3RoKTsKKyAgICBkYXRhLndyaXRlKGRhdGFCdWZmZXIuZGF0YSwgZGF0YUJ1ZmZlci5sZW5ndGgpOworCisgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IGRybVJpZ2h0cy5nZXRNaW1lVHlwZSgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KChtaW1lVHlwZSA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBtaW1lVHlwZSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGFjY291bnRJZCA9IGRybVJpZ2h0cy5nZXRBY2NvdW50SWQoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOCgoYWNjb3VudElkID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IGFjY291bnRJZCk7CisKKyAgICBjb25zdCBTdHJpbmc4IHN1YnNjcmlwdGlvbklkID0gZHJtUmlnaHRzLmdldFN1YnNjcmlwdGlvbklkKCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKHN1YnNjcmlwdGlvbklkID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHN1YnNjcmlwdGlvbklkKTsKKworICAgIGRhdGEud3JpdGVTdHJpbmc4KChyaWdodHNQYXRoID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHJpZ2h0c1BhdGgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KChjb250ZW50UGF0aCA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBjb250ZW50UGF0aCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0FWRV9SSUdIVFMsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitTdHJpbmc4IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HVigiR2V0IE9yaWdpbmFsIE1pbWVUeXBlIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PUklHSU5BTF9NSU1FVFlQRSwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZFN0cmluZzgoKTsKK30KKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldERybU9iamVjdFR5cGUoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiR2V0IERybSBvYmplY3QgdHlwZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RSTV9PQkpFQ1RfVFlQRSwgZGF0YSwgJnJlcGx5KTsKKworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR1YoImNoZWNrUmlnaHRzU3RhdHVzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KENIRUNLX1JJR0hUU19TVEFUVVMsIGRhdGEsICZyZXBseSk7CisKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIExPR1YoImNvbnN1bWVSaWdodHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorCisgICAgZGF0YS53cml0ZUludDMyKGFjdGlvbik7CisgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PCBpbnQ+KHJlc2VydmUpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05TVU1FX1JJR0hUUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIExPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihwbGF5YmFja1N0YXR1cyk7CisgICAgZGF0YS53cml0ZUludDMyKHBvc2l0aW9uKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUExBWUJBQ0tfU1RBVFVTLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworYm9vbCBCcERybU1hbmFnZXJTZXJ2aWNlOjp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIExPR1YoInZhbGlkYXRlQWN0aW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworICAgIGRhdGEud3JpdGVJbnQzMihkZXNjcmlwdGlvbi5vdXRwdXRUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVzY3JpcHRpb24uY29uZmlndXJhdGlvbik7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoVkFMSURBVEVfQUNUSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR1YoInJlbW92ZVJpZ2h0cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfUklHSFRTLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoInJlbW92ZUFsbFJpZ2h0cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQUxMX1JJR0hUUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK2ludCBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIm9wZW5Db252ZXJ0U2Vzc2lvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9DT05WRVJUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIExPR1YoImNvbnZlcnREYXRhIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVJbnQzMihjb252ZXJ0SWQpOworICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dERhdGEtPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShpbnB1dERhdGEtPmRhdGEsIGlucHV0RGF0YS0+bGVuZ3RoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05WRVJUX0RBVEEsIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRFJNIENvbnZlcnRlZCBTdGF0dXMKKyAgICAgICAgY29uc3QgaW50IHN0YXR1c0NvZGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIERybUJ1ZmZlciogY29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnZlcnRlZERhdGEgPSBuZXcgRHJtQnVmZmVyKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9IG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoc3RhdHVzQ29kZSwgY29udmVydGVkRGF0YSwgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIExPR1YoImNsb3NlQ29udmVydFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZUludDMyKGNvbnZlcnRJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfQ09OVkVSVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERSTSBDb252ZXJ0ZWQgU3RhdHVzCisgICAgICAgIGNvbnN0IGludCBzdGF0dXNDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb252ZXJ0ZWREYXRhID0gbmV3IERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBuZXcgRHJtQ29udmVydGVkU3RhdHVzKHN0YXR1c0NvZGUsIGNvbnZlcnRlZERhdGEsIG9mZnNldCk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgTE9HVigiR2V0IEFsbCBTdXBwb3J0IEluZm8iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FMTF9TVVBQT1JUX0lORk8sIGRhdGEsICZyZXBseSk7CisKKyAgICAvL0ZpbGxpbmcgRFJNIFN1cHBvcnQgSW5mbworICAgIGNvbnN0IGludCBhcnJheVNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBpZiAoMCA8IGFycmF5U2l6ZSkgeworICAgICAgICAqZHJtU3VwcG9ydEluZm9BcnJheSA9IG5ldyBEcm1TdXBwb3J0SW5mb1thcnJheVNpemVdOworCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheVNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvIGRybVN1cHBvcnRJbmZvOworCisgICAgICAgICAgICBjb25zdCBpbnQgZmlsZVN1ZmZpeFZlY3RvclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZVN1ZmZpeFZlY3RvclNpemU7ICsraSkgeworICAgICAgICAgICAgICAgIGRybVN1cHBvcnRJbmZvLmFkZEZpbGVTdWZmaXgocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludCBtaW1lVHlwZVZlY3RvclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVR5cGVWZWN0b3JTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBkcm1TdXBwb3J0SW5mby5hZGRNaW1lVHlwZShyZXBseS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJtU3VwcG9ydEluZm8uc2V0RGVzY3JpcHRpb24ocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICAoKmRybVN1cHBvcnRJbmZvQXJyYXkpW2luZGV4XSA9IGRybVN1cHBvcnRJbmZvOworICAgICAgICB9CisgICAgfQorICAgICpsZW5ndGggPSBhcnJheVNpemU7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIExPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOworICAgIGRhdGEud3JpdGVJbnQzMihvZmZzZXQpOworICAgIGRhdGEud3JpdGVJbnQzMihsZW5ndGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPm1pbWVUeXBlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPnN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIm5vIGRlY3J5cHRIYW5kbGUgaXMgZ2VuZXJhdGVkIGluIHNlcnZpY2Ugc2lkZSIpOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitEZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoU3RyaW5nOCh1cmkpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKKworICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5taW1lVHlwZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5zdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJubyBkZWNyeXB0SGFuZGxlIGlzIGdlbmVyYXRlZCBpbiBzZXJ2aWNlIHNpZGUiKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBMT0dWKCJjbG9zZURlY3J5cHRTZXNzaW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBMT0dWKCJkZWxldGluZyBkZWNyeXB0SW5mbyIpOworICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7IGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRVbml0SWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGhlYWRlckluZm8tPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShoZWFkZXJJbmZvLT5kYXRhLCBoZWFkZXJJbmZvLT5sZW5ndGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KElOSVRJQUxJWkVfREVDUllQVF9VTklULCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgTE9HVigiZGVjcnlwdCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdFVuaXRJZCk7CisgICAgZGF0YS53cml0ZUludDMyKCgqZGVjQnVmZmVyKS0+bGVuZ3RoKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihlbmNCdWZmZXItPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShlbmNCdWZmZXItPmRhdGEsIGVuY0J1ZmZlci0+bGVuZ3RoKTsKKworICAgIGlmIChOVUxMICE9IElWKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJVi0+bGVuZ3RoKTsKKyAgICAgICAgZGF0YS53cml0ZShJVi0+ZGF0YSwgSVYtPmxlbmd0aCk7CisgICAgfQorCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFQ1JZUFQsIGRhdGEsICZyZXBseSk7CisKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBMT0dWKCJSZXR1cm4gdmFsdWUgb2YgZGVjcnlwdCgpIGlzICVkIiwgc3RhdHVzKTsKKworICAgIGNvbnN0IGludCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgKCpkZWNCdWZmZXIpLT5sZW5ndGggPSBzaXplOworICAgIHJlcGx5LnJlYWQoKHZvaWQgKikoKmRlY0J1ZmZlciktPmRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0VW5pdElkKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5BTElaRV9ERUNSWVBUX1VOSVQsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzc2l6ZV90IEJwRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBMT0dWKCJyZWFkIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGludCByZXN1bHQ7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorCisgICAgZGF0YS53cml0ZUludDMyKG51bUJ5dGVzKTsKKyAgICBkYXRhLndyaXRlSW50MzIob2Zmc2V0KTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChQUkVBRCwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBpZiAoMCA8IHJlc3VsdCkgeworICAgICAgICByZXBseS5yZWFkKGJ1ZmZlciwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERybU1hbmFnZXJTZXJ2aWNlLCAiZHJtLklEcm1NYW5hZ2VyU2VydmljZSIpOworCitzdGF0dXNfdCBCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IHdpdGggY29kZSAlZCIsIGNvZGUpOworCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBBRERfVU5JUVVFSUQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpBRERfVU5JUVVFSUQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICBpbnQgdW5pcXVlSWQgPSBhZGRVbmlxdWVJZChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIodW5pcXVlSWQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUkVNT1ZFX1VOSVFVRUlEOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX1VOSVFVRUlEIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgcmVtb3ZlVW5pcXVlSWQoZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBBRERfQ0xJRU5UOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6QUREX0NMSUVOVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgIGFkZENsaWVudChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFTU9WRV9DTElFTlQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpSRU1PVkVfQ0xJRU5UIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgcmVtb3ZlQ2xpZW50KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgU0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6U0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiBkcm1TZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgICAgID0gaW50ZXJmYWNlX2Nhc3Q8SURybVNlcnZpY2VMaXN0ZW5lcj4gKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREcm1TZXJ2aWNlTGlzdGVuZXIodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIElOU1RBTExfRFJNX0VOR0lORToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOklOU1RBTExfRFJNX0VOR0lORSIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbERybUVuZ2luZShkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBHRVRfQ09OU1RSQUlOVFNfRlJPTV9DT05URU5UOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX0NPTlNUUkFJTlRTX0ZST01fQ09OVEVOVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBwYXRoID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IGdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCAmcGF0aCwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29uc3RyYWludHMpIHsKKyAgICAgICAgICAgIC8vRmlsbGluZyBEUk0gQ29uc3RyYWludHMgY29udGVudHMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUNvbnN0cmFpbnRzLT5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yIGtleUl0ID0gZHJtQ29uc3RyYWludHMtPmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChrZXkpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gZHJtQ29uc3RyYWludHMtPmdldEFzQnl0ZUFycmF5KCZrZXkpOworICAgICAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gc3RybGVuKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSh2YWx1ZSwgYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1Db25zdHJhaW50czsgZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX01FVEFEQVRBX0ZST01fQ09OVEVOVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9NRVRBREFUQV9GUk9NX0NPTlRFTlQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEcm1NZXRhZGF0YSogZHJtTWV0YWRhdGEgPSBnZXRNZXRhZGF0YSh1bmlxdWVJZCwgJnBhdGgpOworICAgICAgICBpZiAoTlVMTCAhPSBkcm1NZXRhZGF0YSkgeworICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBNZXRhZGF0YSBjb250ZW50cworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtTWV0YWRhdGEtPmdldENvdW50KCkpOworCisgICAgICAgICAgICBEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1NZXRhZGF0YS0+a2V5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGtleSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSBkcm1NZXRhZGF0YS0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSAwOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBzdHJsZW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSh2YWx1ZSwgYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZHJtTWV0YWRhdGE7IGRybU1ldGFkYXRhID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0FOX0hBTkRMRToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNBTl9IQU5ETEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBib29sIHJlc3VsdCA9IGNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBQUk9DRVNTX0RSTV9JTkZPOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UFJPQ0VTU19EUk1fSU5GTyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAvL0ZpbGxpbmcgRFJNIGluZm8KKyAgICAgICAgY29uc3QgaW50IGluZm9UeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjaGFyKiBidWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEcm1CdWZmZXIgZHJtQnVmZmVyKGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgICAgIERybUluZm8qIGRybUluZm8gPSBuZXcgRHJtSW5mbyhpbmZvVHlwZSwgZHJtQnVmZmVyLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBkcm1JbmZvLT5wdXQoa2V5LCAodmFsdWUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgRHJtSW5mb1N0YXR1cyogZHJtSW5mb1N0YXR1cyA9IHByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvU3RhdHVzKSB7CisgICAgICAgICAgICAvL0ZpbGxpbmcgRFJNIEluZm8gU3RhdHVzIGNvbnRlbnRzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1JbmZvU3RhdHVzLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUluZm9TdGF0dXMtPmluZm9UeXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtSW5mb1N0YXR1cy0+bWltZVR5cGUpOworCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGRybUJ1ZmZlciA9IGRybUluZm9TdGF0dXMtPmRybUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRybUJ1ZmZlci0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoZHJtQnVmZmVyLT5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGRybUJ1ZmZlci0+ZGF0YTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZHJtQnVmZmVyOyBkcm1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1JbmZvOyBkcm1JbmZvID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGRybUluZm9TdGF0dXM7IGRybUluZm9TdGF0dXMgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQUNRVUlSRV9EUk1fSU5GTzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkFDUVVJUkVfRFJNX0lORk8iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgLy9GaWxsaW5nIERSTSBpbmZvIFJlcXVlc3QKKyAgICAgICAgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0ID0gbmV3IERybUluZm9SZXF1ZXN0KGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisKKyAgICAgICAgY29uc3QgaW50IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzggdmFsdWUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGRybUluZm9SZXF1ZXN0LT5wdXQoa2V5LCAodmFsdWUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgRHJtSW5mbyogZHJtSW5mbyA9IGFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtSW5mbykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBJbmZvCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIgZHJtQnVmZmVyID0gZHJtSW5mby0+Z2V0RGF0YSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtSW5mby0+Z2V0SW5mb1R5cGUoKSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZHJtQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGRybUJ1ZmZlci5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtSW5mby0+Z2V0TWltZVR5cGUoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1JbmZvLT5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgRHJtSW5mbzo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1JbmZvLT5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlID0gZHJtSW5mby0+Z2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOCgodmFsdWUgPT0gU3RyaW5nOCgiIikpID8gU3RyaW5nOCgiTlVMTCIpIDogdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIFtdIGRybUJ1ZmZlci5kYXRhOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1JbmZvUmVxdWVzdDsgZHJtSW5mb1JlcXVlc3QgPSBOVUxMOworICAgICAgICBkZWxldGUgZHJtSW5mbzsgZHJtSW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBTQVZFX1JJR0hUUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlNBVkVfUklHSFRTIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBEUk0gUmlnaHRzCisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgRHJtQnVmZmVyIGRybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOworCisgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhY2NvdW50SWQoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBzdWJzY3JpcHRpb25JZChkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICBjb25zdCBTdHJpbmc4IHJpZ2h0c1BhdGgoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBjb250ZW50UGF0aChkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIERybVJpZ2h0cyBkcm1SaWdodHMoZHJtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWltZVR5cGUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogbWltZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYWNjb3VudElkID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IGFjY291bnRJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdWJzY3JpcHRpb25JZCA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiBzdWJzY3JpcHRpb25JZCkpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJpZ2h0c1BhdGggPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogcmlnaHRzUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb250ZW50UGF0aCA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiBjb250ZW50UGF0aCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBHRVRfT1JJR0lOQUxfTUlNRVRZUEU6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpHRVRfT1JJR0lOQUxfTUlNRVRZUEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IFN0cmluZzggb3JpZ2luYWxNaW1lVHlwZSA9IGdldE9yaWdpbmFsTWltZVR5cGUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KG9yaWdpbmFsTWltZVR5cGUpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX0RSTV9PQkpFQ1RfVFlQRToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9EUk1fT0JKRUNUX1RZUEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCBkcm1PYmplY3RUeXBlCisgICAgICAgICAgICA9IGdldERybU9iamVjdFR5cGUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybU9iamVjdFR5cGUpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0hFQ0tfUklHSFRTX1NUQVRVUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNIRUNLX1JJR0hUU19TVEFUVVMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCByZXN1bHQKKyAgICAgICAgICAgID0gY2hlY2tSaWdodHNTdGF0dXMoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ09OU1VNRV9SSUdIVFM6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDT05TVU1FX1JJR0hUUyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRBcGlUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLnN0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cworICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgU0VUX1BMQVlCQUNLX1NUQVRVUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlNFVF9QTEFZQkFDS19TVEFUVVMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKKyAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBWQUxJREFURV9BQ1RJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpWQUxJREFURV9BQ1RJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGJvb2wgcmVzdWx0ID0gdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRGVzY3JpcHRpb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBSRU1PVkVfUklHSFRTOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX1JJR0hUUyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlUmlnaHRzKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFTU9WRV9BTExfUklHSFRTOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX0FMTF9SSUdIVFMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZUFsbFJpZ2h0cyhkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgT1BFTl9DT05WRVJUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpPUEVOX0NPTlZFUlRfU0VTU0lPTiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IGNvbnZlcnRJZCA9IG9wZW5Db252ZXJ0U2Vzc2lvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbnZlcnRJZCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBDT05WRVJUX0RBVEE6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDT05WRVJUX0RBVEEiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBjb252ZXJ0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBpbnB1dCBkYXRhCisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgRHJtQnVmZmVyKiBpbnB1dERhdGEgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgRHJtQ29udmVydGVkU3RhdHVzKiAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBjb252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworCisgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERybSBDb252ZXJ0ZWQgU3RzdHVzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db252ZXJ0ZWRTdGF0dXMtPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtQ29udmVydGVkU3RhdHVzLT5vZmZzZXQpOworCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBjb252ZXJ0ZWREYXRhLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShjb252ZXJ0ZWREYXRhLT5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGNvbnZlcnRlZERhdGEtPmRhdGE7CisgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnZlcnRlZERhdGE7IGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBpbnB1dERhdGE7IGlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBkcm1Db252ZXJ0ZWRTdGF0dXM7IGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBDTE9TRV9DT05WRVJUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDTE9TRV9DT05WRVJUX1NFU1NJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIERybUNvbnZlcnRlZFN0YXR1cyogICAgZHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGNsb3NlQ29udmVydFNlc3Npb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29udmVydGVkU3RhdHVzKSB7CisgICAgICAgICAgICAvL0ZpbGxpbmcgRHJtIENvbnZlcnRlZCBTdHN0dXMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUNvbnZlcnRlZFN0YXR1cy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db252ZXJ0ZWRTdGF0dXMtPm9mZnNldCk7CisKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YSkgeworICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogY29udmVydGVkRGF0YSA9IGRybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGNvbnZlcnRlZERhdGEtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGNvbnZlcnRlZERhdGEtPmRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgW10gY29udmVydGVkRGF0YS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBkZWxldGUgY29udmVydGVkRGF0YTsgY29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGRybUNvbnZlcnRlZFN0YXR1czsgZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEdFVF9BTExfU1VQUE9SVF9JTkZPOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX0FMTF9TVVBQT1JUX0lORk8iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBEcm1TdXBwb3J0SW5mbyogZHJtU3VwcG9ydEluZm9BcnJheSA9IE5VTEw7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsICZsZW5ndGgsICZkcm1TdXBwb3J0SW5mb0FycmF5KTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbyBkcm1TdXBwb3J0SW5mbyA9IGRybVN1cHBvcnRJbmZvQXJyYXlbaV07CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybVN1cHBvcnRJbmZvLmdldEZpbGVTdWZmaXhDb3VudCgpKTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3IgZmlsZVN1ZmZpeEl0CisgICAgICAgICAgICAgICAgPSBkcm1TdXBwb3J0SW5mby5nZXRGaWxlU3VmZml4SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChmaWxlU3VmZml4SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChmaWxlU3VmZml4SXQubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtU3VwcG9ydEluZm8uZ2V0TWltZVR5cGVDb3VudCgpKTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yIG1pbWVUeXBlSXQgPSBkcm1TdXBwb3J0SW5mby5nZXRNaW1lVHlwZUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAobWltZVR5cGVJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KG1pbWVUeXBlSXQubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtU3VwcG9ydEluZm8uZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIGRybVN1cHBvcnRJbmZvQXJyYXk7IGRybVN1cHBvcnRJbmZvQXJyYXkgPSBOVUxMOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgT1BFTl9ERUNSWVBUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpPUEVOX0RFQ1JZUFRfU0VTU0lPTiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGZkID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUKKyAgICAgICAgICAgID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZS0+ZGVjcnlwdEluZm87IGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIE9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6T1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkkiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+c3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlLT5kZWNyeXB0SW5mbzsgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0xPU0VfREVDUllQVF9TRVNTSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q0xPU0VfREVDUllQVF9TRVNTSU9OIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+c3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gY2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIElOSVRJQUxJWkVfREVDUllQVF9VTklUOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6SU5JVElBTElaRV9ERUNSWVBUX1VOSVQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBIZWFkZXIgaW5mbworICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIERybUJ1ZmZlciogaGVhZGVySW5mbyA9IE5VTEw7CisgICAgICAgIGhlYWRlckluZm8gPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCisgICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgZGVsZXRlIGhhbmRsZS5kZWNyeXB0SW5mbzsgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGhlYWRlckluZm87IGhlYWRlckluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgREVDUllQVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkRFQ1JZUFQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgZGVjQnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgY29uc3QgaW50IGVuY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBEcm1CdWZmZXIqIGVuY0J1ZmZlcgorICAgICAgICAgICAgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShlbmNCdWZmZXJTaXplKSwgZW5jQnVmZmVyU2l6ZSk7CisKKyAgICAgICAgY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICAgICAgYnVmZmVyID0gbmV3IGNoYXJbZGVjQnVmZmVyU2l6ZV07CisgICAgICAgIERybUJ1ZmZlciogZGVjQnVmZmVyID0gbmV3IERybUJ1ZmZlcihidWZmZXIsIGRlY0J1ZmZlclNpemUpOworCisgICAgICAgIERybUJ1ZmZlciogSVYgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSBkYXRhLmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaXZCdWZmZXJsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgSVYgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShpdkJ1ZmZlcmxlbmd0aCksIGl2QnVmZmVybGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cworICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gZGVjQnVmZmVyLT5sZW5ndGg7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICByZXBseS0+d3JpdGUoZGVjQnVmZmVyLT5kYXRhLCBzaXplKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgSVY7IElWID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEZJTkFMSVpFX0RFQ1JZUFRfVU5JVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkZJTkFMSVpFX0RFQ1JZUFRfVU5JVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRBcGlUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLnN0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBQUkVBRDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFQUQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhcltudW1CeXRlc107CisKKyAgICAgICAgY29uc3Qgb2ZmX3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCAmaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICBpZiAoMCA8IHJlc3VsdCkgeworICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9kcm0vY29tbW9uL0lEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWVhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0lEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0dXNfdCBCcERybVNlcnZpY2VMaXN0ZW5lcjo6bm90aWZ5KGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybVNlcnZpY2VMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQuZ2V0VW5pcXVlSWQoKSk7CisgICAgZGF0YS53cml0ZUludDMyKGV2ZW50LmdldFR5cGUoKSk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRlksIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRHJtU2VydmljZUxpc3RlbmVyLCAiZHJtLklEcm1TZXJ2aWNlTGlzdGVuZXIiKTsKKworc3RhdHVzX3QgQm5Ecm1TZXJ2aWNlTGlzdGVuZXI6Om9uVHJhbnNhY3QoCisgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgTk9USUZZOgorICAgIHsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1TZXJ2aWNlTGlzdGVuZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50IHR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBtZXNzYWdlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG5vdGlmeShEcm1JbmZvRXZlbnQodW5pcXVlSWQsIHR5cGUsIG1lc3NhZ2UpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9SZWFkV3JpdGVVdGlscy5jcHAgYi9kcm0vY29tbW9uL1JlYWRXcml0ZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9SZWFkV3JpdGVVdGlscy5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlYWRXcml0ZVV0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8UmVhZFdyaXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgRkFJTFVSRSAtMQorCitTdHJpbmc4IFJlYWRXcml0ZVV0aWxzOjpyZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJyIik7CisKKyAgICBTdHJpbmc4IHN0cmluZygiIik7CisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisgICAgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgICAgIGlmIChmc3RhdChmZCwgJnNiKSA9PSAwICYmIHNiLnN0X3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gc2Iuc3Rfc2l6ZTsKKyAgICAgICAgICAgIGNoYXIqIGJ5dGVzID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gcmVhZChmZCwgKHZvaWQqKSBieXRlcywgbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoYnl0ZXMsIGxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5nOworfQorCitpbnQgUmVhZFdyaXRlVXRpbHM6OnJlYWRCeXRlcyhjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY2hhcioqIGJ1ZmZlcikgeworICAgIEZJTEUqIGZpbGUgPSBOVUxMOworICAgIGZpbGUgPSBmb3BlbihmaWxlUGF0aC5zdHJpbmcoKSwgInIiKTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKGZpbGUpOworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZzYikgPT0gMCAmJiBzYi5zdF9zaXplID4gMCkgeworICAgICAgICAgICAgbGVuZ3RoID0gc2Iuc3Rfc2l6ZTsKKyAgICAgICAgICAgICpidWZmZXIgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSByZWFkKGZkLCAodm9pZCopICpidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBGQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKwordm9pZCBSZWFkV3JpdGVVdGlsczo6d3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJ3KyIpOworCisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisKKyAgICAgICAgaW50IHNpemUgPSBkYXRhLnNpemUoKTsKKyAgICAgICAgaWYgKEZBSUxVUkUgIT0gZnRydW5jYXRlKGZkLCBzaXplKSkgeworICAgICAgICAgICAgaWYgKHNpemUgIT0gd3JpdGUoZmQsIGRhdGEuc3RyaW5nKCksIHNpemUpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHdyaXRlIHRoZSBkYXRhIHRvOiAlcyIsIGZpbGVQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorfQorCit2b2lkIFJlYWRXcml0ZVV0aWxzOjphcHBlbmRUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJhKyIpOworCisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisKKyAgICAgICAgaW50IHNpemUgPSBkYXRhLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgIT0gd3JpdGUoZmQsIGRhdGEuc3RyaW5nKCksIHNpemUpKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gd3JpdGUgdGhlIGRhdGEgdG86ICVzIiwgZmlsZVBhdGguc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9kcm1pb3NlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybWlvc2VydmVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1NzFjNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1pb3NlcnZlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgbWFpbl9kcm1pb3NlcnZlci5jcHAgXAorICAgIERybUlPU2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmJpbmRlcgorCitpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisgTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKKyBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmRybWZyYW1ld29ya2NvbW1vbgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRTo9IGRybWlvc2VydmVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvZHJtL2RybWlvc2VydmVyL0RybUlPU2VydmljZS5jcHAgYi9kcm0vZHJtaW9zZXJ2ZXIvRHJtSU9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU2ZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybWlvc2VydmVyL0RybUlPU2VydmljZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtSU9TZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgIkRybUlPU2VydmljZS5oIgorI2luY2x1ZGUgIlJlYWRXcml0ZVV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit2b2lkIERybUlPU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CisgICAgTE9HVigiaW5zdGFudGlhdGUiKTsKKyAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybUlPU2VydmljZSIpLCBuZXcgRHJtSU9TZXJ2aWNlKCkpOworfQorCitEcm1JT1NlcnZpY2U6OkRybUlPU2VydmljZSgpIHsKKyAgICBMT0dWKCJjcmVhdGVkIik7Cit9CisKK0RybUlPU2VydmljZTo6fkRybUlPU2VydmljZSgpIHsKKyAgICBMT0dWKCJEZXN0cm95ZWQiKTsKK30KKwordm9pZCBEcm1JT1NlcnZpY2U6OndyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKSB7CisgICAgTE9HVigiRW50ZXJpbmcgd3JpdGVUb0ZpbGUiKTsKKyAgICBSZWFkV3JpdGVVdGlsczo6d3JpdGVUb0ZpbGUoZmlsZVBhdGgsIGRhdGFCdWZmZXIpOworfQorCitTdHJpbmc4IERybUlPU2VydmljZTo6cmVhZEZyb21GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgcmVhZEZyb21GaWxlIik7CisgICAgcmV0dXJuIFJlYWRXcml0ZVV0aWxzOjpyZWFkQnl0ZXMoZmlsZVBhdGgpOworfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtaW9zZXJ2ZXIvbWFpbl9kcm1pb3NlcnZlci5jcHAgYi9kcm0vZHJtaW9zZXJ2ZXIvbWFpbl9kcm1pb3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkMDQ4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtaW9zZXJ2ZXIvbWFpbl9kcm1pb3NlcnZlci5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncnAuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxEcm1JT1NlcnZpY2UuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CisgICAgRHJtSU9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOworfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmMmZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIG1haW5fZHJtc2VydmVyLmNwcCBcCisgICAgRHJtTWFuYWdlci5jcHAgXAorICAgIERybU1hbmFnZXJTZXJ2aWNlLmNwcCBcCisgICAgU3RyaW5nVG9rZW5pemVyLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyCisKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRTo9IGRybXNlcnZlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGYxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1NYW5hZ2VyKE5hdGl2ZSkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm8uaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb0V2ZW50Lmg+CisjaW5jbHVkZSA8ZHJtL0RybVJpZ2h0cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NZXRhZGF0YS5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvU3RhdHVzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8ZHJtL0RybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8ZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oPgorI2luY2x1ZGUgPElEcm1FbmdpbmUuaD4KKworI2luY2x1ZGUgIkRybU1hbmFnZXIuaCIKKyNpbmNsdWRlICJSZWFkV3JpdGVVdGlscy5oIgorCisjZGVmaW5lIERFQ1JZUFRfRklMRV9FUlJPUiAtMQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVmVjdG9yPGludD4gRHJtTWFuYWdlcjo6bVVuaXF1ZUlkVmVjdG9yOworY29uc3QgU3RyaW5nOCBEcm1NYW5hZ2VyOjpFTVBUWV9TVFJJTkcoIiIpOworCitEcm1NYW5hZ2VyOjpEcm1NYW5hZ2VyKCkgOgorICAgIG1EZWNyeXB0U2Vzc2lvbklkKDApLAorICAgIG1Db252ZXJ0SWQoMCkgeworCit9CisKK0RybU1hbmFnZXI6On5Ecm1NYW5hZ2VyKCkgeworCit9CisKK2ludCBEcm1NYW5hZ2VyOjphZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKKyAgICBpZiAoMCA9PSB1bmlxdWVJZCkgeworICAgICAgICBpbnQgdGVtcCA9IDA7CisgICAgICAgIGJvb2wgZm91bmRVbmlxdWVJZCA9IGZhbHNlOworICAgICAgICBzcmFuZCh0aW1lKE5VTEwpKTsKKworICAgICAgICB3aGlsZSAoIWZvdW5kVW5pcXVlSWQpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBzaXplID0gbVVuaXF1ZUlkVmVjdG9yLnNpemUoKTsKKyAgICAgICAgICAgIHRlbXAgPSByYW5kKCkgJSAxMDA7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1VbmlxdWVJZFZlY3Rvci5pdGVtQXQoaW5kZXgpID09IHRlbXApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRVbmlxdWVJZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGZvdW5kVW5pcXVlSWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVuaXF1ZUlkID0gdGVtcDsKKyAgICB9CisgICAgbVVuaXF1ZUlkVmVjdG9yLnB1c2godW5pcXVlSWQpOworICAgIHJldHVybiB1bmlxdWVJZDsKK30KKwordm9pZCBEcm1NYW5hZ2VyOjpyZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1VbmlxdWVJZFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAodW5pcXVlSWQgPT0gbVVuaXF1ZUlkVmVjdG9yLml0ZW1BdChpKSkgeworICAgICAgICAgICAgbVVuaXF1ZUlkVmVjdG9yLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmxvYWRQbHVnSW5zKCkgeworICAgIFN0cmluZzggcGx1Z2luRGlyUGF0aCgiL3N5c3RlbS9saWIvZHJtL3BsdWdpbnMvbmF0aXZlIik7CisgICAgcmV0dXJuIGxvYWRQbHVnSW5zKHBsdWdpbkRpclBhdGgpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiBwbHVnSW5EaXJQYXRoKSB7CisgICAgaWYgKG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIG1QbHVnSW5NYW5hZ2VyLmxvYWRQbHVnSW5zKHBsdWdJbkRpclBhdGgpOworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luUGF0aExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbyogaW5mbyA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoKS5nZXRTdXBwb3J0SW5mbygwKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGluZm8pIHsKKyAgICAgICAgICAgICAgICBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmFkZCgqaW5mbywgcGx1Z0luUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6dW5sb2FkUGx1Z0lucygpIHsKKyAgICBtQ29udmVydFNlc3Npb25NYXAuY2xlYXIoKTsKKyAgICBtRGVjcnlwdFNlc3Npb25NYXAuY2xlYXIoKTsKKyAgICBtUGx1Z0luTWFuYWdlci51bmxvYWRQbHVnSW5zKCk7CisgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5jbGVhcigpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGRybVNlcnZpY2VMaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKE5VTEwgIT0gZHJtU2VydmljZUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXJzLmFkZCh1bmlxdWVJZCwgZHJtU2VydmljZUxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VydmljZUxpc3RlbmVycy5yZW1vdmVJdGVtKHVuaXF1ZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKwordm9pZCBEcm1NYW5hZ2VyOjphZGRDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgaWYgKCFtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmlzRW1wdHkoKSkgeworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpKTsKKyAgICAgICAgICAgIHJEcm1FbmdpbmUuaW5pdGlhbGl6ZSh1bmlxdWVJZCk7CisgICAgICAgICAgICByRHJtRW5naW5lLnNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEcm1NYW5hZ2VyOjpyZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCkpOworICAgICAgICByRHJtRW5naW5lLnRlcm1pbmF0ZSh1bmlxdWVJZCk7CisgICAgfQorfQorCitEcm1Db25zdHJhaW50cyogRHJtTWFuYWdlcjo6Z2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsICpwYXRoKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyOjpnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgKnBhdGgpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmdldE1ldGFkYXRhKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6Omluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBhYnNvbHV0ZVBhdGgpIHsKKyAgICBtUGx1Z0luTWFuYWdlci5sb2FkUGx1Z0luKGFic29sdXRlUGF0aCk7CisKKyAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKGFic29sdXRlUGF0aCk7CisgICAgckRybUVuZ2luZS5pbml0aWFsaXplKHVuaXF1ZUlkKTsKKyAgICByRHJtRW5naW5lLnNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCB0aGlzKTsKKworICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gckRybUVuZ2luZS5nZXRTdXBwb3J0SW5mbygwKTsKKyAgICBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmFkZCgqaW5mbywgYWJzb2x1dGVQYXRoKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2Jvb2wgRHJtTWFuYWdlcjo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQobWltZVR5cGUpOworICAgIGJvb2wgcmVzdWx0ID0gKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgPyB0cnVlIDogZmFsc2U7CisKKyAgICBpZiAoMCA8IHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBjYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUluZm9TdGF0dXMqIERybU1hbmFnZXI6OnByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5wcm9jZXNzRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mbyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitib29sIERybU1hbmFnZXI6OmNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGhMaXN0W2ldKTsKKyAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5jYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpOworCisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUluZm8qIERybU1hbmFnZXI6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKGRybUluZm9SZXF1ZXN0LT5nZXRNaW1lVHlwZSgpKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5hY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQoZHJtUmlnaHRzLmdldE1pbWVUeXBlKCkpOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuc2F2ZVJpZ2h0cyh1bmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZzggRHJtTWFuYWdlcjo6Z2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgcGF0aCk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuZ2V0T3JpZ2luYWxNaW1lVHlwZSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBFTVBUWV9TVFJJTkc7Cit9CisKK2ludCBEcm1NYW5hZ2VyOjpnZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworfQorCitpbnQgRHJtTWFuYWdlcjo6Y2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsIHBhdGgpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y29uc3VtZVJpZ2h0cygKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnNldFBsYXliYWNrU3RhdHVzKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5zZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBEcm1NYW5hZ2VyOjp2YWxpZGF0ZUFjdGlvbigKKyAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS52YWxpZGF0ZUFjdGlvbih1bmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLnJlbW92ZVJpZ2h0cyh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OnJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CisgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBEcm1NYW5hZ2VyOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGludCBjb252ZXJ0SWQgPSAtMTsKKworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChtaW1lVHlwZSk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKworICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJEcm1FbmdpbmUub3BlbkNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBtQ29udmVydElkICsgMSkpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29udmVydExvY2spOworICAgICAgICAgICAgKyttQ29udmVydElkOworICAgICAgICAgICAgY29udmVydElkID0gbUNvbnZlcnRJZDsKKyAgICAgICAgICAgIG1Db252ZXJ0U2Vzc2lvbk1hcC5hZGQoY29udmVydElkLCAmckRybUVuZ2luZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbnZlcnRJZDsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyOjpjb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMgKmRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAobUNvbnZlcnRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoY29udmVydElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtQ29udmVydFNlc3Npb25NYXAudmFsdWVGb3IoY29udmVydElkKTsKKyAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZHJtRW5naW5lLT5jb252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworICAgIH0KKyAgICByZXR1cm4gZHJtQ29udmVydGVkU3RhdHVzOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXI6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgRHJtQ29udmVydGVkU3RhdHVzICpkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKG1Db252ZXJ0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGNvbnZlcnRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbUNvbnZlcnRTZXNzaW9uTWFwLnZhbHVlRm9yKGNvbnZlcnRJZCk7CisgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9IGRybUVuZ2luZS0+Y2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKKyAgICAgICAgbUNvbnZlcnRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oY29udmVydElkKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Z2V0QWxsU3VwcG9ydEluZm8oCisgICAgICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgeworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworICAgIGludCBzaXplID0gcGx1Z0luUGF0aExpc3Quc2l6ZSgpOworICAgIGludCB2YWxpZFBsdWdpbnMgPSAwOworCisgICAgaWYgKDAgPCBzaXplKSB7CisgICAgICAgIFZlY3RvcjxEcm1TdXBwb3J0SW5mbz4gZHJtU3VwcG9ydEluZm9MaXN0OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHBsdWdJblBhdGggPSBwbHVnSW5QYXRoTGlzdFtpXTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvKiBkcm1TdXBwb3J0SW5mbworICAgICAgICAgICAgICAgID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZHJtU3VwcG9ydEluZm8pIHsKKyAgICAgICAgICAgICAgICBkcm1TdXBwb3J0SW5mb0xpc3QuYWRkKCpkcm1TdXBwb3J0SW5mbyk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGRybVN1cHBvcnRJbmZvOyBkcm1TdXBwb3J0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWxpZFBsdWdpbnMgPSBkcm1TdXBwb3J0SW5mb0xpc3Quc2l6ZSgpOworICAgICAgICBpZiAoMCA8IHZhbGlkUGx1Z2lucykgeworICAgICAgICAgICAgKmRybVN1cHBvcnRJbmZvQXJyYXkgPSBuZXcgRHJtU3VwcG9ydEluZm9bdmFsaWRQbHVnaW5zXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRQbHVnaW5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAoKmRybVN1cHBvcnRJbmZvQXJyYXkpW2ldID0gZHJtU3VwcG9ydEluZm9MaXN0W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpsZW5ndGggPSB2YWxpZFBsdWdpbnM7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworCisgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIFN0cmluZzggcGx1Z0luSWQgPSBwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICArK21EZWNyeXB0U2Vzc2lvbklkOworICAgICAgICAgICAgICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5hZGQobURlY3J5cHRTZXNzaW9uSWQsICZyRHJtRW5naW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgeworICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBMT0dFKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCB1cmkpOworCisgICAgICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICsrbURlY3J5cHRTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLmFkZChtRGVjcnlwdFNlc3Npb25JZCwgJnJEcm1FbmdpbmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7CisgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIExPR0UoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAucmVtb3ZlSXRlbShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5pbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+ZGVjcnlwdCgKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIHNzaXplX3QgcmVzdWx0ID0gREVDUllQVF9GSUxFX0VSUk9SOworCisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+cHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZzggRHJtTWFuYWdlcjo6Z2V0U3VwcG9ydGVkUGx1Z0luSWQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CisKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSB7CisgICAgICAgIHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQobWltZVR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBwbHVnSW5JZDsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyOjpnZXRTdXBwb3J0ZWRQbHVnSW5JZChjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggcGx1Z0luSWQoIiIpOworCisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBtaW1lVHlwZSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbyA9IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAua2V5QXQoaW5kZXgpOworCisgICAgICAgICAgICBpZiAoZHJtU3VwcG9ydEluZm8uaXNTdXBwb3J0ZWRNaW1lVHlwZShtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBwbHVnSW5JZCA9IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAudmFsdWVGb3IoZHJtU3VwcG9ydEluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwbHVnSW5JZDsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyOjpnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIFN0cmluZzggcGx1Z0luSWQoIiIpOworICAgIGNvbnN0IFN0cmluZzggZmlsZVN1ZmZpeCA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbyA9IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAua2V5QXQoaW5kZXgpOworCisgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZEZpbGVTdWZmaXgoZmlsZVN1ZmZpeCkpIHsKKyAgICAgICAgICAgIFN0cmluZzgga2V5ID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC52YWx1ZUZvcihkcm1TdXBwb3J0SW5mbyk7CisgICAgICAgICAgICBJRHJtRW5naW5lJiBkcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4oa2V5KTsKKworICAgICAgICAgICAgaWYgKGRybUVuZ2luZS5jYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcGx1Z0luSWQgPSBrZXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBsdWdJbklkOworfQorCit2b2lkIERybU1hbmFnZXI6Om9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVNlcnZpY2VMaXN0ZW5lcnMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGludCB1bmlxdWVJZCA9IG1TZXJ2aWNlTGlzdGVuZXJzLmtleUF0KGluZGV4KTsKKworICAgICAgICBpZiAodW5pcXVlSWQgPT0gZXZlbnQuZ2V0VW5pcXVlSWQoKSkgeworICAgICAgICAgICAgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4gc2VydmljZUxpc3RlbmVyID0gbVNlcnZpY2VMaXN0ZW5lcnMudmFsdWVGb3IodW5pcXVlSWQpOworICAgICAgICAgICAgc2VydmljZUxpc3RlbmVyLT5ub3RpZnkoZXZlbnQpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkY2ZhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtTWFuYWdlclNlcnZpY2UoTmF0aXZlKSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiRHJtTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJEcm1NYW5hZ2VyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgVmVjdG9yPHVpZF90PiB0cnVzdGVkVWlkczsKKworc3RhdGljIGJvb2wgaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZCgpIHsKKyAgICAvLyBUT0RPCisgICAgLy8gRm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgZm9yIHJlZmVyZW5jZS4KKyAgICAvLyBFYWNoIE9FTSBtYW51ZmFjdHVyZXIgc2hvdWxkIGltcGxlbWVudC9yZXBsYWNlIHdpdGggdGhlaXIgb3duIHNvbHV0aW9ucy4KKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CisgICAgTE9HVigiaW5zdGFudGlhdGUiKTsKKyAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSwgbmV3IERybU1hbmFnZXJTZXJ2aWNlKCkpOworCisgICAgaWYgKDAgPj0gdHJ1c3RlZFVpZHMuc2l6ZSgpKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgLy8gRm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgZm9yIHJlZmVyZW5jZS4KKyAgICAgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisKKyAgICAgICAgLy8gQWRkIHRydXN0ZWQgdWlkcyBoZXJlCisgICAgICAgIHRydXN0ZWRVaWRzLnB1c2goQUlEX01FRElBKTsKKyAgICB9Cit9CisKK0RybU1hbmFnZXJTZXJ2aWNlOjpEcm1NYW5hZ2VyU2VydmljZSgpIDoKKyAgICAgICAgbURybU1hbmFnZXIoTlVMTCkgeworICAgIExPR1YoImNyZWF0ZWQiKTsKKyAgICBtRHJtTWFuYWdlciA9IG5ldyBEcm1NYW5hZ2VyKCk7CisgICAgbURybU1hbmFnZXItPmxvYWRQbHVnSW5zKCk7Cit9CisKK0RybU1hbmFnZXJTZXJ2aWNlOjp+RHJtTWFuYWdlclNlcnZpY2UoKSB7CisgICAgTE9HVigiRGVzdHJveWVkIik7CisgICAgbURybU1hbmFnZXItPnVubG9hZFBsdWdJbnMoKTsKKyAgICBkZWxldGUgbURybU1hbmFnZXI7IG1Ecm1NYW5hZ2VyID0gTlVMTDsKK30KKworaW50IERybU1hbmFnZXJTZXJ2aWNlOjphZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmFkZFVuaXF1ZUlkKHVuaXF1ZUlkKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgbURybU1hbmFnZXItPnJlbW92ZVVuaXF1ZUlkKHVuaXF1ZUlkKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6YWRkQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIG1Ecm1NYW5hZ2VyLT5hZGRDbGllbnQodW5pcXVlSWQpOworfQorCit2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgbURybU1hbmFnZXItPnJlbW92ZUNsaWVudCh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBzZXREcm1TZXJ2aWNlTGlzdGVuZXIiKTsKKyAgICBtRHJtTWFuYWdlci0+c2V0RHJtU2VydmljZUxpc3RlbmVyKHVuaXF1ZUlkLCBkcm1TZXJ2aWNlTGlzdGVuZXIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgeworICAgIExPR1YoIkVudGVyaW5nIGluc3RhbGxEcm1FbmdpbmUiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmluc3RhbGxEcm1FbmdpbmUodW5pcXVlSWQsIGRybUVuZ2luZUZpbGUpOworfQorCitEcm1Db25zdHJhaW50cyogRHJtTWFuYWdlclNlcnZpY2U6OmdldENvbnN0cmFpbnRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZ2V0Q29uc3RyYWludHMgZnJvbSBjb250ZW50Iik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKK30KKworRHJtTWV0YWRhdGEqIERybU1hbmFnZXJTZXJ2aWNlOjpnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBnZXRNZXRhZGF0YSBmcm9tIGNvbnRlbnQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmdldE1ldGFkYXRhKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjYW5IYW5kbGUiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyU2VydmljZTo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgTE9HVigiRW50ZXJpbmcgcHJvY2Vzc0RybUluZm8iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKK30KKworRHJtSW5mbyogRHJtTWFuYWdlclNlcnZpY2U6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgTE9HVigiRW50ZXJpbmcgYWNxdWlyZURybUluZm8iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzYXZlUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgc2F2ZVJpZ2h0cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+c2F2ZVJpZ2h0cyh1bmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7Cit9CisKK1N0cmluZzggRHJtTWFuYWdlclNlcnZpY2U6OmdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZ2V0T3JpZ2luYWxNaW1lVHlwZSIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0T3JpZ2luYWxNaW1lVHlwZSh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK2ludCBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIkVudGVyaW5nIGdldERybU9iamVjdFR5cGUiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKK30KKworaW50IERybU1hbmFnZXJTZXJ2aWNlOjpjaGVja1JpZ2h0c1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR1YoIkVudGVyaW5nIGNoZWNrUmlnaHRzU3RhdHVzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIExPR1YoIkVudGVyaW5nIGNvbnN1bWVSaWdodHMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICBMT0dWKCJFbnRlcmluZyBzZXRQbGF5YmFja1N0YXR1cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+c2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7Cit9CisKK2Jvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnZhbGlkYXRlQWN0aW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgTE9HVigiRW50ZXJpbmcgdmFsaWRhdGVBY3Rpb24iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnZhbGlkYXRlQWN0aW9uKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24sIGRlc2NyaXB0aW9uKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyByZW1vdmVSaWdodHMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnJlbW92ZVJpZ2h0cyh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigiRW50ZXJpbmcgcmVtb3ZlQWxsUmlnaHRzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOworfQorCitpbnQgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgb3BlbkNvbnZlcnRTZXNzaW9uIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5vcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1pbWVUeXBlKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyU2VydmljZTo6Y29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY29udmVydERhdGEiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNvbnZlcnREYXRhKHVuaXF1ZUlkLCBjb252ZXJ0SWQsIGlucHV0RGF0YSk7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY2xvc2VDb252ZXJ0U2Vzc2lvbiIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgTE9HVigiRW50ZXJpbmcgZ2V0QWxsU3VwcG9ydEluZm8iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmdldEFsbFN1cHBvcnRJbmZvKHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CisgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gbURybU1hbmFnZXItPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CisgICAgTE9HVigiRW50ZXJpbmcgRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiB3aXRoIHVyaSIpOworICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIExPR1YoIkVudGVyaW5nIGNsb3NlRGVjcnlwdFNlc3Npb24iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBMT0dWKCJFbnRlcmluZyBpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCxkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIExPR1YoIkVudGVyaW5nIGRlY3J5cHQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmRlY3J5cHQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIExPR1YoIkVudGVyaW5nIGZpbmFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworfQorCitzc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIExPR1YoIkVudGVyaW5nIHByZWFkIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9TdHJpbmdUb2tlbml6ZXIuY3BwIGIvZHJtL2RybXNlcnZlci9TdHJpbmdUb2tlbml6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzBhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtc2VydmVyL1N0cmluZ1Rva2VuaXplci5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTdHJpbmdUb2tlbml6ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK1N0cmluZ1Rva2VuaXplcjo6U3RyaW5nVG9rZW5pemVyKGNvbnN0IFN0cmluZzgmIHN0cmluZywgY29uc3QgU3RyaW5nOCYgZGVsaW1pdGVyKSB7CisgICAgc3BsaXRTdHJpbmcoc3RyaW5nLCBkZWxpbWl0ZXIpOworfQorCit2b2lkIFN0cmluZ1Rva2VuaXplcjo6c3BsaXRTdHJpbmcoY29uc3QgU3RyaW5nOCYgc3RyaW5nLCBjb25zdCBTdHJpbmc4JiBkZWxpbWl0ZXIpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBwb3NpdGlvbiA9IHN0cmluZy5maW5kKGRlbGltaXRlci5zdHJpbmcoKSwgaSk7CisgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgIT0gcG9zaXRpb24pIHsKKyAgICAgICAgICAgIFN0cmluZzggdG9rZW4oc3RyaW5nLnN0cmluZygpK2ksIHBvc2l0aW9uLWkpOworICAgICAgICAgICAgaWYgKHRva2VuLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgbVN0cmluZ1Rva2VuaXplclZlY3Rvci5wdXNoKHRva2VuKTsKKyAgICAgICAgICAgICAgICBpID0gcG9zaXRpb24gKyBkZWxpbWl0ZXIubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0cmluZ1Rva2VuaXplclZlY3Rvci5wdXNoKFN0cmluZzgoc3RyaW5nLnN0cmluZygpK2ksIHN0cmluZy5sZW5ndGgoKS1pKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvciBTdHJpbmdUb2tlbml6ZXI6Oml0ZXJhdG9yKCkgeworICAgIHJldHVybiBJdGVyYXRvcih0aGlzKTsKK30KKworU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtU3RyaW5nVG9rZW5pemVyKGl0ZXJhdG9yLm1TdHJpbmdUb2tlbml6ZXIpLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKK30KKworU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvciYgU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvcjo6b3BlcmF0b3I9KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvciYgaXRlcmF0b3IpIHsKKyAgICBtU3RyaW5nVG9rZW5pemVyID0gaXRlcmF0b3IubVN0cmluZ1Rva2VuaXplcjsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFN0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1TdHJpbmdUb2tlbml6ZXItPm1TdHJpbmdUb2tlbml6ZXJWZWN0b3Iuc2l6ZSgpOworfQorCitTdHJpbmc4JiBTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbVN0cmluZ1Rva2VuaXplci0+bVN0cmluZ1Rva2VuaXplclZlY3Rvci5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL21haW5fZHJtc2VydmVyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvbWFpbl9kcm1zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTA2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vZHJtc2VydmVyL21haW5fZHJtc2VydmVyLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworI2luY2x1ZGUgPERybU1hbmFnZXJTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOworICAgIERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOworfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDA1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgc3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkCisgKiBkYXRhL2NoZWNrc3VtIGRhdGEgYW5kIHRoZSBvZmZzZXQuIE9mZnNldCBpcyBnb2luZyB0byBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGNsb3NlCisgKiBzZXNzaW9uIHdoZXJlIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB3aGVyZSB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBzaG91bGQgYmUgYWRkZWQKKyAqCisgKiBBcyBhIHJlc3VsdCBvZiB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNjb252ZXJ0RGF0YShpbnQsIGJ5dGUgW10pfSBhbmQKKyAqIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I2Nsb3NlQ29udmVydFNlc3Npb24oaW50KX0gYW4gaW5zdGFuY2Ugb2YgRHJtQ29udmVydGVkU3RhdHVzCisgKiB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXMgeworICAgIC8vIFNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtQ29udmVydGVkU3RhdHVzLmNwcAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PSyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOUFVUREFUQV9FUlJPUiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VSUk9SID0gMzsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgc3RhdHVzQ29kZTsKKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRlZERhdGE7CisgICAgcHVibGljIGZpbmFsIGludCBvZmZzZXQ7CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtQ29udmVydGVkU3RhdHVzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBfc3RhdHVzQ29kZSBTdGF0dXMgb2YgdGhlIGNvbnZlcnNpb24KKyAgICAgKiBAcGFyYW0gX2NvbnZlcnRlZERhdGEgQ29udmVydGVkIGRhdGEvY2hlY2tzdW0gZGF0YQorICAgICAqIEBwYXJhbSBfb2Zmc2V0IE9mZnNldCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBEcm1Db252ZXJ0ZWRTdGF0dXMoaW50IF9zdGF0dXNDb2RlLCBieXRlW10gX2NvbnZlcnRlZERhdGEsIGludCBfb2Zmc2V0KSB7CisgICAgICAgIHN0YXR1c0NvZGUgPSBfc3RhdHVzQ29kZTsKKyAgICAgICAgY29udmVydGVkRGF0YSA9IF9jb252ZXJ0ZWREYXRhOworICAgICAgICBvZmZzZXQgPSBfb2Zmc2V0OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtRXJyb3JFdmVudC5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtRXJyb3JFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZmQ4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1FcnJvckV2ZW50LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd291bGQgYmUgcGFzc2VkIHRvIGNhbGxlciBpbgorICoge0BsaW5rIERybU1hbmFnZXJDbGllbnQuT25FcnJvckxpc3RlbmVyI29uRXJyb3IoRHJtTWFuYWdlckNsaWVudCwgRHJtRXJyb3JFdmVudCl9CisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtRXJyb3JFdmVudCBleHRlbmRzIERybUV2ZW50IHsKKyAgICAvKioKKyAgICAgKiBUWVBFX1JJR0hUU19OT1RfSU5TVEFMTEVELCB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nIGluc3RhbGxpbmcgdGhlIHJpZ2h0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19OT1RfSU5TVEFMTEVEID0gMjAwMTsKKyAgICAvKioKKyAgICAgKiBUWVBFX1JJR0hUU19SRU5FV0FMX05PVF9BTExPV0VELCB3aGVuIHRoZSBzZXJ2ZXIgcmVqZWN0cyByZW5ld2FsIG9mIHJpZ2h0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19SRU5FV0FMX05PVF9BTExPV0VEID0gMjAwMjsKKyAgICAvKioKKyAgICAgKiBUWVBFX05PVF9TVVBQT1JURUQsIHdoZW4gYW5zd2VyIGZyb20gc2VydmVyIGNhbiBub3QgYmUgaGFuZGxlZCBieSB0aGUgbmF0aXZlIGFnZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTk9UX1NVUFBPUlRFRCA9IDIwMDM7CisgICAgLyoqCisgICAgICogVFlQRV9PVVRfT0ZfTUVNT1JZLCB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZHVyaW5nIHJlbmV3YWwuCisgICAgICogQ2FuIGluIHRoZSBmdXR1cmUgcGVyaGFwcyBiZSB1c2VkIHRvIHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PVVRfT0ZfTUVNT1JZID0gMjAwNDsKKyAgICAvKioKKyAgICAgKiBUWVBFX05PX0lOVEVSTkVUX0NPTk5FQ1RJT04sIHdoZW4gdGhlIEludGVybmV0IGNvbm5lY3Rpb24gaXMgbWlzc2luZyBhbmQgbm8gYXR0ZW1wdAorICAgICAqIGNhbiBiZSBtYWRlIHRvIHJlbmV3IHJpZ2h0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PX0lOVEVSTkVUX0NPTk5FQ1RJT04gPSAyMDA1OworICAgIC8qKgorICAgICAqIFRZUEVfUFJPQ0VTU19EUk1fSU5GT19GQUlMRUQsIHdoZW4gZmFpbGVkIHRvIHByb2Nlc3MgRHJtSW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BST0NFU1NfRFJNX0lORk9fRkFJTEVEID0gMjAwNjsKKyAgICAvKioKKyAgICAgKiBUWVBFX1JFTU9WRV9BTExfUklHSFRTX0ZBSUxFRCwgd2hlbiBmYWlsZWQgdG8gcmVtb3ZlIGFsbCB0aGUgcmlnaHRzIG9iamVjdHMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYWxsIERSTSBzY2hlbWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVNT1ZFX0FMTF9SSUdIVFNfRkFJTEVEID0gMjAwNzsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1FcnJvckV2ZW50IG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtRXJyb3JFdmVudChpbnQgdW5pcXVlSWQsIGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcih1bmlxdWVJZCwgdHlwZSwgbWVzc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1FdmVudC5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2JjNWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUV2ZW50LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyB3aGljaCB3b3VsZCBiZSB1c2VkIHRvIG5vdGlmeSB0aGUgY2FsbGVyCisgKiBhYm91dCBhbnkgZXZlbnQgb2NjdXJyZWQgaW4gRFJNIGZyYW1ld29yay4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1FdmVudCB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoCisgICAgICogYWxsIERSTSBzY2hlbWVzIGFyZSByZW1vdmVkIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUxMX1JJR0hUU19SRU1PVkVEID0gMTAwMTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCBnaXZlbiBpbmZvcm1hdGlvbiBpcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9EUk1fSU5GT19QUk9DRVNTRUQgPSAxMDAyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJNX0lORk9fU1RBVFVTX09CSkVDVCA9ICJkcm1faW5mb19zdGF0dXNfb2JqZWN0IjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1VbmlxdWVJZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtVHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyBtTWVzc2FnZSA9ICIiOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgZm9yIERybUV2ZW50IGNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIERybUV2ZW50KGludCB1bmlxdWVJZCwgaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOworICAgICAgICBtVHlwZSA9IHR5cGU7CisKKyAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgeworICAgICAgICAgICAgbU1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVW5pcXVlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBVbmlxdWUgSWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFR5cGUgb2YgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBtZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbU1lc3NhZ2U7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzZmJmMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm8uamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyBpbiB3aGljaCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gdHJhbnNhY3QKKyAqIGJldHdlZW4gZGV2aWNlIGFuZCBvbmxpbmUgRFJNIHNlcnZlciBpcyBkZXNjcmliZWQuIERSTSBGcmFtZXdvcmsgYWNoaWV2ZXMKKyAqIHNlcnZlciByZWdpc3RyYXRpb24sIGxpY2Vuc2UgYWNxdWlzaXRpb24gYW5kIGFueSBvdGhlciBzZXJ2ZXIgcmVsYXRlZCB0cmFuc2FjdGlvbgorICogYnkgcGFzc2luZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfS4KKyAqCisgKiBDYWxsZXIgY2FuIHJldHJpZXZlIHRoZSB7QGxpbmsgRHJtSW5mb30gaW5zdGFuY2UgYnkgdXNpbmcKKyAqIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I2FjcXVpcmVEcm1JbmZvKERybUluZm9SZXF1ZXN0KX0KKyAqIGJ5IHBhc3Npbmcge0BsaW5rIERybUluZm9SZXF1ZXN0fSBpbnN0YW5jZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1JbmZvIHsKKyAgICBwcml2YXRlIGJ5dGVbXSBtRGF0YTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTWltZVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUluZm9UeXBlOworICAgIC8vIEl0IHdvdWxkIGJlIHVzZWQgdG8gYWRkIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8KKyAgICAvLyBEUk0gc2NoZW1lIHN1Y2ggYXMgYWNjb3VudCBpZCwgcGF0aCBvciBtdWx0aXBsZSBwYXRoJ3MKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtSW5mbyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBkYXRhIFRyaWdnZXIgZGF0YQorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtSW5mbyhpbnQgaW5mb1R5cGUsIGJ5dGVbXSBkYXRhLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgbUluZm9UeXBlID0gaW5mb1R5cGU7CisgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybUluZm8gb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHBhcmFtIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gcGF0aCBUcmlnZ2VyIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybUluZm8oaW50IGluZm9UeXBlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIG1JbmZvVHlwZSA9IGluZm9UeXBlOworICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhID0gRHJtVXRpbHMucmVhZEJ5dGVzKHBhdGgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBBcyB0aGUgZ2l2ZW4gcGF0aCBpcyBpbnZhbGlkLAorICAgICAgICAgICAgLy8gc2V0IG1EYXRhID0gbnVsbCwgc28gdGhhdCBmdXJ0aGVyIHByb2Nlc3NEcm1JbmZvKCkKKyAgICAgICAgICAgIC8vIGNhbGwgd291bGQgZmFpbCB3aXRoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBiZWNhdXNlIG9mIG1EYXRhID0gbnVsbAorICAgICAgICAgICAgbURhdGEgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhcyA8a2V5LCB2YWx1ZT4gcGFpciB0byB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkgdG8gYWRkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqICAgICBUbyBwdXQgY3VzdG9tIG9iamVjdCBpbnRvIERybUluZm8sIGN1c3RvbSBvYmplY3QgaGFzIHRvCisgICAgICogICAgIG92ZXJyaWRlIHRvU3RyaW5nKCkgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtQXR0cmlidXRlcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXksIGlmIG5vdCBmb3VuZCByZXR1cm5zIG51bGwKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBtQXR0cmlidXRlcy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4ga2V5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBtQXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmlnZ2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRyaWdnZXIgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbWV0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJbmZvcm1hdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmZvVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbmZvVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyB2YWxpZCBvciBub3QKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgdHJ1ZSBpZiB2YWxpZAorICAgICAqICAgICBmYWxzZSBpZiBpbnZhbGlkCisgICAgICovCisgICAgIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIChudWxsICE9IG1NaW1lVHlwZSAmJiAhbU1pbWVUeXBlLmVxdWFscygiIikKKyAgICAgICAgICAgICAgICAmJiBudWxsICE9IG1EYXRhICYmIG1EYXRhLmxlbmd0aCA+IDAgJiYgRHJtSW5mb1JlcXVlc3QuaXNWYWxpZFR5cGUobUluZm9UeXBlKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvRXZlbnQuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzhlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvRXZlbnQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3b3VsZCBiZSBwYXNzZWQgdG8gY2FsbGVyIGluCisgKiB7QGxpbmsgRHJtTWFuYWdlckNsaWVudC5PbkluZm9MaXN0ZW5lciNvbkluZm8oRHJtTWFuYWdlckNsaWVudCwgRHJtSW5mb0V2ZW50KX0KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1JbmZvRXZlbnQgZXh0ZW5kcyBEcm1FdmVudCB7CisgICAgLyoqCisgICAgICogVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5ULCB3aGVuIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbiBhbHJlYWR5IGRvbmUKKyAgICAgKiBieSBhbm90aGVyIGFjY291bnQgSUQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5UID0gMTsKKyAgICAvKioKKyAgICAgKiBUWVBFX1JFTU9WRV9SSUdIVFMsIHdoZW4gdGhlIHJpZ2h0cyBuZWVkcyB0byBiZSByZW1vdmVkIGNvbXBsZXRlbHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SRU1PVkVfUklHSFRTID0gMjsKKyAgICAvKioKKyAgICAgKiBUWVBFX1JJR0hUU19JTlNUQUxMRUQsIHdoZW4gdGhlIHJpZ2h0cyBhcmUgZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkIG9rLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUklHSFRTX0lOU1RBTExFRCA9IDM7CisgICAgLyoqCisgICAgICogVFlQRV9XQUlUX0ZPUl9SSUdIVFMsIHJpZ2h0cyBvYmplY3QgaXMgb24gaXQncyB3YXkgdG8gcGhvbmUsCisgICAgICogd2FpdCBiZWZvcmUgY2FsbGluZyBjaGVja1JpZ2h0cyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dBSVRfRk9SX1JJR0hUUyA9IDQ7CisgICAgLyoqCisgICAgICogVFlQRV9BQ0NPVU5UX0FMUkVBRFlfUkVHSVNURVJFRCwgd2hlbiByZWdpc3RyYXRpb24gaGFzIGJlZW4KKyAgICAgKiBhbHJlYWR5IGRvbmUgZm9yIHRoZSBnaXZlbiBhY2NvdW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUNDT1VOVF9BTFJFQURZX1JFR0lTVEVSRUQgPSA1OworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybUluZm9FdmVudCBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIERybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcih1bmlxdWVJZCwgdHlwZSwgbWVzc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvUmVxdWVzdC5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1JlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWE3OTljCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1JlcXVlc3QuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3MgdXNlZCB0byBwYXNzIHJlcXVpcmVkIHBhcmFtZXRlcnMgdG8gZ2V0CisgKiB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGNvbW11bmljYXRlIHdpdGggb25saW5lIERSTSBzZXJ2ZXIKKyAqCisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHBhc3NlZCB0byB7QGxpbmsgRHJtTWFuYWdlckNsaWVudCNhY3F1aXJlRHJtSW5mbyhEcm1JbmZvUmVxdWVzdCl9CisgKiB0byBnZXQgdGhlIGluc3RhbmNlIG9mIHtAbGluayBEcm1JbmZvfQorICoKKyAqLworcHVibGljIGNsYXNzIERybUluZm9SZXF1ZXN0IHsKKyAgICAvLyBDaGFuZ2VzIGluIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvUmVxdWVzdC5jcHAKKyAgICAvKioKKyAgICAgKiBDb25zdGFudHMgZGVmaW5lcyB0aGUgdHlwZSBvZiB7QGxpbmsgRHJtSW5mb1JlcXVlc3R9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SRUdJU1RSQVRJT05fSU5GTyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTlJFR0lTVFJBVElPTl9JTkZPID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9QUk9HUkVTU19JTkZPID0gNDsKKworICAgIC8qKgorICAgICAqIEtleSB0byBwYXNzIHRoZSB1bmlxdWUgaWQgZm9yIHRoZSBhY2NvdW50IG9yIHRoZSB1c2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9JRCA9ICJhY2NvdW50X2lkIjsKKworICAgIC8qKgorICAgICAqIEtleSB0byBwYXNzIHRoZSB1bmlxdWUgaWQgdXNlZCBmb3Igc3Vic2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU0NSSVBUSU9OX0lEID0gInN1YnNjcmlwdGlvbl9pZCI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtSW5mb1R5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1pbWVUeXBlOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbVJlcXVlc3RJbmZvcm1hdGlvbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybUluZm9SZXF1ZXN0IG9iamVjdCB3aXRoIHR5cGUgYW5kIG1pbWV0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtSW5mb1JlcXVlc3QoaW50IGluZm9UeXBlLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgbUluZm9UeXBlID0gaW5mb1R5cGU7CisgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbWV0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgSW5mb3JtYXRpb24gdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJbmZvcm1hdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmZvVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbmZvVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkgdG8gYWRkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbVJlcXVlc3RJbmZvcm1hdGlvbi5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXksIGlmIG5vdCBmb3VuZCByZXR1cm5zIG51bGwKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdEluZm9ybWF0aW9uLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBrZXlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0SW5mb3JtYXRpb24ua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0SW5mb3JtYXRpb24udmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyB2YWxpZCBvciBub3QKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgdHJ1ZSBpZiB2YWxpZAorICAgICAqICAgICBmYWxzZSBpZiBpbnZhbGlkCisgICAgICovCisgICAgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gKG51bGwgIT0gbU1pbWVUeXBlICYmICFtTWltZVR5cGUuZXF1YWxzKCIiKQorICAgICAgICAgICAgICAgICYmIG51bGwgIT0gbVJlcXVlc3RJbmZvcm1hdGlvbiAmJiBpc1ZhbGlkVHlwZShtSW5mb1R5cGUpKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIGlzVmFsaWRUeXBlKGludCBpbmZvVHlwZSkgeworICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKGluZm9UeXBlKSB7CisgICAgICAgIGNhc2UgVFlQRV9SRUdJU1RSQVRJT05fSU5GTzoKKyAgICAgICAgY2FzZSBUWVBFX1VOUkVHSVNUUkFUSU9OX0lORk86CisgICAgICAgIGNhc2UgVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fSU5GTzoKKyAgICAgICAgY2FzZSBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9QUk9HUkVTU19JTkZPOgorICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNWYWxpZDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9TdGF0dXMuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9TdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdlYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1N0YXR1cy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCisvKioKKyAqIFRoaXMgaXMgYW4gZW50aXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSByZXN1bHQgb2YgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRldmljZQorICogYW5kIG9ubGluZSBEUk0gc2VydmVyLgorICoKKyAqIEFzIGEgcmVzdWx0IG9mIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfSBhbiBpbnN0YW5jZSBvZiBEcm1JbmZvU3RhdHVzCisgKiB3b3VsZCBiZSByZXR1cm5lZC4gVGhpcyBjbGFzcyBob2xkcyB7QGxpbmsgUHJvY2Vzc2VkRGF0YX0sIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUKKyAqIHtAbGluayBEcm1SaWdodHMjRHJtUmlnaHRzKFByb2Nlc3NlZERhdGEsIFN0cmluZyl9IGluIGxpY2Vuc2UgYWNxdWlzaXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtSW5mb1N0YXR1cyB7CisgICAgLy8gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvU3RhdHVzLmNwcAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PSyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VSUk9SID0gMjsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgc3RhdHVzQ29kZTsKKyAgICBwdWJsaWMgZmluYWwgaW50IGluZm9UeXBlOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbWltZVR5cGU7CisgICAgcHVibGljIGZpbmFsIFByb2Nlc3NlZERhdGEgZGF0YTsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1JbmZvU3RhdHVzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBfc3RhdHVzQ29kZSBTdGF0dXMgb2YgdGhlIGNvbW11bmljYXRpb24KKyAgICAgKiBAcGFyYW0gX2luZm9UeXBlIFR5cGUgb2YgdGhlIERSTSBpbmZvcm1hdGlvbiBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gX2RhdGEgVGhlIHByb2Nlc3NlZCBkYXRhCisgICAgICogQHBhcmFtIF9taW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtSW5mb1N0YXR1cyhpbnQgX3N0YXR1c0NvZGUsIGludCBfaW5mb1R5cGUsIFByb2Nlc3NlZERhdGEgX2RhdGEsIFN0cmluZyBfbWltZVR5cGUpIHsKKyAgICAgICAgc3RhdHVzQ29kZSA9IF9zdGF0dXNDb2RlOworICAgICAgICBpbmZvVHlwZSA9IF9pbmZvVHlwZTsKKyAgICAgICAgZGF0YSA9IF9kYXRhOworICAgICAgICBtaW1lVHlwZSA9IF9taW1lVHlwZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FmNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsODEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogSW50ZXJmYWNlIG9mIERSTSBGcmFtZXdvcmsuCisgKiBKYXZhIGFwcGxpY2F0aW9uIHdpbGwgaW5zdGFudGlhdGUgdGhpcyBjbGFzcworICogdG8gYWNjZXNzIERSTSBhZ2VudCB0aHJvdWdoIERSTSBGcmFtZXdvcmsuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtTWFuYWdlckNsaWVudCB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoZSBzdWNjZXNzIG9yIG5vIGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTk9ORSA9IDA7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSByZWFzb24gaXMgbm90IGtub3duCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IC0yMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEcm1NYW5hZ2VyQ2xpZW50IjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIExvYWQgdGhlIHJlc3BlY3RpdmUgbGlicmFyeQorICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImRybWZyYW1ld29ya19qbmkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBvZiBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgdG8gY29tbXVuaWNhdGUKKyAgICAgKiBzb21lIGluZm8gYW5kL29yIHdhcm5pbmcgYWJvdXQgRHJtTWFuYWdlckNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uSW5mb0xpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byBpbmRpY2F0ZSBhbiBpbmZvIG9yIGEgd2FybmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCBEcm1NYW5hZ2VyQ2xpZW50IGluc3RhbmNlCisgICAgICAgICAqIEBwYXJhbSBldmVudCBpbnN0YW5jZSB3aGljaCB3cmFwcyByZWFzb24gYW5kIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKERybU1hbmFnZXJDbGllbnQgY2xpZW50LCBEcm1JbmZvRXZlbnQgZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIG9mIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB0byBjb21tdW5pY2F0ZQorICAgICAqIHRoZSByZXN1bHQgb2YgdGltZSBjb25zdW1pbmcgQVBJcyBhc3luY2hyb25vdXNseQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25FdmVudExpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGUgcmVzdWx0IG9mIGFzeW5jaHJvbm91cyBBUElzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xpZW50IERybU1hbmFnZXJDbGllbnQgaW5zdGFuY2UKKyAgICAgICAgICogQHBhcmFtIGV2ZW50IGluc3RhbmNlIHdoaWNoIHdyYXBzIHR5cGUgYW5kIG1lc3NhZ2UKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgcmVzdWx0YW50IHZhbHVlcyBpbiBrZXkgYW5kIHZhbHVlIHBhaXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KERybU1hbmFnZXJDbGllbnQgY2xpZW50LCBEcm1FdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBhdHRyaWJ1dGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBvZiBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgdG8gY29tbXVuaWNhdGUKKyAgICAgKiB0aGUgZXJyb3Igb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uRXJyb3JMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xpZW50IERybU1hbmFnZXJDbGllbnQgaW5zdGFuY2UKKyAgICAgICAgICogQHBhcmFtIGV2ZW50IGluc3RhbmNlIHdoaWNoIHdyYXBzIGVycm9yIHR5cGUgYW5kIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRHJtTWFuYWdlckNsaWVudCBjbGllbnQsIERybUVycm9yRXZlbnQgZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUkVNT1ZFX0FMTF9SSUdIVFMgPSAxMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUFJPQ0VTU19EUk1fSU5GTyA9IDEwMDI7CisKKyAgICBwcml2YXRlIGludCBtVW5pcXVlSWQ7CisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW5mb0hhbmRsZXIgbUluZm9IYW5kbGVyOworICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXI7CisgICAgcHJpdmF0ZSBPbkluZm9MaXN0ZW5lciBtT25JbmZvTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBPbkV2ZW50TGlzdGVuZXIgbU9uRXZlbnRMaXN0ZW5lcjsKKyAgICBwcml2YXRlIE9uRXJyb3JMaXN0ZW5lciBtT25FcnJvckxpc3RlbmVyOworCisgICAgcHJpdmF0ZSBjbGFzcyBFdmVudEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKworICAgICAgICBwdWJsaWMgRXZlbnRIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBEcm1FdmVudCBldmVudCA9IG51bGw7CisgICAgICAgICAgICBEcm1FcnJvckV2ZW50IGVycm9yID0gbnVsbDsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworICAgICAgICAgICAgc3dpdGNoKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9QUk9DRVNTX0RSTV9JTkZPOiB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJtSW5mbyBkcm1JbmZvID0gKERybUluZm8pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgRHJtSW5mb1N0YXR1cyBzdGF0dXMgPSBfcHJvY2Vzc0RybUluZm8obVVuaXF1ZUlkLCBkcm1JbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzdGF0dXMgJiYgRHJtSW5mb1N0YXR1cy5TVEFUVVNfT0sgPT0gc3RhdHVzLnN0YXR1c0NvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoRHJtRXZlbnQuRFJNX0lORk9fU1RBVFVTX09CSkVDVCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgRHJtRXZlbnQobVVuaXF1ZUlkLCBnZXRFdmVudFR5cGUoc3RhdHVzLmluZm9UeXBlKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZm9UeXBlID0gKG51bGwgIT0gc3RhdHVzKSA/IHN0YXR1cy5pbmZvVHlwZSA6IGRybUluZm8uZ2V0SW5mb1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgRHJtRXJyb3JFdmVudChtVW5pcXVlSWQsIGdldEVycm9yVHlwZShpbmZvVHlwZSksIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1JFTU9WRV9BTExfUklHSFRTOiB7CisgICAgICAgICAgICAgICAgaWYgKEVSUk9SX05PTkUgPT0gX3JlbW92ZUFsbFJpZ2h0cyhtVW5pcXVlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IERybUV2ZW50KG1VbmlxdWVJZCwgRHJtRXZlbnQuVFlQRV9BTExfUklHSFRTX1JFTU9WRUQsIG51bGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IERybUVycm9yRXZlbnQobVVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUVycm9yRXZlbnQuVFlQRV9SRU1PVkVfQUxMX1JJR0hUU19GQUlMRUQsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBtZXNzYWdlIHR5cGUgIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVsbCAhPSBtT25FdmVudExpc3RlbmVyICYmIG51bGwgIT0gZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBtT25FdmVudExpc3RlbmVyLm9uRXZlbnQoRHJtTWFuYWdlckNsaWVudC50aGlzLCBldmVudCwgYXR0cmlidXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVsbCAhPSBtT25FcnJvckxpc3RlbmVyICYmIG51bGwgIT0gZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtT25FcnJvckxpc3RlbmVyLm9uRXJyb3IoRHJtTWFuYWdlckNsaWVudC50aGlzLCBlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG5vdGlmeSgKKyAgICAgICAgICAgIE9iamVjdCB0aGlzUmVmZXJlbmNlLCBpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgRHJtTWFuYWdlckNsaWVudCBpbnN0YW5jZSA9IChEcm1NYW5hZ2VyQ2xpZW50KSgoV2Vha1JlZmVyZW5jZSl0aGlzUmVmZXJlbmNlKS5nZXQoKTsKKworICAgICAgICBpZiAobnVsbCAhPSBpbnN0YW5jZSAmJiBudWxsICE9IGluc3RhbmNlLm1JbmZvSGFuZGxlcikgeworICAgICAgICAgICAgTWVzc2FnZSBtID0gaW5zdGFuY2UubUluZm9IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgSW5mb0hhbmRsZXIuSU5GT19FVkVOVF9UWVBFLCB1bmlxdWVJZCwgaW5mb1R5cGUsIG1lc3NhZ2UpOworICAgICAgICAgICAgaW5zdGFuY2UubUluZm9IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJbmZvSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0VWRU5UX1RZUEUgPSAxOworCisgICAgICAgIHB1YmxpYyBJbmZvSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBzdXBlcihsb29wZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgRHJtSW5mb0V2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIERybUVycm9yRXZlbnQgZXJyb3IgPSBudWxsOworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIEluZm9IYW5kbGVyLklORk9fRVZFTlRfVFlQRToKKyAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQgPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICBpbnQgaW5mb1R5cGUgPSBtc2cuYXJnMjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1zZy5vYmoudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5mb1R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERybUluZm9FdmVudC5UWVBFX1JFTU9WRV9SSUdIVFM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERybVV0aWxzLnJlbW92ZUZpbGUobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgRHJtSW5mb0V2ZW50KHVuaXF1ZUlkLCBpbmZvVHlwZSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIERybUluZm9FdmVudC5UWVBFX0FMUkVBRFlfUkVHSVNURVJFRF9CWV9BTk9USEVSX0FDQ09VTlQ6IHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgRHJtSW5mb0V2ZW50KHVuaXF1ZUlkLCBpbmZvVHlwZSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBEcm1FcnJvckV2ZW50KHVuaXF1ZUlkLCBpbmZvVHlwZSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1PbkluZm9MaXN0ZW5lciAmJiBudWxsICE9IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1PbkluZm9MaXN0ZW5lci5vbkluZm8oRHJtTWFuYWdlckNsaWVudC50aGlzLCBldmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1PbkVycm9yTGlzdGVuZXIgJiYgbnVsbCAhPSBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBtT25FcnJvckxpc3RlbmVyLm9uRXJyb3IoRHJtTWFuYWdlckNsaWVudC50aGlzLCBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBtZXNzYWdlIHR5cGUgIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBpbnN0YW50aWF0ZSBEcm1NYW5hZ2VyQ2xpZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IG9mIHRoZSBjYWxsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtTWFuYWdlckNsaWVudChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIEhhbmRsZXJUaHJlYWQgaW5mb1RocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJEcm1NYW5hZ2VyQ2xpZW50LkluZm9IYW5kbGVyIik7CisgICAgICAgIGluZm9UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUluZm9IYW5kbGVyID0gbmV3IEluZm9IYW5kbGVyKGluZm9UaHJlYWQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgIEhhbmRsZXJUaHJlYWQgZXZlbnRUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiRHJtTWFuYWdlckNsaWVudC5FdmVudEhhbmRsZXIiKTsKKyAgICAgICAgZXZlbnRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUV2ZW50SGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoZXZlbnRUaHJlYWQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgIC8vIHNhdmUgdGhlIHVuaXF1ZSBpZAorICAgICAgICBtVW5pcXVlSWQgPSBoYXNoQ29kZSgpOworCisgICAgICAgIF9pbml0aWFsaXplKG1VbmlxdWVJZCwgbmV3IFdlYWtSZWZlcmVuY2U8RHJtTWFuYWdlckNsaWVudD4odGhpcykpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBfZmluYWxpemUobVVuaXF1ZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvIHJlY2VpdmUKKyAgICAgKiBzdXBwbGVtZW50YXJ5IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGluZm9MaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRPbkluZm9MaXN0ZW5lcihPbkluZm9MaXN0ZW5lciBpbmZvTGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gaW5mb0xpc3RlbmVyKSB7CisgICAgICAgICAgICBtT25JbmZvTGlzdGVuZXIgPSBpbmZvTGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvIHJlY2VpdmUKKyAgICAgKiB0aGUgcmVzdWx0IG9mIGFzeW5jaHJvbm91cyBBUElzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50TGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T25FdmVudExpc3RlbmVyKE9uRXZlbnRMaXN0ZW5lciBldmVudExpc3RlbmVyKSB7CisgICAgICAgIGlmIChudWxsICE9IGV2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1PbkV2ZW50TGlzdGVuZXIgPSBldmVudExpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0byByZWNlaXZlCisgICAgICogZXJyb3IgcmVzdWx0IG9mIGFzeW5jaHJvbm91cyBBUElzLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T25FcnJvckxpc3RlbmVyKE9uRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyKSB7CisgICAgICAgIGlmIChudWxsICE9IGVycm9yTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1PbkVycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGluZm9ybWF0aW9ucyBhYm91dCBhbGwgdGhlIHBsdWctaW5zIHJlZ2lzdGVyZWQgd2l0aCBEcm1GcmFtZXdvcmsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5IG9mIERybUVuZ2luZSBwbHVnLWluIHN0cmluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlRHJtRW5naW5lcygpIHsKKyAgICAgICAgRHJtU3VwcG9ydEluZm9bXSBzdXBwb3J0SW5mb3MgPSBfZ2V0QWxsU3VwcG9ydEluZm8obVVuaXF1ZUlkKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gZGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBwb3J0SW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9ucy5hZGQoc3VwcG9ydEluZm9zW2ldLmdldERlc2NyaXByaXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBkcm1FbmdpbmVzID0gbmV3IFN0cmluZ1tkZXNjcmlwdGlvbnMuc2l6ZSgpXTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9ucy50b0FycmF5KGRybUVuZ2luZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb25zdHJhaW50cyBpbmZvcm1hdGlvbiBldmFsdWF0ZWQgZnJvbSBEUk0gY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGVudCBwYXRoIGZyb20gd2hlcmUgRFJNIGNvbnN0cmFpbnRzIHdvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBpbiB7QGxpbmsgRHJtU3RvcmUuQWN0aW9ufQorICAgICAqIEByZXR1cm4gQ29udGVudFZhbHVlcyBpbnN0YW5jZSBpbiB3aGljaCBjb25zdHJhaW50cyBrZXktdmFsdWUgcGFpcnMgYXJlIGVtYmVkZGVkCisgICAgICogICAgICAgICBvciBudWxsIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZW50VmFsdWVzIGdldENvbnN0cmFpbnRzKFN0cmluZyBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChudWxsID09IHBhdGggfHwgcGF0aC5lcXVhbHMoIiIpIHx8ICFEcm1TdG9yZS5BY3Rpb24uaXNWYWxpZChhY3Rpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiB1c2FnZSBvciBwYXRoIGlzIGludmFsaWQvbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZ2V0Q29uc3RyYWludHMobVVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKworICAgLyoqCisgICAgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gZnJvbSBEUk0gY29udGVudAorICAgICoKKyAgICAqIEBwYXJhbSBwYXRoIENvbnRlbnQgcGF0aCBmcm9tIHdoZXJlIERSTSBtZXRhZGF0YSB3b3VsZCBiZSByZXRyaWV2ZWQuCisgICAgKiBAcmV0dXJuIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2UgaW4gd2hpY2ggbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFyZSBlbWJlZGRlZAorICAgICogICAgICAgICBvciBudWxsIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICovCisgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0TWV0YWRhdGEoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHBhdGggaXMgaW52YWxpZC9udWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9nZXRNZXRhZGF0YShtVW5pcXVlSWQsIHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb25zdHJhaW50cyBpbmZvcm1hdGlvbiBldmFsdWF0ZWQgZnJvbSBEUk0gY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBDb250ZW50IFVSSSBmcm9tIHdoZXJlIERSTSBjb25zdHJhaW50cyB3b3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb25zIGRlZmluZWQgaW4ge0BsaW5rIERybVN0b3JlLkFjdGlvbn0KKyAgICAgKiBAcmV0dXJuIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2UgaW4gd2hpY2ggY29uc3RyYWludHMga2V5LXZhbHVlIHBhaXJzIGFyZSBlbWJlZGRlZAorICAgICAqICAgICAgICAgb3IgbnVsbCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBnZXRDb25zdHJhaW50cyhVcmkgdXJpLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBVcmkuRU1QVFkgPT0gdXJpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldENvbnN0cmFpbnRzKGNvbnZlcnRVcmlUb1BhdGgodXJpKSwgYWN0aW9uKTsKKyAgICB9CisKKyAgIC8qKgorICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGZyb20gRFJNIGNvbnRlbnQKKyAgICAqCisgICAgKiBAcGFyYW0gdXJpIENvbnRlbnQgVVJJIGZyb20gd2hlcmUgRFJNIG1ldGFkYXRhIHdvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAqIEByZXR1cm4gQ29udGVudFZhbHVlcyBpbnN0YW5jZSBpbiB3aGljaCBtZXRhZGF0YSBrZXktdmFsdWUgcGFpcnMgYXJlIGVtYmVkZGVkCisgICAgKiAgICAgICAgIG9yIG51bGwgaW4gY2FzZSBvZiBmYWlsdXJlCisgICAgKi8KKyAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBnZXRNZXRhZGF0YShVcmkgdXJpKSB7CisgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBVcmkuRU1QVFkgPT0gdXJpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE1ldGFkYXRhKGNvbnZlcnRVcmlUb1BhdGgodXJpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBEUk0gcmlnaHRzIHRvIHNwZWNpZmllZCByaWdodHMgcGF0aAorICAgICAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoLgorICAgICAqCisgICAgICogPHAgY2xhc3M9Im5vdGUiPkluIGNhc2Ugb2YgT01BIG9yIFdNLURSTSwgcmlnaHRzUGF0aCBhbmQgY29udGVudFBhdGggY291bGQgYmUgbnVsbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbSByaWdodHNQYXRoIEZpbGUgcGF0aCB3aGVyZSByaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW0gY29udGVudFBhdGggRmlsZSBwYXRoIHdoZXJlIGNvbnRlbnQgd2FzIHNhdmVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBFUlJPUl9OT05FIGZvciBzdWNjZXNzCisgICAgICogICAgIEVSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZhaWxlZCB0byBzYXZlIHJpZ2h0cyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gcGF0aAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIERybVJpZ2h0cyBkcm1SaWdodHMsIFN0cmluZyByaWdodHNQYXRoLCBTdHJpbmcgY29udGVudFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IGRybVJpZ2h0cyB8fCAhZHJtUmlnaHRzLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gZHJtUmlnaHRzIG9yIGNvbnRlbnRQYXRoIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IHJpZ2h0c1BhdGggJiYgIXJpZ2h0c1BhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgRHJtVXRpbHMud3JpdGVUb0ZpbGUocmlnaHRzUGF0aCwgZHJtUmlnaHRzLmdldERhdGEoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9zYXZlUmlnaHRzKG1VbmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbCBuZXcgRFJNIEVuZ2luZSBQbHVnLWluIGF0IHRoZSBydW50aW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5naW5lRmlsZVBhdGggUGF0aCBvZiB0aGUgcGx1Zy1pbiBmaWxlIHRvIGJlIGluc3RhbGxlZAorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsRHJtRW5naW5lKFN0cmluZyBlbmdpbmVGaWxlUGF0aCkgeworICAgICAgICBpZiAobnVsbCA9PSBlbmdpbmVGaWxlUGF0aCB8fCBlbmdpbmVGaWxlUGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJHaXZlbiBlbmdpbmVGaWxlUGF0aDogIisgZW5naW5lRmlsZVBhdGggKyAiaXMgbm90IHZhbGlkIik7CisgICAgICAgIH0KKyAgICAgICAgX2luc3RhbGxEcm1FbmdpbmUobVVuaXF1ZUlkLCBlbmdpbmVGaWxlUGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbWltZXR5cGUgb3IgcGF0aCBjYW4gYmUgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgdG8gYmUgaGFuZGxlZAorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNaW1ldHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICAgIHRydWUgLSBpZiB0aGUgZ2l2ZW4gbWltZVR5cGUgb3IgcGF0aCBjYW4gYmUgaGFuZGxlZAorICAgICAqICAgICAgICBmYWxzZSAtIGNhbm5vdCBiZSBoYW5kbGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmICgobnVsbCA9PSBwYXRoIHx8IHBhdGguZXF1YWxzKCIiKSkgJiYgKG51bGwgPT0gbWltZVR5cGUgfHwgbWltZVR5cGUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhdGggb3IgdGhlIG1pbWV0eXBlIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY2FuSGFuZGxlKG1VbmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHVyaSBjYW4gYmUgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgQ29udGVudCBVUkkgb2YgdGhlIGRhdGEgdG8gYmUgaGFuZGxlZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTWltZXR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBoYW5kbGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICAgICB0cnVlIC0gaWYgdGhlIGdpdmVuIG1pbWVUeXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKiAgICAgICAgZmFsc2UgLSBjYW5ub3QgYmUgaGFuZGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmICgobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgJiYgKG51bGwgPT0gbWltZVR5cGUgfHwgbWltZVR5cGUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVyaSBvciB0aGUgbWltZXR5cGUgc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhbkhhbmRsZShjb252ZXJ0VXJpVG9QYXRoKHVyaSksIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBnaXZlbiBkcm0gaW5mb3JtYXRpb24gYmFzZWQgb24gaXRzIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBwcm9jZXNzRHJtSW5mbyhEcm1JbmZvIGRybUluZm8pIHsKKyAgICAgICAgaWYgKG51bGwgPT0gZHJtSW5mbyB8fCAhZHJtSW5mby5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIGRybUluZm8gaXMgaW52YWxpZC9udWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJlc3VsdCA9IEVSUk9SX1VOS05PV047CisgICAgICAgIGlmIChudWxsICE9IG1FdmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50SGFuZGxlci5vYnRhaW5NZXNzYWdlKEFDVElPTl9QUk9DRVNTX0RSTV9JTkZPLCBkcm1JbmZvKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChtRXZlbnRIYW5kbGVyLnNlbmRNZXNzYWdlKG1zZykpID8gRVJST1JfTk9ORSA6IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdGVyLCB1bnJlZ2lzdGVyIG9yIHJpZ2h0cyBhY3F1aXNpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAgICAgKiBAcmV0dXJuIERybUluZm8gSW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIHB1YmxpYyBEcm1JbmZvIGFjcXVpcmVEcm1JbmZvKERybUluZm9SZXF1ZXN0IGRybUluZm9SZXF1ZXN0KSB7CisgICAgICAgIGlmIChudWxsID09IGRybUluZm9SZXF1ZXN0IHx8ICFkcm1JbmZvUmVxdWVzdC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIGRybUluZm9SZXF1ZXN0IGlzIGludmFsaWQvbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWNxdWlyZURybUluZm8obVVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgZ2l2ZW4gRHJtSW5mb1JlcXVlc3QgYW5kIHJldHVybnMgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBhc3luY2hyb25vdXNseS4KKyAgICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBBUEkgd2hpY2ggY29uc2lzdHMgb2Yge0BsaW5rICNhY3F1aXJlRHJtSW5mbyhEcm1JbmZvUmVxdWVzdCl9CisgICAgICogYW5kIHtAbGluayAjcHJvY2Vzc0RybUluZm8oRHJtSW5mbyl9LgorICAgICAqIEl0IGNhbiBiZSB1c2VkIGlmIHNlbGVjdGVkIERSTSBhZ2VudCBjYW4gd29yayB3aXRoIHRoaXMgY29tYmluZWQgc2VxdWVuY2VzLgorICAgICAqIEluIGNhc2Ugb2Ygc29tZSBEUk0gc2NoZW1lcywgc3VjaCBhcyBPTUEgRFJNLCBhcHBsaWNhdGlvbiBuZWVkcyB0byBpbnZva2UKKyAgICAgKiB7QGxpbmsgI2FjcXVpcmVEcm1JbmZvKERybUluZm9SZXF1ZXN0KX0gYW5kIHtAbGluayAjcHJvY2Vzc0RybUluZm8oRHJtSW5mbyl9LCBzZXBhcmF0ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBhY3F1aXJlUmlnaHRzKERybUluZm9SZXF1ZXN0IGRybUluZm9SZXF1ZXN0KSB7CisgICAgICAgIERybUluZm8gZHJtSW5mbyA9IGFjcXVpcmVEcm1JbmZvKGRybUluZm9SZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NEcm1JbmZvKGRybUluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGUgcHJvdGVjdGVkIG9iamVjdCAoY29udGVudCwgcmlnaHRzLCBldGMuLikKKyAgICAgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTWltZXR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFR5cGUgb2YgdGhlIERSTSBjb250ZW50LgorICAgICAqIEBzZWUgRHJtU3RvcmUuRHJtT2JqZWN0VHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RHJtT2JqZWN0VHlwZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmICgobnVsbCA9PSBwYXRoIHx8IHBhdGguZXF1YWxzKCIiKSkgJiYgKG51bGwgPT0gbWltZVR5cGUgfHwgbWltZVR5cGUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhdGggb3IgdGhlIG1pbWV0eXBlIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZ2V0RHJtT2JqZWN0VHlwZShtVW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHVyaSBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGNvbnRlbnQgVVJJIG9mIHRoZSBkYXRhCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHJldHVybiBUeXBlIG9mIHRoZSBEUk0gY29udGVudC4KKyAgICAgKiBAc2VlIERybVN0b3JlLkRybU9iamVjdFR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERybU9iamVjdFR5cGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmICgobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgJiYgKG51bGwgPT0gbWltZVR5cGUgfHwgbWltZVR5cGUuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVyaSBvciB0aGUgbWltZXR5cGUgc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhdGggPSBjb252ZXJ0VXJpVG9QYXRoKHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFdmVuIHVyaSBpcyBpbnZhbGlkIHRoZSBtaW1ldHlwZSBzaGFsbCBiZSB2YWxpZCwgc28gYWxsb3cgdG8gcHJvY2VlZCBmdXJ0aGVyLgorICAgICAgICAgICAgTG9nLncoVEFHLCAiR2l2ZW4gVXJpIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBtZWRpYSBzdG9yZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREcm1PYmplY3RUeXBlKHBhdGgsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBNaW1ldHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsTWltZVR5cGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHBhdGggc2hvdWxkIGJlIG5vbiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9nZXRPcmlnaW5hbE1pbWVUeXBlKG1VbmlxdWVJZCwgcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBjb250ZW50IFVSSSBvZiB0aGUgZGF0YQorICAgICAqIEByZXR1cm4gTWltZXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbE1pbWVUeXBlKFVyaSB1cmkpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdXJpIHx8IFVyaS5FTVBUWSA9PSB1cmkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHVyaSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0T3JpZ2luYWxNaW1lVHlwZShjb252ZXJ0VXJpVG9QYXRoKHVyaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBTdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHNlZSBEcm1TdG9yZS5SaWdodHNTdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNoZWNrUmlnaHRzU3RhdHVzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiBjaGVja1JpZ2h0c1N0YXR1cyhwYXRoLCBEcm1TdG9yZS5BY3Rpb24uREVGQVVMVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgY29udGVudCBVUkkgb2YgdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAc2VlIERybVN0b3JlLlJpZ2h0c1N0YXR1cworICAgICAqLworICAgIHB1YmxpYyBpbnQgY2hlY2tSaWdodHNTdGF0dXMoVXJpIHVyaSkgeworICAgICAgICBpZiAobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gdXJpIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja1JpZ2h0c1N0YXR1cyhjb252ZXJ0VXJpVG9QYXRoKHVyaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QgZm9yIHNwZWNpZmllZCBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0KKyAgICAgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAc2VlIERybVN0b3JlLlJpZ2h0c1N0YXR1cworICAgICAqLworICAgIHB1YmxpYyBpbnQgY2hlY2tSaWdodHNTdGF0dXMoU3RyaW5nIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICAgICAgaWYgKG51bGwgPT0gcGF0aCB8fCBwYXRoLmVxdWFscygiIikgfHwgIURybVN0b3JlLkFjdGlvbi5pc1ZhbGlkKGFjdGlvbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIHBhdGggb3IgYWN0aW9uIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY2hlY2tSaWdodHNTdGF0dXMobVVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QgZm9yIHNwZWNpZmllZCBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBjb250ZW50IFVSSSBvZiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0KKyAgICAgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAc2VlIERybVN0b3JlLlJpZ2h0c1N0YXR1cworICAgICAqLworICAgIHB1YmxpYyBpbnQgY2hlY2tSaWdodHNTdGF0dXMoVXJpIHVyaSwgaW50IGFjdGlvbikgeworICAgICAgICBpZiAobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gdXJpIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja1JpZ2h0c1N0YXR1cyhjb252ZXJ0VXJpVG9QYXRoKHVyaSksIGFjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcmlnaHRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybgorICAgICAqICAgICBFUlJPUl9OT05FIGZvciBzdWNjZXNzCisgICAgICogICAgIEVSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlbW92ZVJpZ2h0cyhTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAobnVsbCA9PSBwYXRoIHx8IHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gcGF0aCBzaG91bGQgYmUgbm9uIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JlbW92ZVJpZ2h0cyhtVW5pcXVlSWQsIHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBjb250ZW50IFVSSSBvZiB0aGUgZGF0YQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRVJST1JfTk9ORSBmb3Igc3VjY2VzcworICAgICAqICAgICBFUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCByZW1vdmVSaWdodHMoVXJpIHVyaSkgeworICAgICAgICBpZiAobnVsbCA9PSB1cmkgfHwgVXJpLkVNUFRZID09IHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gdXJpIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdmVSaWdodHMoY29udmVydFVyaVRvUGF0aCh1cmkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGV2ZXJ5IHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBFUlJPUl9OT05FIGZvciBzdWNjZXNzCisgICAgICogICAgIEVSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlbW92ZUFsbFJpZ2h0cygpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IEVSUk9SX1VOS05PV047CisgICAgICAgIGlmIChudWxsICE9IG1FdmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50SGFuZGxlci5vYnRhaW5NZXNzYWdlKEFDVElPTl9SRU1PVkVfQUxMX1JJR0hUUyk7CisgICAgICAgICAgICByZXN1bHQgPSAobUV2ZW50SGFuZGxlci5zZW5kTWVzc2FnZShtc2cpKSA/IEVSUk9SX05PTkUgOiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIGJhc2VkIERSTSBzY2hlbWUuCisgICAgICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICAgICAqIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gaGFzIHRvCisgICAgICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIERlc2NyaXB0aW9uL01JTUUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIGNvbnZlcnQgSUQgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBtYWludGFpbmluZyBjb252ZXJ0IHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGludCBvcGVuQ29udmVydFNlc3Npb24oU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChudWxsID09IG1pbWVUeXBlIHx8IG1pbWVUeXBlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhdGggb3IgdGhlIG1pbWVUeXBlIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfb3BlbkNvbnZlcnRTZXNzaW9uKG1VbmlxdWVJZCwgbWltZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgICAgICogVGhlIHJlc3VsdGFudCBjb252ZXJ0ZWQgZGF0YSBhbmQgdGhlIHN0YXR1cyBpcyByZXR1cm5lZCBpbiB0aGUgRHJtQ29udmVydGVkSW5mbworICAgICAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGFyZSBuZXcgYmxvY2sKKyAgICAgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtIGlucHV0RGF0YSBJbnB1dCBEYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtQ29udmVydGVkU3RhdHVzIGNvbnZlcnREYXRhKGludCBjb252ZXJ0SWQsIGJ5dGVbXSBpbnB1dERhdGEpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gaW5wdXREYXRhIHx8IDAgPj0gaW5wdXREYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gaW5wdXREYXRhIHNob3VsZCBiZSBub24gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY29udmVydERhdGEobVVuaXF1ZUlkLCBjb252ZXJ0SWQsIGlucHV0RGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgRHJtIEFnZW50IHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkCisgICAgICogb3Igd2hlbiBhbiBlcnJvciBvY2N1cnMuIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLAorICAgICAqIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB0aGF0IHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlCisgICAgICogc2hvdWxkIGJlIGFkZGVkLiBUaGlzIHNpZ25hdHVyZSBhcHBlbmRpbmcgaXMgbmVlZGVkIHRvIGludGVncml0eQorICAgICAqIHByb3RlY3QgdGhlIGNvbnZlcnRlZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YSBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHVibGljIERybUNvbnZlcnRlZFN0YXR1cyBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCBjb252ZXJ0SWQpIHsKKyAgICAgICAgcmV0dXJuIF9jbG9zZUNvbnZlcnRTZXNzaW9uKG1VbmlxdWVJZCwgY29udmVydElkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRFdmVudFR5cGUoaW50IGluZm9UeXBlKSB7CisgICAgICAgIGludCBldmVudFR5cGUgPSAtMTsKKworICAgICAgICBzd2l0Y2ggKGluZm9UeXBlKSB7CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3QuVFlQRV9SRUdJU1RSQVRJT05fSU5GTzoKKyAgICAgICAgY2FzZSBEcm1JbmZvUmVxdWVzdC5UWVBFX1VOUkVHSVNUUkFUSU9OX0lORk86CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3QuVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fSU5GTzoKKyAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybUV2ZW50LlRZUEVfRFJNX0lORk9fUFJPQ0VTU0VEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV2ZW50VHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRFcnJvclR5cGUoaW50IGluZm9UeXBlKSB7CisgICAgICAgIGludCBlcnJvciA9IC0xOworCisgICAgICAgIHN3aXRjaCAoaW5mb1R5cGUpIHsKKyAgICAgICAgY2FzZSBEcm1JbmZvUmVxdWVzdC5UWVBFX1JFR0lTVFJBVElPTl9JTkZPOgorICAgICAgICBjYXNlIERybUluZm9SZXF1ZXN0LlRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTzoKKyAgICAgICAgY2FzZSBEcm1JbmZvUmVxdWVzdC5UWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPOgorICAgICAgICAgICAgZXJyb3IgPSBEcm1FcnJvckV2ZW50LlRZUEVfUFJPQ0VTU19EUk1fSU5GT19GQUlMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZXhwZWN0cyB1cmkgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQKKyAgICAgKiAgICAgY29udGVudDovL21lZGlhLzx0YWJsZV9uYW1lPi88cm93X2luZGV4PiAob3IpCisgICAgICogICAgIGZpbGU6Ly9zZGNhcmQvdGVzdC5tcDQKKyAgICAgKgorICAgICAqIEhlcmUgPHRhYmxlX25hbWU+IHNoYWxsIGJlICJ2aWRlbyIgb3IgImF1ZGlvIiBvciAiaW1hZ2VzIgorICAgICAqIDxyb3dfaW5kZXg+IHRoZSBpbmRleCBvZiB0aGUgY29udGVudCBpbiBnaXZlbiB0YWJsZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRVcmlUb1BhdGgoVXJpIHVyaSkgeworICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IHNjaGVtZSB8fCBzY2hlbWUuZXF1YWxzKCIiKSB8fAorICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZXF1YWxzKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gdXJpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1lLmVxdWFscyhDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7TWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQX07CisgICAgICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IgfHwgMCA9PSBjdXJzb3IuZ2V0Q291bnQoKSB8fCAhY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBjb3VsZCBub3QgYmUgZm91bmQiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBtZWRpYSBzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBwYXRoSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEpOworICAgICAgICAgICAgICAgICAgICBwYXRoID0gY3Vyc29yLmdldFN0cmluZyhwYXRoSW5kZXgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBpcyBub3QgZm9ybWF0dGVkIGluIGEgd2F5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbyB0aGF0IGl0IGNhbiBiZSBmb3VuZCBpbiBtZWRpYSBzdG9yZS4iKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvLyBwcml2YXRlIG5hdGl2ZSBpbnRlcmZhY2VzCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfaW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQsIE9iamVjdCB3ZWFrX3RoaXMpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfZmluYWxpemUoaW50IHVuaXF1ZUlkKTsKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX2luc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBTdHJpbmcgZW5naW5lRmlsZXBhdGgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgQ29udGVudFZhbHVlcyBfZ2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBTdHJpbmcgcGF0aCwgaW50IHVzYWdlKTsKKworICAgIHByaXZhdGUgbmF0aXZlIENvbnRlbnRWYWx1ZXMgX2dldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgU3RyaW5nIHBhdGgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBfY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBEcm1JbmZvU3RhdHVzIF9wcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIERybUluZm8gZHJtSW5mbyk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBEcm1JbmZvIF9hY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIERybUluZm9SZXF1ZXN0IGRybUluZm9SZXF1ZXN0KTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBfc2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRHJtUmlnaHRzIGRybVJpZ2h0cywgU3RyaW5nIHJpZ2h0c1BhdGgsIFN0cmluZyBjb250ZW50UGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2dldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlKTsKKworICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBfZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIFN0cmluZyBwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBfY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBTdHJpbmcgcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX3JlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIFN0cmluZyBwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBfcmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX29wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIFN0cmluZyBtaW1lVHlwZSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBEcm1Db252ZXJ0ZWRTdGF0dXMgX2NvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBieXRlW10gaW5wdXREYXRhKTsKKworICAgIHByaXZhdGUgbmF0aXZlIERybUNvbnZlcnRlZFN0YXR1cyBfY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgRHJtU3VwcG9ydEluZm9bXSBfZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtUmlnaHRzLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1SaWdodHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNhZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtUmlnaHRzLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gd2hpY2ggd2FzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgb25saW5lIERSTSBzZXJ2ZXIuCisgKgorICogQ2FsbGVyIGNhbiBpbnN0YW50aWF0ZSB7QGxpbmsgRHJtUmlnaHRzfSBieQorICogaW52b2tpbmcge0BsaW5rIERybVJpZ2h0cyNEcm1SaWdodHMoUHJvY2Vzc2VkRGF0YSwgU3RyaW5nKX0KKyAqIGNvbnN0cnVjdG9yIGJ5IHVzaW5nIHRoZSByZXN1bHQgb2Yge0BsaW5rIERybU1hbmFnZXJDbGllbnQjcHJvY2Vzc0RybUluZm8oRHJtSW5mbyl9IGludGVyZmFjZS4KKyAqIENhbGxlciBjYW4gYWxzbyBpbnN0YW50aWF0ZSB7QGxpbmsgRHJtUmlnaHRzfSB1c2luZyB0aGUgZmlsZSBwYXRoCisgKiB3aGljaCBjb250YWlucyByaWdodHMgaW5mb3JtYXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtUmlnaHRzIHsKKyAgICBwcml2YXRlIGJ5dGVbXSBtRGF0YTsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZVR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY291bnRJZCA9ICJfTk9fVVNFUiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVN1YnNjcmlwdGlvbklkID0gIiI7CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtUmlnaHRzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodHNGaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgcmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIERybVJpZ2h0cyhTdHJpbmcgcmlnaHRzRmlsZVBhdGgsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyaWdodHNGaWxlUGF0aCk7CisgICAgICAgIGluc3RhbnRpYXRlKGZpbGUsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtUmlnaHRzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodHNGaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgcmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICogQHBhcmFtIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICovCisgICAgcHVibGljIERybVJpZ2h0cyhTdHJpbmcgcmlnaHRzRmlsZVBhdGgsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGFjY291bnRJZCkgeworICAgICAgICB0aGlzKHJpZ2h0c0ZpbGVQYXRoLCBtaW1lVHlwZSk7CisKKyAgICAgICAgaWYgKG51bGwgIT0gYWNjb3VudElkICYmICFhY2NvdW50SWQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgbUFjY291bnRJZCA9IGFjY291bnRJZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBEcm1SaWdodHMgb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHBhcmFtIHJpZ2h0c0ZpbGVQYXRoIFBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyByaWdodHMgZGF0YQorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKiBAcGFyYW0gYWNjb3VudElkIEFjY291bnQgSWQgb2YgdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgU3Vic2NyaXB0aW9uIElkIG9mIHRoZSB1c2VyCisgICAgICovCisgICAgcHVibGljIERybVJpZ2h0cygKKyAgICAgICAgICAgIFN0cmluZyByaWdodHNGaWxlUGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgYWNjb3VudElkLCBTdHJpbmcgc3Vic2NyaXB0aW9uSWQpIHsKKyAgICAgICAgdGhpcyhyaWdodHNGaWxlUGF0aCwgbWltZVR5cGUpOworCisgICAgICAgIGlmIChudWxsICE9IGFjY291bnRJZCAmJiAhYWNjb3VudElkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG1BY2NvdW50SWQgPSBhY2NvdW50SWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCAhPSBzdWJzY3JpcHRpb25JZCAmJiAhc3Vic2NyaXB0aW9uSWQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgbVN1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgRHJtUmlnaHRzIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodHNGaWxlIEZpbGUgY29udGFpbmluZyByaWdodHMgZGF0YQorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJtUmlnaHRzKEZpbGUgcmlnaHRzRmlsZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGluc3RhbnRpYXRlKHJpZ2h0c0ZpbGUsIG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFudGlhdGUoRmlsZSByaWdodHNGaWxlLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhID0gRHJtVXRpbHMucmVhZEJ5dGVzKHJpZ2h0c0ZpbGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIERybVJpZ2h0cyBvYmplY3Qgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICogVGhlIHVzZXIgY2FuIHBhc3MgU3RyaW5nIG9yIGJpbmFyeSBkYXRhPHA+CisgICAgICogVXNhZ2U6PHA+CisgICAgICogICAgICAgIGkpICBTdHJpbmcoZS5nLiBkYXRhIGlzIGluc3RhbmNlIG9mIFN0cmluZyk6PGJyPgorICAgICAqICAgICAgICAgICAgLSBuZXcgRHJtUmlnaHRzKGRhdGEuZ2V0Qnl0ZXMoKSwgbWltZVR5cGUpPHA+CisgICAgICogICAgICAgIGlpKSBCaW5hcnkgZGF0YTxicj4KKyAgICAgKiAgICAgICAgICAgIC0gbmV3IERybVJpZ2h0cyhiaW5hcnlEYXRhW10sIG1pbWVUeXBlKTxicj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFByb2Nlc3NlZCBkYXRhCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBEcm1SaWdodHMoUHJvY2Vzc2VkRGF0YSBkYXRhLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgbURhdGEgPSBkYXRhLmdldERhdGEoKTsKKworICAgICAgICBTdHJpbmcgYWNjb3VudElkID0gZGF0YS5nZXRBY2NvdW50SWQoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gYWNjb3VudElkICYmICFhY2NvdW50SWQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgbUFjY291bnRJZCA9IGFjY291bnRJZDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdWJzY3JpcHRpb25JZCA9IGRhdGEuZ2V0U3Vic2NyaXB0aW9uSWQoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gc3Vic2NyaXB0aW9uSWQgJiYgIXN1YnNjcmlwdGlvbklkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG1TdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmlnaHRzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJpZ2h0cyBkYXRhCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWltZXR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtTWltZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNjb3VudC1pZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjb3VudCBJZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjb3VudElkKCkgeworICAgICAgICByZXR1cm4gbUFjY291bnRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdWJzY3JpcHRpb24taWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN1YnNjcmlwdGlvbiBJZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtU3Vic2NyaXB0aW9uSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgdmFsaWQgb3Igbm90CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgdmFsaWQKKyAgICAgKiAgICAgZmFsc2UgaWYgaW52YWxpZAorICAgICAqLworICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIChudWxsICE9IG1NaW1lVHlwZSAmJiAhbU1pbWVUeXBlLmVxdWFscygiIikKKyAgICAgICAgICAgICAgICAmJiBudWxsICE9IG1EYXRhICYmIG1EYXRhLmxlbmd0aCA+IDApOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtU3RvcmUuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkZjkwYwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVN0b3JlLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZHJtOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbGwgdGhlIGNvbnN0YW50cyB1c2VkIGJ5IERSTSBmcmFtZXdvcmsKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1TdG9yZSB7CisgICAgLyoqCisgICAgICogQ29sdW1ucyByZXByZXNlbnRpbmcgZHJtIGNvbnN0cmFpbnRzCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50c0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCByZXBlYXQgY291bnQKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9SRVBFQVRfQ09VTlQgPSAibWF4X3JlcGVhdF9jb3VudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZW1haW5pbmcgcmVwZWF0IGNvdW50CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1BSU5JTkdfUkVQRUFUX0NPVU5UID0gInJlbWFpbmluZ19yZXBlYXRfY291bnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIHByb3RlY3RlZCBmaWxlIGNhbiBub3QgYmUgcGxheWVkL3ZpZXdlZAorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9TVEFSVF9USU1FID0gImxpY2Vuc2Vfc3RhcnRfdGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBwcm90ZWN0ZWQgZmlsZSBjYW4gbm90IGJlIHBsYXllZC92aWV3ZWQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfRVhQSVJZX1RJTUUgPSAibGljZW5zZV9leHBpcnlfdGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhdmFpbGFibGUgdGltZSBmb3IgbGljZW5zZQorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9BVkFJTEFCTEVfVElNRSA9ICJsaWNlbnNlX2F2YWlsYWJsZV90aW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGEgc3RyZWFtIGZvciBleHRlbmRlZCBtZXRhZGF0YQorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfTUVUQURBVEEgPSAiZXh0ZW5kZWRfbWV0YWRhdGEiOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgY29uc3RhbnRzIHJlbGF0ZWQgdG8gRFJNIHR5cGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEcm1PYmplY3RUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgdW5rbm93biB0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMHgwMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVCA9IDB4MDE7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRTX09CSkVDVCA9IDB4MDI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHRyaWdnZXIgaW5mb3JtYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVJfT0JKRUNUID0gMHgwMzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHBsYXliYWNrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbGF5YmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RhcnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gMHgwMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayBzdG9wCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9QID0gMHgwMTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFID0gMHgwMjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayByZXN1bWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTUUgPSAweDAzOworCisgICAgICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gaXNWYWxpZChpbnQgcGxheWJhY2tTdGF0dXMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1A6CisgICAgICAgICAgICAgICAgY2FzZSBQQVVTRToKKyAgICAgICAgICAgICAgICBjYXNlIFJFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSAweDAwOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHBsYXllZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWSA9IDB4MDE7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgc2V0IGFzIHJpbmcgdG9uZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklOR1RPTkUgPSAweDAyOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHRyYW5zZmVyZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TRkVSID0gMHgwMzsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSBzZXQgYXMgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVQgPSAweDA0OworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgcHJldmlldyBpcyBhbGxvd2VkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVWSUVXID0gMHgwNTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSBleGVjdXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURSA9IDB4MDY7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gZGlzcGxheWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZID0gMHgwNzsKKworICAgICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IGFjdGlvbikgeworICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBERUZBVUxUOgorICAgICAgICAgICAgICAgIGNhc2UgUExBWToKKyAgICAgICAgICAgICAgICBjYXNlIFJJTkdUT05FOgorICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGRVI6CisgICAgICAgICAgICAgICAgY2FzZSBPVVRQVVQ6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVWSUVXOgorICAgICAgICAgICAgICAgIGNhc2UgRVhFQ1VURToKKyAgICAgICAgICAgICAgICBjYXNlIERJU1BMQVk6CisgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHN0YXR1cyBvZiB0aGUgcmlnaHRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSaWdodHNTdGF0dXMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgdmFsaWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUU19WQUxJRCA9IDB4MDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgcmlnaHRzIGFyZSBpbnZhbGlkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVFNfSU5WQUxJRCA9IDB4MDE7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgcmlnaHRzIGFyZSBleHBpcmVkIGZvciB0aGUgY29udGVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRTX0VYUElSRUQgPSAweDAyOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgbm90IGFjcXVpcmVkIGZvciB0aGUgY29udGVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRTX05PVF9BQ1FVSVJFRCA9IDB4MDM7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1TdXBwb3J0SW5mby5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtU3VwcG9ydEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg2YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtU3VwcG9ydEluZm8uamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgY2FwYWJpbGl0eSBvZiBlYWNoIHBsdWctaW4sCisgKiBzdWNoIGFzIG1pbWV0eXBlJ3MgYW5kIGZpbGUgc3VmZml4ZXMgaXQgY291bGQgaGFuZGxlLgorICoKKyAqIFBsdWctaW4gZGV2ZWxvcGVyIGNvdWxkIHJldHVybiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgcGx1Z2luIGJ5IHBhc3NpbmcKKyAqIHtAbGluayBEcm1TdXBwb3J0SW5mb30gaW5zdGFuY2UuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJtU3VwcG9ydEluZm8geworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbUZpbGVTdWZmaXhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtTWltZVR5cGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uID0gIiI7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIG1pbWUtdHlwZSB0byB0aGUgc3VwcG9ydCBpbmZvIHN1Y2ggdGhhdCByZXNwZWN0aXZlIHBsdWctaW4gaXMKKyAgICAgKiBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSBnaXZlbiBtaW1lLXR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIG1NaW1lVHlwZUxpc3QuYWRkKG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGZpbGUgc3VmZml4IHRvIHRoZSBzdXBwb3J0IGluZm8gc3VjaCB0aGF0IHJlc3BlY3RpdmUgcGx1Zy1pbiBpcworICAgICAqIGNhcGFibGUgb2YgaGFuZGxpbmcgdGhlIGdpdmVuIGZpbGUgc3VmZml4LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVTdWZmaXggRmlsZSBzdWZmaXggd2hpY2ggY2FuIGJlIGhhbmRsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU3VmZml4KFN0cmluZyBmaWxlU3VmZml4KSB7CisgICAgICAgIG1GaWxlU3VmZml4TGlzdC5hZGQoZmlsZVN1ZmZpeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgdG8gd2FsayB0byB0aHJvdWdoIG1pbWUgdHlwZXMgb2YgdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0TWltZVR5cGVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZUxpc3QuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciB0byB3YWxrIHRvIHRocm91Z2ggZmlsZSBzdWZmaXhlcyBvZiB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRGaWxlU3VmZml4SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBtRmlsZVN1ZmZpeExpc3QuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVuaXF1ZSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgcGx1Z2luCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIGlmIChudWxsICE9IGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbgorICAgICAqCisgICAgICogQHJldHVybiBVbmlxdWUgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXByaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGRlbiBoYXNoIGNvZGUgaW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gSGFzaCBjb2RlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWxlU3VmZml4TGlzdC5oYXNoQ29kZSgpICsgbU1pbWVUeXBlTGlzdC5oYXNoQ29kZSgpICsgbURlc2NyaXB0aW9uLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGRlbiBlcXVhbHMgaW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBjb21wYXJlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgdHJ1ZSBpZiBlcXVhbAorICAgICAqICAgICBmYWxzZSBpZiBub3QgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEcm1TdXBwb3J0SW5mbykgeworICAgICAgICAgICAgcmVzdWx0ID0gbUZpbGVTdWZmaXhMaXN0LmVxdWFscygoKERybVN1cHBvcnRJbmZvKSBvYmplY3QpLm1GaWxlU3VmZml4TGlzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbU1pbWVUeXBlTGlzdC5lcXVhbHMoKChEcm1TdXBwb3J0SW5mbykgb2JqZWN0KS5tTWltZVR5cGVMaXN0KSAmJgorICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb24uZXF1YWxzKCgoRHJtU3VwcG9ydEluZm8pIG9iamVjdCkubURlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBnaXZlbiBtaW1lLXR5cGUgaXMgc3VwcG9ydGVkIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgdHJ1ZSBpZiBtaW1lIHR5cGUgaXMgc3VwcG9ydGVkCisgICAgICogICAgIGZhbHNlIGlmIG1pbWUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzU3VwcG9ydGVkTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChudWxsICE9IG1pbWVUeXBlICYmICFtaW1lVHlwZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NaW1lVHlwZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxldGVNaW1lVHlwZSA9IG1NaW1lVHlwZUxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZU1pbWVUeXBlLnN0YXJ0c1dpdGgobWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGdpdmVuIGZpbGUgc3VmZml4IGlzIHN1cHBvcnRlZCBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlU3VmZml4IEZpbGUgc3VmZml4CisgICAgICogQHJldHVybgorICAgICAqICAgICB0cnVlIC0gaWYgZmlsZSBzdWZmaXggaXMgc3VwcG9ydGVkCisgICAgICogICAgIGZhbHNlIC0gaWYgZmlsZSBzdWZmaXggaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1N1cHBvcnRlZEZpbGVTdWZmaXgoU3RyaW5nIGZpbGVTdWZmaXgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWxlU3VmZml4TGlzdC5jb250YWlucyhmaWxlU3VmZml4KTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybVV0aWxzLmphdmEgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MDM0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRybTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGhlIHV0aWxpdHkgY2xhc3MgdXNlZCBpbiB0aGUgRFJNIEZyYW1ld29yay4gVGhpcyBpbmNsdWVkcyBBUElzIGZvciBmaWxlIG9wZXJhdGlvbnMKKyAqIGFuZCBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyIGZvciBwYXJzaW5nIGV4dGVuZGVkIG1ldGFkYXRhIEJMT0IgaW4gRFJNIGNvbnN0cmFpbnRzLgorICoKKyAqLworcHVibGljIGNsYXNzIERybVV0aWxzIHsKKyAgICAvKiBTaG91bGQgYmUgdXNlZCB3aGVuIHdlIG5lZWQgdG8gcmVhZCBmcm9tIGxvY2FsIGZpbGUgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBieXRlW10gcmVhZEJ5dGVzKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIHJlYWRCeXRlcyhmaWxlKTsKKyAgICB9CisKKyAgICAvKiBTaG91bGQgYmUgdXNlZCB3aGVuIHdlIG5lZWQgdG8gcmVhZCBmcm9tIGxvY2FsIGZpbGUgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBieXRlW10gcmVhZEJ5dGVzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZmZXJlZFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYnVmZmVyZWRTdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIGVudGlyZSBkYXRhCisgICAgICAgICAgICAgICAgYnVmZmVyZWRTdHJlYW0ucmVhZChkYXRhKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBxdWl0ZURpc3Bvc2UoYnVmZmVyZWRTdHJlYW0pOworICAgICAgICAgICAgcXVpdGVEaXNwb3NlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyB2b2lkIHdyaXRlVG9GaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLyogY2hlY2sgZm9yIGludmFsaWQgaW5wdXRzICovCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICBpZiAobnVsbCAhPSBwYXRoICYmIG51bGwgIT0gZGF0YSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoZGF0YSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHF1aXRlRGlzcG9zZShvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgdm9pZCByZW1vdmVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHF1aXRlRGlzcG9zZShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHN0cmVhbSkgeworICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNhcmUsIGF0IGxlYXN0IGFzIG9mIG5vdworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWl0ZURpc3Bvc2UoT3V0cHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG51bGwgIT0gc3RyZWFtKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FyZQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGluc3RhbmNlIG9mIEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIgdG8gYmUgdXNlZCBmb3IgcGFyc2luZworICAgICAqIGV4dGVuZGVkIG1ldGFkYXRhIEJMT0IgaW4gRFJNIGNvbnN0cmFpbnRzLiA8YnI+CisgICAgICoKKyAgICAgKiBleHRlbmRlZE1ldGFkYXRhIEJMT0IgaXMgcmV0cmlldmVkIGJ5IHNwZWNpZmluZworICAgICAqIGtleSBEcm1TdG9yZS5Db25zdHJhaW50c0NvbHVtbnMuRVhURU5ERURfTUVUQURBVEEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5kZWRNZXRhZGF0YSBCTE9CIGluIHdoaWNoIGtleS12YWx1ZSBwYWlycyBvZiBleHRlbmRlZCBtZXRhZGF0YSBhcmUgZW1iZWRkZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIgZ2V0RXh0ZW5kZWRNZXRhZGF0YVBhcnNlcihieXRlW10gZXh0ZW5kZWRNZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIoZXh0ZW5kZWRNZXRhZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBwYXJzZXIgdG8gcGFyc2UgdGhlIGV4dGVuZGVkIG1ldGEtZGF0YSBlbWJlZGRlZCBpbnNpZGUgRFJNIGNvbnN0cmFpbnRzPGJyPjxicj4KKyAgICAgKgorICAgICAqIFVzYWdlIGV4YW1wbGU8YnI+CisgICAgICogYnl0ZVtdIGV4dGVuZGVkTWV0YWRhdGE8YnI+CisgICAgICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0KKyAgICAgKiAgICAgICAgIGNvbnN0cmFpbnRzLmdldEFzQnl0ZUFycmF5KERybVN0b3JlLkNvbnN0cmFpbnRzQ29sdW1ucy5FWFRFTkRFRF9NRVRBREFUQSk7PGJyPgorICAgICAqIEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIgcGFyc2VyID0gZ2V0RXh0ZW5kZWRNZXRhZGF0YVBhcnNlcihleHRlbmRlZE1ldGFkYXRhKTs8YnI+CisgICAgICogSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSBwYXJzZXIua2V5SXRlcmF0b3IoKTs8YnI+CisgICAgICogd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgezxicj4KKyAgICAgKiAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyaW5nIGV4dGVuZGVkTWV0YWRhdGFLZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7PGJyPgorICAgICAqICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTdHJpbmcgZXh0ZW5kZWRNZXRhZGF0YVZhbHVlID0KKyAgICAgKiAgICAgICAgICAgICBwYXJzZXIuZ2V0KGV4dGVuZGVkTWV0YWRhdGFLZXkpOzxicj4KKyAgICAgKiB9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHRlbmRlZE1ldGFkYXRhUGFyc2VyIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgICAgIHByaXZhdGUgaW50IHJlYWRCeXRlKGJ5dGVbXSBjb25zdHJhaW50RGF0YSwgaW50IGFycmF5SW5kZXgpIHsKKyAgICAgICAgICAgIC8vQ29udmVydCBieXRlW10gaW50byBpbnQuCisgICAgICAgICAgICByZXR1cm4gKGludCljb25zdHJhaW50RGF0YVthcnJheUluZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlYWRNdWx0aXBsZUJ5dGVzKAorICAgICAgICAgICAgICAgIGJ5dGVbXSBjb25zdHJhaW50RGF0YSwgaW50IG51bWJlck9mQnl0ZXMsIGludCBhcnJheUluZGV4KSB7CisgICAgICAgICAgICBieXRlW10gcmV0dXJuQnl0ZXMgPSBuZXcgYnl0ZVtudW1iZXJPZkJ5dGVzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBhcnJheUluZGV4LCBpID0gMDsgaiA8IGFycmF5SW5kZXggKyBudW1iZXJPZkJ5dGVzOyBqKyssaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuQnl0ZXNbaV0gPSBjb25zdHJhaW50RGF0YVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJldHVybkJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgd2lsbCBwYXJzZSB0aGUgZm9sbG93aW5nIGZvcm1hdAorICAgICAgICAgKiBLZXlMZW5ndGhWYWx1ZUxlbmd0aEtleVZhbHVlS2V5TGVuZ3RoMVZhbHVlTGVuZ3RoMUtleTFWYWx1ZTEuLlwwCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEV4dGVuZGVkTWV0YWRhdGFQYXJzZXIoYnl0ZVtdIGNvbnN0cmFpbnREYXRhKSB7CisgICAgICAgICAgICAvL0V4dHJhY3QgS2V5VmFsdWUgUGFpciBJbmZvLCB0aWxsIHRlcm1pbmF0b3Igb2NjdXJzLgorICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY29uc3RyYWludERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgLy9QYXJzZSBLZXkgTGVuZ3RoCisgICAgICAgICAgICAgICAgaW50IGtleUxlbmd0aCA9IHJlYWRCeXRlKGNvbnN0cmFpbnREYXRhLCBpbmRleCk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKworICAgICAgICAgICAgICAgIC8vUGFyc2UgVmFsdWUgTGVuZ3RoCisgICAgICAgICAgICAgICAgaW50IHZhbHVlTGVuZ3RoID0gcmVhZEJ5dGUoY29uc3RyYWludERhdGEsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICAgICAgLy9GZXRjaCBrZXkKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyS2V5ID0gcmVhZE11bHRpcGxlQnl0ZXMoY29uc3RyYWludERhdGEsIGtleUxlbmd0aCwgaW5kZXgpOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGtleUxlbmd0aDsKKworICAgICAgICAgICAgICAgIC8vRmV0Y2ggVmFsdWUKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSByZWFkTXVsdGlwbGVCeXRlcyhjb25zdHJhaW50RGF0YSwgdmFsdWVMZW5ndGgsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyVmFsdWUuZXF1YWxzKCIgIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyVmFsdWUgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggKz0gdmFsdWVMZW5ndGg7CisgICAgICAgICAgICAgICAgbU1hcC5wdXQoc3RyS2V5LCBzdHJWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBrZXlJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbU1hcC5nZXQoa2V5KTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vUHJvY2Vzc2VkRGF0YS5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vUHJvY2Vzc2VkRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTI2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Qcm9jZXNzZWREYXRhLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kcm07CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIHJlc3VsdCBvZiB0cmFuc2FjdGlvbiBiZXR3ZWVuCisgKiBkZXZpY2UgYW5kIG9ubGluZSBEUk0gc2VydmVyIGJ5IHVzaW5nIHtAbGluayBEcm1NYW5hZ2VyQ2xpZW50I3Byb2Nlc3NEcm1JbmZvKERybUluZm8pfQorICoKKyAqIEluIGxpY2Vuc2UgYWNxdWlzaXRpb24gc2NlbmFyaW8gdGhpcyBjbGFzcyB3b3VsZCBob2xkIHRoZSBiaW5hcnkgZGF0YQorICogb2YgcmlnaHRzIGluZm9ybWF0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NlZERhdGEgeworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1EYXRhOworICAgIHByaXZhdGUgU3RyaW5nIG1BY2NvdW50SWQgPSAiX05PX1VTRVIiOworICAgIHByaXZhdGUgU3RyaW5nIG1TdWJzY3JpcHRpb25JZCA9ICIiOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gY3JlYXRlIFByb2Nlc3NlZERhdGEgb2JqZWN0IHdpdGggZ2l2ZW4gcGFyYW1ldGVycworICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgUmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW0gYWNjb3VudElkIEFjY291bnQgSWQgb2YgdGhlIHVzZXIKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFByb2Nlc3NlZERhdGEoYnl0ZVtdIGRhdGEsIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgbURhdGEgPSBkYXRhOworICAgICAgICBtQWNjb3VudElkID0gYWNjb3VudElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBQcm9jZXNzZWREYXRhIG9iamVjdCB3aXRoIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIFN1YnNjcmlwdGlvbiBJZCBvZiB0aGUgdXNlcgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gUHJvY2Vzc2VkRGF0YShieXRlW10gZGF0YSwgU3RyaW5nIGFjY291bnRJZCwgU3RyaW5nIHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbUFjY291bnRJZCA9IGFjY291bnRJZDsKKyAgICAgICAgbVN1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2VkIGRhdGEgYXMgYSByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJpZ2h0cyBkYXRhIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY2NvdW50LWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBBY2NvdW50IElkIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY291bnRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY2NvdW50SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3Vic2NyaXB0aW9uLWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBTdWJzY3JpcHRpb24gSWQgYXNzb2NpYXRlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtU3Vic2NyaXB0aW9uSWQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vam5pL0FuZHJvaWQubWsgYi9kcm0vam5pL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1ZTRkYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnQuY3BwCisKK0xPQ0FMX01PRFVMRTo9IGxpYmRybWZyYW1ld29ya19qbmkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliZHJtZnJhbWV3b3JrIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKKyAgICBsaWJuYXRpdmVoZWxwZXIgXAorICAgIGxpYmJpbmRlcgorCitpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisgTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKKyBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvZHJtL2puaS9hbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50LmNwcCBiL2RybS9qbmkvYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMTgzOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9qbmkvYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudC5jcHAKQEAgLTAsMCArMSw3OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxKTklIZWxwLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisKKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb0V2ZW50Lmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxEcm1NYW5hZ2VyQ2xpZW50SW1wbC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHVzZWQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgcHJvdmlkZWQgamF2YSBvYmplY3QuCisgKiBNYXkgbmVlZCB0byBhZGQgc29tZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBqYXZhIG9iamVjdC4KKyAqLworY2xhc3MgVXRpbGl0eSB7CitwdWJsaWM6CisgICAgc3RhdGljIFN0cmluZzggZ2V0U3RyaW5nVmFsdWUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBjb25zdCBjaGFyKiBmaWVsZE5hbWUpOworCisgICAgc3RhdGljIGNoYXIqIGdldEJ5dGVBcnJheVZhbHVlKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBjb25zdCBjaGFyKiBmaWVsZE5hbWUsIGludCogZGF0YUxlbmd0aCk7CisKKyAgICBzdGF0aWMgY2hhciogZ2V0Qnl0ZUFycmF5VmFsdWUoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgamJ5dGVBcnJheSBieXRlQXJyYXksIGludCogZGF0YUxlbmd0aCk7CisKKyAgICBzdGF0aWMgU3RyaW5nOCBnZXRTdHJpbmdWYWx1ZShKTklFbnYqIGVudiwganN0cmluZyBzdHJpbmcpOworCisgICAgc3RhdGljIGludCBnZXRJbnRWYWx1ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGNvbnN0IGNoYXIqIGZpZWxkTmFtZSk7Cit9OworCitTdHJpbmc4IFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgY29uc3QgY2hhciogZmllbGROYW1lKSB7CisgICAgU3RyaW5nOCBkYXRhU3RyaW5nKCIiKTsKKworICAgIC8qIExvb2sgZm9yIHRoZSBpbnN0YW5jZSBmaWVsZCB3aXRoIHRoZSBuYW1lIGZpZWxkTmFtZSAqLworICAgIGpmaWVsZElEIGZpZWxkSUQKKyAgICAgICAgPSBlbnYtPkdldEZpZWxkSUQoZW52LT5HZXRPYmplY3RDbGFzcyhvYmplY3QpLCBmaWVsZE5hbWUgLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CisKKyAgICBpZiAoTlVMTCAhPSBmaWVsZElEKSB7CisgICAgICAgIGpzdHJpbmcgdmFsdWVTdHJpbmcgPSAoanN0cmluZykgZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkSUQpOworCisgICAgICAgIGlmIChOVUxMICE9IHZhbHVlU3RyaW5nICYmIHZhbHVlU3RyaW5nICE9IGVudi0+TmV3U3RyaW5nVVRGKCIiKSkgeworICAgICAgICAgICAgY2hhciogYnl0ZXMgPSBjb25zdF9jYXN0PCBjaGFyKiA+IChlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhbHVlU3RyaW5nLCBOVUxMKSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYnl0ZXMpICsgMTsKKyAgICAgICAgICAgIGNoYXIgKmRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICAgICAgc3RybmNweShkYXRhLCBieXRlcywgbGVuZ3RoKTsKKyAgICAgICAgICAgIGRhdGFTdHJpbmcgPSBTdHJpbmc4KGRhdGEpOworCisgICAgICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh2YWx1ZVN0cmluZywgYnl0ZXMpOworICAgICAgICAgICAgZGVsZXRlIFtdIGRhdGE7IGRhdGEgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gdGhlIGZpZWxkICVzIiwgZmllbGROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YVN0cmluZzsKK30KKworU3RyaW5nOCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShKTklFbnYqIGVudiwganN0cmluZyBzdHJpbmcpIHsKKyAgICBTdHJpbmc4IGRhdGFTdHJpbmcoIiIpOworCisgICAgaWYgKE5VTEwgIT0gc3RyaW5nICYmIHN0cmluZyAhPSBlbnYtPk5ld1N0cmluZ1VURigiIikpIHsKKyAgICAgICAgY2hhciogYnl0ZXMgPSBjb25zdF9jYXN0PCBjaGFyKiA+IChlbnYtPkdldFN0cmluZ1VURkNoYXJzKHN0cmluZywgTlVMTCkpOworCisgICAgICAgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYnl0ZXMpICsgMTsKKyAgICAgICAgY2hhciAqZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIHN0cm5jcHkoZGF0YSwgYnl0ZXMsIGxlbmd0aCk7CisgICAgICAgIGRhdGFTdHJpbmcgPSBTdHJpbmc4KGRhdGEpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHN0cmluZywgYnl0ZXMpOworICAgICAgICBkZWxldGUgW10gZGF0YTsgZGF0YSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBkYXRhU3RyaW5nOworfQorCitjaGFyKiBVdGlsaXR5OjpnZXRCeXRlQXJyYXlWYWx1ZSgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgY29uc3QgY2hhciogZmllbGROYW1lLCBpbnQqIGRhdGFMZW5ndGgpIHsKKyAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAqZGF0YUxlbmd0aCA9IDA7CisKKyAgICBqZmllbGRJRCBmaWVsZElEID0gZW52LT5HZXRGaWVsZElEKGVudi0+R2V0T2JqZWN0Q2xhc3Mob2JqZWN0KSwgZmllbGROYW1lICwgIltCIik7CisKKyAgICBpZiAoTlVMTCAhPSBmaWVsZElEKSB7CisgICAgICAgIGpieXRlQXJyYXkgYnl0ZUFycmF5ID0gKGpieXRlQXJyYXkpIGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZElEKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gYnl0ZUFycmF5KSB7CisgICAgICAgICAgICBqaW50IGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYnl0ZUFycmF5KTsKKworICAgICAgICAgICAgKmRhdGFMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICBpZiAoMCA8ICpkYXRhTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgICAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oYnl0ZUFycmF5LCAoamludCkwLCBsZW5ndGgsIChqYnl0ZSAqKSBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YTsKK30KKworY2hhciogVXRpbGl0eTo6Z2V0Qnl0ZUFycmF5VmFsdWUoSk5JRW52KiBlbnYsIGpieXRlQXJyYXkgYnl0ZUFycmF5LCBpbnQqIGRhdGFMZW5ndGgpIHsKKyAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSBieXRlQXJyYXkpIHsKKyAgICAgICAgamludCBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGJ5dGVBcnJheSk7CisKKyAgICAgICAgKmRhdGFMZW5ndGggPSBsZW5ndGg7CisgICAgICAgIGlmICgwIDwgKmRhdGFMZW5ndGgpIHsKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oYnl0ZUFycmF5LCAoamludCkwLCBsZW5ndGgsIChqYnl0ZSAqKSBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YTsKK30KKworaW50IFV0aWxpdHk6OmdldEludFZhbHVlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgY29uc3QgY2hhciogZmllbGROYW1lKSB7CisgICAgamZpZWxkSUQgZmllbGRJRDsKKyAgICBpbnQgaW50VmFsdWUgPSAtMTsKKworICAgIC8qIEdldCBhIHJlZmVyZW5jZSB0byBvYmrigJlzIGNsYXNzICovCisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhvYmplY3QpOworICAgIC8qIExvb2sgZm9yIHRoZSBpbnN0YW5jZSBmaWVsZCB3aXRoIHRoZSBuYW1lIGZpZWxkTmFtZSAqLworICAgIGZpZWxkSUQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosIGZpZWxkTmFtZSAsICJJIik7CisKKyAgICBpZiAoTlVMTCAhPSBmaWVsZElEKSB7CisgICAgICAgIGludFZhbHVlID0gKGludCkgZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkSUQpOworICAgIH0KKworICAgIHJldHVybiBpbnRWYWx1ZTsKK30KKworY2xhc3MgSk5JT25JbmZvTGlzdGVuZXIgOiBwdWJsaWMgRHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXIgeworcHVibGljOgorICAgIEpOSU9uSW5mb0xpc3RlbmVyKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3Qgd2Vha190aGl6KTsKKworICAgIHZpcnR1YWwgfkpOSU9uSW5mb0xpc3RlbmVyKCk7CisgICAgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgSk5JT25JbmZvTGlzdGVuZXIoKTsKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGpvYmplY3QgbU9iamVjdDsKK307CisKK0pOSU9uSW5mb0xpc3RlbmVyOjpKTklPbkluZm9MaXN0ZW5lcihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IHdlYWtfdGhpeikgeworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3ModGhpeik7CisKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQiKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0V4Y2VwdGlvbiIsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIG1PYmplY3QgID0gZW52LT5OZXdHbG9iYWxSZWYod2Vha190aGl6KTsKK30KKworSk5JT25JbmZvTGlzdGVuZXI6On5KTklPbkluZm9MaXN0ZW5lcigpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtT2JqZWN0KTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xhc3MpOworfQorCit2b2lkIEpOSU9uSW5mb0xpc3RlbmVyOjpvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgeworICAgIGppbnQgdW5pcXVlSWQgPSBldmVudC5nZXRVbmlxdWVJZCgpOworICAgIGppbnQgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIG1lc3NhZ2UgPSBlbnYtPk5ld1N0cmluZ1VURihldmVudC5nZXRNZXNzYWdlKCkuc3RyaW5nKCkpOworICAgIExPR1YoIkpOSU9uSW5mb0xpc3RlbmVyOjpvbkluZm8gPT4gJWQgfCAlZCB8ICVzIiwgdW5pcXVlSWQsIHR5cGUsIGV2ZW50LmdldE1lc3NhZ2UoKS5zdHJpbmcoKSk7CisKKyAgICBlbnYtPkNhbGxTdGF0aWNWb2lkTWV0aG9kKAorICAgICAgICAgICAgbUNsYXNzLAorICAgICAgICAgICAgZW52LT5HZXRTdGF0aWNNZXRob2RJRChtQ2xhc3MsICJub3RpZnkiLCAiKExqYXZhL2xhbmcvT2JqZWN0O0lJTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICAgICAgICAgIG1PYmplY3QsIHVuaXF1ZUlkLCB0eXBlLCBtZXNzYWdlKTsKK30KKworc3RhdGljIE11dGV4IHNMb2NrOworCitzdGF0aWMgc3A8RHJtTWFuYWdlckNsaWVudEltcGw+IHNldERybU1hbmFnZXJDbGllbnRJbXBsKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudEltcGw+JiBjbGllbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChzTG9jayk7CisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQiKTsKKyAgICBqZmllbGRJRCBmaWVsZElkID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworCisgICAgc3A8RHJtTWFuYWdlckNsaWVudEltcGw+IG9sZCA9IChEcm1NYW5hZ2VyQ2xpZW50SW1wbCopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZElkKTsKKyAgICBpZiAoY2xpZW50LmdldCgpKSB7CisgICAgICAgIGNsaWVudC0+aW5jU3Ryb25nKHRoaXopOworICAgIH0KKyAgICBpZiAob2xkICE9IDApIHsKKyAgICAgICAgb2xkLT5kZWNTdHJvbmcodGhpeik7CisgICAgfQorICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRJZCwgKGludCljbGllbnQuZ2V0KCkpOworICAgIHJldHVybiBvbGQ7Cit9CisKK3N0YXRpYyBzcDxEcm1NYW5hZ2VyQ2xpZW50SW1wbD4gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKHNMb2NrKTsKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudCIpOworICAgIGpmaWVsZElEIGZpZWxkSWQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisKKyAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbCogY29uc3QgY2xpZW50ID0gKERybU1hbmFnZXJDbGllbnRJbXBsKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkSWQpOworICAgIHJldHVybiBzcDxEcm1NYW5hZ2VyQ2xpZW50SW1wbD4oY2xpZW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9pbml0aWFsaXplKAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqb2JqZWN0IHdlYWtfdGhpeikgeworICAgIExPR1YoImluaXRpYWxpemUgLSBFbnRlciIpOworCisgICAgc3A8RHJtTWFuYWdlckNsaWVudEltcGw+IGRybU1hbmFnZXIgPSBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y3JlYXRlKCZ1bmlxdWVJZCk7CisgICAgZHJtTWFuYWdlci0+YWRkQ2xpZW50KHVuaXF1ZUlkKTsKKworICAgIC8vIFNldCB0aGUgbGlzdGVuZXIgdG8gRHJtTWFuYWdlcgorICAgIHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBKTklPbkluZm9MaXN0ZW5lcihlbnYsIHRoaXosIHdlYWtfdGhpeik7CisgICAgZHJtTWFuYWdlci0+c2V0T25JbmZvTGlzdGVuZXIodW5pcXVlSWQsIGxpc3RlbmVyKTsKKworICAgIHNldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiwgZHJtTWFuYWdlcik7CisgICAgTE9HVigiaW5pdGlhbGl6ZSAtIEV4aXQiKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9maW5hbGl6ZShKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigiZmluYWxpemUgLSBFbnRlciIpOworICAgIERybU1hbmFnZXJDbGllbnRJbXBsOjpyZW1vdmUodW5pcXVlSWQpOworICAgIGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPnNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCBOVUxMKTsKKworICAgIHNwPERybU1hbmFnZXJDbGllbnRJbXBsPiBvbGRDbGllbnQgPSBzZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXosIE5VTEwpOworICAgIGlmIChvbGRDbGllbnQgIT0gTlVMTCkgeworICAgICAgICBvbGRDbGllbnQtPnNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCBOVUxMKTsKKyAgICAgICAgb2xkQ2xpZW50LT5yZW1vdmVDbGllbnQodW5pcXVlSWQpOworICAgIH0KKyAgICBMT0dWKCJmaW5hbGl6ZSAtIEV4aXQiKTsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRDb25zdHJhaW50c0Zyb21Db250ZW50KAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBqcGF0aCwgamludCB1c2FnZSkgeworICAgIExPR1YoIkdldENvbnN0cmFpbnRzIC0gRW50ZXIiKTsKKworICAgIGNvbnN0IFN0cmluZzggcGF0aFN0cmluZyA9IFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwganBhdGgpOworICAgIERybUNvbnN0cmFpbnRzKiBwQ29uc3RyYWludHMKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgJnBhdGhTdHJpbmcsIHVzYWdlKTsKKworICAgIGpjbGFzcyBsb2NhbFJlZiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcyIpOworICAgIGpvYmplY3QgY29uc3RyYWludHMgPSBOVUxMOworCisgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYgJiYgTlVMTCAhPSBwQ29uc3RyYWludHMpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjb25zdHJ1Y3RvciBpZAorICAgICAgICBqbWV0aG9kSUQgY29uc3RydWN0b3JJZCA9IGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICI8aW5pdD4iLCAiKClWIik7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgamF2YSBEcm1Db25zdHJhaW50cyBvYmplY3QKKyAgICAgICAgY29uc3RyYWludHMgPSBlbnYtPk5ld09iamVjdChsb2NhbFJlZiwgY29uc3RydWN0b3JJZCk7CisKKyAgICAgICAgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yIGtleUl0ID0gcENvbnN0cmFpbnRzLT5rZXlJdGVyYXRvcigpOworCisgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworCisgICAgICAgICAgICAvLyBpbnNlcnQgdGhlIGVudHJ5PGNvbnN0cmFpbnRLZXksIGNvbnN0cmFpbnRWYWx1ZT4gdG8gbmV3bHkgY3JlYXRlZCBqYXZhIG9iamVjdAorICAgICAgICAgICAgaWYgKERybUNvbnN0cmFpbnRzOjpFWFRFTkRFRF9NRVRBREFUQSA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSA9IHBDb25zdHJhaW50cy0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBkYXRhQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShzdHJsZW4odmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YUFycmF5LCAwLCBzdHJsZW4odmFsdWUpLCAoamJ5dGUqKXZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLCBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAicHV0IiwgIihMamF2YS9sYW5nL1N0cmluZztbQilWIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoa2V5LnN0cmluZygpKSwgZGF0YUFycmF5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBwQ29uc3RyYWludHMtPmdldChrZXkpOworICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAicHV0IiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspViIpLAorICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGtleS5zdHJpbmcoKSksIGVudi0+TmV3U3RyaW5nVVRGKHZhbHVlLnN0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgcENvbnN0cmFpbnRzOyBwQ29uc3RyYWludHMgPSBOVUxMOworICAgIExPR1YoIkdldENvbnN0cmFpbnRzIC0gRXhpdCIpOworICAgIHJldHVybiBjb25zdHJhaW50czsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRNZXRhZGF0YUZyb21Db250ZW50KAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBqcGF0aCkgeworICAgIExPR1YoIkdldE1ldGFkYXRhIC0gRW50ZXIiKTsKKyAgICBjb25zdCBTdHJpbmc4IHBhdGhTdHJpbmcgPSBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGpwYXRoKTsKKyAgICBEcm1NZXRhZGF0YSogcE1ldGFkYXRhID0KKyAgICAgICAgICAgIGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPmdldE1ldGFkYXRhKHVuaXF1ZUlkLCAmcGF0aFN0cmluZyk7CisKKyAgICBqb2JqZWN0IG1ldGFkYXRhID0gTlVMTDsKKworICAgIGpjbGFzcyBsb2NhbFJlZiA9IE5VTEw7CisgICAgbG9jYWxSZWYgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMiKTsKKyAgICBpZiAoTlVMTCAhPSBsb2NhbFJlZiAmJiBOVUxMICE9IHBNZXRhZGF0YSkgeworICAgICAgICAvLyBHZXQgdGhlIGNvbnN0cnVjdG9yIGlkCisgICAgICAgIGptZXRob2RJRCBjb25zdHJ1Y3RvcklkID0gTlVMTDsKKyAgICAgICAgY29uc3RydWN0b3JJZCA9IGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICI8aW5pdD4iLCAiKClWIik7CisgICAgICAgIGlmIChOVUxMICE9IGNvbnN0cnVjdG9ySWQpIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgamF2YSBEcm1NZXRhZGF0YSBvYmplY3QKKyAgICAgICAgICAgIG1ldGFkYXRhID0gZW52LT5OZXdPYmplY3QobG9jYWxSZWYsIGNvbnN0cnVjdG9ySWQpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3Iga2V5SXQgPSBwTWV0YWRhdGEtPmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBlbnRyeTxjb25zdHJhaW50S2V5LCBjb25zdHJhaW50VmFsdWU+CisgICAgICAgICAgICAgICAgICAgIC8vIHRvIG5ld2x5IGNyZWF0ZWQgamF2YSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IHBNZXRhZGF0YS0+Z2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobWV0YWRhdGEsIGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICJwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoa2V5LnN0cmluZygpKSwgZW52LT5OZXdTdHJpbmdVVEYodmFsdWUuc3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIHBNZXRhZGF0YTsgcE1ldGFkYXRhID0gTlVMTDsKKyAgICBMT0dWKCJHZXRNZXRhZGF0YSAtIEV4aXQiKTsKKyAgICByZXR1cm4gbWV0YWRhdGE7Cit9CisKK3N0YXRpYyBqb2JqZWN0QXJyYXkgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dWKCJHZXRBbGxTdXBwb3J0SW5mbyAtIEVudGVyIik7CisgICAgRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvQXJyYXkgPSBOVUxMOworCisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KS0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsICZsZW5ndGgsICZkcm1TdXBwb3J0SW5mb0FycmF5KTsKKworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1TdXBwb3J0SW5mbyIpOworCisgICAgam9iamVjdEFycmF5IGFycmF5ID0gKGpvYmplY3RBcnJheSllbnYtPk5ld09iamVjdEFycmF5KGxlbmd0aCwgY2xhenosIE5VTEwpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBEcm1TdXBwb3J0SW5mbyBpbmZvID0gZHJtU3VwcG9ydEluZm9BcnJheVtpXTsKKworICAgICAgICBqb2JqZWN0IGRybVN1cHBvcnRJbmZvID0gZW52LT5OZXdPYmplY3QoY2xhenosIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKClWIikpOworCisgICAgICAgIGptZXRob2RJRCBhZGRNaW1lVHlwZUlkCisgICAgICAgICAgICA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJhZGRNaW1lVHlwZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICAgICAgam1ldGhvZElEIGFkZEZpbGVTdWZmaXhJZAorICAgICAgICAgICAgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiYWRkRmlsZVN1ZmZpeCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKworICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKAorICAgICAgICAgICAgZHJtU3VwcG9ydEluZm8sIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXREZXNjcmlwdGlvbiIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGluZm8uZ2V0RGVzY3JpcHRpb24oKS5zdHJpbmcoKSkpOworCisgICAgICAgIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5mby5nZXRNaW1lVHlwZUl0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggIHZhbHVlID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkcm1TdXBwb3J0SW5mbywgYWRkTWltZVR5cGVJZCwgZW52LT5OZXdTdHJpbmdVVEYodmFsdWUuc3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3IgaXQgPSBpbmZvLmdldEZpbGVTdWZmaXhJdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gaXQubmV4dCgpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCgKKyAgICAgICAgICAgICAgICBkcm1TdXBwb3J0SW5mbywgYWRkRmlsZVN1ZmZpeElkLCBlbnYtPk5ld1N0cmluZ1VURih2YWx1ZS5zdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyYXksIGksIGRybVN1cHBvcnRJbmZvKTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gZHJtU3VwcG9ydEluZm9BcnJheTsgZHJtU3VwcG9ydEluZm9BcnJheSA9IE5VTEw7CisgICAgTE9HVigiR2V0QWxsU3VwcG9ydEluZm8gLSBFeGl0Iik7CisgICAgcmV0dXJuIGFycmF5OworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2luc3RhbGxEcm1FbmdpbmUoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIGVuZ2luZUZpbGVQYXRoKSB7CisgICAgTE9HVigiaW5zdGFsbERybUVuZ2luZSAtIEVudGVyIik7CisgICAgLy9nZXREcm1NYW5hZ2VyQ2xpZW50KGVudiwgdGhpeikKKyAgICAvLyAgLT5pbnN0YWxsRHJtRW5naW5lKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGVuZ2luZUZpbGVQYXRoKSk7CisgICAgTE9HVigiaW5zdGFsbERybUVuZ2luZSAtIEV4aXQiKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9zYXZlUmlnaHRzKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwKKyAgICAgICAgICAgIGpvYmplY3QgZHJtUmlnaHRzLCBqc3RyaW5nIHJpZ2h0c1BhdGgsIGpzdHJpbmcgY29udGVudFBhdGgpIHsKKyAgICBMT0dWKCJzYXZlUmlnaHRzIC0gRW50ZXIiKTsKKyAgICBpbnQgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgIGNoYXIqIG1EYXRhID0gIFV0aWxpdHk6OmdldEJ5dGVBcnJheVZhbHVlKGVudiwgZHJtUmlnaHRzLCAibURhdGEiLCAmZGF0YUxlbmd0aCk7CisKKyAgICBpZiAoTlVMTCAhPSBtRGF0YSkgeworICAgICAgICBEcm1SaWdodHMgcmlnaHRzKERybUJ1ZmZlcihtRGF0YSwgZGF0YUxlbmd0aCksCisgICAgICAgICAgICAgICAgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBkcm1SaWdodHMsICJtTWltZVR5cGUiKSwKKyAgICAgICAgICAgICAgICBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGRybVJpZ2h0cywgIm1BY2NvdW50SWQiKSwKKyAgICAgICAgICAgICAgICBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGRybVJpZ2h0cywgIm1TdWJzY3JpcHRpb25JZCIpKTsKKyAgICAgICAgcmVzdWx0ID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KQorICAgICAgICAgICAgLT5zYXZlUmlnaHRzKHVuaXF1ZUlkLCByaWdodHMsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcmlnaHRzUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgY29udGVudFBhdGgpKTsKKyAgICB9CisKKyAgICBkZWxldGUgbURhdGE7IG1EYXRhID0gTlVMTDsKKyAgICBMT0dWKCJzYXZlUmlnaHRzIC0gRXhpdCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2NhbkhhbmRsZSgKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpzdHJpbmcgcGF0aCwganN0cmluZyBtaW1lVHlwZSkgeworICAgIExPR1YoImNhbkhhbmRsZSAtIEVudGVyIik7CisgICAgamJvb2xlYW4gcmVzdWx0CisgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KQorICAgICAgICAgICAgLT5jYW5IYW5kbGUodW5pcXVlSWQsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcGF0aCksCisgICAgICAgICAgICAgICAgICAgIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgbWltZVR5cGUpKTsKKyAgICBMT0dWKCJjYW5IYW5kbGUgLSBFeGl0Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9wcm9jZXNzRHJtSW5mbygKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQsIGpvYmplY3QgZHJtSW5mb09iamVjdCkgeworICAgIExPR1YoInByb2Nlc3NEcm1JbmZvIC0gRW50ZXIiKTsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IDA7CisgICAgY29uc3QgU3RyaW5nOCBtTWltZVR5cGUgPSAgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBkcm1JbmZvT2JqZWN0LCAibU1pbWVUeXBlIik7CisgICAgY2hhciogbURhdGEgPSAgVXRpbGl0eTo6Z2V0Qnl0ZUFycmF5VmFsdWUoZW52LCBkcm1JbmZvT2JqZWN0LCAibURhdGEiLCAmZGF0YUxlbmd0aCk7CisgICAgaW50IG1JbmZvVHlwZSA9IFV0aWxpdHk6OmdldEludFZhbHVlKGVudiwgZHJtSW5mb09iamVjdCwgIm1JbmZvVHlwZSIpOworCisgICAgY29uc3QgRHJtQnVmZmVyIGJ1ZmZlcihtRGF0YSwgZGF0YUxlbmd0aCk7CisgICAgRHJtSW5mbyBkcm1JbmZvKG1JbmZvVHlwZSwgYnVmZmVyLCBtTWltZVR5cGUpOworCisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybUluZm8iKTsKKyAgICBqb2JqZWN0IGtleUl0ZXJhdG9yCisgICAgICAgID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGRybUluZm9PYmplY3QsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImtleUl0ZXJhdG9yIiwgIigpTGphdmEvdXRpbC9JdGVyYXRvcjsiKSk7CisKKyAgICBqbWV0aG9kSUQgaGFzTmV4dElkID0gZW52LT5HZXRNZXRob2RJRChlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL0l0ZXJhdG9yIiksICJoYXNOZXh0IiwgIigpWiIpOworCisgICAgd2hpbGUgKGVudi0+Q2FsbEJvb2xlYW5NZXRob2Qoa2V5SXRlcmF0b3IsIGhhc05leHRJZCkpIHsKKyAgICAgICAganN0cmluZyBrZXkgPSAoanN0cmluZykgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGtleUl0ZXJhdG9yLAorICAgICAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoZW52LT5GaW5kQ2xhc3MoImphdmEvdXRpbC9JdGVyYXRvciIpLAorICAgICAgICAgICAgICAgICJuZXh0IiwgIigpTGphdmEvbGFuZy9PYmplY3Q7IikpOworCisgICAgICAgIGpvYmplY3QgdmFsdWVPYmplY3QgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoZHJtSW5mb09iamVjdCwKKyAgICAgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7IiksIGtleSk7CisKKyAgICAgICAganN0cmluZyB2YWxTdHJpbmcgPSBOVUxMOworICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZU9iamVjdCkgeworICAgICAgICAgICAgdmFsU3RyaW5nID0gKGpzdHJpbmcpIGVudi0+Q2FsbE9iamVjdE1ldGhvZCh2YWx1ZU9iamVjdCwKKyAgICAgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT2JqZWN0IiksCisgICAgICAgICAgICAgICAgInRvU3RyaW5nIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IikpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCBrZXlTdHJpbmcgPSBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIGtleSk7CisgICAgICAgIFN0cmluZzggdmFsdWVTdHJpbmcgPSBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIHZhbFN0cmluZyk7CisgICAgICAgIExPR1YoIktleTogJXMgfCBWYWx1ZTogJXMiLCBrZXlTdHJpbmcuc3RyaW5nKCksIHZhbHVlU3RyaW5nLnN0cmluZygpKTsKKworICAgICAgICBkcm1JbmZvLnB1dChrZXlTdHJpbmcsIHZhbHVlU3RyaW5nKTsKKyAgICB9CisKKyAgICBEcm1JbmZvU3RhdHVzKiBwRHJtSW5mb1N0YXR1cworICAgICAgICA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPnByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCAmZHJtSW5mbyk7CisKKyAgICBqY2xhc3MgbG9jYWxSZWYgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtSW5mb1N0YXR1cyIpOworICAgIGpvYmplY3QgZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSBsb2NhbFJlZiAmJiBOVUxMICE9IHBEcm1JbmZvU3RhdHVzKSB7CisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcERybUluZm9TdGF0dXMtPnN0YXR1c0NvZGU7CisgICAgICAgIGludCBpbmZvVHlwZSA9IHBEcm1JbmZvU3RhdHVzLT5pbmZvVHlwZTsKKworICAgICAgICBqYnl0ZUFycmF5IGRhdGFBcnJheSA9IE5VTEw7CisgICAgICAgIGlmIChOVUxMICE9IHBEcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXIpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwRHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyLT5sZW5ndGg7CisgICAgICAgICAgICBkYXRhQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShsZW5ndGgpOworICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgZGF0YUFycmF5LCAwLCBsZW5ndGgsIChqYnl0ZSopIHBEcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXItPmRhdGEpOworCisgICAgICAgICAgICBkZWxldGUgW10gcERybUluZm9TdGF0dXMtPmRybUJ1ZmZlci0+ZGF0YTsKKyAgICAgICAgICAgIGRlbGV0ZSBwRHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyOyBwRHJtSW5mb1N0YXR1cy0+ZHJtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vUHJvY2Vzc2VkRGF0YSIpOworICAgICAgICBqbWV0aG9kSUQgY29uc3RydWN0b3JJZAorICAgICAgICAgICAgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiPGluaXQ+IiwgIihbQkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgICAgIGpvYmplY3QgcHJvY2Vzc2VkRGF0YSA9IGVudi0+TmV3T2JqZWN0KGNsYXp6LCBjb25zdHJ1Y3RvcklkLCBkYXRhQXJyYXksCisgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKChkcm1JbmZvLmdldChEcm1JbmZvUmVxdWVzdDo6QUNDT1VOVF9JRCkpLnN0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoKGRybUluZm8uZ2V0KERybUluZm9SZXF1ZXN0OjpTVUJTQ1JJUFRJT05fSUQpKS5zdHJpbmcoKSkpOworCisgICAgICAgIGNvbnN0cnVjdG9ySWQKKyAgICAgICAgICAgID0gZW52LT5HZXRNZXRob2RJRChsb2NhbFJlZiwKKyAgICAgICAgICAgICAgICAiPGluaXQ+IiwgIihJSUxhbmRyb2lkL2RybS9Qcm9jZXNzZWREYXRhO0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisKKyAgICAgICAgZHJtSW5mb1N0YXR1cyA9IGVudi0+TmV3T2JqZWN0KGxvY2FsUmVmLCBjb25zdHJ1Y3RvcklkLCBzdGF0dXNDb2RlLCBpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhLCBlbnYtPk5ld1N0cmluZ1VURihwRHJtSW5mb1N0YXR1cy0+bWltZVR5cGUuc3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBkZWxldGUgbURhdGE7IG1EYXRhID0gTlVMTDsKKyAgICBkZWxldGUgcERybUluZm9TdGF0dXM7IHBEcm1JbmZvU3RhdHVzID0gTlVMTDsKKworICAgIExPR1YoInByb2Nlc3NEcm1JbmZvIC0gRXhpdCIpOworICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOworfQorCitzdGF0aWMgam9iamVjdCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2FjcXVpcmVEcm1JbmZvKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwgam9iamVjdCBkcm1JbmZvUmVxdWVzdCkgeworICAgIExPR1YoImFjcXVpcmVEcm1JbmZvIEVudGVyIik7CisgICAgY29uc3QgU3RyaW5nOCBtTWltZVR5cGUgPSAgVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBkcm1JbmZvUmVxdWVzdCwgIm1NaW1lVHlwZSIpOworICAgIGludCBtSW5mb1R5cGUgPSBVdGlsaXR5OjpnZXRJbnRWYWx1ZShlbnYsIGRybUluZm9SZXF1ZXN0LCAibUluZm9UeXBlIik7CisKKyAgICBEcm1JbmZvUmVxdWVzdCBkcm1JbmZvUmVxKG1JbmZvVHlwZSwgbU1pbWVUeXBlKTsKKworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1JbmZvUmVxdWVzdCIpOworICAgIGpvYmplY3Qga2V5SXRlcmF0b3IKKyAgICAgICAgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoZHJtSW5mb1JlcXVlc3QsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImtleUl0ZXJhdG9yIiwgIigpTGphdmEvdXRpbC9JdGVyYXRvcjsiKSk7CisKKyAgICBqbWV0aG9kSUQgaGFzTmV4dElkID0gZW52LT5HZXRNZXRob2RJRChlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL0l0ZXJhdG9yIiksICJoYXNOZXh0IiwgIigpWiIpOworCisgICAgd2hpbGUgKGVudi0+Q2FsbEJvb2xlYW5NZXRob2Qoa2V5SXRlcmF0b3IsIGhhc05leHRJZCkpIHsKKyAgICAgICAganN0cmluZyBrZXkKKyAgICAgICAgICAgID0gKGpzdHJpbmcpIGVudi0+Q2FsbE9iamVjdE1ldGhvZChrZXlJdGVyYXRvciwKKyAgICAgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvSXRlcmF0b3IiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLCAiKClMamF2YS9sYW5nL09iamVjdDsiKSk7CisKKyAgICAgICAganN0cmluZyB2YWx1ZSA9IChqc3RyaW5nKSBlbnYtPkNhbGxPYmplY3RNZXRob2QoZHJtSW5mb1JlcXVlc3QsCisgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OyIpLCBrZXkpOworCisgICAgICAgIFN0cmluZzgga2V5U3RyaW5nID0gVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCBrZXkpOworICAgICAgICBTdHJpbmc4IHZhbHVlU3RyaW5nID0gVXRpbGl0eTo6Z2V0U3RyaW5nVmFsdWUoZW52LCB2YWx1ZSk7CisgICAgICAgIExPR1YoIktleTogJXMgfCBWYWx1ZTogJXMiLCBrZXlTdHJpbmcuc3RyaW5nKCksIHZhbHVlU3RyaW5nLnN0cmluZygpKTsKKworICAgICAgICBkcm1JbmZvUmVxLnB1dChrZXlTdHJpbmcsIHZhbHVlU3RyaW5nKTsKKyAgICB9CisKKyAgICBEcm1JbmZvKiBwRHJtSW5mbyA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeiktPmFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCAmZHJtSW5mb1JlcSk7CisKKyAgICBqb2JqZWN0IGRybUluZm9PYmplY3QgPSBOVUxMOworCisgICAgaWYgKE5VTEwgIT0gcERybUluZm8pIHsKKyAgICAgICAgamNsYXNzIGxvY2FsUmVmID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybUluZm8iKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBsb2NhbFJlZikgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHBEcm1JbmZvLT5nZXREYXRhKCkubGVuZ3RoOworCisgICAgICAgICAgICBqYnl0ZUFycmF5IGRhdGFBcnJheSA9IGVudi0+TmV3Qnl0ZUFycmF5KGxlbmd0aCk7CisgICAgICAgICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihkYXRhQXJyYXksIDAsIGxlbmd0aCwgKGpieXRlKilwRHJtSW5mby0+Z2V0RGF0YSgpLmRhdGEpOworCisgICAgICAgICAgICBkcm1JbmZvT2JqZWN0CisgICAgICAgICAgICAgICAgPSBlbnYtPk5ld09iamVjdChsb2NhbFJlZiwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChsb2NhbFJlZiwgIjxpbml0PiIsICIoSVtCTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICAgICAgICAgICAgICAgICAgbUluZm9UeXBlLCBkYXRhQXJyYXksIGVudi0+TmV3U3RyaW5nVVRGKHBEcm1JbmZvLT5nZXRNaW1lVHlwZSgpLnN0cmluZygpKSk7CisKKyAgICAgICAgICAgIERybUluZm86OktleUl0ZXJhdG9yIGl0ID0gcERybUluZm8tPmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICBqbWV0aG9kSUQgcHV0TWV0aG9kSWQKKyAgICAgICAgICAgICAgICA9IGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICJwdXQiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWIik7CisKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gcERybUluZm8tPmdldChrZXkpOworCisgICAgICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkcm1JbmZvT2JqZWN0LCBwdXRNZXRob2RJZCwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoa2V5LnN0cmluZygpKSwgZW52LT5OZXdTdHJpbmdVVEYodmFsdWUuc3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgW10gcERybUluZm8tPmdldERhdGEoKS5kYXRhOworICAgIH0KKworICAgIGRlbGV0ZSBwRHJtSW5mbzsgcERybUluZm8gPSBOVUxMOworCisgICAgTE9HVigiYWNxdWlyZURybUluZm8gRXhpdCIpOworICAgIHJldHVybiBkcm1JbmZvT2JqZWN0OworfQorCitzdGF0aWMgamludCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2dldERybU9iamVjdFR5cGUoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIHBhdGgsIGpzdHJpbmcgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJnZXREcm1PYmplY3RUeXBlIEVudGVyIik7CisgICAgaW50IGRybU9iamVjdFR5cGUKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopCisgICAgICAgICAgICAtPmdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgbWltZVR5cGUpKTsKKyAgICBMT0dWKCJnZXREcm1PYmplY3RUeXBlIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtT2JqZWN0VHlwZTsKK30KKworc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRPcmlnaW5hbE1pbWVUeXBlKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwganN0cmluZyBwYXRoKSB7CisgICAgTE9HVigiZ2V0T3JpZ2luYWxNaW1lVHlwZSBFbnRlciIpOworICAgIFN0cmluZzggbWltZVR5cGUKKyAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopCisgICAgICAgICAgICAtPmdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcGF0aCkpOworICAgIExPR1YoImdldE9yaWdpbmFsTWltZVR5cGUgRXhpdCIpOworICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihtaW1lVHlwZS5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfY2hlY2tSaWdodHNTdGF0dXMoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJnZXRPcmlnaW5hbE1pbWVUeXBlIEVudGVyIik7CisgICAgaW50IHJpZ2h0c1N0YXR1cworICAgICAgICA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeikKKyAgICAgICAgICAgIC0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcGF0aCksIGFjdGlvbik7CisgICAgTE9HVigiZ2V0T3JpZ2luYWxNaW1lVHlwZSBFeGl0Iik7CisgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9yZW1vdmVSaWdodHMoCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKCJyZW1vdmVSaWdodHMiKTsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KQorICAgICAgICAgICAgICAgLT5yZW1vdmVSaWdodHModW5pcXVlSWQsIFV0aWxpdHk6OmdldFN0cmluZ1ZhbHVlKGVudiwgcGF0aCkpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X3JlbW92ZUFsbFJpZ2h0cygKKyAgICAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dWKCJyZW1vdmVBbGxSaWdodHMiKTsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KS0+cmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9vcGVuQ29udmVydFNlc3Npb24oCisgICAgICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHVuaXF1ZUlkLCBqc3RyaW5nIG1pbWVUeXBlKSB7CisgICAgTE9HVigib3BlbkNvbnZlcnRTZXNzaW9uIEVudGVyIik7CisgICAgaW50IGNvbnZlcnRJZAorICAgICAgICA9IGdldERybU1hbmFnZXJDbGllbnRJbXBsKGVudiwgdGhpeikKKyAgICAgICAgICAgIC0+b3BlbkNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBVdGlsaXR5OjpnZXRTdHJpbmdWYWx1ZShlbnYsIG1pbWVUeXBlKSk7CisgICAgTE9HVigib3BlbkNvbnZlcnRTZXNzaW9uIEV4aXQiKTsKKyAgICByZXR1cm4gY29udmVydElkOworfQorCitzdGF0aWMgam9iamVjdCBhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2NvbnZlcnREYXRhKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCB1bmlxdWVJZCwgamludCBjb252ZXJ0SWQsIGpieXRlQXJyYXkgaW5wdXREYXRhKSB7CisgICAgTE9HVigiY29udmVydERhdGEgRW50ZXIiKTsKKworICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICBjaGFyKiBtRGF0YSA9IFV0aWxpdHk6OmdldEJ5dGVBcnJheVZhbHVlKGVudiwgaW5wdXREYXRhLCAmZGF0YUxlbmd0aCk7CisgICAgY29uc3QgRHJtQnVmZmVyIGJ1ZmZlcihtRGF0YSwgZGF0YUxlbmd0aCk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIHBEcm1Db252ZXJ0ZWRTdGF0dXMKKyAgICAgICAgICAgID0gZ2V0RHJtTWFuYWdlckNsaWVudEltcGwoZW52LCB0aGl6KS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgJmJ1ZmZlcik7CisKKyAgICBqY2xhc3MgbG9jYWxSZWYgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kcm0vRHJtQ29udmVydGVkU3RhdHVzIik7CisKKyAgICBqb2JqZWN0IGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSBsb2NhbFJlZiAmJiBOVUxMICE9IHBEcm1Db252ZXJ0ZWRTdGF0dXMpIHsKKyAgICAgICAgaW50IHN0YXR1c0NvZGUgPSBwRHJtQ29udmVydGVkU3RhdHVzLT5zdGF0dXNDb2RlOworCisgICAgICAgIGpieXRlQXJyYXkgZGF0YUFycmF5ID0gTlVMTDsKKyAgICAgICAgaWYgKE5VTEwgIT0gcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YSkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEtPmxlbmd0aDsKKyAgICAgICAgICAgIGRhdGFBcnJheSA9IGVudi0+TmV3Qnl0ZUFycmF5KGxlbmd0aCk7CisgICAgICAgICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihkYXRhQXJyYXksIDAsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhLT5kYXRhKTsKKworICAgICAgICAgICAgZGVsZXRlIFtdIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEtPmRhdGE7CisgICAgICAgICAgICBkZWxldGUgcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YTsgcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgam1ldGhvZElEIGNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGxvY2FsUmVmLCAiPGluaXQ+IiwgIihJW0JJKVYiKTsKKyAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGVudi0+TmV3T2JqZWN0KGxvY2FsUmVmLCBjb25zdHJ1Y3RvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLCBkYXRhQXJyYXksIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPm9mZnNldCk7CisgICAgfQorCisgICAgZGVsZXRlIG1EYXRhOyBtRGF0YSA9IE5VTEw7CisgICAgZGVsZXRlIHBEcm1Db252ZXJ0ZWRTdGF0dXM7IHBEcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgTE9HVigiY29udmVydERhdGEgLSBFeGl0Iik7CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jbG9zZUNvbnZlcnRTZXNzaW9uKAorICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgaW50IHVuaXF1ZUlkLCBqaW50IGNvbnZlcnRJZCkgeworCisgICAgTE9HVigiY2xvc2VDb252ZXJ0U2Vzc2lvbiBFbnRlciIpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBwRHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICAgICAgPSBnZXREcm1NYW5hZ2VyQ2xpZW50SW1wbChlbnYsIHRoaXopLT5jbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOworCisgICAgamNsYXNzIGxvY2FsUmVmID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZHJtL0RybUNvbnZlcnRlZFN0YXR1cyIpOworCisgICAgam9iamVjdCBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKE5VTEwgIT0gbG9jYWxSZWYgJiYgTlVMTCAhPSBwRHJtQ29udmVydGVkU3RhdHVzKSB7CisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcERybUNvbnZlcnRlZFN0YXR1cy0+c3RhdHVzQ29kZTsKKworICAgICAgICBqYnl0ZUFycmF5IGRhdGFBcnJheSA9IE5VTEw7CisgICAgICAgIGlmIChOVUxMICE9IHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhLT5sZW5ndGg7CisgICAgICAgICAgICBkYXRhQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShsZW5ndGgpOworICAgICAgICAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgZGF0YUFycmF5LCAwLCBsZW5ndGgsIChqYnl0ZSopIHBEcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEtPmRhdGEpOworCisgICAgICAgICAgICBkZWxldGUgW10gcERybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YS0+ZGF0YTsKKyAgICAgICAgICAgIGRlbGV0ZSBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhOyBwRHJtQ29udmVydGVkU3RhdHVzLT5jb252ZXJ0ZWREYXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBqbWV0aG9kSUQgY29uc3RydWN0b3JJZCA9IGVudi0+R2V0TWV0aG9kSUQobG9jYWxSZWYsICI8aW5pdD4iLCAiKElbQkkpViIpOworICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMKKyAgICAgICAgICAgID0gZW52LT5OZXdPYmplY3QobG9jYWxSZWYsIGNvbnN0cnVjdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGRhdGFBcnJheSwgcERybUNvbnZlcnRlZFN0YXR1cy0+b2Zmc2V0KTsKKyAgICB9CisKKyAgICBkZWxldGUgcERybUNvbnZlcnRlZFN0YXR1czsgcERybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBMT0dWKCJjbG9zZUNvbnZlcnRTZXNzaW9uIC0gRXhpdCIpOworICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbmF0aXZlTWV0aG9kc1tdID0geworCisgICAgeyJfaW5pdGlhbGl6ZSIsICIoSUxqYXZhL2xhbmcvT2JqZWN0OylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2luaXRpYWxpemV9LAorCisgICAgeyJfZmluYWxpemUiLCAiKEkpViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9maW5hbGl6ZX0sCisKKyAgICB7Il9nZXRDb25zdHJhaW50cyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0kpTGFuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRDb25zdHJhaW50c0Zyb21Db250ZW50fSwKKworICAgIHsiX2dldE1ldGFkYXRhIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlczsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0TWV0YWRhdGFGcm9tQ29udGVudH0sCisKKyAgICB7Il9nZXRBbGxTdXBwb3J0SW5mbyIsICIoSSlbTGFuZHJvaWQvZHJtL0RybVN1cHBvcnRJbmZvOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRBbGxTdXBwb3J0SW5mb30sCisKKyAgICB7Il9pbnN0YWxsRHJtRW5naW5lIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfaW5zdGFsbERybUVuZ2luZX0sCisKKyAgICB7Il9jYW5IYW5kbGUiLCAiKElMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9jYW5IYW5kbGV9LAorCisgICAgeyJfcHJvY2Vzc0RybUluZm8iLCAiKElMYW5kcm9pZC9kcm0vRHJtSW5mbzspTGFuZHJvaWQvZHJtL0RybUluZm9TdGF0dXM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X3Byb2Nlc3NEcm1JbmZvfSwKKworICAgIHsiX2FjcXVpcmVEcm1JbmZvIiwgIihJTGFuZHJvaWQvZHJtL0RybUluZm9SZXF1ZXN0OylMYW5kcm9pZC9kcm0vRHJtSW5mbzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfYWNxdWlyZURybUluZm99LAorCisgICAgeyJfc2F2ZVJpZ2h0cyIsICIoSUxhbmRyb2lkL2RybS9Ecm1SaWdodHM7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfc2F2ZVJpZ2h0c30sCisKKyAgICB7Il9nZXREcm1PYmplY3RUeXBlIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfZ2V0RHJtT2JqZWN0VHlwZX0sCisKKyAgICB7Il9nZXRPcmlnaW5hbE1pbWVUeXBlIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9nZXRPcmlnaW5hbE1pbWVUeXBlfSwKKworICAgIHsiX2NoZWNrUmlnaHRzU3RhdHVzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2NoZWNrUmlnaHRzU3RhdHVzfSwKKworICAgIHsiX3JlbW92ZVJpZ2h0cyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X3JlbW92ZVJpZ2h0c30sCisKKyAgICB7Il9yZW1vdmVBbGxSaWdodHMiLCAiKEkpSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9kcm1fRHJtTWFuYWdlckNsaWVudF9yZW1vdmVBbGxSaWdodHN9LAorCisgICAgeyJfb3BlbkNvbnZlcnRTZXNzaW9uIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfZHJtX0RybU1hbmFnZXJDbGllbnRfb3BlbkNvbnZlcnRTZXNzaW9ufSwKKworICAgIHsiX2NvbnZlcnREYXRhIiwgIihJSVtCKUxhbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2NvbnZlcnREYXRhfSwKKworICAgIHsiX2Nsb3NlQ29udmVydFNlc3Npb24iLCAiKElJKUxhbmRyb2lkL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX2RybV9Ecm1NYW5hZ2VyQ2xpZW50X2Nsb3NlQ29udmVydFNlc3Npb259LAorfTsKKworc3RhdGljIGludCByZWdpc3Rlck5hdGl2ZU1ldGhvZHMoSk5JRW52KiBlbnYpIHsKKyAgICBpbnQgcmVzdWx0ID0gLTE7CisKKyAgICAvKiBsb29rIHVwIHRoZSBjbGFzcyAqLworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50Iik7CisKKyAgICBpZiAoTlVMTCAhPSBjbGF6eikgeworICAgICAgICBpZiAoZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIG5hdGl2ZU1ldGhvZHMsIHNpemVvZihuYXRpdmVNZXRob2RzKQorICAgICAgICAgICAgICAgIC8gc2l6ZW9mKG5hdGl2ZU1ldGhvZHNbMF0pKSA9PSBKTklfT0spIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGppbnQgcmVzdWx0ID0gLTE7CisKKyAgICBpZiAodm0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzQpID09IEpOSV9PSykgeworICAgICAgICBpZiAoTlVMTCAhPSBlbnYgJiYgcmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudikgPT0gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gSk5JX1ZFUlNJT05fMV80OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEzM2JhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgXAorICAgIERybU1hbmFnZXJDbGllbnQuY3BwCisKK0xPQ0FMX01PRFVMRTo9IGxpYmRybWZyYW1ld29yaworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyCisKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmRybWZyYW1ld29ya2NvbW1vbgorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMDBjMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgorCisjaW5jbHVkZSAiRHJtTWFuYWdlckNsaWVudEltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybU1hbmFnZXJDbGllbnQ6OkRybU1hbmFnZXJDbGllbnQoKToKKyAgICAgICAgbVVuaXF1ZUlkKDApLCBtRHJtTWFuYWdlckNsaWVudEltcGwoTlVMTCkgeworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbCA9IERybU1hbmFnZXJDbGllbnRJbXBsOjpjcmVhdGUoJm1VbmlxdWVJZCk7CisgICAgbURybU1hbmFnZXJDbGllbnRJbXBsLT5hZGRDbGllbnQobVVuaXF1ZUlkKTsKK30KKworRHJtTWFuYWdlckNsaWVudDo6fkRybU1hbmFnZXJDbGllbnQoKSB7CisgICAgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZShtVW5pcXVlSWQpOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cmVtb3ZlQ2xpZW50KG1VbmlxdWVJZCk7CisgICAgbURybU1hbmFnZXJDbGllbnRJbXBsLT5zZXRPbkluZm9MaXN0ZW5lcihtVW5pcXVlSWQsIE5VTEwpOworICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudEltcGw7IG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbCA9IE5VTEw7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNldE9uSW5mb0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnNldE9uSW5mb0xpc3RlbmVyKG1VbmlxdWVJZCwgaW5mb0xpc3RlbmVyKTsKK30KKworRHJtQ29uc3RyYWludHMqIERybU1hbmFnZXJDbGllbnQ6OmdldENvbnN0cmFpbnRzKGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXRDb25zdHJhaW50cyhtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRNZXRhZGF0YShjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0TWV0YWRhdGEobVVuaXF1ZUlkLCBwYXRoKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50OjpjYW5IYW5kbGUoY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jYW5IYW5kbGUobVVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK0RybUluZm9TdGF0dXMqIERybU1hbmFnZXJDbGllbnQ6OnByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5wcm9jZXNzRHJtSW5mbyhtVW5pcXVlSWQsIGRybUluZm8pOworfQorCitEcm1JbmZvKiBEcm1NYW5hZ2VyQ2xpZW50OjphY3F1aXJlRHJtSW5mbyhjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5hY3F1aXJlRHJtSW5mbyhtVW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6c2F2ZVJpZ2h0cygKKyAgICAgICAgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+c2F2ZVJpZ2h0cyhtVW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworfQorCitTdHJpbmc4IERybU1hbmFnZXJDbGllbnQ6OmdldE9yaWdpbmFsTWltZVR5cGUoY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmdldE9yaWdpbmFsTWltZVR5cGUobVVuaXF1ZUlkLCBwYXRoKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6OmdldERybU9iamVjdFR5cGUoY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXREcm1PYmplY3RUeXBlKCBtVW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6OmNoZWNrUmlnaHRzU3RhdHVzKGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jaGVja1JpZ2h0c1N0YXR1cyhtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNvbnN1bWVSaWdodHMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y29uc3VtZVJpZ2h0cyhtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsCisgICAgICAgICAgICAtPnNldFBsYXliYWNrU3RhdHVzKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50Ojp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnZhbGlkYXRlQWN0aW9uKG1VbmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnJlbW92ZVJpZ2h0cyhjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cmVtb3ZlUmlnaHRzKG1VbmlxdWVJZCwgcGF0aCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnJlbW92ZUFsbFJpZ2h0cygpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5yZW1vdmVBbGxSaWdodHMobVVuaXF1ZUlkKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6Om9wZW5Db252ZXJ0U2Vzc2lvbihjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5Db252ZXJ0U2Vzc2lvbihtVW5pcXVlSWQsIG1pbWVUeXBlKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50Ojpjb252ZXJ0RGF0YShpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNvbnZlcnREYXRhKG1VbmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXJDbGllbnQ6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IGNvbnZlcnRJZCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNsb3NlQ29udmVydFNlc3Npb24obVVuaXF1ZUlkLCBjb252ZXJ0SWQpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRBbGxTdXBwb3J0SW5mbyhpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0QWxsU3VwcG9ydEluZm8obVVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+b3BlbkRlY3J5cHRTZXNzaW9uKG1VbmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5EZWNyeXB0U2Vzc2lvbihtVW5pcXVlSWQsIHVyaSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNsb3NlRGVjcnlwdFNlc3Npb24oRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNsb3NlRGVjcnlwdFNlc3Npb24obVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmRlY3J5cHQoCisgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmRlY3J5cHQoCisgICAgICAgICAgICBtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmZpbmFsaXplRGVjcnlwdFVuaXQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5maW5hbGl6ZURlY3J5cHRVbml0KG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7Cit9CisKK3NzaXplX3QgRHJtTWFuYWdlckNsaWVudDo6cHJlYWQoCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnByZWFkKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEzMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybU1hbmFnZXJDbGllbnRJbXBsKE5hdGl2ZSkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSAiRHJtTWFuYWdlckNsaWVudEltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgSU5WQUxJRF9WQUxVRSAtMQorCitNdXRleCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6bU11dGV4Oworc3A8SURybU1hbmFnZXJTZXJ2aWNlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6bURybU1hbmFnZXJTZXJ2aWNlOworY29uc3QgU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6RU1QVFlfU1RSSU5HKCIiKTsKKworRHJtTWFuYWdlckNsaWVudEltcGwqIERybU1hbmFnZXJDbGllbnRJbXBsOjpjcmVhdGUoaW50KiBwVW5pcXVlSWQpIHsKKyAgICBpZiAoMCA9PSAqcFVuaXF1ZUlkKSB7CisgICAgICAgIGludCB1bmlxdWVJZCA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFkZFVuaXF1ZUlkKCpwVW5pcXVlSWQpOworICAgICAgICAqcFVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkVW5pcXVlSWQoKnBVbmlxdWVJZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtTWFuYWdlckNsaWVudEltcGwoKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlKGludCB1bmlxdWVJZCkgeworICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnJlbW92ZVVuaXF1ZUlkKHVuaXF1ZUlkKTsKK30KKworY29uc3Qgc3A8SURybU1hbmFnZXJTZXJ2aWNlPiYgRHJtTWFuYWdlckNsaWVudEltcGw6OmdldERybU1hbmFnZXJTZXJ2aWNlKCkgeworICAgIG1NdXRleC5sb2NrKCk7CisgICAgaWYgKE5VTEwgPT0gbURybU1hbmFnZXJTZXJ2aWNlLmdldCgpKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1coIkRybU1hbmFnZXJTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyByZXF0OworICAgICAgICAgICAgcmVxdC50dl9zZWMgID0gMDsKKyAgICAgICAgICAgIHJlcXQudHZfbnNlYyA9IDUwMDAwMDAwMDsgLy8wLjUgc2VjCisgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcXQsIE5VTEwpOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICBtRHJtTWFuYWdlclNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJRHJtTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorICAgIG1NdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJTZXJ2aWNlOworfQorCit2b2lkIERybU1hbmFnZXJDbGllbnRJbXBsOjphZGRDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkQ2xpZW50KHVuaXF1ZUlkKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnJlbW92ZUNsaWVudCh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1PbkluZm9MaXN0ZW5lciA9IGluZm9MaXN0ZW5lcjsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0RHJtU2VydmljZUxpc3RlbmVyKHVuaXF1ZUlkLAorICAgICAgICAgICAgKE5VTEwgIT0gaW5mb0xpc3RlbmVyLmdldCgpKSA/IHRoaXMgOiBOVUxMKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Omluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBkcm1FbmdpbmVGaWxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluc3RhbGxEcm1FbmdpbmUodW5pcXVlSWQsIGRybUVuZ2luZUZpbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitEcm1Db25zdHJhaW50cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmdldENvbnN0cmFpbnRzKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBEcm1Db25zdHJhaW50cyAqZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgIGlmICgoTlVMTCAhPSBwYXRoKSAmJiAoRU1QVFlfU1RSSU5HICE9ICpwYXRoKSkgeworICAgICAgICBkcm1Db25zdHJhaW50cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgRHJtTWV0YWRhdGEgKmRybU1ldGFkYXRhID0gTlVMTDsKKyAgICBpZiAoKE5VTEwgIT0gcGF0aCkgJiYgKEVNUFRZX1NUUklORyAhPSAqcGF0aCkpIHsKKyAgICAgICAgZHJtTWV0YWRhdGEgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRNZXRhZGF0YSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBkcm1NZXRhZGF0YTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBib29sIHJldENvZGUgPSBmYWxzZTsKKyAgICBpZiAoKEVNUFRZX1NUUklORyAhPSBwYXRoKSB8fCAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSkgeworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgRHJtSW5mb1N0YXR1cyAqZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisgICAgaWYgKE5VTEwgIT0gZHJtSW5mbykgeworICAgICAgICBkcm1JbmZvU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOworICAgIH0KKyAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKK30KKworRHJtSW5mbyogRHJtTWFuYWdlckNsaWVudEltcGw6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgRHJtSW5mbyogZHJtSW5mbyA9IE5VTEw7CisgICAgaWYgKE5VTEwgIT0gZHJtSW5mb1JlcXVlc3QpIHsKKyAgICAgICAgZHJtSW5mbyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBkcm1JbmZvOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6c2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IGNvbnRlbnRQYXRoKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitTdHJpbmc4IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIFN0cmluZzggbWltZVR5cGUgPSBFTVBUWV9TVFJJTkc7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwYXRoKSB7CisgICAgICAgIG1pbWVUeXBlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0T3JpZ2luYWxNaW1lVHlwZSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBtaW1lVHlwZTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGludCBkcm1PamVjdFR5cGUgPSBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworICAgIGlmICgoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHx8IChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpKSB7CisgICAgICAgICBkcm1PamVjdFR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiBkcm1PamVjdFR5cGU7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2hlY2tSaWdodHNTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKKyAgICAgICAgcmlnaHRzU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgfQorICAgIHJldHVybiByaWdodHNTdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIERybU1hbmFnZXJDbGllbnRJbXBsOjp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgYm9vbCByZXRDb2RlID0gZmFsc2U7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwYXRoKSB7CisgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT52YWxpZGF0ZUFjdGlvbih1bmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVSaWdodHModW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOworfQorCitpbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgaW50IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKKyAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgbWltZVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSkgeworICAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKChOVUxMICE9IGRybVN1cHBvcnRJbmZvQXJyYXkpICYmIChOVUxMICE9IGxlbmd0aCkpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIGlmIChOVUxMICE9IHVyaSkgeworICAgICAgICBoYW5kbGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaSk7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbiggdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYgKE5VTEwgIT0gaGVhZGVySW5mbykpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYgKE5VTEwgIT0gZW5jQnVmZmVyKQorICAgICAgICAmJiAoTlVMTCAhPSBkZWNCdWZmZXIpICYmIChOVUxMICE9ICpkZWNCdWZmZXIpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmRlY3J5cHQoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgc3RhdHVzCisgICAgICAgICAgICA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzc2l6ZV90IERybU1hbmFnZXJDbGllbnRJbXBsOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKKyAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Om5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSB7CisgICAgaWYgKE5VTEwgIT0gbU9uSW5mb0xpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1PbkluZm9MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uSW5mbyhldmVudCk7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1JT1NlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1JT1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQxMjRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybUlPU2VydmljZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lPX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fRFJNX0lPX1NFUlZJQ0VfSF9fCisKKyNpbmNsdWRlICJJRHJtSU9TZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIElPIHNlcnZpY2UuCisgKgorICogVGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aGlsZSBzdGFydGluZyB0aGUgRFJNIElPIHNlcnZpY2UuCisgKgorICovCitjbGFzcyBEcm1JT1NlcnZpY2UgOiBwdWJsaWMgQm5Ecm1JT1NlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisKK3ByaXZhdGU6CisgICAgRHJtSU9TZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+RHJtSU9TZXJ2aWNlKCk7CisKK3B1YmxpYzoKKyAgICB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKTsKKyAgICBTdHJpbmc4IHJlYWRGcm9tRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCk7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU9fU0VSVklDRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01BTkFHRVJfSF9fCisjZGVmaW5lIF9fRFJNX01BTkFHRVJfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSAiSURybUVuZ2luZS5oIgorI2luY2x1ZGUgIlBsdWdJbk1hbmFnZXIuaCIKKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSURybU1hbmFnZXI7CitjbGFzcyBEcm1SZWdpc3RyYXRpb25JbmZvOworY2xhc3MgRHJtVW5yZWdpc3RyYXRpb25JbmZvOworY2xhc3MgRHJtUmlnaHRzQWNxdWlzaXRpb25JbmZvOworY2xhc3MgRHJtQ29udGVudElkczsKK2NsYXNzIERybUNvbnN0cmFpbnRzOworY2xhc3MgRHJtTWV0YWRhdGE7CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1JbmZvOworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBBY3Rpb25EZXNjcmlwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gTWFuYWdlci4gVGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdGhlCisgKiBmdW5jdGlvbmFsaXR5IHRvIGNvcnJlc3BvbmRpbmcgRFJNIEVuZ2luZS4KKyAqCisgKiBUaGUgRHJtTWFuYWdlclNlcnZpY2UgY2xhc3MgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICoKKyAqLworY2xhc3MgRHJtTWFuYWdlciA6IHB1YmxpYyBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciB7CitwdWJsaWM6CisgICAgRHJtTWFuYWdlcigpOworICAgIHZpcnR1YWwgfkRybU1hbmFnZXIoKTsKKworcHVibGljOgorICAgIGludCBhZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBsb2FkUGx1Z0lucygpOworCisgICAgc3RhdHVzX3QgbG9hZFBsdWdJbnMoY29uc3QgU3RyaW5nOCYgcGx1Z0luRGlyUGF0aCk7CisKKyAgICBzdGF0dXNfdCB1bmxvYWRQbHVnSW5zKCk7CisKKyAgICBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpOworCisgICAgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgY29uc3QgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KTsKKworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKTsKKworICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCisgICAgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBnZXRTdXBwb3J0ZWRQbHVnSW5JZChpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIFN0cmluZzggZ2V0U3VwcG9ydGVkUGx1Z0luSWQoY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgU3RyaW5nOCBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBWZWN0b3I8aW50PiBtVW5pcXVlSWRWZWN0b3I7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRU1QVFlfU1RSSU5HOworCisgICAgaW50IG1EZWNyeXB0U2Vzc2lvbklkOworICAgIGludCBtQ29udmVydElkOworICAgIE11dGV4IG1Mb2NrOworICAgIE11dGV4IG1EZWNyeXB0TG9jazsKKyAgICBNdXRleCBtQ29udmVydExvY2s7CisgICAgVFBsdWdJbk1hbmFnZXI8SURybUVuZ2luZT4gbVBsdWdJbk1hbmFnZXI7CisgICAgS2V5ZWRWZWN0b3I8IERybVN1cHBvcnRJbmZvLCBTdHJpbmc4ID4gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcDsKKyAgICBLZXllZFZlY3RvcjwgaW50LCBJRHJtRW5naW5lKj4gbUNvbnZlcnRTZXNzaW9uTWFwOworICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+ID4gbVNlcnZpY2VMaXN0ZW5lcnM7CisgICAgS2V5ZWRWZWN0b3I8IGludCwgSURybUVuZ2luZSo+IG1EZWNyeXB0U2Vzc2lvbk1hcDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fTUFOQUdFUl9DTElFTlRfSU1QTF9IX18KKyNkZWZpbmUgX19EUk1fTUFOQUdFUl9DTElFTlRfSU1QTF9IX18KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKyNpbmNsdWRlICJJRHJtTWFuYWdlclNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1JbmZvRXZlbnQ7CisvKioKKyAqIFRoaXMgaXMgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERybU1hbmFnZXJDbGllbnQgY2xhc3MuCisgKgorICogT25seSB0aGUgSk5JIGxheWVyIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0byBkZWxlZ2F0ZQorICogZnVuY3Rpb25hbGl0eSB0byBOYXRpdmUgbGF0ZXIuCisgKgorICovCitjbGFzcyBEcm1NYW5hZ2VyQ2xpZW50SW1wbCA6IHB1YmxpYyBCbkRybVNlcnZpY2VMaXN0ZW5lciB7Citwcml2YXRlOgorICAgIERybU1hbmFnZXJDbGllbnRJbXBsKCkgeyB9CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgRHJtTWFuYWdlckNsaWVudEltcGwqIGNyZWF0ZShpbnQqIHBVbmlxdWVJZCk7CisKKyAgICBzdGF0aWMgdm9pZCByZW1vdmUoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgfkRybU1hbmFnZXJDbGllbnRJbXBsKCkgeyB9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBjbGllbnQgcmVzcGVjdGl2ZSB0byBnaXZlbiB1bmlxdWUgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKi8KKyAgICB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgY2xpZW50IHJlc3BlY3RpdmUgdG8gZ2l2ZW4gdW5pcXVlIGlkLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICovCisgICAgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZWQgdG8KKyAgICAgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgICAgICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICAgICAqICAgICBBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjCisgICAgICogQHJldHVybiBEcm1Db25zdHJhaW50cworICAgICAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBEcm1NZXRhZGF0YQorICAgICAqICAgICAgICAga2V5LXZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhIGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAgICAgKi8KKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcGFyYW1baW5dIG1pbWV0eXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIFRydWUgaWYgRHJtTWFuYWdlciBjYW4gaGFuZGxlIGdpdmVuIHBhdGggb3IgbWltZSB0eXBlLgorICAgICAqLworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgZ2l2ZW4gZHJtIGluZm9ybWF0aW9uIGJhc2VkIG9uIGl0cyB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm8gSW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHJldHVybiBEcm1JbmZvU3RhdHVzCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgcmVnaXN0cmF0aW9uLCB1bnJlZ2lzdHJhdGlvbiBvciByaWdodHMKKyAgICAgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mb1JlcXVlc3QgUmVxdWVzdCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBkcm1JbmZvCisgICAgICogQHJldHVybiBEcm1JbmZvCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgICAgICogYW5kIG1ha2UgYXNzb2NpYXRpb24gd2l0aCBjb250ZW50IHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gU3RyaW5nOAorICAgICAqICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGUgcHJvdGVjdGVkIG9iamVjdCAoY29udGVudCwgcmlnaHRzLCBldGMuLikKKyAgICAgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHR5cGUgb2YgdGhlIERSTSBjb250ZW50LAorICAgICAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAgICAgKi8KKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAgICAgKi8KKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAgICAgKiBJZiB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmlnaHRzIGlzIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgICAgICogYXBwbGljYXRpb24gY2FsbHMgdGhpcyBhcGkgYWdhaW4gd2l0aCB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgc2V0IHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIHJlc2VydmUgVHJ1ZSBpZiB0aGUgcmlnaHRzIHNob3VsZCBiZSByZXNlcnZlZC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgRFJNIGVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBsYXliYWNrU3RhdHVzIFBsYXliYWNrIGFjdGlvbiAoUGxheWJhY2s6OlNUQVJULCBQbGF5YmFjazo6U1RPUCwgUGxheWJhY2s6OlBBVVNFKQorICAgICAqIEBwYXJhbVtpbl0gcG9zaXRpb24gUG9zaXRpb24gaW4gdGhlIGZpbGUgKGluIG1pbGxpc2Vjb25kcykgd2hlcmUgdGhlIHN0YXJ0IG9jY3Vycy4KKyAgICAgKiAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIGRlc2NyaXB0aW9uIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgQVBJIGlzIGZvciBGb3J3YXJkIExvY2sgYmFzZWQgRFJNIHNjaGVtZS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIERlc2NyaXB0aW9uL01JTUUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBoYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKi8KKyAgICBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAgICAgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEcm0gQWdlbnQgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYWxsIERybVN1cHBvcnRJbmZvIGluc3RhbmNlIHRoYXQgbmF0aXZlIERSTSBmcmFtZXdvcmsgY2FuIGhhbmRsZS4KKyAgICAgKiBUaGlzIGludGVyZmFjZSBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IEpOSSBsYXllcgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW291dF0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyBpbiBkcm1TdXBwb3J0SW5mb0FycmF5CisgICAgICogQHBhcmFtW291dF0gZHJtU3VwcG9ydEluZm9BcnJheSBBcnJheSBjb250YWlucyBhbGwgRHJtU3VwcG9ydEluZm8KKyAgICAgKiAgICAgICAgICAgICB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZmQgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBTdGFydCBwb3NpdGlvbiBvZiB0aGUgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybgorICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKi8KKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHVyaSBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqLworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHBhcmFtW2luXSBoZWFkZXJJbmZvIEluZm9ybWF0aW9uIGZvciBpbml0aWFsaXppbmcgZGVjcnlwdGlvbiBvZiB0aGlzIGRlY3J5cFVuaXQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1bb3V0XSBidWZmZXIgUmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICAgICAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KKyAgICAgKi8KKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgZXZlbnQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIG5vdGlmaWVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBub3RpZnkoY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogSW5zdGFsbCBuZXcgRFJNIEVuZ2luZSBQbHVnLWluIGF0IHRoZSBydW50aW1lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUVuZ2luZSBTaGFyZWQgT2JqZWN0KHNvKSBGaWxlIGluIHdoaWNoIERSTSBFbmdpbmUgZGVmaW5lZAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworICAgIHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiBtT25JbmZvTGlzdGVuZXI7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IG1NdXRleDsKKyAgICBzdGF0aWMgc3A8SURybU1hbmFnZXJTZXJ2aWNlPiBtRHJtTWFuYWdlclNlcnZpY2U7CisgICAgc3RhdGljIGNvbnN0IHNwPElEcm1NYW5hZ2VyU2VydmljZT4mIGdldERybU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRU1QVFlfU1RSSU5HOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0lNUExfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0NjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgIklEcm1NYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgIklEcm1TZXJ2aWNlTGlzdGVuZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1NYW5hZ2VyOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIE11dGV4OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gbWFuYWdlciBzZXJ2aWNlLiBUaGlzIGRlbGVnYXRlcworICogdGhlIHJlc3BvbnNpYmlsaXR5IHRvIERybU1hbmFnZXIuCisgKgorICogVGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aGlsZSBzdGFydGluZyB0aGUgRFJNIG1hbmFnZXIgc2VydmljZS4KKyAqCisgKi8KK2NsYXNzIERybU1hbmFnZXJTZXJ2aWNlIDogcHVibGljIEJuRHJtTWFuYWdlclNlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisKK3ByaXZhdGU6CisgICAgRHJtTWFuYWdlclNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIH5Ecm1NYW5hZ2VyU2VydmljZSgpOworCitwdWJsaWM6CisgICAgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisKKyAgICB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisKKyAgICB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IHNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGRybVNlcnZpY2VMaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSk7CisKKyAgICBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKTsKKworICAgIERybU1ldGFkYXRhKiBnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisgICAgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb3JlcXVlc3QpOworCisgICAgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsaW50IGFjdGlvbik7CisKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCitwcml2YXRlOgorICAgIERybU1hbmFnZXIqIG1Ecm1NYW5hZ2VyOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX01BTkFHRVJfU0VSVklDRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1JT1NlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtSU9TZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwZDkwNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtSU9TZXJ2aWNlLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19JRFJNX0lPX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fSURSTV9JT19TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gSU8gc2VydmljZS4KKyAqCisgKi8KK2NsYXNzIElEcm1JT1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIGVudW0geworICAgICAgICBXUklURV9UT19GSUxFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgUkVBRF9GUk9NX0ZJTEUKKyAgICB9OworCitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShEcm1JT1NlcnZpY2UpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBkYXRhIGludG8gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHBhcmFtW2luXSBkYXRhQnVmZmVyIERhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGFCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqLworICAgIHZpcnR1YWwgU3RyaW5nOCByZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpID0gMDsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gSU8gc2VydmljZS4KKyAqLworY2xhc3MgQnBEcm1JT1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtSU9TZXJ2aWNlPgoreworcHVibGljOgorICAgIEJwRHJtSU9TZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICAgICAgOiBCcEludGVyZmFjZTxJRHJtSU9TZXJ2aWNlPihpbXBsKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCByZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBJTyBzZXJ2aWNlLgorICovCitjbGFzcyBCbkRybUlPU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElEcm1JT1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9JT19TRVJWSUNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkYWJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19JRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKyNkZWZpbmUgX19JRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtQ29udGVudElkczsKK2NsYXNzIERybUNvbnN0cmFpbnRzOworY2xhc3MgRHJtTWV0YWRhdGE7CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1JbmZvOworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXM7CitjbGFzcyBTdHJpbmc4OworY2xhc3MgQWN0aW9uRGVzY3JpcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gTWFuYWdlciBzZXJ2aWNlLgorICoKKyAqLworY2xhc3MgSURybU1hbmFnZXJTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgQUREX1VOSVFVRUlEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgUkVNT1ZFX1VOSVFVRUlELAorICAgICAgICBBRERfQ0xJRU5ULAorICAgICAgICBSRU1PVkVfQ0xJRU5ULAorICAgICAgICBTRVRfRFJNX1NFUlZJQ0VfTElTVEVORVIsCisgICAgICAgIElOU1RBTExfRFJNX0VOR0lORSwKKyAgICAgICAgR0VUX0NPTlNUUkFJTlRTX0ZST01fQ09OVEVOVCwKKyAgICAgICAgR0VUX01FVEFEQVRBX0ZST01fQ09OVEVOVCwKKyAgICAgICAgQ0FOX0hBTkRMRSwKKyAgICAgICAgUFJPQ0VTU19EUk1fSU5GTywKKyAgICAgICAgQUNRVUlSRV9EUk1fSU5GTywKKyAgICAgICAgU0FWRV9SSUdIVFMsCisgICAgICAgIEdFVF9PUklHSU5BTF9NSU1FVFlQRSwKKyAgICAgICAgR0VUX0RSTV9PQkpFQ1RfVFlQRSwKKyAgICAgICAgQ0hFQ0tfUklHSFRTX1NUQVRVUywKKyAgICAgICAgQ09OU1VNRV9SSUdIVFMsCisgICAgICAgIFNFVF9QTEFZQkFDS19TVEFUVVMsCisgICAgICAgIFZBTElEQVRFX0FDVElPTiwKKyAgICAgICAgUkVNT1ZFX1JJR0hUUywKKyAgICAgICAgUkVNT1ZFX0FMTF9SSUdIVFMsCisgICAgICAgIE9QRU5fQ09OVkVSVF9TRVNTSU9OLAorICAgICAgICBDT05WRVJUX0RBVEEsCisgICAgICAgIENMT1NFX0NPTlZFUlRfU0VTU0lPTiwKKyAgICAgICAgR0VUX0FMTF9TVVBQT1JUX0lORk8sCisgICAgICAgIE9QRU5fREVDUllQVF9TRVNTSU9OLAorICAgICAgICBPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwKKyAgICAgICAgQ0xPU0VfREVDUllQVF9TRVNTSU9OLAorICAgICAgICBJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCwKKyAgICAgICAgREVDUllQVCwKKyAgICAgICAgRklOQUxJWkVfREVDUllQVF9VTklULAorICAgICAgICBQUkVBRAorICAgIH07CisKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERybU1hbmFnZXJTZXJ2aWNlKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgPSAwOworCisgICAgdmlydHVhbCBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pID0gMDsKKworICAgIHZpcnR1YWwgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgPSAwOworCisgICAgdmlydHVhbCBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvcmVxdWVzdCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgPSAwOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCBnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLG9mZl90IG9mZnNldCkgPSAwOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBNYW5hZ2VyIHNlcnZpY2UuCisgKi8KK2NsYXNzIEJwRHJtTWFuYWdlclNlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBEcm1NYW5hZ2VyU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgICAgIDogQnBJbnRlcmZhY2U8SURybU1hbmFnZXJTZXJ2aWNlPihpbXBsKSB7fQorCisgICAgdmlydHVhbCBpbnQgYWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSk7CisKKyAgICB2aXJ0dWFsIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgdmlydHVhbCBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbyk7CisKKyAgICB2aXJ0dWFsIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHZpcnR1YWwgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKyAgICB2aXJ0dWFsIGludCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworICAgIHZpcnR1YWwgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBNYW5hZ2VyIHNlcnZpY2UuCisgKi8KK2NsYXNzIEJuRHJtTWFuYWdlclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJRHJtTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtU2VydmljZUxpc3RlbmVyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybVNlcnZpY2VMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzEwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybVNlcnZpY2VMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSURSTV9TRVJWSUNFX0xJU1RFTkVSX0hfXworI2RlZmluZSBfX0lEUk1fU0VSVklDRV9MSVNURU5FUl9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1JbmZvRXZlbnQ7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gc2VydmljZSBsaXN0ZW5lci4KKyAqCisgKi8KK2NsYXNzIElEcm1TZXJ2aWNlTGlzdGVuZXIgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIGVudW0geworICAgICAgICBOT1RJRlkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIH07CisKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERybVNlcnZpY2VMaXN0ZW5lcik7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSA9IDA7Cit9OworCisvKioKKyAqIFRoaXMgaXMgdGhlIEJpbmRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIHNlcnZpY2UgbGlzdGVuZXIuCisgKi8KK2NsYXNzIEJwRHJtU2VydmljZUxpc3RlbmVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybVNlcnZpY2VMaXN0ZW5lcj4KK3sKK3B1YmxpYzoKKyAgICBCcERybVNlcnZpY2VMaXN0ZW5lcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgICAgIDogQnBJbnRlcmZhY2U8SURybVNlcnZpY2VMaXN0ZW5lcj4oaW1wbCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5KGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBzZXJ2aWNlIGxpc3RlbmVyLgorICovCitjbGFzcyBCbkRybVNlcnZpY2VMaXN0ZW5lcjogcHVibGljIEJuSW50ZXJmYWNlPElEcm1TZXJ2aWNlTGlzdGVuZXI+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9TRVJWSUNFX0xJU1RFTkVSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQxOTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19QTFVHSU5fTUFOQUdFUl9IX18KKyNkZWZpbmUgX19QTFVHSU5fTUFOQUdFUl9IX18KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyKiBjb25zdCBQTFVHSU5fTUFOQUdFUl9DUkVBVEUgPSAiY3JlYXRlIjsKK2NvbnN0IGNoYXIqIGNvbnN0IFBMVUdJTl9NQU5BR0VSX0RFU1RST1kgPSAiZGVzdHJveSI7Citjb25zdCBjaGFyKiBjb25zdCBQTFVHSU5fRVhURU5TSU9OID0gIi5zbyI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgdGVtcGxhdGUgY2xhc3MgZm9yIFBsdWdpbiBtYW5hZ2VyLgorICoKKyAqIFRoZSBEcm1NYW5hZ2VyIHVzZXMgdGhpcyBjbGFzcyB0byBoYW5kbGUgdGhlIHBsdWdpbnMuCisgKgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgorY2xhc3MgVFBsdWdJbk1hbmFnZXIgeworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHZvaWQqICAgICAgSEFORExFOworICAgIHR5cGVkZWYgVHlwZSogICAgICBjcmVhdGVfdCh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgZGVzdHJveV90KFR5cGUqKTsKKyAgICB0eXBlZGVmIGNyZWF0ZV90KiAgRlBDUkVBVEU7CisgICAgdHlwZWRlZiBkZXN0cm95X3QqIEZQREVTVE9SWTsKKworICAgIHR5cGVkZWYgc3RydWN0IF9QbHVnSW5Db250YWluZXIgeworICAgICAgICBTdHJpbmc4ICAgc1BhdGg7CisgICAgICAgIEhBTkRMRSAgICBoSGFuZGxlOworICAgICAgICBGUENSRUFURSAgZnBDcmVhdGU7CisgICAgICAgIEZQREVTVE9SWSBmcERlc3Rvcnk7CisgICAgICAgIFR5cGUqICAgICBwSW5zdGFuY2U7CisKKyAgICAgICAgX1BsdWdJbkNvbnRhaW5lcigpOgorICAgICAgICAgICAgc1BhdGgoIiIpCisgICAgICAgICAgICAsaEhhbmRsZShOVUxMKQorICAgICAgICAgICAgLGZwQ3JlYXRlKE5VTEwpCisgICAgICAgICAgICAsZnBEZXN0b3J5KE5VTEwpCisgICAgICAgICAgICAscEluc3RhbmNlKE5VTEwpCisgICAgICAgICAgICB7fQorICAgIH0gUGx1Z0luQ29udGFpbmVyOworCisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBQbHVnSW5Db250YWluZXIqPiBQbHVnSW5NYXA7CisgICAgUGx1Z0luTWFwIG1fcGx1Z0luTWFwOworCisgICAgdHlwZWRlZiBWZWN0b3I8U3RyaW5nOD4gUGx1Z0luSWRMaXN0OworICAgIFBsdWdJbklkTGlzdCBtX3BsdWdJbklkTGlzdDsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIExvYWQgYWxsIHRoZSBwbHVnLWlucyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSByc1BsdWdJbkRpclBhdGgKKyAgICAgKiAgICAgRGlyZWN0b3J5IHBhdGggd2hpY2ggcGx1Zy1pbnMgKGR5bmFtaWMgbGlicmFyeSkgYXJlIHN0b3JlZAorICAgICAqIEBub3RlIFBsdWctaW5zIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRQbHVnSW5zKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luRGlyUGF0aCkgeworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luRmlsZUxpc3QgPSBnZXRQbHVnSW5QYXRoTGlzdChyc1BsdWdJbkRpclBhdGgpOworCisgICAgICAgIGlmICghcGx1Z0luRmlsZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBsdWdJbkZpbGVMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgbG9hZFBsdWdJbihwbHVnSW5GaWxlTGlzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxvYWQgYWxsIHRoZSBwbHVnLWlucworICAgICAqCisgICAgICovCisgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bmxvYWRQbHVnSW4obV9wbHVnSW5JZExpc3RbaV0pOworICAgICAgICB9CisgICAgICAgIG1fcGx1Z0luSWRMaXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCB0aGUgSURzIG9mIGF2YWlsYWJsZSBwbHVnLWlucworICAgICAqCisgICAgICogQHJldHVybltpbl0gcGx1Z0luSWRMaXN0CisgICAgICogICAgIFN0cmluZyB0eXBlIFZlY3RvciBpbiB3aGljaCBhbGwgcGx1Zy1pbiBJRHMgYXJlIHN0b3JlZAorICAgICAqLworICAgIFZlY3RvcjxTdHJpbmc4PiBnZXRQbHVnSW5JZExpc3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BsdWdJbklkTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwbHVnLWluIHJlZmVyZW5jZSBvZiBzcGVjaWZpZWQgSUQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNQbHVnSW5JZAorICAgICAqICAgICBQbHVnLWluIElEIHRvIGJlIHVzZWQKKyAgICAgKiBAcmV0dXJuIHBsdWdJbgorICAgICAqICAgICBSZWZlcmVuY2Ugb2Ygc3BlY2lmaWVkIHBsdWctaW4gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBUeXBlJiBnZXRQbHVnSW4oY29uc3QgU3RyaW5nOCYgcnNQbHVnSW5JZCkgeworICAgICAgICBpZiAoIWNvbnRhaW5zKHJzUGx1Z0luSWQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGVycm9yIGNhc2UgbmV2ZXIgaGFwcGVucworICAgICAgICB9CisgICAgICAgIHJldHVybiAqKG1fcGx1Z0luTWFwLnZhbHVlRm9yKHJzUGx1Z0luSWQpLT5wSW5zdGFuY2UpOworICAgIH0KKworcHVibGljOgorICAgIC8qKgorICAgICAqIExvYWQgYSBwbHVnLWluIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNQbHVnSW5QYXRoCisgICAgICogICAgIFBsdWctaW4gKGR5bmFtaWMgbGlicmFyeSkgZmlsZSBwYXRoCisgICAgICogQG5vdGUgUGx1Zy1pbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z0luKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luUGF0aCkgeworICAgICAgICBpZiAoY29udGFpbnMocnNQbHVnSW5QYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUGx1Z0luQ29udGFpbmVyKiBwUGx1Z0luQ29udGFpbmVyID0gbmV3IFBsdWdJbkNvbnRhaW5lcigpOworCisgICAgICAgIHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUgPSBkbG9wZW4ocnNQbHVnSW5QYXRoLnN0cmluZygpLCBSVExEX0xBWlkpOworCisgICAgICAgIGlmIChOVUxMID09IHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwUGx1Z0luQ29udGFpbmVyOworICAgICAgICAgICAgcFBsdWdJbkNvbnRhaW5lciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5zUGF0aCA9IHJzUGx1Z0luUGF0aDsKKyAgICAgICAgcFBsdWdJbkNvbnRhaW5lci0+ZnBDcmVhdGUKKyAgICAgICAgICAgICAgICA9IChGUENSRUFURSlkbHN5bShwUGx1Z0luQ29udGFpbmVyLT5oSGFuZGxlLCBQTFVHSU5fTUFOQUdFUl9DUkVBVEUpOworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5mcERlc3RvcnkKKyAgICAgICAgICAgICAgICA9IChGUERFU1RPUlkpZGxzeW0ocFBsdWdJbkNvbnRhaW5lci0+aEhhbmRsZSwgUExVR0lOX01BTkFHRVJfREVTVFJPWSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcFBsdWdJbkNvbnRhaW5lci0+ZnBDcmVhdGUgJiYgTlVMTCAhPSBwUGx1Z0luQ29udGFpbmVyLT5mcERlc3RvcnkpIHsKKyAgICAgICAgICAgIHBQbHVnSW5Db250YWluZXItPnBJbnN0YW5jZSA9IChUeXBlKilwUGx1Z0luQ29udGFpbmVyLT5mcENyZWF0ZSgpOworICAgICAgICAgICAgbV9wbHVnSW5JZExpc3QuYWRkKHJzUGx1Z0luUGF0aCk7CisgICAgICAgICAgICBtX3BsdWdJbk1hcC5hZGQocnNQbHVnSW5QYXRoLCBwUGx1Z0luQ29udGFpbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRsY2xvc2UocFBsdWdJbkNvbnRhaW5lci0+aEhhbmRsZSk7CisgICAgICAgICAgICBkZWxldGUgcFBsdWdJbkNvbnRhaW5lcjsKKyAgICAgICAgICAgIHBQbHVnSW5Db250YWluZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5sb2FkIGEgcGx1Zy1pbiBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJzUGx1Z0luUGF0aAorICAgICAqICAgICBQbHVnLWluIChkeW5hbWljIGxpYnJhcnkpIGZpbGUgcGF0aAorICAgICAqLworICAgIHZvaWQgdW5sb2FkUGx1Z0luKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luUGF0aCkgeworICAgICAgICBpZiAoIWNvbnRhaW5zKHJzUGx1Z0luUGF0aCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsdWdJbkNvbnRhaW5lciogcFBsdWdJbkNvbnRhaW5lciA9IG1fcGx1Z0luTWFwLnZhbHVlRm9yKHJzUGx1Z0luUGF0aCk7CisgICAgICAgIHBQbHVnSW5Db250YWluZXItPmZwRGVzdG9yeShwUGx1Z0luQ29udGFpbmVyLT5wSW5zdGFuY2UpOworICAgICAgICBkbGNsb3NlKHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUpOworCisgICAgICAgIG1fcGx1Z0luTWFwLnJlbW92ZUl0ZW0ocnNQbHVnSW5QYXRoKTsKKyAgICAgICAgZGVsZXRlIHBQbHVnSW5Db250YWluZXI7CisgICAgICAgIHBQbHVnSW5Db250YWluZXIgPSBOVUxMOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIFRQbHVnSW5NYW5hZ2VyIGNvbnRhaW5zIHJzUGx1Z0luSWQKKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luSWQpIHsKKyAgICAgICAgcmV0dXJuIG1fcGx1Z0luTWFwLmluZGV4T2ZLZXkocnNQbHVnSW5JZCkgIT0gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpbGUgcGF0aCBsaXN0IG9mIHBsdWctaW5zIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSByc0RpclBhdGgKKyAgICAgKiAgICAgRGlyZWN0b3J5IHBhdGggaW4gd2hpY2ggcGx1Zy1pbnMgYXJlIHN0b3JlZAorICAgICAqIEByZXR1cm4gcGx1Z0luRmlsZUxpc3QKKyAgICAgKiAgICAgU3RyaW5nIHR5cGUgVmVjdG9yIGluIHdoaWNoIGZpbGUgcGF0aCBvZiBwbHVnLWlucyBhcmUgc3RvcmVkCisgICAgICovCisgICAgVmVjdG9yPFN0cmluZzg+IGdldFBsdWdJblBhdGhMaXN0KGNvbnN0IFN0cmluZzgmIHJzRGlyUGF0aCkgeworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gZmlsZUxpc3Q7CisgICAgICAgIERJUiogcERpciA9IG9wZW5kaXIocnNEaXJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgc3RydWN0IGRpcmVudCogcEVudHJ5ID0gbmV3IGRpcmVudCgpOworCisgICAgICAgIHdoaWxlIChOVUxMICE9IHBEaXIgJiYgTlVMTCAhPSAocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKKyAgICAgICAgICAgIGlmICghaXNQbHVnSW4ocEVudHJ5KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoOworICAgICAgICAgICAgcGx1Z0luUGF0aCArPSByc0RpclBhdGg7CisgICAgICAgICAgICBwbHVnSW5QYXRoICs9ICIvIjsKKyAgICAgICAgICAgIHBsdWdJblBhdGggKz0gcEVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgICAgIGZpbGVMaXN0LmFkZChwbHVnSW5QYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChOVUxMICE9IHBEaXIpIHsKKyAgICAgICAgICAgIGNsb3NlZGlyKHBEaXIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIGZpbGVMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGlucHV0IG5hbWUgZGVub3RlcyBwbHVnLWluCisgICAgICovCisgICAgYm9vbCBpc1BsdWdJbihjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKKyAgICAgICAgU3RyaW5nOCBzTmFtZShwRW50cnktPmRfbmFtZSk7CisgICAgICAgIGludCBleHRlbnRpb25Qb3MgPSBzTmFtZS5zaXplKCkgLSBTdHJpbmc4KFBMVUdJTl9FWFRFTlNJT04pLnNpemUoKTsKKyAgICAgICAgaWYgKGV4dGVudGlvblBvcyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXh0ZW50aW9uUG9zID09IChpbnQpc05hbWUuZmluZChQTFVHSU5fRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBpbnB1dCBlbnRyeSBpcyAiLiIgb3IgIi4uIgorICAgICAqLworICAgIGJvb2wgaXNEb3RPckREb3QoY29uc3Qgc3RydWN0IGRpcmVudCogcEVudHJ5KSBjb25zdCB7CisgICAgICAgIFN0cmluZzggc05hbWUocEVudHJ5LT5kX25hbWUpOworICAgICAgICByZXR1cm4gIi4iID09IHNOYW1lIHx8ICIuLiIgPT0gc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBpbnB1dCBlbnRyeSBpcyBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBib29sIGlzRGlyZWN0b3J5KGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfRElSID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgaW5wdXQgZW50cnkgaXMgcmVndWxhciBmaWxlCisgICAgICovCisgICAgYm9vbCBpc1JlZ3VsYXJGaWxlKGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfUkVHID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgaW5wdXQgZW50cnkgaXMgbGluaworICAgICAqLworICAgIGJvb2wgaXNMaW5rKGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfTE5LID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KK307CisKK307CisKKyNlbmRpZiAvKiBfX1BMVUdJTl9NQU5BR0VSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUmVhZFdyaXRlVXRpbHMuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9SZWFkV3JpdGVVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWIzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUmVhZFdyaXRlVXRpbHMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1JFQURfV1JJVEVfVVRJTFNfSF9fCisjZGVmaW5lIF9fUkVBRF9XUklURV9VVElMU19IX18KKworI2luY2x1ZGUgPHV0aWxzL0ZpbGVNYXAuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBwZXJmb3JtcyBJTyBvcGVyYXRpb25zLgorICoKKyAqLworY2xhc3MgUmVhZFdyaXRlVXRpbHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBSZWFkV3JpdGVVdGlscworICAgICAqLworICAgIFJlYWRXcml0ZVV0aWxzKCkge30KKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIFJlYWRXcml0ZVV0aWxzCisgICAgICovCisgICAgdmlydHVhbCB+UmVhZFdyaXRlVXRpbHMoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmc4IHJlYWRCeXRlcyhjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCk7CisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGRhdGEgaW50byB0aGUgZ2l2ZW4gYnVmZmVyIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHBhcmFtW291dF0gYnVmZmVyIERhdGEgcmVhZCBmcm9tIHRoZSBmaWxlCisgICAgICogQHJldHVybiBMZW5ndGggb2YgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBmaWxlCisgICAgICovCisgICAgc3RhdGljIGludCByZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNoYXIqKiBidWZmZXIpOworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbVtpbl0gZGF0YUJ1ZmZlciBEYXRhIHRvIHdyaXRlCisgICAgICovCisgICAgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpOworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRhdGEgaW50byB0aGUgZmlsZSBwYXRoIHByb3ZpZGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZpbGVQYXRoIFBhdGggb2YgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW1baW5dIGRhdGFCdWZmZXIgRGF0YSB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpOworCitwcml2YXRlOgorICAgIEZpbGVNYXAqIG1GaWxlTWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fUkVBRF9XUklURV9VVElMU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1N0cmluZ1Rva2VuaXplci5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1N0cmluZ1Rva2VuaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTc1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvU3RyaW5nVG9rZW5pemVyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19TVFJJTkdfVE9LRU5JWkVSX0hfXworI2RlZmluZSBfX1NUUklOR19UT0tFTklaRVJfSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyBmb3IgU3RyaW5nIG1hbmlwdWxhdGlvbi4KKyAqCisgKi8KK2NsYXNzIFN0cmluZ1Rva2VuaXplciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIHN0cmluZyB0b2tlbnMKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBTdHJpbmdUb2tlbml6ZXI7CisgICAgcHJpdmF0ZToKKyAgICAgICAgSXRlcmF0b3IoU3RyaW5nVG9rZW5pemVyKiBTdHJpbmdUb2tlbml6ZXIpCisgICAgICAgICA6IG1TdHJpbmdUb2tlbml6ZXIoU3RyaW5nVG9rZW5pemVyKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyKiBtU3RyaW5nVG9rZW5pemVyOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nVG9rZW5pemVyCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmluZyBDb21wbGV0ZSBzdHJpbmcgZGF0YQorICAgICAqIEBwYXJhbVtpbl0gZGVsaW1ldGVyIERlbGltZXRlciB1c2VkIHRvIHNwbGl0IHRoZSBzdHJpbmcKKyAgICAgKi8KKyAgICBTdHJpbmdUb2tlbml6ZXIoY29uc3QgU3RyaW5nOCYgc3RyaW5nLCBjb25zdCBTdHJpbmc4JiBkZWxpbWV0ZXIpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgU3RyaW5nVG9rZW5pemVyCisgICAgICovCisgICAgflN0cmluZ1Rva2VuaXplcigpIHt9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogU3BsaXRzIHRoZSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBkZWxpbWV0ZXIKKyAgICAgKi8KKyAgICB2b2lkIHNwbGl0U3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZywgY29uc3QgU3RyaW5nOCYgZGVsaW1ldGVyKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgc3BsaXQgc3RyaW5nIHZhbHVlcworICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBJdGVyYXRvciBpdGVyYXRvcigpOworCitwcml2YXRlOgorICAgIFZlY3RvcjxTdHJpbmc4PiBtU3RyaW5nVG9rZW5pemVyVmVjdG9yOworfTsKKworfTsKKyNlbmRpZiAvKiBfX1NUUklOR19UT0tFTklaRVJfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjYzNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fRU5HSU5FX0JBU0VfSF9fCisjZGVmaW5lIF9fRFJNX0VOR0lORV9CQVNFX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+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+bGVuZ3RoID0gZW5jQnVmZmVyLT5sZW5ndGg7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IDhhYzJhYTAuLmE1ODdkMGQxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogICAgICAgICAgICAgY2hlY2tSYW5nZSh0ZXhzLmxlbmd0aCwgdGV4T2Zmc2V0LCB2ZXJ0ZXhDb3VudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGVja1JhbmdlKGNvbG9ycy5sZW5ndGgsIGNvbG9yT2Zmc2V0LCB2ZXJ0ZXhDb3VudCk7CisgICAgICAgICAgICBjaGVja1JhbmdlKGNvbG9ycy5sZW5ndGgsIGNvbG9yT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAvIDIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIHsKICAgICAgICAgICAgIGNoZWNrUmFuZ2UoaW5kaWNlcy5sZW5ndGgsIGluZGV4T2Zmc2V0LCBpbmRleENvdW50KTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9ZdXZJbWFnZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlLmphdmEKaW5kZXggOTM2OGRhNi4uYWYzZjI3NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlLmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgV09SS0lOR19DT01QUkVTU19TVE9SQUdFID0gNDA5NjsKIAogICAgLyoqCi0gICAgICogVGhlIFlVViBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgUGl4ZWxGb3JtYXR9LgorICAgICAqIFRoZSBZVVYgZm9ybWF0IGFzIGRlZmluZWQgaW4ge0BsaW5rIEltYWdlRm9ybWF0fS4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBtRm9ybWF0OwogCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0geXV2ICAgICBUaGUgWVVWIGRhdGEuIEluIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgaW1hZ2UgcGxhbmUsIGFsbCB0aGUgcGxhbmVzIG11c3QgYmUKICAgICAgKiAgICAgICAgICAgICAgICBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBmb3JtYXQgIFRoZSBZVVYgZGF0YSBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgUGl4ZWxGb3JtYXR9LgorICAgICAqIEBwYXJhbSBmb3JtYXQgIFRoZSBZVVYgZGF0YSBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgSW1hZ2VGb3JtYXR9LgogICAgICAqIEBwYXJhbSB3aWR0aCAgIFRoZSB3aWR0aCBvZiB0aGUgWXV2SW1hZ2UuCiAgICAgICogQHBhcmFtIGhlaWdodCAgVGhlIGhlaWdodCBvZiB0aGUgWXV2SW1hZ2UuCiAgICAgICogQHBhcmFtIHN0cmlkZXMgKE9wdGlvbmFsKSBSb3cgYnl0ZXMgb2YgZWFjaCBpbWFnZSBwbGFuZS4gSWYgeXV2IGNvbnRhaW5zIHBhZGRpbmcsIHRoZSBzdHJpZGUKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFlVViBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgUGl4ZWxGb3JtYXR9LgorICAgICAqIEByZXR1cm4gdGhlIFlVViBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgSW1hZ2VGb3JtYXR9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0WXV2Rm9ybWF0KCkgewogICAgICAgICByZXR1cm4gbUZvcm1hdDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRlZFJvdGF0ZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQW5pbWF0ZWRSb3RhdGVEcmF3YWJsZS5qYXZhCmluZGV4IDU4MjA2ZDQuLjQ5ZjQ5N2MgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRlZFJvdGF0ZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGVkUm90YXRlRHJhd2FibGUuamF2YQpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgaWYgKG1TdGF0ZS5jYW5Db25zdGFudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgICAgIHJldHVybiBtU3RhdGU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCmluZGV4IDMyMTExZTguLjBiODQ2NWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZS5qYXZhCkBAIC00MjcsNyArNDI3LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7Ci0gICAgICAgIG1CaXRtYXBTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgbUJpdG1hcFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICByZXR1cm4gbUJpdG1hcFN0YXRlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhCmluZGV4IGE3NzI4NzEuLjJiM2JkODAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9DbGlwRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlLmphdmEKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7CiAgICAgICAgIGlmIChtQ2xpcFN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbUNsaXBTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1DbGlwU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgICAgICByZXR1cm4gbUNsaXBTdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ29sb3JEcmF3YWJsZS5qYXZhCmluZGV4IDYwNGM2MDIuLjA5ODVjMWIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YQpAQCAtMTI0LDcgKzEyNCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewotICAgICAgICBtU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIG1TdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKaW5kZXggYzZmNTdkNC4uYjEzZjI2ZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7CiAgICAgICAgIGlmIChtRHJhd2FibGVDb250YWluZXJTdGF0ZS5jYW5Db25zdGFudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1EcmF3YWJsZUNvbnRhaW5lclN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgICAgICByZXR1cm4gbURyYXdhYmxlQ29udGFpbmVyU3RhdGU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQppbmRleCAzM2VjYmVhLi4zMDhmZDA4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKQEAgLTgzMiw3ICs4MzIsNyBAQAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7Ci0gICAgICAgIG1HcmFkaWVudFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICBtR3JhZGllbnRTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIG1HcmFkaWVudFN0YXRlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9JbnNldERyYXdhYmxlLmphdmEKaW5kZXggYTljOTgzZS4uNjdjOTI4YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvSW5zZXREcmF3YWJsZS5qYXZhCkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobUluc2V0U3RhdGUuY2FuQ29uc3RhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBtSW5zZXRTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1JbnNldFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1JbnNldFN0YXRlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKaW5kZXggODA0N2RkNC4uMjM0YjgwZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCkBAIC01MjMsNyArNTIzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobUxheWVyU3RhdGUuY2FuQ29uc3RhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBtTGF5ZXJTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHN1cGVyLmdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1MYXllclN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1MYXllclN0YXRlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQppbmRleCAwMDQxNmQ4Li42NzY4MTg2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKLSAgICAgICAgbU5pbmVQYXRjaFN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICBtTmluZVBhdGNoU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgICAgIHJldHVybiBtTmluZVBhdGNoU3RhdGU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvUm90YXRlRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCmluZGV4IDljNDdkYWIuLjE0MjhlZmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Sb3RhdGVEcmF3YWJsZS5qYXZhCkBAIC0xODksNyArMTg5LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICBpZiAobVN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gc3VwZXIuZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgbVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZS5qYXZhCmluZGV4IGI2MjNkODAuLmE5NWViMDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUuamF2YQpAQCAtMjM3LDcgKzIzNyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgaWYgKG1TY2FsZVN0YXRlLmNhbkNvbnN0YW50U3RhdGUoKSkgewotICAgICAgICAgICAgbVNjYWxlU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgICAgICBtU2NhbGVTdGF0ZS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICAgICAgICAgIHJldHVybiBtU2NhbGVTdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TaGFwZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2hhcGVEcmF3YWJsZS5qYXZhCmluZGV4IGJlMTg5MmUuLjAyMDFmYjAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TaGFwZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGUuamF2YQpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKLSAgICAgICAgbVNoYXBlU3RhdGUubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBzdXBlci5nZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIG1TaGFwZVN0YXRlLm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgICAgICByZXR1cm4gbVNoYXBlU3RhdGU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1Db25zdHJhaW50cy5oIGIvaW5jbHVkZS9kcm0vRHJtQ29uc3RyYWludHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVjOTQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtQ29uc3RyYWludHMuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fQ09OU1RSQUlOVFNfSF9fCisjZGVmaW5lIF9fRFJNX0NPTlNUUkFJTlRTX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgY29uc3RyYWludHMgaW5mb3JtYXRpb24uCisgKgorICogQXMgYSByZXN1bHQgb2YgRHJtTWFuYWdlckNsaWVudDo6Z2V0Q29uc3RyYWludHMoY29uc3QgU3RyaW5nOCosIGNvbnN0IGludCkKKyAqIGFuIGluc3RhbmNlIG9mIERybUNvbnN0cmFpbnRzIHdvdWxkIGJlIHJldHVybmVkLgorICoKKyAqLworY2xhc3MgRHJtQ29uc3RyYWludHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSByZXBsaWNhIG9mIGFuZHJvaWQuZHJtLkRybVN0b3JlLkNvbnN0cmFpbnRzQ29sdW1ucworICAgICAqIEFueSBjaGFuZ2VzIHNob3VsZCBhbHNvIGJlIGluY29ycG9yYXRlZCB3aXRoIEphdmEgTGF5ZXIgYXMgd2VsbAorICAgICAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggcmVwZWF0IGNvdW50CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggTUFYX1JFUEVBVF9DT1VOVDsKKyAgICAvKioKKyAgICAgKiBUaGUgcmVtYWluaW5nIHJlcGVhdCBjb3VudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IFJFTUFJTklOR19SRVBFQVRfQ09VTlQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIHByb3RlY3RlZCBmaWxlIGNhbiBub3QgYmUgcGxheWVkL3ZpZXdlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IExJQ0VOU0VfU1RBUlRfVElNRTsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBwcm90ZWN0ZWQgZmlsZSBjYW4gbm90IGJlIHBsYXllZC92aWV3ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBMSUNFTlNFX0VYUElSWV9USU1FOworCisgICAgLyoqCisgICAgICogVGhlIGF2YWlsYWJsZSB0aW1lIGZvciBsaWNlbnNlCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggTElDRU5TRV9BVkFJTEFCTEVfVElNRTsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHN0cmVhbSBmb3IgZXh0ZW5kZWQgbWV0YWRhdGEKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBFWFRFTkRFRF9NRVRBREFUQTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBrZXkKKyAgICAgKi8KKyAgICBjbGFzcyBLZXlJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1Db25zdHJhaW50czsKKyAgICBwcml2YXRlOgorICAgICAgICBLZXlJdGVyYXRvcihEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMpCisgICAgICAgICAgICA6IG1Ecm1Db25zdHJhaW50cyhkcm1Db25zdHJhaW50cyksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUNvbnN0cmFpbnRzKiBtRHJtQ29uc3RyYWludHM7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBjb25zdHJhaW50cworICAgICAqLworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybUNvbnN0cmFpbnRzOworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cykKKyAgICAgICAgICAgIDogbURybUNvbnN0cmFpbnRzKGRybUNvbnN0cmFpbnRzKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1Db25zdHJhaW50cyogbURybUNvbnN0cmFpbnRzOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICBEcm1Db25zdHJhaW50cygpIHt9CisgICAgdmlydHVhbCB+RHJtQ29uc3RyYWludHMoKSB7CisgICAgICAgIERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBrZXlJdCA9IHRoaXMtPmtleUl0ZXJhdG9yKCk7CisKKyAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSB0aGlzLT5nZXRBc0J5dGVBcnJheSgma2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ29uc3RyYWludE1hcC5jbGVhcigpOworICAgIH0KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc3RyYWludHMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGNvbnN0cmFpbnRzCisgICAgICovCisgICAgaW50IGdldENvdW50KHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQWRkcyBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0ga2V5IEtleSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqIEByZXR1cm4gUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlCisgICAgICovCisgICAgU3RyaW5nOCBnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKKworICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGFzIGJ5dGUgYXJyYXkgb2YgZ2l2ZW4ga2V5CisgICAgICogQHBhcmFtIGtleSBLZXkgd2hvc2UgdmFsdWUgdG8gYmUgcmV0cmlldmVkIGFzIGJ5dGUgYXJyYXkKKyAgICAgKiBAcmV0dXJuIFRoZSBieXRlIGFycmF5IHZhbHVlCisgICAgICovCisgICAgY29uc3QgY2hhciogZ2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgS2V5SXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBLZXlJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKTsKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciogZ2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBjb25zdCBjaGFyKj4gRHJtQ29uc3RyYWludHNNYXA7CisgICAgRHJtQ29uc3RyYWludHNNYXAgbUNvbnN0cmFpbnRNYXA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fQ09OU1RSQUlOVFNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oIGIvaW5jbHVkZS9kcm0vRHJtQ29udmVydGVkU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5ZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fCisjZGVmaW5lIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnZlcnNpb24sIHRoZSBjb252ZXJ0ZWQKKyAqIGRhdGEvY2hlY2tzdW0gZGF0YSBhbmQgdGhlIG9mZnNldC4gT2Zmc2V0IGlzIGdvaW5nIHRvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgY2xvc2UKKyAqIHNlc3Npb24gd2hlcmUgdGhlIGFnZW50IHdpbGwgaW5mb3JtIHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIHNob3VsZCBiZSBhZGRlZAorICoKKyAqIEFzIGEgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OmNvbnZlcnREYXRhKGludCwgY29uc3QgRHJtQnVmZmVyKikgYW5kCisgKiBEcm1NYW5hZ2VyQ2xpZW50OjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCkgYW4gaW5zdGFuY2Ugb2YgRHJtQ29udmVydGVkU3RhdHVzCisgKiB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKi8KK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1cyB7CitwdWJsaWM6CisgICAgLy8gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1Db252ZXJ0ZWRTdGF0dXMuamF2YQorICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX09LID0gMTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19JTlBVVERBVEFfRVJST1IgPSAyOworICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX0VSUk9SID0gMzsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1Db252ZXJ0ZWRTdGF0dXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uCisgICAgICogQHBhcmFtW2luXSBfY29udmVydGVkRGF0YSBDb252ZXJ0ZWQgZGF0YS9jaGVja3N1bSBkYXRhCisgICAgICogQHBhcmFtW2luXSBfb2Zmc2V0IE9mZnNldCB2YWx1ZQorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyhpbnQgX3N0YXR1c0NvZGUsIGNvbnN0IERybUJ1ZmZlciogX2NvbnZlcnRlZERhdGEsIGludCBfb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIERybUNvbnZlcnRlZFN0YXR1cworICAgICAqLworICAgIHZpcnR1YWwgfkRybUNvbnZlcnRlZFN0YXR1cygpIHsKKworICAgIH0KKworcHVibGljOgorICAgIGludCBzdGF0dXNDb2RlOworICAgIGNvbnN0IERybUJ1ZmZlciogY29udmVydGVkRGF0YTsKKyAgICBpbnQgb2Zmc2V0OworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0NPTlZFUlRFRF9TVEFUVVNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUluZm8uaCBiL2luY2x1ZGUvZHJtL0RybUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ4NTQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mby5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9JTkZPX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyBpbiB3aGljaCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gdHJhbnNhY3QKKyAqIGJldHdlZW4gZGV2aWNlIGFuZCBvbmxpbmUgRFJNIHNlcnZlciBpcyBkZXNjcmliZWQuIERSTSBGcmFtZXdvcmsgYWNoaWV2ZXMKKyAqIHNlcnZlciByZWdpc3RyYXRpb24sIGxpY2Vuc2UgYWNxdWlzaXRpb24gYW5kIGFueSBvdGhlciBzZXJ2ZXIgcmVsYXRlZCB0cmFuc2FjdGlvbgorICogYnkgcGFzc2luZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIERybU1hbmFnZXJDbGllbnQ6OnByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qKS4KKyAqCisgKiBUaGUgQ2FsbGVyIGNhbiByZXRyaWV2ZSB0aGUgRHJtSW5mbyBpbnN0YW5jZSBieSB1c2luZworICogRHJtTWFuYWdlckNsaWVudDo6YWNxdWlyZURybUluZm8oY29uc3QgRHJtSW5mb1JlcXVlc3QqKSBieSBwYXNzaW5nIERybUluZm9SZXF1ZXN0IGluc3RhbmNlLgorICoKKyAqLworY2xhc3MgRHJtSW5mbyB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm8KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtQnVmZmVyIFRyaWdnZXIgZGF0YQorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgRHJtSW5mbyhpbnQgaW5mb1R5cGUsIGNvbnN0IERybUJ1ZmZlciYgZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvCisgICAgICovCisgICAgdmlydHVhbCB+RHJtSW5mbygpIHt9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mbzsKKworICAgIHByaXZhdGU6CisgICAgICAgIEtleUl0ZXJhdG9yKGNvbnN0IERybUluZm8qIGRybUluZm8pCisgICAgICAgICAgICA6IG1Ecm1JbmZvKGNvbnN0X2Nhc3QgPERybUluZm8qPiAoZHJtSW5mbykpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgS2V5SXRlcmF0b3IoY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgS2V5SXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5LZXlJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvKiBtRHJtSW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSXRlcmF0b3IKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1JbmZvOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgRHJtSW5mbyogZHJtSW5mbykKKyAgICAgICAgICAgIDogbURybUluZm8oY29uc3RfY2FzdCA8RHJtSW5mbyo+IChkcm1JbmZvKSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUluZm8qIG1Ecm1JbmZvOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIGludCBnZXRJbmZvVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIFN0cmluZzggZ2V0TWltZVR5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmlnZ2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJpZ2dlciBkYXRhCisgICAgICovCisgICAgY29uc3QgRHJtQnVmZmVyJiBnZXREYXRhKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBpbnQgZ2V0Q291bnQodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0ga2V5IEtleSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXJyb3IgY29kZQorICAgICAqLworICAgIHN0YXR1c190IHB1dChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZQorICAgICAqLworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEtleUl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gS2V5SXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5kZXgKKyAgICAgKi8KKyAgICBpbnQgaW5kZXhPZktleShjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgaW50IG1JbmZvVHlwZTsKKyAgICBEcm1CdWZmZXIgbURhdGE7CisgICAgU3RyaW5nOCBtTWltZVR5cGU7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUF0dHJpYnV0ZXM7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU5GT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmggYi9pbmNsdWRlL2RybS9Ecm1JbmZvRXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQwOWZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lORk9fRVZFTlRfSF9fCisjZGVmaW5lIF9fRFJNX0lORk9fRVZFTlRfSF9fCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVudGl0eSBjbGFzcyB3aGljaCB3b3VsZCBiZSBwYXNzZWQgdG8gY2FsbGVyIGluCisgKiBEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYpLgorICovCitjbGFzcyBEcm1JbmZvRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb0V2ZW50LmphdmEKKyAgICAgKi8KKyAgICAvLyEgVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5ULCB3aGVuIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbgorICAgIC8vISBhbHJlYWR5IGRvbmUgYnkgYW5vdGhlciBhY2NvdW50IElELgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9BTFJFQURZX1JFR0lTVEVSRURfQllfQU5PVEhFUl9BQ0NPVU5UID0gMTsKKyAgICAvLyEgVFlQRV9SRU1PVkVfUklHSFRTLCB3aGVuIHRoZSByaWdodHMgbmVlZHMgdG8gYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9SRU1PVkVfUklHSFRTID0gMjsKKyAgICAvLyEgVFlQRV9SSUdIVFNfSU5TVEFMTEVELCB3aGVuIHRoZSByaWdodHMgYXJlIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZCBvay4KKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX0lOU1RBTExFRCA9IDM7CisgICAgLy8hIFRZUEVfV0FJVF9GT1JfUklHSFRTLCByaWdodHMgb2JqZWN0IGlzIG9uIGl0J3Mgd2F5IHRvIHBob25lLAorICAgIC8vISB3YWl0IGJlZm9yZSBjYWxsaW5nIGNoZWNrUmlnaHRzIGFnYWluCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1dBSVRfRk9SX1JJR0hUUyA9IDQ7CisgICAgLy8hIFRZUEVfQUNDT1VOVF9BTFJFQURZX1JFR0lTVEVSRUQsIHdoZW4gcmVnaXN0cmF0aW9uIGhhcyBiZWVuCisgICAgLy8hIGFscmVhZHkgZG9uZSBmb3IgdGhlIGdpdmVuIGFjY291bnQuCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX0FDQ09VTlRfQUxSRUFEWV9SRUdJU1RFUkVEID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtRXJyb3JFdmVudC5qYXZhCisgICAgICovCisgICAgLy8hIFRZUEVfUklHSFRTX05PVF9JTlNUQUxMRUQsIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zdGFsbGluZyB0aGUgcmlnaHRzCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19OT1RfSU5TVEFMTEVEID0gMjAwMTsKKyAgICAvLyEgVFlQRV9SSUdIVFNfUkVORVdBTF9OT1RfQUxMT1dFRCwgd2hlbiB0aGUgc2VydmVyIHJlamVjdHMgcmVuZXdhbCBvZiByaWdodHMKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX1JFTkVXQUxfTk9UX0FMTE9XRUQgPSAyMDAyOworICAgIC8vISBUWVBFX05PVF9TVVBQT1JURUQsIHdoZW4gYW5zd2VyIGZyb20gc2VydmVyIGNhbiBub3QgYmUgaGFuZGxlZCBieSB0aGUgbmF0aXZlIGFnZW50CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX05PVF9TVVBQT1JURUQgPSAyMDAzOworICAgIC8vISBUWVBFX09VVF9PRl9NRU1PUlksIHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gZmFpbCBkdXJpbmcgcmVuZXdhbC4KKyAgICAvLyEgQ2FuIGluIHRoZSBmdXR1cmUgcGVyaGFwcyBiZSB1c2VkIHRvIHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfT1VUX09GX01FTU9SWSA9IDIwMDQ7CisgICAgLy8hIFRZUEVfTk9fSU5URVJORVRfQ09OTkVDVElPTiwgd2hlbiB0aGUgSW50ZXJuZXQgY29ubmVjdGlvbiBpcyBtaXNzaW5nIGFuZCBubyBhdHRlbXB0CisgICAgLy8hIGNhbiBiZSBtYWRlIHRvIHJlbmV3IHJpZ2h0cworICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9OT19JTlRFUk5FVF9DT05ORUNUSU9OID0gMjAwNTsKKyAgICAvLyEgVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCwgd2hlbiBmYWlsZWQgdG8gcHJvY2VzcyBEcm1JbmZvLgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9QUk9DRVNTX0RSTV9JTkZPX0ZBSUxFRCA9IDIwMDY7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtSW5mb0V2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW1baW5dIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIERybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvRXZlbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1JbmZvRXZlbnQoKSB7fQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVW5pcXVlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVuaXF1ZSBJZAorICAgICAqLworICAgIGludCBnZXRVbmlxdWVJZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVHlwZSBvZiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqLworICAgIGludCBnZXRUeXBlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBNZXNzYWdlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgY29uc3QgU3RyaW5nOCYgZ2V0TWVzc2FnZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludCBtVW5pcXVlSWQ7CisgICAgaW50IG1JbmZvVHlwZTsKKyAgICBjb25zdCBTdHJpbmc4JiBtTWVzc2FnZTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9JTkZPX0VWRU5UX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1JbmZvUmVxdWVzdC5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQ4ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1JlcXVlc3QuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fSU5GT19SRVFVRVNUX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX1JFUVVFU1RfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gcGFzcyByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGdldAorICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjb21tdW5pY2F0ZSB3aXRoIG9ubGluZSBEUk0gc2VydmVyCisgKgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBwYXNzZWQgdG8KKyAqIERybU1hbmFnZXJDbGllbnQ6OmFjcXVpcmVEcm1JbmZvKGNvbnN0IERybUluZm9SZXF1ZXN0KikgdG8gZ2V0IHRoZQorICogaW5zdGFuY2Ugb2YgRHJtSW5mby4KKyAqCisgKi8KK2NsYXNzIERybUluZm9SZXF1ZXN0IHsKK3B1YmxpYzoKKyAgICAvLyBDaGFuZ2VzIGluIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvUmVxdWVzdC5qYXZhCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JFR0lTVFJBVElPTl9JTkZPID0gMTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTyA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPID0gMzsKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX1BST0dSRVNTX0lORk8gPSA0OworCisgICAgLyoqCisgICAgICogS2V5IHRvIHBhc3MgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGFjY291bnQgb3IgdGhlIHVzZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBBQ0NPVU5UX0lEOworICAgIC8qKgorICAgICAqIEtleSB0byBwYXNzIHRoZSBzdWJzY3JpcHRpb24gaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBTVUJTQ1JJUFRJT05fSUQ7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtSW5mb1JlcXVlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgRHJtSW5mb1JlcXVlc3QoaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvUmVxdWVzdAorICAgICAqLworICAgIHZpcnR1YWwgfkRybUluZm9SZXF1ZXN0KCkge30KKworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBrZXkKKyAgICAgKi8KKyAgICBjbGFzcyBLZXlJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1JbmZvUmVxdWVzdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIEtleUl0ZXJhdG9yKGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkKKyAgICAgICAgICAgIDogbURybUluZm9SZXF1ZXN0KGNvbnN0X2Nhc3QgPERybUluZm9SZXF1ZXN0Kj4gKGRybUluZm9SZXF1ZXN0KSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybUluZm9SZXF1ZXN0KiBtRHJtSW5mb1JlcXVlc3Q7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yCisgICAgICovCisgICAgY2xhc3MgSXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mb1JlcXVlc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBJdGVyYXRvcihjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpCisgICAgICAgICAgICA6IG1Ecm1JbmZvUmVxdWVzdChjb25zdF9jYXN0IDxEcm1JbmZvUmVxdWVzdCo+IChkcm1JbmZvUmVxdWVzdCkpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvUmVxdWVzdCogbURybUluZm9SZXF1ZXN0OworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSW5mb3JtYXRpb24gdHlwZQorICAgICAqLworICAgIGludCBnZXRJbmZvVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIFN0cmluZzggZ2V0TWltZVR5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBEcm1SZXF1ZXN0SW5mb01hcAorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgZW50cmllcworICAgICAqLworICAgIGludCBnZXRDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFkZHMgb3B0aW9uYWwgaW5mb3JtYXRpb24gYXMgPGtleSwgdmFsdWU+IHBhaXIgdG8gdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBrZXkgS2V5IHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gdmFsdWUgVmFsdWUgdG8gYWRkCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlCisgICAgICovCisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXZlbiBrZXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlCisgICAgICovCisgICAgU3RyaW5nOCBnZXQoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgS2V5SXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBLZXlJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQgbUluZm9UeXBlOworICAgIFN0cmluZzggbU1pbWVUeXBlOworCisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBEcm1SZXF1ZXN0SW5mb01hcDsKKyAgICBEcm1SZXF1ZXN0SW5mb01hcCBtUmVxdWVzdEluZm9ybWF0aW9uTWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0lORk9fUkVRVUVTVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb1N0YXR1cy5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzBmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1JbmZvU3RhdHVzLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fSU5GT19TVEFUVVNfSF9fCisjZGVmaW5lIF9fRFJNX0lORk9fU1RBVFVTX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgcmVzdWx0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBkZXZpY2UKKyAqIGFuZCBvbmxpbmUgRFJNIHNlcnZlci4KKyAqCisgKiBBcyBhIHJlc3VsdCBvZiBEcm1NYW5hZ2VyQ2xpZW50Ojpwcm9jZXNzRHJtSW5mbyhjb25zdCBEcm1JbmZvKikgYW4gaW5zdGFuY2Ugb2YKKyAqIERybUluZm9TdGF0dXMgd291bGQgYmUgcmV0dXJuZWQuIFRoaXMgY2xhc3MgaG9sZHMgRHJtQnVmZmVyIHdoaWNoIGNvdWxkIGJlCisgKiB1c2VkIHRvIGluc3RhbnRpYXRlIERybVJpZ2h0cyBpbiBsaWNlbnNlIGFjcXVpc2l0aW9uLgorICoKKyAqLworY2xhc3MgRHJtSW5mb1N0YXR1cyB7CitwdWJsaWM6CisgICAgLy8gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBEcm1JbmZvU3RhdHVzLmphdmEKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19PSyA9IDE7CisgICAgc3RhdGljIGNvbnN0IGludCBTVEFUVVNfRVJST1IgPSAyOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm9TdGF0dXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gX3N0YXR1c0NvZGUgU3RhdHVzIG9mIHRoZSBjb21tdW5pY2F0aW9uCisgICAgICogQHBhcmFtW2luXSBfaW5mb1R5cGUgVHlwZSBvZiB0aGUgRFJNIGluZm9ybWF0aW9uIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbVtpbl0gX2RybUJ1ZmZlciBSaWdodHMgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIF9taW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBEcm1JbmZvU3RhdHVzKGludCBfc3RhdHVzQ29kZSwgaW50IF9pbmZvVHlwZSwgY29uc3QgRHJtQnVmZmVyKiBfZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBfbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mb1N0YXR1cworICAgICAqLworICAgIHZpcnR1YWwgfkRybUluZm9TdGF0dXMoKSB7CisKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgc3RhdHVzQ29kZTsKKyAgICBpbnQgaW5mb1R5cGU7CisgICAgY29uc3QgRHJtQnVmZmVyKiBkcm1CdWZmZXI7CisgICAgU3RyaW5nOCBtaW1lVHlwZTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9JTkZPX1NUQVRVU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0hfXworI2RlZmluZSBfX0RSTV9NQU5BR0VSX0NMSUVOVF9IX18KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtSW5mbzsKK2NsYXNzIERybVJpZ2h0czsKK2NsYXNzIERybU1ldGFkYXRhOworY2xhc3MgRHJtSW5mb0V2ZW50OworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBEcm1Db25zdHJhaW50czsKK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1czsKK2NsYXNzIERybU1hbmFnZXJDbGllbnRJbXBsOworCisvKioKKyAqIFRoZSBOYXRpdmUgYXBwbGljYXRpb24gd2lsbCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGFuZCBhY2Nlc3MgRFJNIEZyYW1ld29yaworICogc2VydmljZXMgdGhyb3VnaCB0aGlzIGNsYXNzLgorICoKKyAqLworY2xhc3MgRHJtTWFuYWdlckNsaWVudCB7CitwdWJsaWM6CisgICAgRHJtTWFuYWdlckNsaWVudCgpOworCisgICAgdmlydHVhbCB+RHJtTWFuYWdlckNsaWVudCgpOworCitwdWJsaWM6CisgICAgY2xhc3MgT25JbmZvTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UgeworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PbkluZm9MaXN0ZW5lcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgPSAwOworICAgIH07CisKKy8qKgorICogQVBJcyB3aGljaCB3aWxsIGJlIHVzZWQgYnkgbmF0aXZlIG1vZHVsZXMgKGUuZy4gU3RhZ2VGcmlnaHQpCisgKgorICovCitwdWJsaWM6CisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICovCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICovCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICAgICAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgaXMgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0uIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEBwYXJhbVtpbl0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlLgorICAgICAqICAgICBJbiBjYXNlIGxpY2Vuc2UgaGFzIGJlZW4gZXhwaXJlZCwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERSTSBlbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwbGF5YmFja1N0YXR1cyBQbGF5YmFjayBhY3Rpb24gKFBsYXliYWNrOjpTVEFSVCwgUGxheWJhY2s6OlNUT1AsIFBsYXliYWNrOjpQQVVTRSkKKyAgICAgKiBAcGFyYW1baW5dIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgICAgICogICAgICAgICAgICAgICAgICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJViA9IE5VTEwpOworCisgICAgLyoqCisgICAgICogRmluYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtvdXRdIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgICAgICogQHBhcmFtW2luXSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICAgICAqLworICAgIHNzaXplX3QgcHJlYWQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHBhcmFtW2luXSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKy8qKgorICogQVBJcyB3aGljaCBhcmUganVzdCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEphdmEgQVBJCisgKgorICovCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICAgICAqIHJlY2VpdmUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGluZm9MaXN0ZW5lciBMaXN0ZW5lcgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0T25JbmZvTGlzdGVuZXIoY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICAgICAqICAgICAgICAgICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAgICAgKiBAcmV0dXJuIERybUNvbnN0cmFpbnRzCisgICAgICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgICAgICogICAgICAgICBrZXktdmFsdWUgcGFpcnMgb2YgbWV0YWRhdGEKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIERybU1ldGFkYXRhKiBnZXRNZXRhZGF0YShjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcGFyYW1baW5dIG1pbWV0eXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIFRydWUgaWYgRHJtTWFuYWdlciBjYW4gaGFuZGxlIGdpdmVuIHBhdGggb3IgbWltZSB0eXBlLgorICAgICAqLworICAgIGJvb2wgY2FuSGFuZGxlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIGRybSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBpdHMgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oY29uc3QgRHJtSW5mbyogZHJtSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICAgICAqIGFjcXVpc2l0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAgICAgKiBAcmV0dXJuIERybUluZm8KKyAgICAgKiAgICAgaW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgICAgICogYW5kIG1ha2UgYXNzb2NpYXRpb24gd2l0aCBjb250ZW50IHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNhdmVSaWdodHMoCisgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLCBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIFN0cmluZzgKKyAgICAgKiAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgICAgICovCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICAgICAqIGJ5IHVzaW5nIHNwZWNpZmllZCBwYXRoIG9yIG1pbWV0eXBlLiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIHNob3VsZCBiZSBub24gbnVsbAorICAgICAqIHRvIHJldHJpZXZlIERSTSBvYmplY3QgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgRHJtT2JqZWN0VHlwZTo6Q09OVEVOVCwgRHJtT2JqZWN0VHlwZTo6UklHSFRTX09CSkVDVAorICAgICAqLworICAgIGludCBnZXREcm1PYmplY3RUeXBlKGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgZm9yIHRoZSBwcm90ZWN0ZWQgY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICAgICAqLworICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIEFQSSBpcyBmb3IgRm9yd2FyZCBMb2NrIERSTS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIERlc2NyaXB0aW9uL01JTUUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBoYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKi8KKyAgICBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIFBhc3NlcyB0aGUgaW5wdXQgZGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZC4gVGhlIHJlc3VsdGFudAorICAgICAqIGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisgICAgLyoqCisgICAgICogV2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQgb3Igd2hlbiBhbgorICAgICAqIGVycm9yIG9jY3VycyB0aGF0IHRpbWUgdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBpbmZvcm0gdGhlIERybSBhZ2VudAorICAgICAqIHZpYSB0aGlzIEFQSS4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCBjb252ZXJ0SWQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBEcm1TdXBwb3J0SW5mbyBpbnN0YW5jZSB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUuCisgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBKTkkgbGF5ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbVtvdXRdIGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZHJtU3VwcG9ydEluZm9BcnJheQorICAgICAqIEBwYXJhbVtvdXRdIGRybVN1cHBvcnRJbmZvQXJyYXkgQXJyYXkgY29udGFpbnMgYWxsIERybVN1cHBvcnRJbmZvCisgICAgICogICAgIHRoYXQgbmF0aXZlIERSTSBmcmFtZXdvcmsgY2FuIGhhbmRsZQorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKK3ByaXZhdGU6CisgICAgaW50IG1VbmlxdWVJZDsKKyAgICBNdXRleCBtRGVjcnlwdExvY2s7CisgICAgRHJtTWFuYWdlckNsaWVudEltcGwqIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX0NMSUVOVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWV0YWRhdGEuaCBiL2luY2x1ZGUvZHJtL0RybU1ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NTM4YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybU1ldGFkYXRhLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01FVEFEQVRBX0hfXworI2RlZmluZSBfX0RSTV9NRVRBREFUQV9IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0cmFpbnRzIGluZm9ybWF0aW9uLgorICoKKyAqIEFzIGEgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OmdldE1ldGFkYXRhKGNvbnN0IFN0cmluZzgqKQorICogYW4gaW5zdGFuY2Ugb2YgRHJtTWV0YWRhdGEgd291bGQgYmUgcmV0dXJuZWQuCisgKi8KK2NsYXNzIERybU1ldGFkYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtTWV0YWRhdGE7CisgICAgcHJpdmF0ZToKKyAgICAgICAgS2V5SXRlcmF0b3IoRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhKSA6IG1Ecm1NZXRhZGF0YShkcm1NZXRhZGF0YSksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICBLZXlJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfktleUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybU1ldGFkYXRhKiBtRHJtTWV0YWRhdGE7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBjb25zdHJhaW50cworICAgICAqLworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybU1ldGFkYXRhOworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSkgOiBtRHJtTWV0YWRhdGEoZHJtTWV0YWRhdGEpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4IG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybU1ldGFkYXRhKiBtRHJtTWV0YWRhdGE7CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworcHVibGljOgorICAgIERybU1ldGFkYXRhKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1NZXRhZGF0YSgpIHsKKyAgICAgICAgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIGtleUl0ID0gdGhpcy0+a2V5SXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gdGhpcy0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHZhbHVlOworICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTWV0YWRhdGFNYXAuY2xlYXIoKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgZ2V0Q291bnQodm9pZCkgY29uc3Q7CisgICAgc3RhdHVzX3QgcHV0KGNvbnN0IFN0cmluZzgqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisgICAgY29uc3QgY2hhciogZ2V0QXNCeXRlQXJyYXkoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKyAgICBLZXlJdGVyYXRvciBrZXlJdGVyYXRvcigpOworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciogZ2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEtleWVkVmVjdG9yPFN0cmluZzgsIGNvbnN0IGNoYXIqPiBEcm1NZXRhZGF0YU1hcDsKKyAgICBEcm1NZXRhZGF0YU1hcCBtTWV0YWRhdGFNYXA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fTUVUQURBVEFfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybVJpZ2h0cy5oIGIvaW5jbHVkZS9kcm0vRHJtUmlnaHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmOGY3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybVJpZ2h0cy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9SSUdIVFNfSF9fCisjZGVmaW5lIF9fRFJNX1JJR0hUU19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gd2hpY2ggd2FzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgb25saW5lIERSTSBzZXJ2ZXIuCisgKgorICogQ2FsbGVyIGNhbiBpbnN0YW50aWF0ZSBEcm1SaWdodHMgYnkgaW52b2tpbmcgRHJtUmlnaHRzKGNvbnN0IERybUJ1ZmZlciYsIFN0cmluZykKKyAqIGNvbnN0cnVjdG9yIGJ5IHVzaW5nIHRoZSByZXN1bHQgb2YgRHJtTWFuYWdlckNsaWVudDo6UHJvY2Vzc0RybUluZm8oY29uc3QgRHJtSW5mbyopIEFQSS4KKyAqIENhbGxlciBjYW4gYWxzbyBpbnN0YW50aWF0ZSBEcm1SaWdodHMgdXNpbmcgdGhlIGZpbGUgcGF0aCB3aGljaCBjb250YWlucyByaWdodHMgaW5mb3JtYXRpb24uCisgKgorICovCitjbGFzcyBEcm1SaWdodHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1SaWdodHMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzRmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKiBAcGFyYW1baW5dIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICogQHBhcmFtW2luXSBzdWJzY3JpcHRpb25JZCBTdWJzY3JpcHRpb24gSWQgb2YgdGhlIHVzZXIKKyAgICAgKi8KKyAgICBEcm1SaWdodHMoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNGaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQgPSBTdHJpbmc4KCJfTk9fVVNFUiIpLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgc3Vic2NyaXB0aW9uSWQgPSBTdHJpbmc4KCIiKSk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtUmlnaHRzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c0RhdGEgUmlnaHRzIGRhdGEKKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqIEBwYXJhbVtpbl0gYWNjb3VudElkIEFjY291bnQgSWQgb2YgdGhlIHVzZXIKKyAgICAgKiBAcGFyYW1baW5dIHN1YnNjcmlwdGlvbklkIFN1YnNjcmlwdGlvbiBJZCBvZiB0aGUgdXNlcgorICAgICAqLworICAgIERybVJpZ2h0cygKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgcmlnaHRzRGF0YSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQgPSBTdHJpbmc4KCJfTk9fVVNFUiIpLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgc3Vic2NyaXB0aW9uSWQgPSBTdHJpbmc4KCIiKSk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1SaWdodHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1SaWdodHMoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJpZ2h0cyBkYXRhCisgICAgICovCisgICAgY29uc3QgRHJtQnVmZmVyJiBnZXREYXRhKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gTUlNRSB0eXBlCisgICAgICovCisgICAgU3RyaW5nOCBnZXRNaW1lVHlwZSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjY291bnQtaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjb3VudCBJZAorICAgICAqLworICAgIFN0cmluZzggZ2V0QWNjb3VudElkKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3Vic2NyaXB0aW9uLWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBTdWJzY3JpcHRpb24gSWQKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldFN1YnNjcmlwdGlvbklkKHZvaWQpIGNvbnN0OworCitwcml2YXRlOgorICAgIERybUJ1ZmZlciBtRGF0YTsKKyAgICBTdHJpbmc4IG1NaW1lVHlwZTsKKyAgICBTdHJpbmc4IG1BY2NvdW50SWQ7CisgICAgU3RyaW5nOCBtU3Vic2NyaXB0aW9uSWQ7CisgICAgY2hhciogbVJpZ2h0c0Zyb21GaWxlOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1JJR0hUU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtU3VwcG9ydEluZm8uaCBiL2luY2x1ZGUvZHJtL0RybVN1cHBvcnRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybVN1cHBvcnRJbmZvLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX1NVUFBPUlRfSU5GT19IX18KKyNkZWZpbmUgX19EUk1fU1VQUE9SVF9JTkZPX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgY2FwYWJpbGl0eSBvZiBlYWNoIHBsdWctaW4sCisgKiBzdWNoIGFzIG1pbWV0eXBlJ3MgYW5kIGZpbGUgc3VmZml4ZXMgaXQgY291bGQgaGFuZGxlLgorICoKKyAqIFBsdWctaW4gZGV2ZWxvcGVyIGNvdWxkIHJldHVybiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgcGx1Z2luIGJ5IHBhc3NpbmcKKyAqIERybVN1cHBvcnRJbmZvIGluc3RhbmNlLgorICoKKyAqLworY2xhc3MgRHJtU3VwcG9ydEluZm8geworcHVibGljOgorICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBtTWltZVR5cGVWZWN0b3IKKyAgICAgKi8KKyAgICBjbGFzcyBNaW1lVHlwZUl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybVN1cHBvcnRJbmZvOworICAgIHByaXZhdGU6CisgICAgICAgIE1pbWVUeXBlSXRlcmF0b3IoRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvKQorICAgICAgICAgICA6IG1Ecm1TdXBwb3J0SW5mbyhkcm1TdXBwb3J0SW5mbyksIG1JbmRleCgwKSB7fQorICAgIHB1YmxpYzoKKyAgICAgICAgTWltZVR5cGVJdGVyYXRvcihjb25zdCBNaW1lVHlwZUl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIE1pbWVUeXBlSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBNaW1lVHlwZUl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfk1pbWVUeXBlSXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtU3VwcG9ydEluZm8qIG1Ecm1TdXBwb3J0SW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIG1GaWxlU3VmZml4VmVjdG9yCisgICAgICovCisgICAgY2xhc3MgRmlsZVN1ZmZpeEl0ZXJhdG9yIHsKKyAgICAgICBmcmllbmQgY2xhc3MgRHJtU3VwcG9ydEluZm87CisKKyAgICBwcml2YXRlOgorICAgICAgICBGaWxlU3VmZml4SXRlcmF0b3IoRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvKQorICAgICAgICAgICAgOiBtRHJtU3VwcG9ydEluZm8oZHJtU3VwcG9ydEluZm8pLCBtSW5kZXgoMCkge30KKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGVTdWZmaXhJdGVyYXRvcihjb25zdCBGaWxlU3VmZml4SXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgRmlsZVN1ZmZpeEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgRmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdWZmaXhJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1TdXBwb3J0SW5mbyogbURybVN1cHBvcnRJbmZvOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICBEcm1TdXBwb3J0SW5mbygpOworCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICBEcm1TdXBwb3J0SW5mbyhjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtU3VwcG9ydEluZm8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1TdXBwb3J0SW5mbygpIHt9CisKKyAgICBEcm1TdXBwb3J0SW5mbyYgb3BlcmF0b3I9KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbyk7CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgRmlsZVN1ZmZpeEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggZmlsZSBzdWZmaXggdmFsdWVzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gRmlsZVN1ZmZpeEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEZpbGVTdWZmaXhJdGVyYXRvciBnZXRGaWxlU3VmZml4SXRlcmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTWltZVR5cGVJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIG1pbWV0eXBlIHZhbHVlcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1pbWVUeXBlSXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgTWltZVR5cGVJdGVyYXRvciBnZXRNaW1lVHlwZUl0ZXJhdG9yKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWltZXR5cGVzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIG1pbWV0eXBlcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBpbnQgZ2V0TWltZVR5cGVDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIHR5cGVzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGZpbGUgdHlwZXMgc3VwcG9ydGVkCisgICAgICovCisgICAgaW50IGdldEZpbGVTdWZmaXhDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIG1pbWV0eXBlIHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBtaW1ldHlwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgbWltZXR5cGUgdG8gYmUgYWRkZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGFkZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGZpbGVzdWZmaXggdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgdHlwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZXN1ZmZpeCBmaWxlIHN1ZmZpeCB0byBiZSBhZGRlZAorICAgICAqIEByZXR1cm4gUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgYWRkRmlsZVN1ZmZpeChjb25zdCBTdHJpbmc4JiBmaWxlU3VmZml4KTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdW5pcXVlIGRlc2NyaXB0aW9uIGFib3V0IHRoZSBwbHVnaW4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVzY3JpcHRpb24gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICogQHJldHVybiBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnaW4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVW5pcXVlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgU3RyaW5nOCBnZXREZXNjcmlwdGlvbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGdpdmVuIG1pbWV0eXBlIGlzIHN1cHBvcnRlZCBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICogQHJldHVybgorICAgICAqICAgICAgICB0cnVlIC0gaWYgbWltZS10eXBlIGlzIHN1cHBvcnRlZAorICAgICAqICAgICAgICBmYWxzZSAtIGlmIG1pbWUtdHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICovCisgICAgYm9vbCBpc1N1cHBvcnRlZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBnaXZlbiBmaWxlIHR5cGUgaXMgc3VwcG9ydGVkIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlVHlwZSBGaWxlIHR5cGUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHRydWUgaWYgZmlsZSB0eXBlIGlzIHN1cHBvcnRlZAorICAgICAqICAgICBmYWxzZSBpZiBmaWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIGJvb2wgaXNTdXBwb3J0ZWRGaWxlU3VmZml4KGNvbnN0IFN0cmluZzgmIGZpbGVUeXBlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8U3RyaW5nOD4gbU1pbWVUeXBlVmVjdG9yOworICAgIFZlY3RvcjxTdHJpbmc4PiBtRmlsZVN1ZmZpeFZlY3RvcjsKKworICAgIFN0cmluZzggbURlc2NyaXB0aW9uOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1NVUFBPUlRfSU5GT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaCBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3NjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fCisjZGVmaW5lIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2RlZmluZSBJTlZBTElEX1ZBTFVFIC0xCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBFcnJvciBjb2RlIGZvciBEUk0gRnJhbWVvd3JrCisgKi8KK2VudW0geworICAgIERSTV9FUlJPUl9CQVNFID0gLTIwMDAsCisKKyAgICBEUk1fRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSwKKyAgICBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gMywKKyAgICBEUk1fRVJST1JfREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1LAorCisgICAgRFJNX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTk9fRVJST1IKK307CisKKy8qKgorICogRGVmaW5lcyBEUk0gQnVmZmVyCisgKi8KK2NsYXNzIERybUJ1ZmZlciB7CitwdWJsaWM6CisgICAgY2hhciogZGF0YTsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgRHJtQnVmZmVyKCkgOgorICAgICAgICBkYXRhKE5VTEwpLAorICAgICAgICBsZW5ndGgoMCkgeworICAgIH0KKworICAgIERybUJ1ZmZlcihjaGFyKiBkYXRhQnl0ZXMsIGludCBkYXRhTGVuZ3RoKSA6CisgICAgICAgIGRhdGEoZGF0YUJ5dGVzKSwKKyAgICAgICAgbGVuZ3RoKGRhdGFMZW5ndGgpIHsKKyAgICB9CisKK307CisKKy8qKgorICogRGVmaW5lcyBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgKi8KK2NsYXNzIEFjdGlvbkRlc2NyaXB0aW9uIHsKK3B1YmxpYzoKKyAgICBBY3Rpb25EZXNjcmlwdGlvbihpbnQgX291dHB1dFR5cGUsIGludCBfY29uZmlndXJhdGlvbikgOgorICAgICAgICBvdXRwdXRUeXBlKF9vdXRwdXRUeXBlKSwKKyAgICAgICAgY29uZmlndXJhdGlvbihfY29uZmlndXJhdGlvbikgeworICAgIH0KKworcHVibGljOgorICAgIGludCBvdXRwdXRUeXBlOyAgIC8qIEJMVUVUT09USCAsIEhETUkqLworICAgIGludCBjb25maWd1cmF0aW9uOyAvKiBSRVNPTFVUSU9OXzcyMF80ODAgLCBSRUNPUkRBQkxFIGV0Yy4qLworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIERSTSB0eXBlcworICovCitjbGFzcyBEcm1PYmplY3RUeXBlIHsKK3ByaXZhdGU6CisgICAgRHJtT2JqZWN0VHlwZSgpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSB1bmtub3duIHR5cGUKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAweDAwOworICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgQ09OVEVOVCA9IDB4MDE7CisgICAgLyoqCisgICAgICogRmllbGQgc3BlY2lmaWVzIHRoZSByaWdodHMgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19PQkpFQ1QgPSAweDAyOworICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgdHJpZ2dlciBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgVFJJR0dFUl9PQkpFQ1QgPSAweDAzOworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHBsYXkgYmFjaworICovCitjbGFzcyBQbGF5YmFjayB7Citwcml2YXRlOgorICAgIFBsYXliYWNrKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RhcnQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVJUID0gMHgwMDsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgc3RvcAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgU1RPUCA9IDB4MDE7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHBsYXliYWNrIHBhdXNlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUEFVU0UgPSAweDAyOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayByZXN1bWVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSRVNVTUUgPSAweDAzOworfTsKKworLyoqCisgKiBEZWZpbmVzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHByb3RlY3RlZCBjb250ZW50CisgKi8KK2NsYXNzIEFjdGlvbiB7Citwcml2YXRlOgorICAgIEFjdGlvbigpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUID0gMHgwMDsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgcGxheWVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBQTEFZID0gMHgwMTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgc2V0IGFzIHJpbmcgdG9uZQorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklOR1RPTkUgPSAweDAyOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSB0cmFuc2ZlcmVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBUUkFOU0ZFUiA9IDB4MDM7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHNldCBhcyBvdXRwdXQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IE9VVFBVVCA9IDB4MDQ7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgcHJldmlldyBpcyBhbGxvd2VkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBQUkVWSUVXID0gMHgwNTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgZXhlY3V0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IEVYRUNVVEUgPSAweDA2OworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IERJU1BMQVkgPSAweDA3OworfTsKKworLyoqCisgKiBEZWZpbmVzIGNvbnN0YW50cyByZWxhdGVkIHRvIHN0YXR1cyBvZiB0aGUgcmlnaHRzCisgKi8KK2NsYXNzIFJpZ2h0c1N0YXR1cyB7Citwcml2YXRlOgorICAgIFJpZ2h0c1N0YXR1cygpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19WQUxJRCA9IDB4MDA7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgaW52YWxpZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklHSFRTX0lOVkFMSUQgPSAweDAxOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIGV4cGlyZWQgZm9yIHRoZSBjb250ZW50CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSSUdIVFNfRVhQSVJFRCA9IDB4MDI7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIHJpZ2h0cyBhcmUgbm90IGFjcXVpcmVkIGZvciB0aGUgY29udGVudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklHSFRTX05PVF9BQ1FVSVJFRCA9IDB4MDM7Cit9OworCisvKioKKyAqIERlZmluZXMgQVBJIHNldCBmb3IgZGVjcnlwdGlvbgorICovCitjbGFzcyBEZWNyeXB0QXBpVHlwZSB7Citwcml2YXRlOgorICAgIERlY3J5cHRBcGlUeXBlKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBEZWNyeXB0IEFQSSBzZXQgZm9yIG5vbiBlbmNyeXB0ZWQgY29udGVudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgTk9OX0VOQ1JZUFRFRCA9IDB4MDA7CisgICAgLyoqCisgICAgICogRGVjcnlwdCBBUEkgc2V0IGZvciBFUyBiYXNlZCBEUk0KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IEVMRU1FTlRBUllfU1RSRUFNX0JBU0VEID0gMHgwMTsKKyAgICAvKioKKyAgICAgKiBQT1NJWCBiYXNlZCBEZWNyeXB0IEFQSSBzZXQgZm9yIGNvbnRhaW5lciBiYXNlZCBEUk0KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IENPTlRBSU5FUl9CQVNFRCA9IDB4MDI7Cit9OworCisvKioKKyAqIERlZmluZXMgZGVjcnlwdGlvbiBpbmZvcm1hdGlvbgorICovCitjbGFzcyBEZWNyeXB0SW5mbyB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogc2l6ZSBvZiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIHRvIGdldCB0aGUgZGVjcnlwdGVkIGNvbnRlbnQuCisgICAgICovCisgICAgaW50IGRlY3J5cHRCdWZmZXJMZW5ndGg7CisgICAgLyoqCisgICAgICogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwdXJwb3NlCisgICAgICovCit9OworCisvKioKKyAqIERlZmluZXMgZGVjcnlwdGlvbiBoYW5kbGUKKyAqLworY2xhc3MgRGVjcnlwdEhhbmRsZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogRGVjcnlwdGlvbiBzZXNzaW9uIEhhbmRsZQorICAgICAqLworICAgIGludCBkZWNyeXB0SWQ7CisgICAgLyoqCisgICAgICogTWltZXR5cGUgb2YgdGhlIGNvbnRlbnQgdG8gYmUgdXNlZCB0byBzZWxlY3QgdGhlIG1lZGlhIGV4dHJhY3RvcgorICAgICAqIEZvciBlLmcuLCAidmlkZW8vbXBlZyIgb3IgImF1ZGlvL21wMyIKKyAgICAgKi8KKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hpY2ggZGVjcnlwdGlvbiBwYXR0ZXJuIHNob3VsZCBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGdpdmVuIGNvbnRlbnQKKyAgICAgKiBEcm1GcmFtZXdvcmsgcHJvdmlkZXMgdHdvIGRpZmZlcmVudCBzZXQgb2YgZGVjcnlwdGlvbiBBUElzLgorICAgICAqICAgMS4gRGVjcnlwdCBBUElzIGZvciBlbGVtZW50YXJ5IHN0cmVhbSBiYXNlZCBEUk0KKyAgICAgKiAgICAgIChmaWxlIGZvcm1hdCBpcyBub3QgZW5jcnlwdGVkIGJ1dCBFUyBpcyBlbmNyeXB0ZWQpCisgICAgICogICAgICAgICBlLmcuLCBNYXJsaW4gRFJNIChNUDQgZmlsZSBmb3JtYXQpLCBXTS1EUk0gKGFzZiBmaWxlIGZvcm1hdCkKKyAgICAgKgorICAgICAqICAgICAgICAgRGVjcnlwdEFwaVR5cGU6OkVMRU1FTlRBUllfU1RSRUFNX0JBU0VECisgICAgICogICAgICAgICAgICAgRGVjcnlwdGlvbiBBUEkgc2V0IGZvciBFUyBiYXNlZCBEUk0KKyAgICAgKiAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURlY3J5cHRVbml0KCksIGRlY3J5cHQoKSwgYW5kIGZpbmFsaXplRGVjcnlwdFVuaXQoKQorICAgICAqICAgMi4gRGVjcnlwdCBBUElzIGZvciBjb250YWluZXIgYmFzZWQgRFJNIChmaWxlIGZvcm1hdCBpdHNlbGYgaXMgZW5jcnlwdGVkKQorICAgICAqICAgICAgICAgZS5nLiwgT01BIERSTSAoZGNmIGZpbGUgZm9ybWF0KQorICAgICAqCisgICAgICogICAgICAgICBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECisgICAgICogICAgICAgICAgICAgUE9TSVggYmFzZWQgRGVjcnlwdGlvbiBBUEkgc2V0IGZvciBjb250YWluZXIgYmFzZWQgRFJNCisgICAgICogICAgICAgICAgICAgICAgIHByZWFkKCkKKyAgICAgKi8KKyAgICBpbnQgZGVjcnlwdEFwaVR5cGU7CisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgbGlrZQorICAgICAqICAgICBSSUdIVFNfVkFMSUQsIFJJR0hUU19JTlZBTElELCBSSUdIVFNfRVhQSVJFRCBvciBSSUdIVFNfTk9UX0FDUVVJUkVECisgICAgICovCisgICAgaW50IHN0YXR1czsKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkZWNyeXB0IGNvbnRlbnQKKyAgICAgKiBlLmcuIHNpemUgb2YgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCB0byBnZXQgdGhlIGRlY3J5cHRlZCBjb250ZW50LgorICAgICAqLworICAgIERlY3J5cHRJbmZvKiBkZWNyeXB0SW5mbzsKKworcHVibGljOgorICAgIERlY3J5cHRIYW5kbGUoKToKKyAgICAgICAgICAgIGRlY3J5cHRJZChJTlZBTElEX1ZBTFVFKSwKKyAgICAgICAgICAgIG1pbWVUeXBlKCIiKSwKKyAgICAgICAgICAgIGRlY3J5cHRBcGlUeXBlKElOVkFMSURfVkFMVUUpLAorICAgICAgICAgICAgc3RhdHVzKElOVkFMSURfVkFMVUUpIHsKKworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlY3J5cHRIYW5kbGUmIGhhbmRsZSkgY29uc3QgeworICAgICAgICByZXR1cm4gKGRlY3J5cHRJZCA8IGhhbmRsZS5kZWNyeXB0SWQpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWNyeXB0SGFuZGxlJiBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChkZWNyeXB0SWQgPT0gaGFuZGxlLmRlY3J5cHRJZCk7CisgICAgfQorfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0ZSQU1FV09SS19DT01NT05fSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlLmggYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWFmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTdXJmYWNlVGV4dHVyZSB7CisgICAgc3RydWN0IEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHt9OworCisgICAgU3VyZmFjZVRleHR1cmUoR0x1aW50KSB7fQorICAgIHZvaWQgdXBkYXRlVGV4SW1hZ2UoKSB7fQorICAgIHZvaWQgZGVjU3Ryb25nKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2VUZXh0dXJlPiogY29uc3QpIHt9CisgICAgdm9pZCBpbmNTdHJvbmcoYW5kcm9pZDo6c3A8YW5kcm9pZDo6U3VyZmFjZVRleHR1cmU+KiBjb25zdCkge30KKyAgICB2b2lkIGdldFRyYW5zZm9ybU1hdHJpeChmbG9hdCBtdHhbMTZdKSB7fQorICAgIHZvaWQgc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYpIHt9Cit9OworCitzdGF0aWMgc3A8U3VyZmFjZVRleHR1cmU+IFN1cmZhY2VUZXh0dXJlX2dldFN1cmZhY2VUZXh0dXJlKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3A8U3VyZmFjZVRleHR1cmU+IHM7CisgICAgcmV0dXJuIHM7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YSBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCmNvcHkgdG8gaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaAppbmRleCA4NmRlMzY2Li5hODM3NTZlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQorKysgYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworI2lmbmRlZiBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRUNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFQ0xJRU5UX0gKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOworI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgZXhjZXB0aW9ucyBpbiBTVEsgc2VydmljZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWNsYXNzIFN0a0V4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBTdGtFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorc3RydWN0IFN1cmZhY2VUZXh0dXJlQ2xpZW50IDogcHVibGljIEFOYXRpdmVXaW5kb3cgeworICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KGNvbnN0IHNwPFN1cmZhY2VUZXh0dXJlPiYpe30KK307CisKIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IGEzZGEzZWQuLmQwYjlmY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03Myw2ICs3NCwxMyBAQAogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU25pZmZlcihTbmlmZmVyRnVuYyBmdW5jKTsKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogRHJtSW5pdGlhbGl6YXRpb24oRHJtTWFuYWdlckNsaWVudCAqY2xpZW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7fTsKKworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKaW5kZXggOGEyMTVlYS4uNDMwNzI2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNywxNSArMzgsMjkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKERybU1hbmFnZXJDbGllbnQgKmNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBGSUxFICptRmlsZTsKKyAgICBpbnQgbUZkOwogICAgIGludDY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAgICAgTXV0ZXggbUxvY2s7CiAKKyAgICAvKmZvciBEUk0qLworICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIGludDY0X3QgbURybUJ1Zk9mZnNldDsKKyAgICBpbnQ2NF90IG1Ecm1CdWZTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CisKKyAgICBzc2l6ZV90IHJlYWRBdERSTShvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKwogICAgIEZpbGVTb3VyY2UoY29uc3QgRmlsZVNvdXJjZSAmKTsKICAgICBGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgRmlsZVNvdXJjZSAmKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggZTQ0MTIyZC4uNmRmNGQ4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtNDAsNiArNDAsOCBAQAogICAgIC8vIE5vdCB0ZWNobmljYWxseSBhbiBlcnJvci4KICAgICBJTkZPX0ZPUk1BVF9DSEFOR0VEICAgID0gTUVESUFfRVJST1JfQkFTRSAtIDEyLAogICAgIElORk9fRElTQ09OVElOVUlUWSAgICAgPSBNRURJQV9FUlJPUl9CQVNFIC0gMTMsCisKKyAgICBFUlJPUl9OT19MSUNFTlNFICAgICAgID0gTUVESUFfRVJST1JfQkFTRSAtIDE0LAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAxNmIwYTRjLi5hODIxMDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC01NSw2ICs1NSwxMiBAQAogICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgdm9pZCBzZXREcm1GbGFnKGJvb2wgZmxhZykge307CisgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkge30KICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggYmZmYjllMC4uZWEyZmE1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtNTgsNiArNTgsOCBAQAogICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKICAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCiAgICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAorICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCiAKICAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCiAgICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2h3dWkvRHJhd0dsSW5mby5oIGIvaW5jbHVkZS9wcml2YXRlL2h3dWkvRHJhd0dsSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTkxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ByaXZhdGUvaHd1aS9EcmF3R2xJbmZvLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IV1VJX0RSQVdfR0xfSU5GT19ICisjZGVmaW5lIEFORFJPSURfSFdVSV9EUkFXX0dMX0lORk9fSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogU3RydWN0dXJlIHVzZWQgYnkgT3BlbkdMUmVuZGVyZXI6OmNhbGxEcmF3R0xGdW5jdGlvbigpIHRvIHBhc3MgYW5kCisgKiByZWNlaXZlIGRhdGEgZnJvbSBPcGVuR0wgZnVuY3RvcnMuCisgKi8KK3N0cnVjdCBEcmF3R2xJbmZvIHsKKyAgICAvLyBJbnB1dDogY3VycmVudCBjbGlwIHJlY3QKKyAgICBpbnQgY2xpcExlZnQ7CisgICAgaW50IGNsaXBUb3A7CisgICAgaW50IGNsaXBSaWdodDsKKyAgICBpbnQgY2xpcEJvdHRvbTsKKworICAgIC8vIElucHV0OiBpcyB0aGUgcmVuZGVyIHRhcmdldCBhbiBGQk8KKyAgICBib29sIGlzTGF5ZXI7CisKKyAgICAvLyBJbnB1dDogY3VycmVudCB0cmFuc2Zvcm0gbWF0cml4LCBpbiBPcGVuR0wgZm9ybWF0CisgICAgZmxvYXQgdHJhbnNmb3JtWzE2XTsKKworICAgIC8vIE91dHB1dDogZGlydHkgcmVnaW9uIHRvIHJlZHJhdworICAgIGZsb2F0IGRpcnR5TGVmdDsKKyAgICBmbG9hdCBkaXJ0eVRvcDsKKyAgICBmbG9hdCBkaXJ0eVJpZ2h0OworICAgIGZsb2F0IGRpcnR5Qm90dG9tOworfTsgLy8gc3RydWN0IERyYXdHbEluZm8KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hXVUlfRFJBV19HTF9JTkZPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaCBiL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaAppbmRleCBjOTEzMzU1Li4yY2QwOTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmgKKysrIGIvaW5jbHVkZS91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CiAKKyNkZWZpbmUgTlVNX0ZSQU1FX0JVRkZFUlMgIDIKIAogZXh0ZXJuICJDIiBFR0xOYXRpdmVXaW5kb3dUeXBlIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2Uodm9pZCk7CiAKQEAgLTcyLDcgKzczLDcgQEAKICAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmJEZXY7CiAgICAgYWxsb2NfZGV2aWNlX3QqIGdyRGV2OwogCi0gICAgc3A8TmF0aXZlQnVmZmVyPiBidWZmZXJzWzJdOworICAgIHNwPE5hdGl2ZUJ1ZmZlcj4gYnVmZmVyc1tOVU1fRlJBTUVfQlVGRkVSU107CiAgICAgc3A8TmF0aXZlQnVmZmVyPiBmcm9udDsKICAgICAKICAgICBtdXRhYmxlIE11dGV4IG11dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dC5oIGIvaW5jbHVkZS91aS9JbnB1dC5oCmluZGV4IDhjNjAxOGIuLjRlODA5ZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXQuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0LmgKQEAgLTM4LDYgKzM4LDE1IEBACiAgICAgQUtFWV9FVkVOVF9GTEFHX1NUQVJUX1RSQUNLSU5HID0gMHg0MDAwMDAwMAogfTsKIAorZW51bSB7CisgICAgLyoKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBkZXZpY2UgaGFzIHN3aXRjaGVzLgorICAgICAqIFRoaXMgaW5wdXQgc291cmNlIGZsYWcgaXMgaGlkZGVuIGZyb20gdGhlIEFQSSBiZWNhdXNlIHN3aXRjaGVzIGFyZSBvbmx5IHVzZWQgYnkgdGhlIHN5c3RlbQorICAgICAqIGFuZCBhcHBsaWNhdGlvbnMgaGF2ZSBubyB3YXkgdG8gaW50ZXJhY3Qgd2l0aCB0aGVtLgorICAgICAqLworICAgIEFJTlBVVF9TT1VSQ0VfU1dJVENIID0gMHg4MDAwMDAwMCwKK307CisKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBwb2ludGVycyBzdXBwb3J0ZWQgcGVyIG1vdGlvbiBldmVudC4KICAqIFNtYWxsZXN0IG51bWJlciBvZiBwb2ludGVycyBpcyAxLgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEgYi9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKY29weSB0byBpbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaAppbmRleCA4NmRlMzY2Li41NmE3NTU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQorKysgYi9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE4ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKKyNpZm5kZWYgQU5EUk9JRF9GVU5DVE9SX0gKKyNkZWZpbmUgQU5EUk9JRF9GVU5DVE9SX0gKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOworbmFtZXNwYWNlICBhbmRyb2lkIHsKIAorc3RydWN0IEZ1bmN0b3J7fTsKIAotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gU1RLIHNlcnZpY2UuCi0gKgotICoge0BoaWRlfQotICovCi1jbGFzcyBTdGtFeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgU3RrRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KIH0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oIGIvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKaW5kZXggZGE4NmRhNC4uYWI3Yjk3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKKysrIGIvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKQEAgLTE5ODMsNiArMTk4Myw3IEBACiAKICNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiAgICAgdm9pZCBwcmludChib29sIGluY2xWYWx1ZXMpIGNvbnN0OworICAgIHN0YXRpYyBTdHJpbmc4IG5vcm1hbGl6ZUZvck91dHB1dChjb25zdCBjaGFyKiBpbnB1dCk7CiAjZW5kaWYKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAgYi9saWJzL2JpbmRlci9QYXJjZWwuY3BwCmluZGV4IGYzMjlhYzQuLmQ1N2YyYzkgMTAwNjQ0Ci0tLSBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKKysrIGIvbGlicy9iaW5kZXIvUGFyY2VsLmNwcApAQCAtNjE5LDcgKzYxOSwxMCBAQAogc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cmluZzgoY29uc3QgU3RyaW5nOCYgc3RyKQogewogICAgIHN0YXR1c190IGVyciA9IHdyaXRlSW50MzIoc3RyLmJ5dGVzKCkpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAvLyBvbmx5IHdyaXRlIHN0cmluZyBpZiBpdHMgbGVuZ3RoIGlzIG1vcmUgdGhhbiB6ZXJvIGNoYXJhY3RlcnMsCisgICAgLy8gYXMgcmVhZFN0cmluZzggd2lsbCBvbmx5IHJlYWQgaWYgdGhlIGxlbmd0aCBmaWVsZCBpcyBub24temVyby4KKyAgICAvLyB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGhvdyB3cml0ZVN0cmluZzE2IHdvcmtzLgorICAgIGlmIChzdHIuYnl0ZXMoKSA+IDAgJiYgZXJyID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGVyciA9IHdyaXRlKHN0ci5zdHJpbmcoKSwgc3RyLmJ5dGVzKCkrMSk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcAppbmRleCA3NjRkYzFhLi40YjY3NTg2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyBiL2xpYnMvcnMvcnNOb2lzZS5jcHAKQEAgLTI1Myw0ICsyNTMsNCBAQAogfQogCiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5jcHAgYi9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcAppbmRleCBhMzZkNTU1Li4wNGEwMTk1IDEwMDY0NAotLS0gYS9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcAorKysgYi9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcApAQCAtODMsNiArODMsNyBAQAogICAgIGlmIChod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKSA9PSAwKSB7CiAgICAgICAgIGludCBzdHJpZGU7CiAgICAgICAgIGludCBlcnI7CisgICAgICAgIGludCBpOwogICAgICAgICBlcnIgPSBmcmFtZWJ1ZmZlcl9vcGVuKG1vZHVsZSwgJmZiRGV2KTsKICAgICAgICAgTE9HRV9JRihlcnIsICJjb3VsZG4ndCBvcGVuIGZyYW1lYnVmZmVyIEhBTCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwogICAgICAgICAKQEAgLTk2LDI3ICs5NywzMyBAQAogICAgICAgICBtVXBkYXRlT25EZW1hbmQgPSAoZmJEZXYtPnNldFVwZGF0ZVJlY3QgIT0gMCk7CiAgICAgICAgIAogICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBidWZmZXIgRklGTwotICAgICAgICBtTnVtQnVmZmVycyA9IDI7Ci0gICAgICAgIG1OdW1GcmVlQnVmZmVycyA9IDI7CisgICAgICAgIG1OdW1CdWZmZXJzID0gTlVNX0ZSQU1FX0JVRkZFUlM7CisgICAgICAgIG1OdW1GcmVlQnVmZmVycyA9IE5VTV9GUkFNRV9CVUZGRVJTOwogICAgICAgICBtQnVmZmVySGVhZCA9IG1OdW1CdWZmZXJzLTE7Ci0gICAgICAgIGJ1ZmZlcnNbMF0gPSBuZXcgTmF0aXZlQnVmZmVyKAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgR1JBTExPQ19VU0FHRV9IV19GQik7Ci0gICAgICAgIGJ1ZmZlcnNbMV0gPSBuZXcgTmF0aXZlQnVmZmVyKAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgR1JBTExPQ19VU0FHRV9IV19GQik7Ci0gICAgICAgIAotICAgICAgICBlcnIgPSBnckRldi0+YWxsb2MoZ3JEZXYsCi0gICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LCAKLSAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0ZCLCAmYnVmZmVyc1swXS0+aGFuZGxlLCAmYnVmZmVyc1swXS0+c3RyaWRlKTsKIAotICAgICAgICBMT0dFX0lGKGVyciwgImZiIGJ1ZmZlciAwIGFsbG9jYXRpb24gZmFpbGVkIHc9JWQsIGg9JWQsIGVycj0lcyIsCi0gICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtQnVmZmVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyc1tpXSA9IG5ldyBOYXRpdmVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBmYkRldi0+d2lkdGgsIGZiRGV2LT5oZWlnaHQsIGZiRGV2LT5mb3JtYXQsIEdSQUxMT0NfVVNBR0VfSFdfRkIpOworICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gZ3JEZXYtPmFsbG9jKGdyRGV2LAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgCi0gICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19GQiwgJmJ1ZmZlcnNbMV0tPmhhbmRsZSwgJmJ1ZmZlcnNbMV0tPnN0cmlkZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtQnVmZmVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gZ3JEZXYtPmFsbG9jKGdyRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19GQiwgJmJ1ZmZlcnNbaV0tPmhhbmRsZSwgJmJ1ZmZlcnNbaV0tPnN0cmlkZSk7CiAKLSAgICAgICAgTE9HRV9JRihlcnIsICJmYiBidWZmZXIgMSBhbGxvY2F0aW9uIGZhaWxlZCB3PSVkLCBoPSVkLCBlcnI9JXMiLAotICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgIExPR0VfSUYoZXJyLCAiZmIgYnVmZmVyICVkIGFsbG9jYXRpb24gZmFpbGVkIHc9JWQsIGg9JWQsIGVycj0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBmYkRldi0+d2lkdGgsIGZiRGV2LT5oZWlnaHQsIHN0cmVycm9yKC1lcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZmZlcnMgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyZWVCdWZmZXJzID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJIZWFkID0gbU51bUJ1ZmZlcnMtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDMyX3QmPihBTmF0aXZlV2luZG93OjpmbGFncykgPSBmYkRldi0+ZmxhZ3M7IAogICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eGRwaSkgPSBmYkRldi0+eGRwaTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXRSZWFkZXIuY3BwIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKaW5kZXggODNiMzgyYi4uMzRlNDRlNCAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKKysrIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKQEAgLTgyNCw3ICs4MjQsNyBAQAogfQogCiB1aW50MzJfdCBTd2l0Y2hJbnB1dE1hcHBlcjo6Z2V0U291cmNlcygpIHsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQUlOUFVUX1NPVVJDRV9TV0lUQ0g7CiB9CiAKIHZvaWQgU3dpdGNoSW5wdXRNYXBwZXI6OnByb2Nlc3MoY29uc3QgUmF3RXZlbnQqIHJhd0V2ZW50KSB7CmRpZmYgLS1naXQgYS9saWJzL3VpL092ZXJsYXkuY3BwIGIvbGlicy91aS9PdmVybGF5LmNwcAppbmRleCAzYWE4OTUwLi5iMDgyYzUzIDEwMDY0NAotLS0gYS9saWJzL3VpL092ZXJsYXkuY3BwCisrKyBiL2xpYnMvdWkvT3ZlcmxheS5jcHAKQEAgLTk2LDcgKzk2LDYgQEAKIH0KIAogdm9pZCBPdmVybGF5OjpkZXN0cm95KCkgeyAgCi0gICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybjsKIAogICAgIC8vIE11c3QgZGVsZXRlIHRoZSBvYmplY3RzIGluIHJldmVyc2UgY3JlYXRpb24gb3JkZXIsIHRodXMgdGhlCiAgICAgLy8gIGRhdGEgc2lkZSBtdXN0IGJlIGNsb3NlZCBmaXJzdCBhbmQgdGhlbiB0aGUgZGVzdHJveSBzZW5kIHRvCkBAIC0xMDQsOSArMTAzLDE1IEBACiAgICAgaWYgKG1PdmVybGF5RGF0YSkgewogICAgICAgICBvdmVybGF5X2RhdGFfY2xvc2UobU92ZXJsYXlEYXRhKTsKICAgICAgICAgbU92ZXJsYXlEYXRhID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJPdmVybGF5OjpkZXN0cm95IG1PdmVybGF5RGF0YSBpcyBOVUxMIik7CiAgICAgfQogCi0gICAgbU92ZXJsYXlSZWYtPm1PdmVybGF5Q2hhbm5lbC0+ZGVzdHJveSgpOworICAgIGlmIChtT3ZlcmxheVJlZiAhPSAwKSB7CisgICAgICAgIG1PdmVybGF5UmVmLT5tT3ZlcmxheUNoYW5uZWwtPmRlc3Ryb3koKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJPdmVybGF5OjpkZXN0cm95IG1PdmVybGF5UmVmIGlzIE5VTEwiKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IE92ZXJsYXk6OmdldFN0YXR1cygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvdGVzdHMvSW5wdXRSZWFkZXJfdGVzdC5jcHAgYi9saWJzL3VpL3Rlc3RzL0lucHV0UmVhZGVyX3Rlc3QuY3BwCmluZGV4IGYzMWE2YmUuLjA5ZDE2ODAgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvdGVzdHMvSW5wdXRSZWFkZXJfdGVzdC5jcHAKKysrIGIvbGlicy91aS90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcApAQCAtMTM2OCw3ICsxMzY4LDcgQEAKICAgICBTd2l0Y2hJbnB1dE1hcHBlciogbWFwcGVyID0gbmV3IFN3aXRjaElucHV0TWFwcGVyKG1EZXZpY2UpOwogICAgIGFkZE1hcHBlckFuZENvbmZpZ3VyZShtYXBwZXIpOwogCi0gICAgQVNTRVJUX0VRKHVpbnQzMl90KDApLCBtYXBwZXItPmdldFNvdXJjZXMoKSk7CisgICAgQVNTRVJUX0VRKHVpbnQzMl90KEFJTlBVVF9TT1VSQ0VfU1dJVENIKSwgbWFwcGVyLT5nZXRTb3VyY2VzKCkpOwogfQogCiBURVNUX0YoU3dpdGNoSW5wdXRNYXBwZXJUZXN0LCBHZXRTd2l0Y2hTdGF0ZSkgewpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggODM0NWNjMy4uN2ZiN2FlMyAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC00MDM4LDYgKzQwMzgsMzggQEAKICAgICB9CiB9CiAKKy8vIE5vcm1hbGl6ZSBhIHN0cmluZyBmb3Igb3V0cHV0CitTdHJpbmc4IFJlc1RhYmxlOjpub3JtYWxpemVGb3JPdXRwdXQoIGNvbnN0IGNoYXIgKmlucHV0ICkKK3sKKyAgICBTdHJpbmc4IHJldDsKKyAgICBjaGFyIGJ1ZmZbMl07CisgICAgYnVmZlsxXSA9ICdcMCc7CisKKyAgICB3aGlsZSAoKmlucHV0ICE9ICdcMCcpIHsKKyAgICAgICAgc3dpdGNoICgqaW5wdXQpIHsKKyAgICAgICAgICAgIC8vIEFsbCBpbnRlcmVzdGluZyBjaGFyYWN0ZXJzIGFyZSBpbiB0aGUgQVNDSUkgem9uZSwgc28gd2UgYXJlIG1ha2luZyBvdXIgb3duIGxpdmVzCisgICAgICAgICAgICAvLyBlYXNpZXIgYnkgc2Nhbm5pbmcgdGhlIHN0cmluZyBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHJldCArPSAiXFxcXCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgcmV0ICs9ICJcXG4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgcmV0ICs9ICJcXFwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnVmZlswXSA9ICppbnB1dDsKKyAgICAgICAgICAgIHJldCArPSBidWZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dCsrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHZvaWQgUmVzVGFibGU6OnByaW50X3ZhbHVlKGNvbnN0IFBhY2thZ2UqIHBrZywgY29uc3QgUmVzX3ZhbHVlJiB2YWx1ZSkgY29uc3QKIHsKICAgICBpZiAodmFsdWUuZGF0YVR5cGUgPT0gUmVzX3ZhbHVlOjpUWVBFX05VTEwpIHsKQEAgLTQwNTEsMTMgKzQwODMsMTMgQEAKICAgICAgICAgY29uc3QgY2hhciogc3RyOCA9IHBrZy0+aGVhZGVyLT52YWx1ZXMuc3RyaW5nOEF0KAogICAgICAgICAgICAgICAgIHZhbHVlLmRhdGEsICZsZW4pOwogICAgICAgICBpZiAoc3RyOCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwcmludGYoIihzdHJpbmc4KSBcIiVzXCJcbiIsIHN0cjgpOworICAgICAgICAgICAgcHJpbnRmKCIoc3RyaW5nOCkgXCIlc1wiXG4iLCBub3JtYWxpemVGb3JPdXRwdXQoc3RyOCkuc3RyaW5nKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29uc3QgY2hhcjE2X3QqIHN0cjE2ID0gcGtnLT5oZWFkZXItPnZhbHVlcy5zdHJpbmdBdCgKICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZGF0YSwgJmxlbik7CiAgICAgICAgICAgICBpZiAoc3RyMTYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHByaW50ZigiKHN0cmluZzE2KSBcIiVzXCJcbiIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc3RyMTYsIGxlbikuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVGb3JPdXRwdXQoU3RyaW5nOChzdHIxNiwgbGVuKS5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwcmludGYoIihzdHJpbmcpIG51bGxcbiIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9HcHNOZXRJbml0aWF0ZWRIYW5kbGVyLmphdmEgYi9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQppbmRleCBkM2E3MWIzLi5mZmMzMzQ2IDEwMDc1NQotLS0gYS9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQorKysgYi9sb2NhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc05ldEluaXRpYXRlZEhhbmRsZXIuamF2YQpAQCAtMjgsNiArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKKwogLyoqCiAgKiBBIEdQUyBOZXR3b3JrLWluaXRpYXRlZCBIYW5kbGVyIGNsYXNzIHVzZWQgYnkgTG9jYXRpb25NYW5hZ2VyLgogICoKQEAgLTE4Miw4ICsxODUsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0Tm90aWZUaXRsZShub3RpZik7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0Tm90aWZNZXNzYWdlKG5vdGlmKTsKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0Tm90aWZUaXRsZShub3RpZiwgbUNvbnRleHQpOworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGdldE5vdGlmTWVzc2FnZShub3RpZiwgbUNvbnRleHQpOwogCiAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0TmlOb3RpZmljYXRpb24sIG5vdGlmeUlkOiAiICsgbm90aWYubm90aWZpY2F0aW9uSWQgKwogICAgICAgICAgICAgICAgICIsIHRpdGxlOiAiICsgdGl0bGUgKwpAQCAtMjAzLDcgKzIwNiw3IEBACiAgICAgICAgIH0gICAgICAgIAogCiAgICAgICAgIG1OaU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQ7Ci0gICAgICAgIG1OaU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gZ2V0Tm90aWZUaWNrZXIobm90aWYpOworICAgICAgICBtTmlOb3RpZmljYXRpb24udGlja2VyVGV4dCA9IGdldE5vdGlmVGlja2VyKG5vdGlmLCBtQ29udGV4dCk7CiAKICAgICAgICAgLy8gaWYgbm90IHRvIHBvcHVwIGRpYWxvZyBpbW1lZGlhdGVseSwgcGVuZGluZyBpbnRlbnQgd2lsbCBvcGVuIHRoZSBkaWFsb2cKICAgICAgICAgSW50ZW50IGludGVudCA9ICFtUG9wdXBJbW1lZGlhdGVseSA/IGdldERsZ0ludGVudChub3RpZikgOiBuZXcgSW50ZW50KCk7CkBAIC0yMzQsOCArMjM3LDggQEAKICAgICBwcml2YXRlIEludGVudCBnZXREbGdJbnRlbnQoR3BzTmlOb3RpZmljYXRpb24gbm90aWYpCiAgICAgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBnZXREaWFsb2dUaXRsZShub3RpZik7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0RGlhbG9nTWVzc2FnZShub3RpZik7CisgICAgICAgIFN0cmluZyB0aXRsZSA9IGdldERpYWxvZ1RpdGxlKG5vdGlmLCBtQ29udGV4dCk7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0RGlhbG9nTWVzc2FnZShub3RpZiwgbUNvbnRleHQpOwogCiAgICAgICAgIC8vIGRpcmVjdGx5IGJyaW5nIHVwIHRoZSBOSSBhY3Rpdml0eQogICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwpAQCAtMjg2LDU4ICsyODksMzIgQEAKICAgICAgKi8KICAgICBzdGF0aWMgU3RyaW5nIGRlY29kZUdTTVBhY2tlZFN0cmluZyhieXRlW10gaW5wdXQpCiAgICAgewotICAgICAgICBmaW5hbCBjaGFyIENIQVJfQ1IgPSAweDBEOwotICAgICAgICBpbnQgblN0cmlkeCA9IDA7Ci0gICAgICAgIGludCBuUGNraWR4ID0gMDsKLSAgICAgICAgaW50IG51bV9ieXRlcyA9IGlucHV0Lmxlbmd0aDsKLSAgICAgICAgaW50IGNQcmV2ID0gMDsKLSAgICAgICAgaW50IGNDdXJyID0gMDsKLSAgICAgICAgYnl0ZSBuU2hpZnQ7Ci0gICAgICAgIGJ5dGUgbmV4dENoYXI7Ci0gICAgICAgIGJ5dGVbXSBzdHJpbmdCdWYgPSBuZXcgYnl0ZVtpbnB1dC5sZW5ndGggKiAyXTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICBmaW5hbCBjaGFyIFBBRERJTkdfQ0hBUiA9IDB4MDA7CisgICAgICAgIGludCBsZW5ndGhCeXRlcyA9IGlucHV0Lmxlbmd0aDsKKyAgICAgICAgaW50IGxlbmd0aFNlcHRldHMgPSAobGVuZ3RoQnl0ZXMgKiA4KSAvIDc7CisgICAgICAgIFN0cmluZyBkZWNvZGVkOwogCi0gICAgICAgIHdoaWxlKG5QY2tpZHggPCBudW1fYnl0ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5TaGlmdCA9IChieXRlKSAoblN0cmlkeCAmIDB4MDcpOwotICAgICAgICAgICAgY0N1cnIgPSBpbnB1dFtuUGNraWR4KytdOwotICAgICAgICAgICAgaWYgKGNDdXJyIDwgMCkgY0N1cnIgKz0gMjU2OwotCi0gICAgICAgICAgICAvKiBBIDctYml0IGNoYXJhY3RlciBjYW4gYmUgc3BsaXQgYXQgdGhlIG1vc3QgYmV0d2VlbiB0d28gYnl0ZXMgb2YgcGFja2VkCi0gICAgICAgICAgICAgKiogZGF0YS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbmV4dENoYXIgPSAoYnl0ZSkgKCggKGNDdXJyIDw8IG5TaGlmdCkgfCAoY1ByZXYgPj4gKDgtblNoaWZ0KSkgKSAmIDB4N0YpOwotICAgICAgICAgICAgc3RyaW5nQnVmW25TdHJpZHgrK10gPSBuZXh0Q2hhcjsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIHdoZXJlIHRoZSB3aG9sZSBvZiB0aGUgbmV4dCA3LWJpdCBjaGFyYWN0ZXIgZml0cyBpbnNpZGUKLSAgICAgICAgICAgICAqKiB0aGUgY3VycmVudCBieXRlIG9mIHBhY2tlZCBkYXRhLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihuU2hpZnQgPT0gNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgbmV4dCA3LWJpdCBjaGFyYWN0ZXIgaXMgYSBDUiAoMHgwRCkgYW5kIGl0IGlzIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICoqIGNoYXJhY3RlciwgdGhlbiBpdCBpbmRpY2F0ZXMgYSBwYWRkaW5nIGNoYXJhY3Rlci4gRHJvcCBpdC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoblBja2lkeCA9PSBudW1fYnl0ZXMgfHwgKGNDdXJyID4+IDEpID09IENIQVJfQ1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBsYXN0IDcgYml0cyBpbiB0aGUgbGFzdCBieXRlIGNvdWxkIGhvbGQgYSB2YWxpZAorICAgICAgICAgKiA3LWJpdCBjaGFyYWN0ZXIgb3IgYSBwYWRkaW5nIGNoYXJhY3Rlci4gRHJvcCB0aGUgbGFzdCA3LWJpdCBjaGFyYWN0ZXIKKyAgICAgICAgICogaWYgaXQgaXMgYSBwYWRkaW5nIGNoYXJhY3Rlci4KKyAgICAgICAgICovCisgICAgICAgIGlmIChsZW5ndGhCeXRlcyAlIDcgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aEJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgoaW5wdXRbbGVuZ3RoQnl0ZXMgLSAxXSA+PiAxKSA9PSBQQURESU5HX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoU2VwdGV0cyA9IGxlbmd0aFNlcHRldHMgLSAxOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5leHRDaGFyID0gKGJ5dGUpIChjQ3VyciA+PiAxKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCdWZbblN0cmlkeCsrXSA9IG5leHRDaGFyOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjUHJldiA9IGNDdXJyOwogICAgICAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmcoc3RyaW5nQnVmLCAwLCBuU3RyaWR4LCAiVVMtQVNDSUkiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgZGVjb2RlZCA9IEdzbUFscGhhYmV0LmdzbTdCaXRQYWNrZWRUb1N0cmluZyhpbnB1dCwgMCwgbGVuZ3RoU2VwdGV0cyk7CisKKyAgICAgICAgLy8gUmV0dXJuICIiIGlmIGRlY29kaW5nIG9mIEdTTSBwYWNrZWQgc3RyaW5nIGZhaWxzCisgICAgICAgIGlmIChudWxsID09IGRlY29kZWQpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRlY29kaW5nIG9mIEdTTSBwYWNrZWQgc3RyaW5nIGZhaWxlZCIpOworICAgICAgICAgICAgZGVjb2RlZCA9ICIiOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgfQogCiAgICAgc3RhdGljIFN0cmluZyBkZWNvZGVVVEY4U3RyaW5nKGJ5dGVbXSBpbnB1dCkKQEAgLTQxMiw0MSArMzg5LDQwIEBACiAgICAgfQogCiAgICAgLy8gY2hhbmdlIHRoaXMgdG8gY29uZmlndXJlIG5vdGlmaWNhdGlvbiBkaXNwbGF5Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldE5vdGlmVGlja2VyKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmKQorICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXROb3RpZlRpY2tlcihHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHRpY2tlciA9IFN0cmluZy5mb3JtYXQoIlBvc2l0aW9uIHJlcXVlc3QhIFJlcUlkOiBbJXNdIENsaWVudE5hbWU6IFslc10iLAorICAgICAgICBTdHJpbmcgdGlja2VyID0gU3RyaW5nLmZvcm1hdChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ncHNOb3RpZlRpY2tlciksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnJlcXVlc3RvcklkLCBtSXNIZXhJbnB1dCwgbm90aWYucmVxdWVzdG9ySWRFbmNvZGluZyksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnRleHQsIG1Jc0hleElucHV0LCBub3RpZi50ZXh0RW5jb2RpbmcpKTsKICAgICAgICAgcmV0dXJuIHRpY2tlcjsKICAgICB9CiAKICAgICAvLyBjaGFuZ2UgdGhpcyB0byBjb25maWd1cmUgbm90aWZpY2F0aW9uIGRpc3BsYXkKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90aWZUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZikKKyAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90aWZUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gU3RyaW5nLmZvcm1hdCgiUG9zaXRpb24gUmVxdWVzdCIpOworICAgICAgICBTdHJpbmcgdGl0bGUgPSBTdHJpbmcuZm9ybWF0KGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmdwc05vdGlmVGl0bGUpKTsKICAgICAgICAgcmV0dXJuIHRpdGxlOwogICAgIH0KIAogICAgIC8vIGNoYW5nZSB0aGlzIHRvIGNvbmZpZ3VyZSBub3RpZmljYXRpb24gZGlzcGxheQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXROb3RpZk1lc3NhZ2UoR3BzTmlOb3RpZmljYXRpb24gbm90aWYpCisgICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldE5vdGlmTWVzc2FnZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICJOSSBSZXF1ZXN0IHJlY2VpdmVkIGZyb20gWyVzXSBmb3IgY2xpZW50IFslc10hIiwKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmdwc05vdGlmTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnJlcXVlc3RvcklkLCBtSXNIZXhJbnB1dCwgbm90aWYucmVxdWVzdG9ySWRFbmNvZGluZyksCiAgICAgICAgICAgICAgICAgZGVjb2RlU3RyaW5nKG5vdGlmLnRleHQsIG1Jc0hleElucHV0LCBub3RpZi50ZXh0RW5jb2RpbmcpKTsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgfSAgICAgICAKIAogICAgIC8vIGNoYW5nZSB0aGlzIHRvIGNvbmZpZ3VyZSBkaWFsb2cgZGlzcGxheSAoZm9yIHZlcmlmaWNhdGlvbikKLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXREaWFsb2dUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZikKKyAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXREaWFsb2dUaXRsZShHcHNOaU5vdGlmaWNhdGlvbiBub3RpZiwgQ29udGV4dCBjb250ZXh0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE5vdGlmVGl0bGUobm90aWYpOworICAgICAgICByZXR1cm4gZ2V0Tm90aWZUaXRsZShub3RpZiwgY29udGV4dCk7CiAgICAgfQogCiAgICAgLy8gY2hhbmdlIHRoaXMgdG8gY29uZmlndXJlIGRpYWxvZyBkaXNwbGF5IChmb3IgdmVyaWZpY2F0aW9uKQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmKQorICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKEdwc05pTm90aWZpY2F0aW9uIG5vdGlmLCBDb250ZXh0IGNvbnRleHQpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Tm90aWZNZXNzYWdlKG5vdGlmKTsKKyAgICAgICAgcmV0dXJuIGdldE5vdGlmTWVzc2FnZShub3RpZiwgY29udGV4dCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCBkOWYyMzAyLi40ZTg3YzczIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICAgICAgZGVncmVlcyAhPSAyNzApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGFuZ2xlOiAiICsgZGVncmVlcyk7CiAgICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLXBhcmFtLXJvdGF0aW9uLWFuZ2xlLWRlZ3JlZXM9JWQiLCBkZWdyZWVzKSk7CisgICAgICAgIHNldFBhcmFtZXRlcigidmlkZW8tcGFyYW0tcm90YXRpb24tYW5nbGUtZGVncmVlcz0iICsgZGVncmVlcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzUsNyArNDM1LDcgQEAKICAgICAgICAgaWYgKHNhbXBsaW5nUmF0ZSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdWRpbyBzYW1wbGluZyByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1zYW1wbGluZy1yYXRlPSVkIiwgc2FtcGxpbmdSYXRlKSk7CisgICAgICAgIHNldFBhcmFtZXRlcigiYXVkaW8tcGFyYW0tc2FtcGxpbmctcmF0ZT0iICsgc2FtcGxpbmdSYXRlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPD0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1udW1iZXItb2YtY2hhbm5lbHM9JWQiLCBudW1DaGFubmVscykpOworICAgICAgICBzZXRQYXJhbWV0ZXIoImF1ZGlvLXBhcmFtLW51bWJlci1vZi1jaGFubmVscz0iICsgbnVtQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDY2LDcgKzQ2Niw3IEBACiAgICAgICAgIGlmIChiaXRSYXRlIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF1ZGlvIGVuY29kaW5nIGJpdCByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJhdWRpby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgYml0UmF0ZSkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoImF1ZGlvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGU9IiArIGJpdFJhdGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDgyLDcgKzQ4Miw3IEBACiAgICAgICAgIGlmIChiaXRSYXRlIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZpZGVvIGVuY29kaW5nIGJpdCByYXRlIGlzIG5vdCBwb3NpdGl2ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgYml0UmF0ZSkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoInZpZGVvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGU9IiArIGJpdFJhdGUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCmluZGV4IDQ3ZTEwNTguLmFiMmM2ZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKQEAgLTEyMjAsOCArMTIyMCwxMiBAQAogICAgICAgICAgICAgcHJlc2NhbihwYXRoKTsKIAogICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisKKyAgICAgICAgICAgIC8vIGxhc3RNb2RpZmllZCBpcyBpbiBtaWxsaXNlY29uZHMgb24gRmlsZXMuCisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZFNlY29uZHMgPSBmaWxlLmxhc3RNb2RpZmllZCgpIC8gMTAwMDsKKwogICAgICAgICAgICAgLy8gYWx3YXlzIHNjYW4gdGhlIGZpbGUsIHNvIHdlIGNhbiByZXR1cm4gdGhlIGNvbnRlbnQ6Ly9tZWRpYSBVcmkgZm9yIGV4aXN0aW5nIGZpbGVzCi0gICAgICAgICAgICByZXR1cm4gbUNsaWVudC5kb1NjYW5GaWxlKHBhdGgsIG1pbWVUeXBlLCBmaWxlLmxhc3RNb2RpZmllZCgpLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBtQ2xpZW50LmRvU2NhbkZpbGUocGF0aCwgbWltZVR5cGUsIGxhc3RNb2RpZmllZFNlY29uZHMsIGZpbGUubGVuZ3RoKCksIHRydWUpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIE1lZGlhU2Nhbm5lci5zY2FuRmlsZSgpIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9UaHVtYm5haWxVdGlscy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1RodW1ibmFpbFV0aWxzLmphdmEKaW5kZXggNDk0YjRjYi4uYjI3NmUzMyAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1RodW1ibmFpbFV0aWxzLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1RodW1ibmFpbFV0aWxzLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgcGF0aCBvZiBpbWFnZSBmaWxlCiAgICAgICogQHBhcmFtIGtpbmQgY291bGQgYmUgTUlOSV9LSU5EIG9yIE1JQ1JPX0tJTkQKLSAgICAgKiBAcmV0dXJuIEJpdG1hcAorICAgICAqIEByZXR1cm4gQml0bWFwLCBvciBudWxsIG9uIGZhaWx1cmVzCiAgICAgICoKICAgICAgKiBAaGlkZSBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgYnkgbWVkaWEgZnJhbWV3b3JrIGFuZCBtZWRpYSBwcm92aWRlciBpbnRlcm5hbGx5LgogICAgICAqLwpAQCAtMTIzLDYgKzEyMyw4IEBACiAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3Igb29tKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGRlY29kZSBmaWxlICIgKyBmaWxlUGF0aCArICIuIE91dE9mTWVtb3J5RXJyb3IuIiwgb29tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAppbmRleCA2ZjU4MWQzLi5jNTExMmE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKQEAgLTgxLDEzICs4MSwxMyBAQAogfQogCiBzdGF0aWMgYm9vbCBmaWxlTWF0Y2hlc0V4dGVuc2lvbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBleHRlbnNpb25zKSB7Ci0gICAgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOworICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbiA9IHN0cnJjaHIocGF0aCwgJy4nKTsKICAgICBpZiAoIWV4dGVuc2lvbikgcmV0dXJuIGZhbHNlOwogICAgICsrZXh0ZW5zaW9uOyAgICAvLyBza2lwIHRoZSBkb3QKICAgICBpZiAoZXh0ZW5zaW9uWzBdID09IDApIHJldHVybiBmYWxzZTsKIAogICAgIHdoaWxlIChleHRlbnNpb25zWzBdKSB7Ci0gICAgICAgIGNoYXIqIGNvbW1hID0gc3RyY2hyKGV4dGVuc2lvbnMsICcsJyk7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKGV4dGVuc2lvbnMsICcsJyk7CiAgICAgICAgIHNpemVfdCBsZW5ndGggPSAoY29tbWEgPyBjb21tYSAtIGV4dGVuc2lvbnMgOiBzdHJsZW4oZXh0ZW5zaW9ucykpOwogICAgICAgICBpZiAobGVuZ3RoID09IHN0cmxlbihleHRlbnNpb24pICYmIHN0cm5jYXNlY21wKGV4dGVuc2lvbiwgZXh0ZW5zaW9ucywgbGVuZ3RoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgZXh0ZW5zaW9ucyArPSBsZW5ndGg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA2MTVmM2U4Li5kNjc0NTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTExLDYgKzExLDcgQEAKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRFJNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgSFRUUFN0cmVhbS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU5LDcgKzYwLDggQEAKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCi0gICAgICAgIGxpYmNhbWVyYV9jbGllbnQKKyAgICAgICAgbGliY2FtZXJhX2NsaWVudCBcCisgICAgICAgIGxpYmRybWZyYW1ld29yawogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggZDk5OTkwYi4uNmRjNjFjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTI0Nyw3ICsyNDcsOCBAQAogICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAogICAgICAgbUxhc3RWaWRlb0J1ZmZlcihOVUxMKSwKICAgICAgIG1WaWRlb0J1ZmZlcihOVUxMKSwKLSAgICAgIG1TdXNwZW5zaW9uU3RhdGUoTlVMTCkgeworICAgICAgbVN1c3BlbnNpb25TdGF0ZShOVUxMKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpIHsKICAgICBDSEVDS19FUShtQ2xpZW50LmNvbm5lY3QoKSwgT0spOwogCiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKQEAgLTM0Niw2ICszNDcsMTIgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwKKyAgICAgICAgICAgICYmIFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEICE9IG1EZWNyeXB0SGFuZGxlLT5zdGF0dXMpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgRVJST1JfTk9fTElDRU5TRSk7CisgICAgfQorCiAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOwogfQogCkBAIC00MjEsNiArNDI4LDEzIEBACiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6cmVzZXRfbCgpIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgfQorCiAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewogICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CiAgICAgICAgIGlmIChtQ29ubmVjdGluZ0RhdGFTb3VyY2UgIT0gTlVMTCkgewpAQCAtNzYxLDYgKzc3NSwxMyBAQAogCiAgICAgYm9vbCBkZWZlcnJlZEF1ZGlvU2VlayA9IGZhbHNlOwogCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKKyAgICAgICAgZ2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVEFSVCwgcG9zaXRpb24gLyAxMDAwKTsKKyAgICB9CisKICAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CkBAIC03NzgsNiArNzk5LDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKIAorICAgICAgICAgICAgICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2s6OlNUT1AsIDApOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTkwNSw2ICs5MzEsMTEgQEAKIAogICAgIG1GbGFncyAmPSB+UExBWUlORzsKIAorICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBQbGF5YmFjazo6UEFVU0UsIDApOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTAyMiw2ICsxMDUzLDEzIEBACiAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwogICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKKworICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6UEFVU0UsIDApOworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIG1TZWVrVGltZVVzIC8gMTAwMCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTEyNTQsNiArMTI5MiwxMyBAQAogCiAgICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwogCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIHRpbWVVcyAvIDEwMDApOworICAgIH0KKwogICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewogICAgICAgICBtRmxhZ3MgJj0gfkZJUlNUX0ZSQU1FOwogCkBAIC0xNjY1LDYgKzE3MTAsMTIgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwKKyAgICAgICAgICAgICYmIFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEICE9IG1EZWNyeXB0SGFuZGxlLT5zdGF0dXMpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgRVJST1JfTk9fTElDRU5TRSk7CisgICAgfQorCiAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTlhZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorCisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEcm1NYW5hZ2VyQ2xpZW50KiBnRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisKK2NsYXNzIERSTVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CitwdWJsaWM6CisgICAgRFJNU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmbWVkaWFTb3VyY2UsCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQzMl90IHRyYWNrSWQsIERybUJ1ZmZlciogaXBtcEJveCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRSTVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHNwPE1lZGlhU291cmNlPiBtT3JpZ2luYWxNZWRpYVNvdXJjZTsKKyAgICBEZWNyeXB0SGFuZGxlKiBtRGVjcnlwdEhhbmRsZTsKKyAgICBzaXplX3QgbVRyYWNrSWQ7CisgICAgbXV0YWJsZSBNdXRleCBtRFJNTG9jazsKKyAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CisgICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7CisKKyAgICBEUk1Tb3VyY2UoY29uc3QgRFJNU291cmNlICYpOworICAgIERSTVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERSTVNvdXJjZSAmKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RSTVNvdXJjZTo6RFJNU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmbWVkaWFTb3VyY2UsCisgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludDMyX3QgdHJhY2tJZCwgRHJtQnVmZmVyKiBpcG1wQm94KQorICAgIDogbU9yaWdpbmFsTWVkaWFTb3VyY2UobWVkaWFTb3VyY2UpLAorICAgICAgbURlY3J5cHRIYW5kbGUoZGVjcnlwdEhhbmRsZSksCisgICAgICBtVHJhY2tJZCh0cmFja0lkKSwKKyAgICAgIG1OQUxMZW5ndGhTaXplKDApLAorICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSB7CisgICAgZ0RybU1hbmFnZXJDbGllbnQtPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlLCB0cmFja0lkLCBpcG1wQm94KTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgYm9vbCBzdWNjZXNzID0gZ2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIENIRUNLKHN1Y2Nlc3MpOworCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIENIRUNLKGdldEZvcm1hdCgpLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBDSEVDSyhzaXplID49IDcpOworICAgICAgICBDSEVDS19FUShwdHJbMF0sIDEpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGxlbmd0aCBvZiBhIE5BTCB1bml0LgorICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgfQorfQorCitEUk1Tb3VyY2U6On5EUk1Tb3VyY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EUk1Mb2NrKTsKKyAgICBnRHJtTWFuYWdlckNsaWVudC0+ZmluYWxpemVEZWNyeXB0VW5pdChtRGVjcnlwdEhhbmRsZSwgbVRyYWNrSWQpOworfQorCitzdGF0dXNfdCBEUk1Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBpbnQzMl90IHZhbDsKKyAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKKyAgICAgICAgJiYgdmFsICE9IDApIHsKKyAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKKyAgICB9CisKKyAgIHJldHVybiBtT3JpZ2luYWxNZWRpYVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKK30KKworc3RhdHVzX3QgRFJNU291cmNlOjpzdG9wKCkgeworICAgIHJldHVybiBtT3JpZ2luYWxNZWRpYVNvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gRFJNU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1PcmlnaW5hbE1lZGlhU291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworc3RhdHVzX3QgRFJNU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRFJNTG9jayk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gbU9yaWdpbmFsTWVkaWFTb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgbGVuID0gKCpidWZmZXIpLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGNoYXIgKnNyYyA9IChjaGFyICopKCpidWZmZXIpLT5kYXRhKCkgKyAoKmJ1ZmZlciktPnJhbmdlX29mZnNldCgpOworCisgICAgRHJtQnVmZmVyIGVuY3J5cHRlZERybUJ1ZmZlcihzcmMsIGxlbik7CisgICAgRHJtQnVmZmVyIGRlY3J5cHRlZERybUJ1ZmZlcjsKKyAgICBkZWNyeXB0ZWREcm1CdWZmZXIubGVuZ3RoID0gbGVuOworICAgIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhID0gbmV3IGNoYXJbbGVuXTsKKyAgICBEcm1CdWZmZXIgKnBEZWNyeXB0ZWREcm1CdWZmZXIgPSAmZGVjcnlwdGVkRHJtQnVmZmVyOworCisgICAgaWYgKChlcnIgPSBnRHJtTWFuYWdlckNsaWVudC0+ZGVjcnlwdChtRGVjcnlwdEhhbmRsZSwgbVRyYWNrSWQsCisgICAgICAgICAgICAmZW5jcnlwdGVkRHJtQnVmZmVyLCAmcERlY3J5cHRlZERybUJ1ZmZlcikpICE9IERSTV9OT19FUlJPUikgeworCisgICAgICAgIGlmIChkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSkgeworICAgICAgICAgICAgZGVsZXRlIFtdIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhOworICAgICAgICAgICAgZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVEKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9fTElDRU5TRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDSyhwRGVjcnlwdGVkRHJtQnVmZmVyID09ICZkZWNyeXB0ZWREcm1CdWZmZXIpOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhnZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgJiYgIW1XYW50c05BTEZyYWdtZW50cykgeworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QqKXNyYzsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworCisgICAgICAgIGxlbiA9IGRlY3J5cHRlZERybUJ1ZmZlci5sZW5ndGg7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBsZW4pIHsKKyAgICAgICAgICAgIENIRUNLKHNyY09mZnNldCArIG1OQUxMZW5ndGhTaXplIDw9IGxlbik7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSAoY29uc3QgdWludDhfdCopKCZkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YVtzcmNPZmZzZXRdKTsKKworICAgICAgICAgICAgc3dpdGNoIChtTkFMTGVuZ3RoU2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gKmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gVTE2X0FUKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9ICgoc2l6ZV90KWRhdGFbMF0gPDwgMTYpIHwgVTE2X0FUKCZkYXRhWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBVMzJfQVQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworCisgICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhkc3RPZmZzZXQgKyA0IDw9ICgqYnVmZmVyKS0+c2l6ZSgpKTsKKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YVtzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIGxlbik7CisgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKCgqYnVmZmVyKS0+cmFuZ2Vfb2Zmc2V0KCksIGRzdE9mZnNldCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoc3JjLCBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSwgZGVjcnlwdGVkRHJtQnVmZmVyLmxlbmd0aCk7CisgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKCgqYnVmZmVyKS0+cmFuZ2Vfb2Zmc2V0KCksIGRlY3J5cHRlZERybUJ1ZmZlci5sZW5ndGgpOworICAgIH0KKworICAgIGlmIChkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSkgeworICAgICAgICBkZWxldGUgW10gZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGE7CisgICAgICAgIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RSTUV4dHJhY3Rvcjo6RFJNRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIqIG1pbWUpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCkgeworICAgIG1PcmlnaW5hbEV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoc291cmNlLCBtaW1lKTsKKyAgICBtT3JpZ2luYWxFeHRyYWN0b3ItPnNldERybUZsYWcodHJ1ZSk7CisKKyAgICBEcm1NYW5hZ2VyQ2xpZW50ICpjbGllbnQ7CisgICAgc291cmNlLT5nZXREcm1JbmZvKCZtRGVjcnlwdEhhbmRsZSwgJmNsaWVudCk7Cit9CisKK0RSTUV4dHJhY3Rvcjo6fkRSTUV4dHJhY3RvcigpIHsKK30KKworc2l6ZV90IERSTUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1PcmlnaW5hbEV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IERSTUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgc3A8TWVkaWFTb3VyY2U+IG9yaWdpbmFsTWVkaWFTb3VyY2UgPSBtT3JpZ2luYWxFeHRyYWN0b3ItPmdldFRyYWNrKGluZGV4KTsKKyAgICBvcmlnaW5hbE1lZGlhU291cmNlLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleUlzRFJNLCAxKTsKKworICAgIGludDMyX3QgdHJhY2tJRDsKKyAgICBDSEVDSyhnZXRUcmFja01ldGFEYXRhKGluZGV4LCAwKS0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJRCkpOworCisgICAgRHJtQnVmZmVyIGlwbXBCb3g7CisgICAgaXBtcEJveC5kYXRhID0gbU9yaWdpbmFsRXh0cmFjdG9yLT5nZXREcm1UcmFja0luZm8odHJhY2tJRCwgJihpcG1wQm94Lmxlbmd0aCkpOworICAgIENIRUNLKGlwbXBCb3gubGVuZ3RoID4gMCk7CisKKyAgICByZXR1cm4gbmV3IERSTVNvdXJjZShvcmlnaW5hbE1lZGlhU291cmNlLCBtRGVjcnlwdEhhbmRsZSwgdHJhY2tJRCwgJmlwbXBCb3gpOworfQorCitzcDxNZXRhRGF0YT4gRFJNRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICByZXR1cm4gbU9yaWdpbmFsRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGluZGV4LCBmbGFncyk7Cit9CisKK3NwPE1ldGFEYXRhPiBEUk1FeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgeworICAgIHJldHVybiBtT3JpZ2luYWxFeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7Cit9CisKK3N0YXRpYyBNdXRleCBnRFJNU25pZmZlck11dGV4OworYm9vbCBTbmlmZkRSTSgKKyAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ0RSTVNuaWZmZXJNdXRleCk7CisgICAgICAgIGlmIChnRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWNyeXB0SGFuZGxlICpkZWNyeXB0SGFuZGxlID0gc291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihnRHJtTWFuYWdlckNsaWVudCk7CisKKyAgICBpZiAoZGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9PSBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VEKSB7CisgICAgICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KCJkcm0rY29udGFpbmVyX2Jhc2VkKyIpOworICAgICAgICB9IGVsc2UgaWYgKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID09IERlY3J5cHRBcGlUeXBlOjpFTEVNRU5UQVJZX1NUUkVBTV9CQVNFRCkgeworICAgICAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOCgiZHJtK2VzX2Jhc2VkKyIpOworICAgICAgICB9CisKKyAgICAgICAgKm1pbWVUeXBlICs9IGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlOworICAgICAgICAqY29uZmlkZW5jZSA9IDEwLjBmOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KK30gLy9uYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCmluZGV4IDQ5ZWFjNjIuLjBiODk5N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKICNpbmNsdWRlICJpbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKIApAQCAtMzEsNiArMzIsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBib29sIERhdGFTb3VyY2U6OmdldFVJbnQxNihvZmZfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CkBAIC0xMDQsNiArMTA3LDEyIEBACiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmQU1SKTsKICAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZNUEVHMlRTKTsKICAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZNUDMpOworCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImRybS5zZXJ2aWNlLmVuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgeworICAgICAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZEUk0pOworICAgIH0KIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmluZGV4IGRkMjU3OWIuLmI0NmQ4ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCkBAIC0yMSwxNCArMjEsMjYgQEAKIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKICAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAicmIiKSksCisgICAgICBtRmQoZmlsZW5vKG1GaWxlKSksCiAgICAgICBtT2Zmc2V0KDApLAotICAgICAgbUxlbmd0aCgtMSkgeworICAgICAgbUxlbmd0aCgtMSksCisgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAorICAgICAgbURybUJ1Zk9mZnNldCgwKSwKKyAgICAgIG1Ecm1CdWZTaXplKDApLAorICAgICAgbURybUJ1ZihOVUxMKXsKIH0KIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKICAgICA6IG1GaWxlKGZkb3BlbihmZCwgInJiIikpLAorICAgICAgbUZkKGZkKSwKICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKLSAgICAgIG1MZW5ndGgobGVuZ3RoKSB7CisgICAgICBtTGVuZ3RoKGxlbmd0aCksCisgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAorICAgICAgbURybUJ1Zk9mZnNldCgwKSwKKyAgICAgIG1Ecm1CdWZTaXplKDApLAorICAgICAgbURybUJ1ZihOVUxMKXsKICAgICBDSEVDSyhvZmZzZXQgPj0gMCk7CiAgICAgQ0hFQ0sobGVuZ3RoID49IDApOwogfQpAQCAtMzgsNiArNTAsMTQgQEAKICAgICAgICAgZmNsb3NlKG1GaWxlKTsKICAgICAgICAgbUZpbGUgPSBOVUxMOwogICAgIH0KKworICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKKyAgICAgICAgbURybUJ1ZiA9IE5VTEw7CisgICAgfQorICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKG1EZWNyeXB0SGFuZGxlKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IEZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKQEAgLTYxLDEzICs4MSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50IGVyciA9IGZzZWVrbyhtRmlsZSwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOwotICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIExPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCBvZmZzZXQgKyBtT2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQorICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMICYmIERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQKKyAgICAgICAgICAgID09IG1EZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSkgeworICAgICAgICByZXR1cm4gcmVhZEF0RFJNKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICB9IGVsc2UgeworICAgICAgICBpbnQgZXJyID0gZnNlZWtvKG1GaWxlLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgb2Zmc2V0ICsgbU9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQogCi0gICAgcmV0dXJuIGZyZWFkKGRhdGEsIDEsIHNpemUsIG1GaWxlKTsKKyAgICAgICAgcmV0dXJuIGZyZWFkKGRhdGEsIDEsIHNpemUsIG1GaWxlKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IEZpbGVTb3VyY2U6OmdldFNpemUob2ZmX3QgKnNpemUpIHsKQEAgLTg3LDQgKzExMiw1MyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorRGVjcnlwdEhhbmRsZSogRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oRHJtTWFuYWdlckNsaWVudCogY2xpZW50KSB7CisgICAgbURybU1hbmFnZXJDbGllbnQgPSBjbGllbnQ7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBtRHJtTWFuYWdlckNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgICAgIG1GZCwgbU9mZnNldCwgbUxlbmd0aCk7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKK30KKwordm9pZCBGaWxlU291cmNlOjpnZXREcm1JbmZvKERlY3J5cHRIYW5kbGUgKipoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKKyAgICAqaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7CisKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK3NzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNKG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgRFJNX0NBQ0hFX1NJWkUgPSAxMDI0OworICAgIGlmIChtRHJtQnVmID09IE5VTEwpIHsKKyAgICAgICAgbURybUJ1ZiA9IG5ldyB1bnNpZ25lZCBjaGFyW0RSTV9DQUNIRV9TSVpFXTsKKyAgICB9CisKKyAgICBpZiAobURybUJ1ZiAhPSBOVUxMICYmIG1Ecm1CdWZTaXplID4gMCAmJiAob2Zmc2V0ICsgbU9mZnNldCkgPj0gbURybUJ1Zk9mZnNldAorICAgICAgICAgICAgJiYgKG9mZnNldCArIG1PZmZzZXQgKyBzaXplKSA8PSAobURybUJ1Zk9mZnNldCArIG1Ecm1CdWZTaXplKSkgeworICAgICAgICAvKiBVc2UgYnVmZmVyZWQgZGF0YSAqLworICAgICAgICBtZW1jcHkoZGF0YSwgKHZvaWQqKShtRHJtQnVmKyhvZmZzZXQrbU9mZnNldC1tRHJtQnVmT2Zmc2V0KSksIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9IGVsc2UgaWYgKHNpemUgPD0gRFJNX0NBQ0hFX1NJWkUpIHsKKyAgICAgICAgLyogQnVmZmVyIG5ldyBkYXRhICovCisgICAgICAgIG1Ecm1CdWZPZmZzZXQgPSAgb2Zmc2V0ICsgbU9mZnNldDsKKyAgICAgICAgbURybUJ1ZlNpemUgPSBtRHJtTWFuYWdlckNsaWVudC0+cHJlYWQobURlY3J5cHRIYW5kbGUsIG1Ecm1CdWYsCisgICAgICAgICAgICAgICAgRFJNX0NBQ0hFX1NJWkUsIG9mZnNldCArIG1PZmZzZXQpOworICAgICAgICBpZiAobURybUJ1ZlNpemUgPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IGRhdGFSZWFkID0gMDsKKyAgICAgICAgICAgIGRhdGFSZWFkID0gc2l6ZSA+IG1Ecm1CdWZTaXplID8gbURybUJ1ZlNpemUgOiBzaXplOworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICh2b2lkKiltRHJtQnVmLCBkYXRhUmVhZCk7CisgICAgICAgICAgICByZXR1cm4gZGF0YVJlYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbURybUJ1ZlNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUb28gYmlnIGNodW5rIHRvIGNhY2hlLiBDYWxsIERSTSBkaXJlY3RseSAqLworICAgICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnQtPnByZWFkKG1EZWNyeXB0SGFuZGxlLCBkYXRhLCBzaXplLCBvZmZzZXQgKyBtT2Zmc2V0KTsKKyAgICB9Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDM0MDY0YzhjLi41NDk3MzIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNjQsNyArMjY0LDkgQEAKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCksCi0gICAgICBtRmlsZU1ldGFEYXRhKG5ldyBNZXRhRGF0YSkgeworICAgICAgbUZpbGVNZXRhRGF0YShuZXcgTWV0YURhdGEpLAorICAgICAgbUZpcnN0U0lORihOVUxMKSwKKyAgICAgIG1Jc0RybShmYWxzZSkgewogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewpAQCAtMjc2LDYgKzI3OCwxNSBAQAogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQogICAgIG1GaXJzdFRyYWNrID0gbUxhc3RUcmFjayA9IE5VTEw7CisKKyAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICB3aGlsZSAoc2luZikgeworICAgICAgICBTSU5GICpuZXh0ID0gc2luZi0+bmV4dDsKKyAgICAgICAgZGVsZXRlIHNpbmYtPklQTVBEYXRhOworICAgICAgICBkZWxldGUgc2luZjsKKyAgICAgICAgc2luZiA9IG5leHQ7CisgICAgfQorICAgIG1GaXJzdFNJTkYgPSBOVUxMOwogfQogCiBzcDxNZXRhRGF0YT4gTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewpAQCAtMzcwLDYgKzM4MSwxNzggQEAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIE1QRUc0RXh0cmFjdG9yOjpzZXREcm1GbGFnKGJvb2wgZmxhZykgeworICAgIG1Jc0RybSA9IGZsYWc7Cit9CisKK2NoYXIqIE1QRUc0RXh0cmFjdG9yOjpnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CisgICAgaWYgKG1GaXJzdFNJTkYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICB3aGlsZSAoc2luZiAmJiAodHJhY2tJRCAhPSBzaW5mLT50cmFja0lEKSkgeworICAgICAgICBzaW5mID0gc2luZi0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoc2luZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICpsZW4gPSBzaW5mLT5sZW47CisgICAgcmV0dXJuIHNpbmYtPklQTVBEYXRhOworfQorCisvLyBSZWFkcyBhbiBlbmNvZGVkIGludGVnZXIgNyBiaXRzIGF0IGEgdGltZSB1bnRpbCBpdCBlbmNvdW50ZXJzIHRoZSBoaWdoIGJpdCBjbGVhci4KK2ludDMyX3QgcmVhZFNpemUob2ZmX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiBEYXRhU291cmNlLCB1aW50OF90ICpudW1PZkJ5dGVzKSB7CisgICAgdWludDMyX3Qgc2l6ZSA9IDA7CisgICAgdWludDhfdCBkYXRhOworICAgIGJvb2wgbW9yZURhdGEgPSB0cnVlOworICAgICpudW1PZkJ5dGVzID0gMDsKKworICAgIHdoaWxlIChtb3JlRGF0YSkgeworICAgICAgICBpZiAoRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmRhdGEsIDEpIDwgMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgbW9yZURhdGEgPSAoZGF0YSA+PSAxMjgpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBzaXplID0gKHNpemUgPDwgNykgfCAoZGF0YSAmIDB4N2YpOyAvLyBUYWtlIGxhc3QgNyBiaXRzCisgICAgICAgICgqbnVtT2ZCeXRlcykgKys7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYob2ZmX3QgKm9mZnNldCwgb2ZmX3QgZGF0YV9vZmZzZXQpIHsKKyAgICB1aW50OF90IHVwZGF0ZUlkVGFnOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdXBkYXRlSWRUYWcsIDEpIDwgMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGRhdGFfb2Zmc2V0ICsrOworCisgICAgaWYgKDB4MDEvKk9CSkVDVF9ERVNDUklQVE9SX1VQREFURV9JRF9UQUcqLyAhPSB1cGRhdGVJZFRhZykgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgbnVtT2ZCeXRlczsKKyAgICBpbnQzMl90IHNpemUgPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBpbnQzMl90IGNsYXNzU2l6ZSA9IHNpemU7CisgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKKworICAgIHdoaWxlKHNpemUgPj0gMTEgKSB7CisgICAgICAgIHVpbnQ4X3QgZGVzY3JpcHRvclRhZzsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZkZXNjcmlwdG9yVGFnLCAxKSA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArKzsKKworICAgICAgICBpZiAoMHgxMS8qT0JKRUNUX0RFU0NSSVBUT1JfSURfVEFHKi8gIT0gZGVzY3JpcHRvclRhZykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOworICAgICAgICAvL09iamVjdERlc2NyaXB0b3JJRCBhbmQgT2JqZWN0RGVzY3JpcHRvciB1cmwgZmxhZworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgYnVmZmVyLCAyKSA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArPSAyOworCisgICAgICAgIGlmICgoYnVmZmVyWzFdID4+IDUpICYgMHgwMDAxKSB7IC8vdXJsIGZsYWcgaXMgc2V0CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIGJ1ZmZlciwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKworICAgICAgICBpZiAoKDB4MEYvKkVTX0lEX1JFRl9UQUcqLyAhPSBidWZmZXJbMV0pCisgICAgICAgICAgICAgICAgfHwgKCAweDBBLypJUE1QX0RFU0NSSVBUT1JfUE9JTlRFUl9JRF9UQUcqLyAhPSBidWZmZXJbNV0pKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgU0lORiAqc2luZiA9IG5ldyBTSU5GOworICAgICAgICBzaW5mLT50cmFja0lEID0gVTE2X0FUKCZidWZmZXJbM10pOworICAgICAgICBzaW5mLT5JUE1QRGVzY3JpcHRvcklEID0gYnVmZmVyWzddOworICAgICAgICBzaW5mLT5uZXh0ID0gbUZpcnN0U0lORjsKKyAgICAgICAgbUZpcnN0U0lORiA9IHNpbmY7CisKKyAgICAgICAgc2l6ZSAtPSAoOCArIDIgKyAxKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ1cGRhdGVJZFRhZywgMSkgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICBpZigweDA1LypJUE1QX0RFU0NSSVBUT1JfVVBEQVRFX0lEX1RBRyovICE9IHVwZGF0ZUlkVGFnKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc2l6ZSA9IHJlYWRTaXplKGRhdGFfb2Zmc2V0LCBtRGF0YVNvdXJjZSwgJm51bU9mQnl0ZXMpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGNsYXNzU2l6ZSA9IHNpemU7CisgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICB1aW50OF90IHRhZzsKKyAgICAgICAgaW50MzJfdCBkYXRhTGVuOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnRhZywgMSkgPCAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICAgICAgaWYgKDB4MEIvKklQTVBfREVTQ1JJUFRPUl9JRF9UQUcqLyA9PSB0YWcpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaWQ7CisgICAgICAgICAgICBkYXRhTGVuID0gcmVhZFNpemUoZGF0YV9vZmZzZXQsIG1EYXRhU291cmNlLCAmbnVtT2ZCeXRlcyk7CisgICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFMZW4gPCA0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IG51bU9mQnl0ZXM7CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmaWQsIDEpIDwgMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsrOworCisgICAgICAgICAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICAgICAgICAgIHdoaWxlIChzaW5mICYmIChzaW5mLT5JUE1QRGVzY3JpcHRvcklEICE9IGlkKSkgeworICAgICAgICAgICAgICAgIHNpbmYgPSBzaW5mLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbmYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaW5mLT5sZW4gPSBkYXRhTGVuIC0gMzsKKyAgICAgICAgICAgIHNpbmYtPklQTVBEYXRhID0gbmV3IGNoYXJbc2luZi0+bGVuXTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyLCBzaW5mLT5JUE1QRGF0YSwgc2luZi0+bGVuKSA8IHNpbmYtPmxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpbmYtPmxlbjsKKworICAgICAgICAgICAgc2l6ZSAtPSAoZGF0YUxlbiArIG51bU9mQnl0ZXMgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorfQorCiBzdGF0aWMgdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKICAgICBzWzBdID0geCA+PiAyNDsKICAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKQEAgLTU3Miw3ICs3NTUsMTEgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSkgewogICAgICAgICAgICAgICAgIG1IYXZlTWV0YWRhdGEgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBkdW1teSBlcnJvci4KKyAgICAgICAgICAgICAgICBpZiAoIW1Jc0RybSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTAyMCw2ICsxMjA3LDIwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbUlzRHJtKSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcGFyc2VEcm1TSU5GKG9mZnNldCwgZGF0YV9vZmZzZXQpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMTA2OSw2ICsxMjcwLDggQEAKICAgICAgICAgZHVyYXRpb24gPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwogICAgIH0KIAorICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CiAgICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7CkBAIC0xNzEyLDkgKzE5MTUsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CiAgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLQotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIGludDMyX3QgZHJtID0gMDsKKyAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKQEAgLTE3MjMsNDAgKzE5MzIsNDYgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKIAotICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgQ0hFQ0soc3JjT2Zmc2V0ICsgbU5BTExlbmd0aFNpemUgPD0gc2l6ZSk7Ci0gICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbExlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgICAgIENIRUNLKHNyY09mZnNldCArIG1OQUxMZW5ndGhTaXplIDw9IHNpemUpOworICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENIRUNLKGRzdE9mZnNldCArIDQgPD0gbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhkc3RPZmZzZXQgKyA0IDw9IG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwogICAgICAgICB9Ci0gICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CiAKLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOwogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdClkdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDhhNWZiMTEuLjk2NWMzNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKQEAgLTYzLDYgKzY0LDE4IEBACiAgICAgICAgICAgICAgbWltZSwgY29uZmlkZW5jZSk7CiAgICAgfQogCisgICAgaWYgKCFzdHJuY21wKG1pbWUsICJkcm0iLCAzKSkgeworICAgICAgICBjb25zdCBjaGFyICpvcmlnaW5hbE1pbWUgPSBzdHJyY2hyKG1pbWUsICcrJykgKyAxOworCisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiZHJtK2VzX2Jhc2VkIiwgMTIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERSTUV4dHJhY3Rvcihzb3VyY2UsIG9yaWdpbmFsTWltZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZSwgImRybStjb250YWluZXJfYmFzZWQiLCAxOSkpIHsKKyAgICAgICAgICAgIG1pbWUgPSBvcmlnaW5hbE1pbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCAiYXVkaW8vbXA0IikpIHsKICAgICAgICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCA2ZDRmYmNiLi5hZjI0N2Q1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggMTBjNmU0MS4uN2E2MDBkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMTI3LDEwICsxMjcsMTEgQEAKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5ydHR0bCIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIucnR4IikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5vdGEiKSkgewotICAgICAgICByZXR1cm4gSGFuZGxlTUlESShwYXRoLCAmY2xpZW50KTsKLSAgICB9Ci0KLSAgICBpZiAobVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKSA9PSBPSykgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBIYW5kbGVNSURJKHBhdGgsICZjbGllbnQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHBhdGgpID09IE9LKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgICAgICBpZiAoKHZhbHVlID0gbVJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX01JTUVUWVBFKSkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggYTY4YzY0MS4uOTBmM2Q2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IGMwNTllNjAuLmUzNTI5MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDYgKzQyLDkgQEAKIHN0cnVjdCBBUlRQU2Vzc2lvbjsKIHN0cnVjdCBVRFBQdXNoZXI7CiAKK2NsYXNzIERybU1hbmFnZXJDbGluZXQ7CitjbGFzcyBEZWNyeXB0SGFuZGxlOworCiBzdHJ1Y3QgQXdlc29tZVJlbmRlcmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEF3ZXNvbWVSZW5kZXJlcigpIHt9CiAKQEAgLTIxNiw2ICsyMjAsOSBAQAogICAgICAgICB9CiAgICAgfSAqbVN1c3BlbnNpb25TdGF0ZTsKIAorICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmM4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBEUk1fRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIFNhbXBsZVRhYmxlOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIERlY3J5cHRIYW5kbGU7CisKK2NsYXNzIERSTUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgRFJNRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRSTUV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworCisgICAgc3A8TWVkaWFFeHRyYWN0b3I+IG1PcmlnaW5hbEV4dHJhY3RvcjsKKyAgICBEZWNyeXB0SGFuZGxlKiBtRGVjcnlwdEhhbmRsZTsKKworICAgIERSTUV4dHJhY3Rvcihjb25zdCBEUk1FeHRyYWN0b3IgJik7CisgICAgRFJNRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRFJNRXh0cmFjdG9yICYpOworfTsKKworYm9vbCBTbmlmZkRSTSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9FWFRSQUNUT1JfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDI2MTBiMGUuLmJjMmU0ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTM5LDYgKzM5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgdm9pZCBzZXREcm1GbGFnKGJvb2wgZmxhZyk7CisgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1QRUc0RXh0cmFjdG9yKCk7CiAKQEAgLTcxLDYgKzc1LDE5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgdmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKTsKIAorICAgIHN0cnVjdCBTSU5GIHsKKyAgICAgICAgU0lORiAqbmV4dDsKKyAgICAgICAgdWludDE2X3QgdHJhY2tJRDsKKyAgICAgICAgdWludDhfdCBJUE1QRGVzY3JpcHRvcklEOworICAgICAgICBzc2l6ZV90IGxlbjsKKyAgICAgICAgY2hhciAqSVBNUERhdGE7CisgICAgfTsKKworICAgIFNJTkYgKm1GaXJzdFNJTkY7CisKKyAgICBib29sIG1Jc0RybTsKKyAgICBzdGF0dXNfdCBwYXJzZURybVNJTkYob2ZmX3QgKm9mZnNldCwgb2ZmX3QgZGF0YV9vZmZzZXQpOworCiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0hlYWRlcihvZmZfdCBkYXRhX29mZnNldCwgb2ZmX3QgZGF0YV9zaXplKTsKIAogICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggYWEyNjE4ZS4uZjAzZjdhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0yMDEsNyArMjAxLDcgQEAKICAgICBBU3RyaW5nIGZvcm1hdDsKICAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOwogCi0gICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOwogICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKIAogICAgIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDdiZjUzNGQuLjcyYTJmZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMTE5Nyw3ICsxMTk3LDcgQEAKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5tawppbmRleCA3ODAyZWZkLi44MWM2MTY3IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsKQEAgLTIyLDExICsyMiw2IEBACiAgICAgICAgIFNrT214UGl4ZWxSZWYuY3BwIFwKICAgICAgICAgU3RyZWFtU291cmNlLmNwcAogCi0KLSMgYWRkIGV4dGVybmFsL3NraWEvc3JjL2ltYWdlcy9Ta0ltYWdlRGVjb2Rlcl9saWJqcGVnLmNwcAotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICAgICAgLi4vLi4vLi4vLi4vLi4vZXh0ZXJuYWwvc2tpYS9zcmMvaW1hZ2VzL1NrSW1hZ2VEZWNvZGVyX2xpYmpwZWcuY3BwCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlic2tpYSBcCmRpZmYgLS1naXQgYS9vYmV4L2phdmF4L29iZXgvU2VydmVyT3BlcmF0aW9uLmphdmEgYi9vYmV4L2phdmF4L29iZXgvU2VydmVyT3BlcmF0aW9uLmphdmEKaW5kZXggMDdhM2E1My4uZDE0NzZkMiAxMDA2NDQKLS0tIGEvb2JleC9qYXZheC9vYmV4L1NlcnZlck9wZXJhdGlvbi5qYXZhCisrKyBiL29iZXgvamF2YXgvb2JleC9TZXJ2ZXJPcGVyYXRpb24uamF2YQpAQCAtMzk3LDExICszOTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKGhlYWRlcklEICE9IE9iZXhIZWxwZXIuT0JFWF9PUENPREVfR0VUX0ZJTkFMKSkgewogCiAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgICAgICAgICBieXRlW10gdGVtcCA9IG5ldyBieXRlW2xlbmd0aCAtIDNdOworICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCB0aHJlZSBieXRlcyBhbHJlYWR5IHJlYWQsIGNvbXBlbnNhdGluZyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICBieXRlc1JlY2VpdmVkID0gbUlucHV0LnJlYWQodGVtcCk7CiAKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzUmVjZWl2ZWQgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlc1JlY2VpdmVkICs9IG1JbnB1dC5yZWFkKHRlbXAsIGJ5dGVzUmVjZWl2ZWQsIGxlbmd0aCAtIGJ5dGVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWNlaXZlZCAhPSB0ZW1wLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWNlaXZlZCArPSBtSW5wdXQucmVhZCh0ZW1wLCBieXRlc1JlY2VpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLmxlbmd0aCAtIGJ5dGVzUmVjZWl2ZWQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKaW5kZXggNjYyYTFmYS4uNWMwOWRjYyAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApAQCAtNDgwLDEzICs0ODAsMTMgQEAKICAgICBjb3B5Yml0X2RldmljZV90KiBjb25zdCBjb3B5Yml0ID0gYmxpdGVuZ2luZTsKICAgICBpZiAoY29weWJpdCkgIHsKICAgICAgICAgY29weWJpdF9pbWFnZV90IHNpbWc7Ci0gICAgICAgIHNpbWcudyA9IHNyYy0+d2lkdGg7CisgICAgICAgIHNpbWcudyA9IHNyYy0+c3RyaWRlOwogICAgICAgICBzaW1nLmggPSBzcmMtPmhlaWdodDsKICAgICAgICAgc2ltZy5mb3JtYXQgPSBzcmMtPmZvcm1hdDsKICAgICAgICAgc2ltZy5oYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KHNyYy0+aGFuZGxlKTsKIAogICAgICAgICBjb3B5Yml0X2ltYWdlX3QgZGltZzsKLSAgICAgICAgZGltZy53ID0gZHN0LT53aWR0aDsKKyAgICAgICAgZGltZy53ID0gZHN0LT5zdHJpZGU7CiAgICAgICAgIGRpbWcuaCA9IGRzdC0+aGVpZ2h0OwogICAgICAgICBkaW1nLmZvcm1hdCA9IGRzdC0+Zm9ybWF0OwogICAgICAgICBkaW1nLmhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oZHN0LT5oYW5kbGUpOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAppbmRleCA3ZTBjMTY5Li5kMjZkMTNlIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAorKysgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcApAQCAtMTg0MywzICsxODQzLDggQEAKICAgICB9CiAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgTlVMTCk7CiB9CisKK0VHTEJvb2xlYW4gZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYykgeyByZXR1cm4gMDsgfQorRUdMU3luY0tIUiBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpIHsgcmV0dXJuIDA7IH0KK0VHTGludCBlZ2xDbGllbnRXYWl0U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVLSFIgdGltZW91dCkgeyByZXR1cm4gMDsgfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCmluZGV4IGYwMzFjNzkuLmVmNjY4NDEgMTAwNjQ0Ci0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCisrKyBiL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCkBAIC0xODEsNCArMTgxLDMgQEAKIHsKICAgICBiYWNrZ3JvdW5kID0gMS4wZiAtIGJhY2tncm91bmQ7CiB9Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDhmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gV0FQUHVzaE1hbmFnZXIKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQtY29tbW9uCisKK0xPQ0FMX1BST0dVQVJEX0ZMQUdTIDo9IC1pbmNsdWRlICQoTE9DQUxfUEFUSCkvcHJvZ3VhcmQuZmxhZ3MKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgVGhpcyBmaW5kcyBhbmQgYnVpbGRzIHRoZSB0ZXN0IGFwayBhcyB3ZWxsLCBzbyBhIHNpbmdsZSBtYWtlIGRvZXMgYm90aC4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTlkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc21zcHVzaCI+CisKKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNtc3B1c2guV0FQUFVTSF9NQU5BR0VSX0JJTkQiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmVPclN5c3RlbSIgLz4KKworICAgIDxvcmlnaW5hbC1wYWNrYWdlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc21zcHVzaCIgLz4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLldhcFB1c2hNYW5hZ2VyIgorICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJjb20uYW5kcm9pZC5zbXNwdXNoLldBUFBVU0hfTUFOQUdFUl9CSU5EIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklXYXBQdXNoTWFuYWdlciI+PC9hY3Rpb24+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9DbGVhblNwZWMubWsgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9DbGVhblNwZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL0NsZWFuU3BlYy5tawpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAorIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKKyMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisjIHJ1biBiZWZvcmUuCisjCisjIEUuZy46CisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCisjCisjIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAorIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KKyMKKyMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgorIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgorIworIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKKyMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKKyMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKKyMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAorIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyMKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBGb3IgZXhhbXBsZToKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBwYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9OT1RJQ0UgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vTk9USUNFCnJlbmFtZSB0byBwYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9OT1RJQ0UKaW5kZXggOWRmMjU1NC4uYzViMWVmYSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vTk9USUNFCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL05PVElDRQpAQCAtMSw1ICsxLDUgQEAKIAotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk4ODdiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvcHJvZ3VhcmQuZmxhZ3MKQEAgLTAsMCArMSwxOCBAQAorCisjYXBwbHkgbWV0aG9kIGlzIGR5bmFtaWNhbGx5IHJlZmVyZW5jZWQgYnkgdGhlIHJlZmxlY3Rpb24gY2xhc3MuCista2VlcCBjbGFzcyBhbmRyb2lkLmFwcC5Db250ZXh0SW1wbCRTaGFyZWRQcmVmZXJlbmNlc0ltcGwkRWRpdG9ySW1wbCB7CisgICAgdm9pZCBhcHBseSgpOworfQorLWtlZXAgY2xhc3MgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciB7CisgICAgdm9pZCBhcHBseSgpOworfQorCisjV2FwUHVzaE1hbmFnZXIgaXMgcmVmZXJlbmNlZCBvbmx5IGJ5IEFuZHJvaWRNYW5pZmVzdC54bWwKKy1rZWVwIGNsYXNzIGNvbS5hbmRyb2lkLnNtc3B1c2guV2FwUHVzaE1hbmFnZXIgeworI0NUUyBtb2R1bGUgbWV0aG9kCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhRXhpc3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOworICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeURhdGEoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKKyAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgYm9vbGVhbik7Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL1dhcFB1c2hNYW5hZ2VyLmphdmEgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC9XYXBQdXNoTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTAzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC9XYXBQdXNoTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zbXNwdXNoOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklXYXBQdXNoTWFuYWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuV2FwUHVzaE1hbmFnZXJQYXJhbXM7CisKKy8qKgorICogVGhlIFdhcFB1c2hNYW5hZ2VyIHNlcnZpY2UgaXMgaW1wbGVtZW50ZWQgdG8gcHJvY2VzcyBpbmNvbWluZworICogV0FQIFB1c2ggbWVzc2FnZXMgYW5kIHRvIG1haW50YWluIHRoZSBSZWNlaXZlciBBcHBsaWNhdGlvbi9BcHBsaWNhdGlvbgorICogSUQgbWFwcGluZy4gVGhlIFdhcFB1c2hNYW5hZ2VyIHJ1bnMgYXMgYSBzeXN0ZW0gc2VydmljZSwgYW5kIG9ubHkgdGhlCisgKiBXYXBQdXNoTWFuYWdlciBjYW4gdXBkYXRlIHRoZSBXQVAgUHVzaCBtZXNzYWdlIGFuZCBSZWNlaXZlciBBcHBsaWNhdGlvbgorICogbWFwcGluZyAoQXBwbGljYXRpb24gSUQgVGFibGUpLiBXaGVuIHRoZSBkZXZpY2UgcmVjZWl2ZXMgYW4gU01TIFdBUCBQdXNoCisgKiBtZXNzYWdlLCB0aGUgV2FwUHVzaE1hbmFnZXIgbG9va3MgdXAgdGhlIFJlY2VpdmVyIEFwcGxpY2F0aW9uIG5hbWUgaW4KKyAqIEFwcGxpY2F0aW9uIElEIFRhYmxlLiBJZiBhbiBhcHBsaWNhdGlvbiBpcyBmb3VuZCwgdGhlIGFwcGxpY2F0aW9uIGlzCisgKiBsYXVuY2hlZCB1c2luZyBpdHMgZnVsbCBjb21wb25lbnQgbmFtZSBpbnN0ZWFkIG9mIGJyb2FkY2FzdGluZyBhbiBpbXBsaWNpdAorICogSW50ZW50LiBJZiBhIFJlY2VpdmVyIEFwcGxpY2F0aW9uIGlzIG5vdCBmb3VuZCBpbiB0aGUgQXBwbGljYXRpb24gSUQKKyAqIFRhYmxlIG9yIHRoZSBXYXBQdXNoTWFuYWdlciByZXR1cm5zIGEgcHJvY2Vzcy1mdXJ0aGVyIHZhbHVlLCB0aGUKKyAqIHRlbGVwaG9ueSBzdGFjayB3aWxsIHByb2Nlc3MgdGhlIG1lc3NhZ2UgdXNpbmcgZXhpc3RpbmcgbWVzc2FnZSBwcm9jZXNzaW5nCisgKiBmbG93LCBhbmQgYnJvYWRjYXN0IGFuIGltcGxpY2l0IEludGVudC4KKyAqLworcHVibGljIGNsYXNzIFdhcFB1c2hNYW5hZ2VyIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX05BTUUgPSAid2FwcHVzaC5kYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUElEX1RBQkxFX05BTUUgPSAiYXBwaWRfdGJsIjsKKworICAgIC8qKgorICAgICAqIFZlcnNpb24gbnVtYmVyIG11c3QgYmUgaW5jcmVtZW50ZWQgd2hlbiB0YWJsZSBzdHJ1Y3R1cmUgaXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FQX1BVU0hfTUFOQUdFUl9WRVJTSU9OID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NRTCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5uZXIgY2xhc3MgdGhhdCBkZWFscyB3aXRoIGFwcGxpY2F0aW9uIElEIHRhYmxlCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBXYXBQdXNoTWFuREJIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKyAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgV0FQX1BVU0hfTUFOQUdFUl9WRVJTSU9OKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihMT0dfVEFHLCAiaGVscGVyIGluc3RhbmNlIGNyZWF0ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihMT0dfVEFHLCAiZGIgb25DcmVhdGUuIik7CisgICAgICAgICAgICBTdHJpbmcgc3FsID0gIkNSRUFURSBUQUJMRSAiICsgQVBQSURfVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICAgICAgICAgKyAiaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgIgorICAgICAgICAgICAgICAgICAgICArICJ4X3dhcF9hcHBsaWNhdGlvbiBURVhULCAiCisgICAgICAgICAgICAgICAgICAgICsgImNvbnRlbnRfdHlwZSBURVhULCAiCisgICAgICAgICAgICAgICAgICAgICsgInBhY2thZ2VfbmFtZSBURVhULCAiCisgICAgICAgICAgICAgICAgICAgICsgImNsYXNzX25hbWUgVEVYVCwgIgorICAgICAgICAgICAgICAgICAgICArICJhcHBfdHlwZSBJTlRFR0VSLCAiCisgICAgICAgICAgICAgICAgICAgICsgIm5lZWRfc2lnbmF0dXJlIElOVEVHRVIsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZnVydGhlcl9wcm9jZXNzaW5nIElOVEVHRVIsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW5zdGFsbF9vcmRlciBJTlRFR0VSICIKKyAgICAgICAgICAgICAgICAgICAgKyAiKSI7CisKKyAgICAgICAgICAgIGlmIChERUJVR19TUUwpIExvZy52KExPR19UQUcsICJzcWw6ICIgKyBzcWwpOworICAgICAgICAgICAgZGIuZXhlY1NRTChzcWwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB3aGVuIHRhYmxlIHN0cnVjdHVyZSBpcyBjaGFuZ2VkLCBuZWVkIHRvIGR1bXAgYW5kIHJlc3RvcmUgZGF0YS4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoCisgICAgICAgICAgICAgICJkcm9wIHRhYmxlIGlmIGV4aXN0cyAiK0FQUElEX1RBQkxFX05BTUUpOworICAgICAgICAgICAgICBvbkNyZWF0ZShkYik7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVXBncmFkZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiBkbyBub3RoaW5nLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIHF1ZXJ5RGF0YSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHBhY2thZ2VOYW1lOworICAgICAgICAgICAgcHVibGljIFN0cmluZyBjbGFzc05hbWU7CisgICAgICAgICAgICBpbnQgYXBwVHlwZTsKKyAgICAgICAgICAgIGludCBuZWVkU2lnbmF0dXJlOworICAgICAgICAgICAgaW50IGZ1cnRoZXJQcm9jZXNzaW5nOworICAgICAgICAgICAgaW50IGluc3RhbGxPcmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyeSB0aGUgbGF0ZXN0IHJlY2VpdmVyIGFwcGxpY2F0aW9uIGluZm8gd2l0aCBzdXBwbGllZCBhcHBsaWNhdGlvbiBJRCBhbmQKKyAgICAgICAgICogY29udGVudCB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gYXBwX2lkICAgIGFwcGxpY2F0aW9uIElEIHRvIGxvb2sgdXAKKyAgICAgICAgICogQHBhcmFtIGNvbnRlbnRfdHlwZSAgICBjb250ZW50IHR5cGUgdG8gbG9vayB1cAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHF1ZXJ5RGF0YSBxdWVyeUxhc3RBcHAoU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICAgICAgU3RyaW5nIGFwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSkgeworICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgaW5zdGFsbF9vcmRlciwgcGFja2FnZV9uYW1lLCBjbGFzc19uYW1lLCAiCisgICAgICAgICAgICAgICAgICAgICsgIiBhcHBfdHlwZSwgbmVlZF9zaWduYXR1cmUsIGZ1cnRoZXJfcHJvY2Vzc2luZyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIEFQUElEX1RBQkxFX05BTUUKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdoZXJlIHhfd2FwX2FwcGxpY2F0aW9uPVwnIiArIGFwcF9pZCArICJcJyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBjb250ZW50X3R5cGU9XCciICsgY29udGVudF90eXBlICsgIlwnIgorICAgICAgICAgICAgICAgICAgICArICIgb3JkZXIgYnkgaW5zdGFsbF9vcmRlciBkZXNjIjsKKyAgICAgICAgICAgIGlmIChERUJVR19TUUwpIExvZy52KExPR19UQUcsICJzcWw6ICIgKyBzcWwpOworICAgICAgICAgICAgQ3Vyc29yIGN1ciA9IGRiLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgICAgICBxdWVyeURhdGEgcmV0ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGN1ci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBuZXcgcXVlcnlEYXRhKCk7CisgICAgICAgICAgICAgICAgcmV0Lmluc3RhbGxPcmRlciA9IGN1ci5nZXRJbnQoY3VyLmdldENvbHVtbkluZGV4KCJpbnN0YWxsX29yZGVyIikpOworICAgICAgICAgICAgICAgIHJldC5wYWNrYWdlTmFtZSA9IGN1ci5nZXRTdHJpbmcoY3VyLmdldENvbHVtbkluZGV4KCJwYWNrYWdlX25hbWUiKSk7CisgICAgICAgICAgICAgICAgcmV0LmNsYXNzTmFtZSA9IGN1ci5nZXRTdHJpbmcoY3VyLmdldENvbHVtbkluZGV4KCJjbGFzc19uYW1lIikpOworICAgICAgICAgICAgICAgIHJldC5hcHBUeXBlID0gY3VyLmdldEludChjdXIuZ2V0Q29sdW1uSW5kZXgoImFwcF90eXBlIikpOworICAgICAgICAgICAgICAgIHJldC5uZWVkU2lnbmF0dXJlID0gY3VyLmdldEludChjdXIuZ2V0Q29sdW1uSW5kZXgoIm5lZWRfc2lnbmF0dXJlIikpOworICAgICAgICAgICAgICAgIHJldC5mdXJ0aGVyUHJvY2Vzc2luZyA9IGN1ci5nZXRJbnQoY3VyLmdldENvbHVtbkluZGV4KCJmdXJ0aGVyX3Byb2Nlc3NpbmciKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBleHBvcnRlZCBBUEkgaW1wbGVtZW50YXRpb25zIGNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBJV2FwUHVzaE1hbmFnZXJTdHViIGV4dGVuZHMgSVdhcFB1c2hNYW5hZ2VyLlN0dWIgeworICAgICAgICBwdWJsaWMgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBwdWJsaWMgSVdhcFB1c2hNYW5hZ2VyU3R1YigpIHsKKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgdGhlIHBhY2thZ2Ugc2lnbmF0dXJlIHdpdGggV2FwUHVzaE1hbmFnZXIgcGFja2FnZQorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2lnbmF0dXJlQ2hlY2soU3RyaW5nIHBhY2thZ2VfbmFtZSkgeworICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgaW50IG1hdGNoID0gcG0uY2hlY2tTaWduYXR1cmVzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHBhY2thZ2VfbmFtZSk7CisKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihMT0dfVEFHLCAiY29tcGFyZSBzaWduYXR1cmUgIiArIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCAiICsgIHBhY2thZ2VfbmFtZSArICIsIG1hdGNoPSIgKyBtYXRjaCk7CisKKyAgICAgICAgICAgIHJldHVybiBtYXRjaCA9PSBQYWNrYWdlTWFuYWdlci5TSUdOQVRVUkVfTUFUQ0g7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIHZhbHVlIG9mIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcuCisgICAgICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIGZvbGxvd3M6CisgICAgICAgICAqIDEuTG9vayB1cCBBcHBsaWNhdGlvbiBJRCBUYWJsZSB3aXRoIHgtd2FwLWFwcGxpY2F0aW9uLWlkICsgY29udGVudCB0eXBlCisgICAgICAgICAqIDIuQ2hlY2sgdGhlIHNpZ25hdHVyZSBvZiBwYWNrYWdlIG5hbWUgdGhhdCBpcyBmb3VuZCBpbiB0aGUKKyAgICAgICAgICogICBBcHBsaWNhdGlvbiBJRCBUYWJsZSBieSB1c2luZyBQYWNrYWdlTWFuYWdlci5jaGVja1NpZ25hdHVyZQorICAgICAgICAgKiAzLlRyaWdnZXIgdGhlIEFwcGxpY2F0aW9uCisgICAgICAgICAqIDQuUmV0dXJucyB0aGUgcHJvY2VzcyBzdGF0dXMgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHByb2Nlc3NNZXNzYWdlKFN0cmluZyBhcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsIEludGVudCBpbnRlbnQpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ3cG1hbiBwcm9jZXNzTXNnICIgKyBhcHBfaWQgKyAiOiIgKyBjb250ZW50X3R5cGUpOworCisgICAgICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIgZGJoID0gZ2V0RGF0YWJhc2UobUNvbnRleHQpOworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBkYmguZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyLnF1ZXJ5RGF0YSBsYXN0YXBwID0gZGJoLnF1ZXJ5TGFzdEFwcChkYiwgYXBwX2lkLCBjb250ZW50X3R5cGUpOworICAgICAgICAgICAgZGIuY2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKGxhc3RhcHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJubyByZWNlaXZlciBhcHAgZm91bmQgZm9yICIgKyBhcHBfaWQgKyAiOiIgKyBjb250ZW50X3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfUVVFUllfRkFJTEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJzdGFydGluZyAiICsgbGFzdGFwcC5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvIiArIGxhc3RhcHAuY2xhc3NOYW1lKTsKKworICAgICAgICAgICAgaWYgKGxhc3RhcHAubmVlZFNpZ25hdHVyZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVDaGVjayhsYXN0YXBwLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2FwUHVzaE1hbmFnZXJQYXJhbXMuU0lHTkFUVVJFX05PX01BVENIOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3RhcHAuYXBwVHlwZSA9PSBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSkgeworICAgICAgICAgICAgICAgIC8vSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKGxhc3RhcHAucGFja2FnZU5hbWUsIGxhc3RhcHAuY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiaW52YWxpZCBuYW1lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RhcHAucGFja2FnZU5hbWUgKyAiLyIgKyBsYXN0YXBwLmNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXYXBQdXNoTWFuYWdlclBhcmFtcy5JTlZBTElEX1JFQ0VJVkVSX05BTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Db250ZXh0LCBsYXN0YXBwLmNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShsYXN0YXBwLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGFwcC5jbGFzc05hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQuc3RhcnRTZXJ2aWNlKGludGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiaW52YWxpZCBuYW1lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RhcHAucGFja2FnZU5hbWUgKyAiLyIgKyBsYXN0YXBwLmNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXYXBQdXNoTWFuYWdlclBhcmFtcy5JTlZBTElEX1JFQ0VJVkVSX05BTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVECisgICAgICAgICAgICAgICAgICAgIHwgKGxhc3RhcHAuZnVydGhlclByb2Nlc3NpbmcgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuRlVSVEhFUl9QUk9DRVNTSU5HIDogMCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcHBUeXBlQ2hlY2soaW50IGFwcF90eXBlKSB7CisgICAgICAgICAgICBpZiAoYXBwX3R5cGUgPT0gV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFkgfHwKKyAgICAgICAgICAgICAgICAgICAgYXBwX3R5cGUgPT0gV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGFkZGluZyB0aGUgcGFja2FnZSBzdWNjZWVkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRQYWNrYWdlKFN0cmluZyB4X2FwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICBpbnQgYXBwX3R5cGUsIGJvb2xlYW4gbmVlZF9zaWduYXR1cmUsIGJvb2xlYW4gZnVydGhlcl9wcm9jZXNzaW5nKSB7CisgICAgICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIgZGJoID0gZ2V0RGF0YWJhc2UobUNvbnRleHQpOworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBkYmguZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyLnF1ZXJ5RGF0YSBsYXN0YXBwID0gZGJoLnF1ZXJ5TGFzdEFwcChkYiwgeF9hcHBfaWQsIGNvbnRlbnRfdHlwZSk7CisgICAgICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBpbnNlcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBzcSA9IDA7CisKKyAgICAgICAgICAgIGlmICghYXBwVHlwZUNoZWNrKGFwcF90eXBlKSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJpbnZhbGlkIGFwcF90eXBlICIgKyBhcHBfdHlwZSArICIuIGFwcF90eXBlIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSArICIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXN0YXBwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnNlcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNxID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxhc3RhcHAucGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VfbmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWxhc3RhcHAuY2xhc3NOYW1lLmVxdWFscyhjbGFzc19uYW1lKSkgeworICAgICAgICAgICAgICAgIGluc2VydCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3EgPSBsYXN0YXBwLmluc3RhbGxPcmRlciArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbnNlcnQpIHsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJ4X3dhcF9hcHBsaWNhdGlvbiIsIHhfYXBwX2lkKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb250ZW50X3R5cGUiLCBjb250ZW50X3R5cGUpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoInBhY2thZ2VfbmFtZSIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiY2xhc3NfbmFtZSIsIGNsYXNzX25hbWUpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImFwcF90eXBlIiwgYXBwX3R5cGUpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoIm5lZWRfc2lnbmF0dXJlIiwgbmVlZF9zaWduYXR1cmUgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiZnVydGhlcl9wcm9jZXNzaW5nIiwgZnVydGhlcl9wcm9jZXNzaW5nID8gMSA6IDApOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImluc3RhbGxfb3JkZXIiLCBzcSk7CisgICAgICAgICAgICAgICAgZGIuaW5zZXJ0KEFQUElEX1RBQkxFX05BTUUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJhZGQ6IiArIHhfYXBwX2lkICsgIjoiICsgY29udGVudF90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIHBhY2thZ2VfbmFtZSArICIuIiArIGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbmV3c3E6IiArIHNxKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYi5jbG9zZSgpOworCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB1cGRhdGluZyB0aGUgcGFja2FnZSBzdWNjZWVkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVQYWNrYWdlKFN0cmluZyB4X2FwcF9pZCwgU3RyaW5nIGNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICBpbnQgYXBwX3R5cGUsIGJvb2xlYW4gbmVlZF9zaWduYXR1cmUsIGJvb2xlYW4gZnVydGhlcl9wcm9jZXNzaW5nKSB7CisKKyAgICAgICAgICAgIGlmICghYXBwVHlwZUNoZWNrKGFwcF90eXBlKSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJpbnZhbGlkIGFwcF90eXBlICIgKyBhcHBfdHlwZSArICIuIGFwcF90eXBlIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSArICIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlciBkYmggPSBnZXREYXRhYmFzZShtQ29udGV4dCk7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIucXVlcnlEYXRhIGxhc3RhcHAgPSBkYmgucXVlcnlMYXN0QXBwKGRiLCB4X2FwcF9pZCwgY29udGVudF90eXBlKTsKKworICAgICAgICAgICAgaWYgKGxhc3RhcHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICBTdHJpbmcgd2hlcmUgPSAieF93YXBfYXBwbGljYXRpb249XCciICsgeF9hcHBfaWQgKyAiXCciCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgY29udGVudF90eXBlPVwnIiArIGNvbnRlbnRfdHlwZSArICJcJyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBpbnN0YWxsX29yZGVyPSIgKyBsYXN0YXBwLmluc3RhbGxPcmRlcjsKKworICAgICAgICAgICAgdmFsdWVzLnB1dCgicGFja2FnZV9uYW1lIiwgcGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImNsYXNzX25hbWUiLCBjbGFzc19uYW1lKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImFwcF90eXBlIiwgYXBwX3R5cGUpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgibmVlZF9zaWduYXR1cmUiLCBuZWVkX3NpZ25hdHVyZSA/IDEgOiAwKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImZ1cnRoZXJfcHJvY2Vzc2luZyIsIGZ1cnRoZXJfcHJvY2Vzc2luZyA/IDEgOiAwKTsKKworICAgICAgICAgICAgaW50IG51bSA9IGRiLnVwZGF0ZShBUFBJRF9UQUJMRV9OQU1FLCB2YWx1ZXMsIHdoZXJlLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihMT0dfVEFHLCAidXBkYXRlOiIgKyB4X2FwcF9pZCArICI6IiArIGNvbnRlbnRfdHlwZSArICIgIgorICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VfbmFtZSArICIuIiArIGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBzcToiICsgbGFzdGFwcC5pbnN0YWxsT3JkZXIpOworCisgICAgICAgICAgICBkYi5jbG9zZSgpOworCisgICAgICAgICAgICByZXR1cm4gbnVtID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgZGVsZXRpbmcgdGhlIHBhY2thZ2Ugc3VjY2VlZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUGFja2FnZShTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSwgU3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgICAgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlciBkYmggPSBnZXREYXRhYmFzZShtQ29udGV4dCk7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBTdHJpbmcgd2hlcmUgPSAieF93YXBfYXBwbGljYXRpb249XCciICsgeF9hcHBfaWQgKyAiXCciCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgY29udGVudF90eXBlPVwnIiArIGNvbnRlbnRfdHlwZSArICJcJyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBwYWNrYWdlX25hbWU9XCciICsgcGFja2FnZV9uYW1lICsgIlwnIgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGNsYXNzX25hbWU9XCciICsgY2xhc3NfbmFtZSArICJcJyI7CisgICAgICAgICAgICBpbnQgbnVtX3JlbW92ZWQgPSBkYi5kZWxldGUoQVBQSURfVEFCTEVfTkFNRSwgd2hlcmUsIG51bGwpOworCisgICAgICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KExPR19UQUcsICJkZWxldGVkICIgKyBudW1fcmVtb3ZlZCArICIgcm93czoiCisgICAgICAgICAgICAgICAgICAgICsgeF9hcHBfaWQgKyAiOiIgKyBjb250ZW50X3R5cGUgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlX25hbWUgKyAiLiIgKyBjbGFzc19uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudW1fcmVtb3ZlZCA+IDA7CisgICAgICAgIH0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBMaW51eCBJUEMgQmluZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJV2FwUHVzaE1hbmFnZXJTdHViIG1CaW5kZXIgPSBuZXcgSVdhcFB1c2hNYW5hZ2VyU3R1YigpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBXYXBQdXNoTWFuYWdlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbUJpbmRlci5tQ29udGV4dCA9IHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtQmluZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGxpY2F0aW9uIElEIGRhdGFiYXNlIGluc3RhbmNlCisgICAgICovCisgICAgcHJpdmF0ZSBXYXBQdXNoTWFuREJIZWxwZXIgbURiSGVscGVyID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgV2FwUHVzaE1hbkRCSGVscGVyIGdldERhdGFiYXNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAobURiSGVscGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihMT0dfVEFHLCAiY3JlYXRlIG5ldyBkYiBpbnN0LiIpOworICAgICAgICAgICAgbURiSGVscGVyID0gbmV3IFdhcFB1c2hNYW5EQkhlbHBlcihjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURiSGVscGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgdGVzdGluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeURhdGEoU3RyaW5nIHhfYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSwgU3RyaW5nIGNsYXNzX25hbWUsCisgICAgICAgICAgICBpbnQgYXBwX3R5cGUsIGJvb2xlYW4gbmVlZF9zaWduYXR1cmUsIGJvb2xlYW4gZnVydGhlcl9wcm9jZXNzaW5nKSB7CisgICAgICAgIFdhcFB1c2hNYW5EQkhlbHBlciBkYmggPSBnZXREYXRhYmFzZSh0aGlzKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBkYmguZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICBXYXBQdXNoTWFuREJIZWxwZXIucXVlcnlEYXRhIGxhc3RhcHAgPSBkYmgucXVlcnlMYXN0QXBwKGRiLCB4X2FwcF9pZCwgY29udGVudF90eXBlKTsKKworICAgICAgICBkYi5jbG9zZSgpOworCisgICAgICAgIGlmIChsYXN0YXBwID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAobGFzdGFwcC5wYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZV9uYW1lKQorICAgICAgICAgICAgICAgICYmIGxhc3RhcHAuY2xhc3NOYW1lLmVxdWFscyhjbGFzc19uYW1lKQorICAgICAgICAgICAgICAgICYmIGxhc3RhcHAuYXBwVHlwZSA9PSBhcHBfdHlwZQorICAgICAgICAgICAgICAgICYmICBsYXN0YXBwLm5lZWRTaWduYXR1cmUgPT0gKG5lZWRfc2lnbmF0dXJlID8gMSA6IDApCisgICAgICAgICAgICAgICAgJiYgIGxhc3RhcHAuZnVydGhlclByb2Nlc3NpbmcgPT0gKGZ1cnRoZXJfcHJvY2Vzc2luZyA/IDEgOiAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB0ZXN0aW5nCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhRXhpc3QoU3RyaW5nIHhfYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSwgU3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgICAgICAgV2FwUHVzaE1hbkRCSGVscGVyIGRiaCA9IGdldERhdGFiYXNlKHRoaXMpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGRiaC5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gZGJoLnF1ZXJ5TGFzdEFwcChkYiwgeF9hcHBfaWQsIGNvbnRlbnRfdHlwZSkgIT0gbnVsbDsKKworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTk1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworIyBJbmNsdWRlIGFsbCB0ZXN0IGphdmEgZmlsZXMuCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgICAgICBzcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvSURhdGFWZXJpZnkuYWlkbAorCisKKyMgTm90aWNlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIHRoZSBzcmMgZmlsZXMgb2YgRW1haWwgYmVjYXVzZSwgYnkKKyMgcnVubmluZyB0aGUgdGVzdHMgdXNpbmcgYW4gaW5zdHJ1bWVudGF0aW9uIHRhcmdldGluZyBFYW1pbCwgd2UKKyMgYXV0b21hdGljYWxseSBnZXQgYWxsIG9mIGl0cyBjbGFzc2VzIGxvYWRlZCBpbnRvIG91ciBlbnZpcm9ubWVudC4KKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFdBUFB1c2hNYW5hZ2VyVGVzdHMKKworTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBXQVBQdXNoTWFuYWdlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3NjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+CisKKzwhLS0gcGFja2FnZSBuYW1lIG11c3QgYmUgdW5pcXVlIHNvIHN1ZmZpeCB3aXRoICJ0ZXN0cyIgc28gcGFja2FnZSBsb2FkZXIgZG9lc24ndCBpZ25vcmUgdXMgLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzIj4KKworCisgICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zbXNwdXNoLldBUFBVU0hfTUFOQUdFUl9CSU5EIiAvPgorICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfV0FQX1BVU0giIC8+CisgICAgIDwhLS10ZXN0aW5nLi4uLy0tPgorICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNvbiIgYW5kcm9pZDpsYWJlbD0id2FwcHVzaCB0ZXN0Ij4KKyAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkNsaWVudFRlc3QiCisgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0id2FwcHVzaCB0ZXN0Ij4KKyAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuRHJtUmVjZWl2ZXIiIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5XQVBfUFVTSF9SRUNFSVZFRCIgLz4KKyAgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDptaW1lVHlwZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3htbCIgLz4KKyAgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDp2YWx1ZT0iYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3dieG1sIiAvPgorICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpuYW1lPSIuUmVjZWl2ZXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIvPgorCisgICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUmVjZWl2ZXJBY3Rpdml0eSIKKyAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiBhbmRyb2lkOmxhYmVsPSJ0ZXN0IHJlY2VpdmVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkRhdGFWZXJpZnkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5JRGF0YVZlcmlmeSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgIDwvYXBwbGljYXRpb24+CisKKyAgICAgPCEtLQorICAgICBUaGlzIGRlY2xhcmVzIHRoYXQgdGhpcyBhcHBsaWNhdGlvbiB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gdGVzdCBydW5uZXIgdGFyZ2V0aW5nCisgICAgIHRoZSBwYWNrYWdlIG9mIGNvbS5hbmRyb2lkLnNtc3B1c2guICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKKyAgICAgImFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13CisgICAgICAgIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAtLT4KKyAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zbXNwdXNoIgorICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIFdBUFB1c2hNYW5hZ2VyIi8+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NGM0YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1sZHBpL2ljb24ucG5nIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5NTU4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1sZHBpL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24ucG5nIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9yZXMvbGF5b3V0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YmRiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMTUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPEFic29sdXRlTGF5b3V0CithbmRyb2lkOmlkPSJAK2lkL3dpZGdldDEzMyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCit4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCis+Cis8RWRpdFRleHQKK2FuZHJvaWQ6aWQ9IkAraWQvYXBwX2lkIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSIxMCIKK2FuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCithbmRyb2lkOmxheW91dF94PSIwcHgiCithbmRyb2lkOmxheW91dF95PSIyNnB4IgorPgorPC9FZGl0VGV4dD4KKzxFZGl0VGV4dAorYW5kcm9pZDppZD0iQCtpZC9jb250IgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSIyMCIKK2FuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCithbmRyb2lkOmxheW91dF94PSI0N3B4IgorYW5kcm9pZDpsYXlvdXRfeT0iMjZweCIKKz4KKzwvRWRpdFRleHQ+Cis8RWRpdFRleHQKK2FuZHJvaWQ6aWQ9IkAraWQvcGtnIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEyNXB4IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9InBrZyIKK2FuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCithbmRyb2lkOmxheW91dF94PSIwcHgiCithbmRyb2lkOmxheW91dF95PSI4MXB4IgorPgorPC9FZGl0VGV4dD4KKzxFZGl0VGV4dAorYW5kcm9pZDppZD0iQCtpZC9jbHMiCithbmRyb2lkOmxheW91dF93aWR0aD0iMTczcHgiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0iY2xzIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjE0N3B4IgorYW5kcm9pZDpsYXlvdXRfeT0iODFweCIKKz4KKzwvRWRpdFRleHQ+Cis8QnV0dG9uCithbmRyb2lkOmlkPSJAK2lkL2FkZHBrZyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxODJweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJhZGQvdXBkYXRlIHBhY2thZ2UiCithbmRyb2lkOmxheW91dF94PSIxNXB4IgorYW5kcm9pZDpsYXlvdXRfeT0iMjI1cHgiCis+Cis8L0J1dHRvbj4KKzxUZXh0VmlldworYW5kcm9pZDppZD0iQCtpZC93aWRnZXQ1MiIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0iaW5wdXQgYXBwX2lkLCBjb250X3R5cGUsIHBrZywgY2xzIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjBweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjBweCIKKz4KKzwvVGV4dFZpZXc+Cis8QnV0dG9uCithbmRyb2lkOmlkPSJAK2lkL3Byb2Ntc2ciCithbmRyb2lkOmxheW91dF93aWR0aD0iMTA5cHgiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0icHJvY2VzcyBtc2ciCithbmRyb2lkOmxheW91dF94PSIxOTdweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjM2MXB4IgorPgorPC9CdXR0b24+Cis8UmFkaW9Hcm91cAorYW5kcm9pZDppZD0iQCtpZC93aWRnZXQxMzciCithbmRyb2lkOmxheW91dF93aWR0aD0iODNweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0iODBweCIKK2FuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorYW5kcm9pZDpsYXlvdXRfeD0iMTlweCIKK2FuZHJvaWQ6bGF5b3V0X3k9IjEzN3B4IgorPgorPFJhZGlvQnV0dG9uCithbmRyb2lkOmlkPSJAK2lkL2FjdCIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxODJweCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJhY3QiCithbmRyb2lkOmNoZWNrZWQ9InRydWUiCis+Cis8L1JhZGlvQnV0dG9uPgorPFJhZGlvQnV0dG9uCithbmRyb2lkOmlkPSJAK2lkL3N2YyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0ic3ZjIgorPgorPC9SYWRpb0J1dHRvbj4KKzwvUmFkaW9Hcm91cD4KKzxCdXR0b24KK2FuZHJvaWQ6aWQ9IkAraWQvZGVscGtnIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE3NHB4IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOnRleHQ9ImRlbGV0ZSBwa2ciCithbmRyb2lkOmxheW91dF94PSIxNHB4IgorYW5kcm9pZDpsYXlvdXRfeT0iMjgzcHgiCis+Cis8L0J1dHRvbj4KKzxFZGl0VGV4dAorYW5kcm9pZDppZD0iQCtpZC9wZHUiCithbmRyb2lkOmxheW91dF93aWR0aD0iMTg2cHgiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IjgzcHgiCithbmRyb2lkOnRleHQ9IjAwMDYwODAzMDIwMzBhYWYwMjkwNWMwMzBkNmEwMDg1MDcwMzczNjE2ZDcwNmM2NTQwNjQ2ZjYzNmY2ZDZmMmU2ZTY1MmU2YTcwMDAwNWMzMDcyMDA5MTAyMDEyMzQ1NjAxIgorYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKK2FuZHJvaWQ6bGF5b3V0X3g9IjEwcHgiCithbmRyb2lkOmxheW91dF95PSIzNDFweCIKKz4KKzwvRWRpdFRleHQ+Cis8Q2hlY2tCb3gKK2FuZHJvaWQ6aWQ9IkAraWQvZnRyIgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorYW5kcm9pZDp0ZXh0PSJmdHJfcHJvYyIKK2FuZHJvaWQ6bGF5b3V0X3g9IjE0M3B4IgorYW5kcm9pZDpsYXlvdXRfeT0iMTgxcHgiCis+Cis8L0NoZWNrQm94PgorPENoZWNrQm94CithbmRyb2lkOmlkPSJAK2lkL3NpZyIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCithbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKK2FuZHJvaWQ6dGV4dD0ibmRfc2lnIgorYW5kcm9pZDpjaGVja2VkPSJ0cnVlIgorYW5kcm9pZDpsYXlvdXRfeD0iMTQycHgiCithbmRyb2lkOmxheW91dF95PSIxNDBweCIKKz4KKzwvQ2hlY2tCb3g+Cis8L0Fic29sdXRlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0NsaWVudFRlc3QuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9DbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmZDE3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9DbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvQnV0dG9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklXYXBQdXNoTWFuYWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuV2FwUHVzaE1hbmFnZXJQYXJhbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LldhcFB1c2hPdmVyU21zOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zbXNwdXNoLldhcFB1c2hNYW5hZ2VyOworCisvKioKKyAqIFdhcFB1c2hNYW5hZ2VyIHRlc3QgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIENsaWVudFRlc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiV0FQIFBVU0giOworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CisKKyAgICAgICAgQnV0dG9uIGFkZHBidG4gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5hZGRwa2cpOworICAgICAgICBCdXR0b24gcHJvY2J0biA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnByb2Ntc2cpOworICAgICAgICBCdXR0b24gZGVsYnRuID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZGVscGtnKTsKKworICAgICAgICBMb2cudihMT0dfVEFHLCAiYWN0aXZpdHkgY3JlYXRlZCEhIik7CisKKyAgICAgICAgYWRkcGJ0bi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IGFwcF9pZCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuYXBwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgY29udCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udCk7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IHBrZyA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGtnKTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgY2xzID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5jbHMpOworICAgICAgICAgICAgICAgICAgICBSYWRpb0J1dHRvbiBhY3QgPSAoUmFkaW9CdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmFjdCk7CisgICAgICAgICAgICAgICAgICAgIENoZWNrQm94IHNpZyA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuc2lnKTsKKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tCb3ggZnRyID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5mdHIpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1XYXBQdXNoTWFuLmFkZFBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdC5pc0NoZWNrZWQoKSA/IFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnLmlzQ2hlY2tlZCgpLCBmdHIuaXNDaGVja2VkKCkpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAicmVtb3RlIGFkZCBwa2cgZmFpbGVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhcFB1c2hNYW4udXBkYXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZC5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnQuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2cuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3QuaXNDaGVja2VkKCkgPyBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnLmlzQ2hlY2tlZCgpLCBmdHIuaXNDaGVja2VkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZW1vdGUgZnVuYyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIGRlbGJ0bi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IGFwcF9pZCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuYXBwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgY29udCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udCk7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IHBrZyA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGtnKTsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgY2xzID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5jbHMpOworICAgICAgICAgICAgICAgICAgICAvLyBDaGVja0JveCBkZWxhbGwgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmRlbGFsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZy5kKExPR19UQUcsICJidXR0b24gY2xpY2tlZCIpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2FwUHVzaE1hbi5kZWxldGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBfaWQuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnQuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGFsbC5pc0NoZWNrZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAicmVtb3RlIGZ1bmMgZmFpbGVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICBwcm9jYnRuLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgcGR1ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wZHUpOworICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCBhcHBfaWQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmFwcF9pZCk7CisgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IGNvbnQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdhcFB1c2hPdmVyU21zIHdhcCA9IG5ldyBXYXBQdXNoT3ZlclNtcygpOworICAgICAgICAgICAgICAgICAgICAvLyB3YXAuZGlzcGF0Y2hXYXBQZHUoc3RyVG9IZXgocGR1LmdldFRleHQoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0cmFuc2FjdGlvbklkIiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdVR5cGUiLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4RHVtcC5oZXhTdHJpbmdUb0J5dGVBcnJheShwZHUuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleER1bXAuaGV4U3RyaW5nVG9CeXRlQXJyYXkocGR1LmdldFRleHQoKS50b1N0cmluZygpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XYXBQdXNoTWFuLnByb2Nlc3NNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBfaWQuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnQuZ2V0VGV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0hleER1bXAuaGV4U3RyaW5nVG9CeXRlQXJyYXkocGR1LmdldFRleHQoKS50b1N0cmluZygpKSwgMCwgNiwgNSwgNSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAicmVtb3RlIGZ1bmMgZmFpbGVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIElXYXBQdXNoTWFuYWdlciBtV2FwUHVzaE1hbjsKKyAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIGNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1XYXBQdXNoTWFuID0gbnVsbDsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsICJzZXJ2aWNlIGRpc2Nvbm5lY3RlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbVdhcFB1c2hNYW4gPSBJV2FwUHVzaE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsICJzZXJ2aWNlIGNvbm5lY3RlZC4iKTsKKyAgICAgICAgfQorICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBMb2cudihMT0dfVEFHLCAib25TdGFydCBiaW5kIFdBUFB1c2hNYW5hZ2VyIHNlcnZpY2UgIgorICAgICAgICAgICAgICAgICsgSVdhcFB1c2hNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHRoaXMuYmluZFNlcnZpY2UobmV3IEludGVudChJV2FwUHVzaE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSwgY29ubiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICBMb2cudihMT0dfVEFHLCAiYmluZCBzZXJ2aWNlIGRvbmUuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgdGhpcy51bmJpbmRTZXJ2aWNlKGNvbm4pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL0RhdGFWZXJpZnkuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9EYXRhVmVyaWZ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0OTFmZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9EYXRhVmVyaWZ5LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOworCisvKioKKyAqIFRvIHZlcmlmeSB0aGF0IHJlY2VpdmVyIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGNvcnJlY3QgYm9keSBkYXRhLgorICovCitwdWJsaWMgY2xhc3MgRGF0YVZlcmlmeSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldBUCBQVVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9XQUlUID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX0NPVU5UID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBtTGFzdFJlY2VpdmVkUGR1ID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNEYXRhU2V0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGNsYXNzIElEYXRhVmVyaWZ5U3R1YiBleHRlbmRzIElEYXRhVmVyaWZ5LlN0dWIgeworICAgICAgICBwdWJsaWMgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBwdWJsaWMgSURhdGFWZXJpZnlTdHViKCkgeworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBhcnJheUNvbXBhcmUoYnl0ZVtdIGFycjEsIGJ5dGVbXSBhcnIyKSB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgaWYgKGFycjEgPT0gbnVsbCB8fCBhcnIyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyMSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJhcnIxIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiYXJyMiBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFycjEubGVuZ3RoICE9IGFycjIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhcnIxW2ldICE9IGFycjJbaV0pIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgcGR1IGFuZCByZWNlaXZlZCBwZHUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB2ZXJpZnlEYXRhKGJ5dGVbXSBwZHUpIHsKKyAgICAgICAgICAgIGludCBjbnQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoIXNEYXRhU2V0KSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGFjdGl2aXR5IHJlY2VpdmUgZGF0YS4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoVElNRV9XQUlUKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNudCsrID4gV0FJVF9DT1VOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd2FpdCBtb3JlIHRoYW4gMTAgc2VjLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgInZlcmlmeSBwZHUiKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0ID0gYXJyYXlDb21wYXJlKHBkdSwgbUxhc3RSZWNlaXZlZFBkdSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFyIHRoZSBvbGQgZGF0YS4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXNldERhdGEoKSB7CisgICAgICAgICAgICBtTGFzdFJlY2VpdmVkUGR1ID0gbnVsbDsKKyAgICAgICAgICAgIHNEYXRhU2V0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIElEYXRhVmVyaWZ5U3R1YiBiaW5kZXIgPSBuZXcgSURhdGFWZXJpZnlTdHViKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBEYXRhVmVyaWZ5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmVyIGFwcGxpY2F0aW9uIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGl0IHJlY2VpdmVzIHRoZSB3YXAgcHVzaCBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIFNldExhc3RSZWNlaXZlZFBkdShieXRlW10gcGR1KSB7CisgICAgICAgIG1MYXN0UmVjZWl2ZWRQZHUgPSBwZHU7CisgICAgICAgIHNEYXRhU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvRHJtUmVjZWl2ZXIuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9Ecm1SZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWYxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvRHJtUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKKy8qKgorICogQSBzYW1wbGUgd2FwIHB1c2ggcmVjZWl2ZXIgYXBwbGljYXRpb24gZm9yIGV4aXN0aW5nIGZyYW1ld29yaworICogVGhpcyBjbGFzcyBpcyBsaXN0ZW5pbmcgZm9yICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIiBtZXNzYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBEcm1SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJEcm1SZWNlaXZlciByZWNlaXZlZC4iKTsKKworICAgICAgICBieXRlW10gYm9keTsKKyAgICAgICAgYnl0ZVtdIGhlYWRlcjsKKworICAgICAgICBib2R5ID0gaW50ZW50LmdldEJ5dGVBcnJheUV4dHJhKCJkYXRhIik7CisgICAgICAgIGhlYWRlciA9IGludGVudC5nZXRCeXRlQXJyYXlFeHRyYSgiaGVhZGVyIik7CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImhlYWRlcjoiKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGhlYWRlcikpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiYm9keToiKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGJvZHkpKTsKKworICAgICAgICBEYXRhVmVyaWZ5LlNldExhc3RSZWNlaXZlZFBkdShib2R5KTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9JRGF0YVZlcmlmeS5haWRsCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtFeGNlcHRpb24uamF2YQpjb3B5IHRvIHBhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9JRGF0YVZlcmlmeS5haWRsCmluZGV4IDg2ZGUzNjYuLmYwNjcwZmEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCisrKyBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9JRGF0YVZlcmlmeS5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247Ci0KK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CiAKIC8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBleGNlcHRpb25zIGluIFNUSyBzZXJ2aWNlLgotICoKLSAqIHtAaGlkZX0KKyAqIEludGVyZmFjZSB0byByZWNlaXZlciBhcHBsaWNhdGlvbiBkYXRhIHZlcmlmeWVyIGNsYXNzCiAgKi8KLWNsYXNzIFN0a0V4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBTdGtFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQoraW50ZXJmYWNlIElEYXRhVmVyaWZ5IHsKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgZGF0YQorICAgICAqLworICAgIGJvb2xlYW4gdmVyaWZ5RGF0YShpbiBieXRlW10gcGR1KTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgZGF0YQorICAgICAqLworICAgIHZvaWQgcmVzZXREYXRhKCk7CiB9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9SZWNlaXZlckFjdGl2aXR5LmphdmEgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvUmVjZWl2ZXJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjU1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvUmVjZWl2ZXJBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOworCisvKioKKyAqIEFjdGl2aXR5IHR5cGUgcmVjZWl2ZXIgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIFJlY2VpdmVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiV0FQIFBVU0giOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiYWN0aXZpdHkgY3JlYXRlZCEhIik7CisKKyAgICAgICAgSW50ZW50IGluID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGJ5dGVbXSBib2R5OworICAgICAgICBieXRlW10gaGVhZGVyOworCisgICAgICAgIGJvZHkgPSBpbi5nZXRCeXRlQXJyYXlFeHRyYSgiZGF0YSIpOworICAgICAgICBoZWFkZXIgPSBpbi5nZXRCeXRlQXJyYXlFeHRyYSgiaGVhZGVyIik7CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImhlYWRlcjoiKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGhlYWRlcikpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiYm9keToiKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgSGV4RHVtcC5kdW1wSGV4U3RyaW5nKGJvZHkpKTsKKworICAgICAgICBEYXRhVmVyaWZ5LlNldExhc3RSZWNlaXZlZFBkdShib2R5KTsKKworICAgICAgICBmaW5pc2goKTsKKworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL1JlY2VpdmVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvV0FQUHVzaE1hbmFnZXIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntc3B1c2gvdW5pdFRlc3RzL1JlY2VpdmVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjRiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvUmVjZWl2ZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKKy8qKgorICogU2VydmljZSB0eXBlIHJlY2VpdmVyIGFwcGxpY2F0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBSZWNlaXZlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlY2VpdmVyIHNlcnZpY2UgY3JlYXRlZCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgb25TdGFydENvbW1hbmQoSW50ZW50IGludGVudCwgaW50IGZsYWdzLCBpbnQgc3RhcnRJZCkgeworICAgICAgICBMb2cuZChMT0dfVEFHLCAiUmVjZWl2ZXIgc2VydmljZSBzdGFydGVkIik7CisKKyAgICAgICAgYnl0ZVtdIGJvZHk7CisgICAgICAgIGJ5dGVbXSBoZWFkZXI7CisgICAgICAgIGJvZHkgPSBpbnRlbnQuZ2V0Qnl0ZUFycmF5RXh0cmEoImRhdGEiKTsKKyAgICAgICAgaGVhZGVyID0gaW50ZW50LmdldEJ5dGVBcnJheUV4dHJhKCJoZWFkZXIiKTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAiaGVhZGVyOiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoaGVhZGVyKSk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJib2R5OiIpOworICAgICAgICBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcoYm9keSkpOworCisgICAgICAgIERhdGFWZXJpZnkuU2V0TGFzdFJlY2VpdmVkUGR1KGJvZHkpOworICAgICAgICByZXR1cm4gU1RBUlRfU1RJQ0tZOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvV2FwUHVzaFRlc3QuamF2YSBiL3BhY2thZ2VzL1dBUFB1c2hNYW5hZ2VyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbXNwdXNoL3VuaXRUZXN0cy9XYXBQdXNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGEzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9XQVBQdXNoTWFuYWdlci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21zcHVzaC91bml0VGVzdHMvV2FwUHVzaFRlc3QuamF2YQpAQCAtMCwwICsxLDI1MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNtcy5JbnRlbnRzOworaW1wb3J0IGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JV2FwUHVzaE1hbmFnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LldhcFB1c2hNYW5hZ2VyUGFyYW1zOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Xc3BUeXBlRGVjb2RlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CitpbXBvcnQgY29tLmFuZHJvaWQuc21zcHVzaC5XYXBQdXNoTWFuYWdlcjsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSBmcmFtZXdvcmsgZm9yIGEgdGVzdCBvZiBhIFNlcnZpY2UuICBTZWUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UKKyAqIFNlcnZpY2VUZXN0Q2FzZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHdyaXRlIGFuZCBleHRlbmQgc2VydmljZSB0ZXN0cy4KKyAqCisgKiBUbyBydW4gdGhpcyB0ZXN0LCB5b3UgY2FuIHR5cGU6CisgKiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBcCisgKiAtZSBjbGFzcyBjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5XYXBQdXNoVGVzdCBcCisgKiBjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgorICovCitwdWJsaWMgY2xhc3MgV2FwUHVzaFRlc3QgZXh0ZW5kcyBTZXJ2aWNlVGVzdENhc2U8V2FwUHVzaE1hbmFnZXI+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJXQVAgUFVTSCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfV0FJVCA9IDEwMDsKKworICAgIHByb3RlY3RlZCBpbnQgbUFwcElkVmFsdWUgPSAweDgwMDI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtQXBwSWROYW1lID0gIngtd2FwLWFwcGxpY2F0aW9uOioiOworICAgIHByb3RlY3RlZCBpbnQgbUNvbnRlbnRUeXBlVmFsdWUgPSAweDAzMGE7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtQ29udGVudFR5cGVOYW1lID0gImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIjsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgbVBhY2thZ2VOYW1lOworICAgIHByb3RlY3RlZCBTdHJpbmcgbUNsYXNzTmFtZTsKKworICAgIHByb3RlY3RlZCBieXRlW10gbUdzbUhlYWRlciA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBzYyBhZGRyZXNzCisgICAgICAgICAgICAoYnl0ZSkgMHg0MCwgLy8gVFAtTVRJCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwgLy8gc2VuZGVyIGFkZHJlc3MgbGVuZ3RoPworICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg0NSwgLy8gc2VuZGVyIGFkZHJlc3M/CisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gZGF0YSBzY2hlbWEKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBwcm90byBJRAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDYwLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4MzEsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDYzIC8vIHRpbWUgc3RhbXAKKyAgICB9OworCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBtVXNlckRhdGFIZWFkZXIgPSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgwNywgLy8gVURIIGxlbgorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIC8vIGhlYWRlciBsZW4KKyAgICAgICAgICAgIChieXRlKSAweDA1LCAvLyBwb3J0IGFkZHJlc3NpbmcgdHlwZT8KKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBkdW1teQorICAgICAgICAgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDg0LCAvLyBkZXN0IHBvcnQKKyAgICAgICAgICAgIChieXRlKSAweDIzLCAoYnl0ZSkgMHhGMCAvLyBzcmMgcG9ydAorICAgIH07CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIG1Xc3BIZWFkZXI7CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIG1NZXNzYWdlQm9keSA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwKKyAgICAgICAgICAgIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDA2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDcsCisgICAgICAgICAgICAoYnl0ZSkgMHgwOCwKKyAgICAgICAgICAgIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MGEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYiwKKyAgICAgICAgICAgIChieXRlKSAweDBjLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZSwKKyAgICAgICAgICAgIChieXRlKSAweDBmCisgICAgfTsKKworICAgIHByb3RlY3RlZCBpbnQgbVdzcEhlYWRlclN0YXJ0OworICAgIHByb3RlY3RlZCBpbnQgbVdzcEhlYWRlckxlbjsKKyAgICBwcm90ZWN0ZWQgaW50IG1Xc3BDb250ZW50VHlwZVN0YXJ0OworCisgICAgLyoqCisgICAgICogT01BIGFwcGxpY2F0aW9uIElEIGluIGJpbmFyeSBmb3JtCisgICAgICogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvb21uYS9vbW5hLXB1c2gtYXBwLWlkLmFzcHgKKyAgICAgKi8KKyAgICBmaW5hbCBpbnRbXSBPTUFfQVBQTElDQVRJT05fSURfVkFMVUVTID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDMsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHgwNSwKKyAgICAgICAgICAgIDB4MDYsCisgICAgICAgICAgICAweDA3LAorICAgICAgICAgICAgMHgwOCwKKyAgICAgICAgICAgIDB4MDksCisgICAgICAgICAgICAweDBBLAorICAgICAgICAgICAgMHg4MDAwLAorICAgICAgICAgICAgMHg4MDAxLAorICAgICAgICAgICAgMHg4MDAyLAorICAgICAgICAgICAgMHg4MDAzLAorICAgICAgICAgICAgMHg4MDA0LAorICAgICAgICAgICAgMHg4MDA1LAorICAgICAgICAgICAgMHg4MDA2LAorICAgICAgICAgICAgMHg4MDA3LAorICAgICAgICAgICAgMHg4MDA4LAorICAgICAgICAgICAgMHg4MDA5LAorICAgICAgICAgICAgMHg4MDBCLAorICAgICAgICAgICAgMHg4MDEwCisgICAgfTsKKworICAgIC8qKgorICAgICAqIE9NQSBhcHBsaWNhdGlvbiBJRCBpbiBzdHJpbmcgZm9ybQorICAgICAqIGh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL29tbmEvb21uYS1wdXNoLWFwcC1pZC5hc3B4CisgICAgICovCisgICAgZmluYWwgU3RyaW5nW10gT01BX0FQUExJQ0FUSU9OX0lEX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjoqIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjpwdXNoLnNpYSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246d21sLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjp3dGEudWEiLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOm1tcy51YSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246cHVzaC5zeW5jbWwiLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOmxvYy51YSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246c3luY21sLmRtIiwKKyAgICAgICAgICAgICJ4LXdhcC1hcHBsaWNhdGlvbjpkcm0udWEiLAorICAgICAgICAgICAgIngtd2FwLWFwcGxpY2F0aW9uOmVtbi51YSIsCisgICAgICAgICAgICAieC13YXAtYXBwbGljYXRpb246d3YudWEiLAorICAgICAgICAgICAgIngtd2FwLW1pY3Jvc29mdDpsb2NhbGNvbnRlbnQudWEiLAorICAgICAgICAgICAgIngtd2FwLW1pY3Jvc29mdDpJTWNsaWVudC51YSIsCisgICAgICAgICAgICAieC13YXAtZG9jb21vOmltb2RlLm1haWwudWEiLAorICAgICAgICAgICAgIngtd2FwLWRvY29tbzppbW9kZS5tci51YSIsCisgICAgICAgICAgICAieC13YXAtZG9jb21vOmltb2RlLm1mLnVhIiwKKyAgICAgICAgICAgICJ4LW1vdG9yb2xhOmxvY2F0aW9uLnVhIiwKKyAgICAgICAgICAgICJ4LW1vdG9yb2xhOm5vdy51YSIsCisgICAgICAgICAgICAieC1tb3Rvcm9sYTpvdGFwcm92LnVhIiwKKyAgICAgICAgICAgICJ4LW1vdG9yb2xhOmJyb3dzZXIudWEiLAorICAgICAgICAgICAgIngtbW90b3JvbGE6c3BsYXNoLnVhIiwKKyAgICAgICAgICAgICJ4LXdhcC1uYWk6bXZzdy5jb21tYW5kIiwKKyAgICAgICAgICAgICJ4LXdhcC1vcGVud2F2ZTppb3RhLnVhIgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBPTUEgY29udGVudCB0eXBlIGluIGJpbmFyeSBmb3JtCisgICAgICogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvb21uYS9vbW5hLXdzcC1jb250ZW50LXR5cGUuYXNweAorICAgICAqLworICAgIGZpbmFsIGludFtdIE9NQV9DT05URU5UX1RZUEVfVkFMVUVTID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDMsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHgwNSwKKyAgICAgICAgICAgIDB4MDYsCisgICAgICAgICAgICAweDA3LAorICAgICAgICAgICAgMHgwOCwKKyAgICAgICAgICAgIDB4MDksCisgICAgICAgICAgICAweDBBLAorICAgICAgICAgICAgMHgwQiwKKyAgICAgICAgICAgIDB4MEMsCisgICAgICAgICAgICAweDBELAorICAgICAgICAgICAgMHgwRSwKKyAgICAgICAgICAgIDB4MEYsCisgICAgICAgICAgICAweDEwLAorICAgICAgICAgICAgMHgxMSwKKyAgICAgICAgICAgIDB4MTIsCisgICAgICAgICAgICAweDEzLAorICAgICAgICAgICAgMHgxNCwKKyAgICAgICAgICAgIDB4MTUsCisgICAgICAgICAgICAweDE2LAorICAgICAgICAgICAgMHgxNywKKyAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAweDE5LAorICAgICAgICAgICAgMHgxQSwKKyAgICAgICAgICAgIDB4MUIsCisgICAgICAgICAgICAweDFDLAorICAgICAgICAgICAgMHgxRCwKKyAgICAgICAgICAgIDB4MUUsCisgICAgICAgICAgICAweDFGLAorICAgICAgICAgICAgMHgyMCwKKyAgICAgICAgICAgIDB4MjEsCisgICAgICAgICAgICAweDIyLAorICAgICAgICAgICAgMHgyMywKKyAgICAgICAgICAgIDB4MjQsCisgICAgICAgICAgICAweDI1LAorICAgICAgICAgICAgMHgyNiwKKyAgICAgICAgICAgIDB4MjcsCisgICAgICAgICAgICAweDI4LAorICAgICAgICAgICAgMHgyOSwKKyAgICAgICAgICAgIDB4MkEsCisgICAgICAgICAgICAweDJCLAorICAgICAgICAgICAgMHgyQywKKyAgICAgICAgICAgIDB4MkQsCisgICAgICAgICAgICAweDJFLAorICAgICAgICAgICAgMHgyRiwKKyAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAweDMxLAorICAgICAgICAgICAgMHgzMiwKKyAgICAgICAgICAgIDB4MzMsCisgICAgICAgICAgICAweDM0LAorICAgICAgICAgICAgMHgzNSwKKyAgICAgICAgICAgIDB4MzYsCisgICAgICAgICAgICAweDM3LAorICAgICAgICAgICAgMHgzOCwKKyAgICAgICAgICAgIDB4MzksCisgICAgICAgICAgICAweDNBLAorICAgICAgICAgICAgMHgzQiwKKyAgICAgICAgICAgIDB4M0MsCisgICAgICAgICAgICAweDNELAorICAgICAgICAgICAgMHgzRSwKKyAgICAgICAgICAgIDB4M0YsCisgICAgICAgICAgICAweDQwLAorICAgICAgICAgICAgMHg0MSwKKyAgICAgICAgICAgIDB4NDIsCisgICAgICAgICAgICAweDQzLAorICAgICAgICAgICAgMHg0NCwKKyAgICAgICAgICAgIDB4NDUsCisgICAgICAgICAgICAweDQ2LAorICAgICAgICAgICAgMHg0NywKKyAgICAgICAgICAgIDB4NDgsCisgICAgICAgICAgICAweDQ5LAorICAgICAgICAgICAgMHg0QSwKKyAgICAgICAgICAgIDB4NEIsCisgICAgICAgICAgICAweDRDLAorICAgICAgICAgICAgMHg0RCwKKyAgICAgICAgICAgIDB4NEUsCisgICAgICAgICAgICAweDRGLAorICAgICAgICAgICAgMHg1MCwKKyAgICAgICAgICAgIDB4NTEsCisgICAgICAgICAgICAweDUyLAorICAgICAgICAgICAgMHg1MywKKyAgICAgICAgICAgIDB4NTQsCisvLyAgICAgICAgICAgIDB4NTUsCisvLyAgICAgICAgICAgIDB4NTYsCisvLyAgICAgICAgICAgIDB4NTcsCisvLyAgICAgICAgICAgIDB4NTgsCisgICAgICAgICAgICAweDAyMDEsCisgICAgICAgICAgICAweDAyMDIsCisgICAgICAgICAgICAweDAyMDMsCisgICAgICAgICAgICAweDAyMDQsCisgICAgICAgICAgICAweDAyMDUsCisgICAgICAgICAgICAweDAyMDYsCisgICAgICAgICAgICAweDAyMDcsCisgICAgICAgICAgICAweDAyMDgsCisgICAgICAgICAgICAweDAyMDksCisgICAgICAgICAgICAweDAyMEEsCisgICAgICAgICAgICAweDAyMEIsCisgICAgICAgICAgICAweDAyMEMsCisgICAgICAgICAgICAweDAzMDAsCisgICAgICAgICAgICAweDAzMDEsCisgICAgICAgICAgICAweDAzMDIsCisgICAgICAgICAgICAweDAzMDMsCisgICAgICAgICAgICAweDAzMDQsCisgICAgICAgICAgICAweDAzMDUsCisgICAgICAgICAgICAweDAzMDYsCisgICAgICAgICAgICAweDAzMDcsCisgICAgICAgICAgICAweDAzMDgsCisgICAgICAgICAgICAweDAzMDksCisgICAgICAgICAgICAweDAzMEEsCisgICAgICAgICAgICAweDAzMEIsCisgICAgICAgICAgICAweDAzMEMsCisgICAgICAgICAgICAweDAzMEQsCisgICAgICAgICAgICAweDAzMEUsCisgICAgICAgICAgICAweDAzMEYsCisgICAgICAgICAgICAweDAzMTAsCisgICAgICAgICAgICAweDAzMTEsCisgICAgICAgICAgICAweDAzMTIsCisgICAgICAgICAgICAweDAzMTMsCisgICAgICAgICAgICAweDAzMTQsCisgICAgICAgICAgICAweDAzMTUsCisgICAgICAgICAgICAweDAzMTYsCisgICAgICAgICAgICAweDAzMTcsCisgICAgICAgICAgICAweDAzMTgsCisgICAgICAgICAgICAweDAzMTksCisgICAgICAgICAgICAweDAzMUEsCisgICAgICAgICAgICAweDAzMUIKKyAgICAgICAgICAgIC8qMHgwMzFDLAorICAgICAgICAgICAgICAweDAzMUQqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBPTUEgY29udGVudCB0eXBlIGluIHN0cmluZyBmb3JtCisgICAgICogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvb21uYS9vbW5hLXdzcC1jb250ZW50LXR5cGUuYXNweAorICAgICAqLworICAgIGZpbmFsIFN0cmluZ1tdIE9NQV9DT05URU5UX1RZUEVfTkFNRVMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIiovKiIsCisgICAgICAgICAgICAidGV4dC8qIiwKKyAgICAgICAgICAgICJ0ZXh0L2h0bWwiLAorICAgICAgICAgICAgInRleHQvcGxhaW4iLAorICAgICAgICAgICAgInRleHQveC1oZG1sIiwKKyAgICAgICAgICAgICJ0ZXh0L3gtdHRtbCIsCisgICAgICAgICAgICAidGV4dC94LXZDYWxlbmRhciIsCisgICAgICAgICAgICAidGV4dC94LXZDYXJkIiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAud21sIiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0IiwKKyAgICAgICAgICAgICJ0ZXh0L3ZuZC53YXAud3RhLWV2ZW50IiwKKyAgICAgICAgICAgICJtdWx0aXBhcnQvKiIsCisgICAgICAgICAgICAibXVsdGlwYXJ0L21peGVkIiwKKyAgICAgICAgICAgICJtdWx0aXBhcnQvZm9ybS1kYXRhIiwKKyAgICAgICAgICAgICJtdWx0aXBhcnQvYnl0ZXJhbnRlcyIsCisgICAgICAgICAgICAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi8qIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qYXZhLXZtIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtaGRtbGMiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAud21sYyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLnd0YS1ldmVudGMiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAudWFwcm9mIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLnd0bHMtY2EtY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAud3Rscy11c2VyLWNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsCisgICAgICAgICAgICAiaW1hZ2UvKiIsCisgICAgICAgICAgICAiaW1hZ2UvZ2lmIiwKKyAgICAgICAgICAgICJpbWFnZS9qcGVnIiwKKyAgICAgICAgICAgICJpbWFnZS90aWZmIiwKKyAgICAgICAgICAgICJpbWFnZS9wbmciLAorICAgICAgICAgICAgImltYWdlL3ZuZC53YXAud2JtcCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuKiIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQubWl4ZWQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmZvcm0tZGF0YSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuYnl0ZXJhbmdlcyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQuYWx0ZXJuYXRpdmUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAidGV4dC94bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gteDk2OC1jcm9zcy1jZXJ0IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXg5NjgtY2EtY2VydCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veC14OTY4LXVzZXItY2VydCIsCisgICAgICAgICAgICAidGV4dC92bmQud2FwLnNpIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYyIsCisgICAgICAgICAgICAidGV4dC92bmQud2FwLnNsIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLnNsYyIsCisgICAgICAgICAgICAidGV4dC92bmQud2FwLmNvIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLmNvYyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQucmVsYXRlZCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5zaWEiLAorICAgICAgICAgICAgInRleHQvdm5kLndhcC5jb25uZWN0aXZpdHkteG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLmNvbm5lY3Rpdml0eS13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vcGtjczctbWltZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5oYXNoZWQtY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2lnbmVkLWNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud2FwLmNlcnQtcmVzcG9uc2UiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vd21sK3htbCIsCisgICAgICAgICAgICAidGV4dC9jc3MiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAubW1zLW1lc3NhZ2UiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAucm9sbG92ZXItY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAubG9jYyt3YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndhcC5sb2MreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5ub3RpZmljYXRpb24iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAueGh0bWwreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQud3YuY3NwLmNpciIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kZCt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLm1lc3NhZ2UiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLmNvbnRlbnQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt3YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnd2LmNzcCt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53di5jc3Ard2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIiwKKyAgICAgICAgICAgICJhdWRpby8qIiwKKyAgICAgICAgICAgICJ2aWRlby8qIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL21pa2V5IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRjZCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIiwKKy8vICAgICAgICAgICAgInRleHQveC12TWVzc2FnZSIsCisvLyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwrd2J4bWwiLAorLy8gICAgICAgICAgICAidGV4dC94LXZCb29rbWFyayIsCisvLyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtLm5vdGlmaWNhdGlvbiIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2FjaGVvcC13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuc2lnbmFsIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdC13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZC13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQucHJvdmlzaW9uaW5nLXN0YXR1cy11cmkiLAorICAgICAgICAgICAgIngtd2FwLm11bHRpcGFydC92bmQudXBsYW5ldC5oZWFkZXItc2V0IiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQucGhvbmVjb20ubW1jLXdieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubm9raWEuc3luY3NldCt3YnhtbCIsCisgICAgICAgICAgICAiaW1hZ2UveC11cC13cG5nIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9pb3RhLm1tYy13YnhtbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vaW90YS5tbWMteG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3luY21sK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN5bmNtbCt3YnhtbCIsCisgICAgICAgICAgICAidGV4dC92bmQud2FwLmVtbit4bWwiLAorICAgICAgICAgICAgInRleHQvY2FsZW5kYXIiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1maWxlK3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZvbGRlcit4bWwiLAorICAgICAgICAgICAgInRleHQvZGlyZWN0b3J5O3Byb2ZpbGU9dkNhcmQiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC53YXAuZW1uK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubm9raWEuaXBkYy1wdXJjaGFzZS1yZXNwb25zZSIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLnNjcmVlbjMreG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuc2NyZWVuMytnemlwIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuY21jYy5zZXR0aW5nK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuY21jYy5ib21iaW5nK3dieG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnViIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hbG9jLXN1cGwtaW5pdCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5ncm91cC11c2FnZS1saXN0K3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vb21hLWRpcmVjdG9yeSt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5kb2NvbW8ucGYyIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yb2FwLXRyaWdnZXIrd2J4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMiIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLndtZi5ib290c3RyYXAiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuYy5jbWNjLmRjZCt4bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zYm0uY2lkIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnByb3Zpc2lvbmluZ3RyaWdnZXIiLAorICAgICAgICAgICAgLyoiYXBwbGljYXRpb24vdm5kLmRvY29tby5kbSIsCisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLnNjaWRtLm1lc3NhZ2VzK3htbCIqLworICAgIH07CisKKyAgICBwcml2YXRlIElEYXRhVmVyaWZ5IG1JVmVyaWZ5ID0gbnVsbDsKKworICAgIFNlcnZpY2VDb25uZWN0aW9uIG1Db25uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgImRhdGEgdmVyaWZ5IGludGVyZmFjZSBjb25uZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgbUlWZXJpZnkgPSBJRGF0YVZlcmlmeS5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgLyoqCisgICAgICogTWFpbiBXYXBQdXNoTWFuYWdlciB0ZXN0IG1vZHVsZSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBXYXBQdXNoVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoV2FwUHVzaE1hbmFnZXIuY2xhc3MpOworICAgICAgICBtQ2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdmVyaWZpZXIKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgICAgICAvLyBnZXQgdmVyaWZpZXIKKyAgICAgICAgICAgIGdldENvbnRleHQoKS5iaW5kU2VydmljZShuZXcgSW50ZW50KElEYXRhVmVyaWZ5LmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgIG1Db25uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInN1cGVyIGV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIC8vIExvZy5kKExPR19UQUcsICJ0ZXN0IHNldHVwIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBJV2FwUHVzaE1hbmFnZXIgbVdhcFB1c2ggPSBudWxsOworICAgIElXYXBQdXNoTWFuYWdlciBnZXRJbnRlcmZhY2UoKSB7CisgICAgICAgIGlmIChtV2FwUHVzaCAhPSBudWxsKSByZXR1cm4gbVdhcFB1c2g7CisgICAgICAgIEludGVudCBzdGFydEludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgc3RhcnRJbnRlbnQuc2V0Q2xhc3MoZ2V0Q29udGV4dCgpLCBXYXBQdXNoTWFuYWdlci5jbGFzcyk7CisgICAgICAgIElCaW5kZXIgc2VydmljZSA9IGJpbmRTZXJ2aWNlKHN0YXJ0SW50ZW50KTsKKworICAgICAgICBtV2FwUHVzaCA9IElXYXBQdXNoTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICByZXR1cm4gbVdhcFB1c2g7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbGwgbWV0aG9kcyBuZWVkIHRvIHN0YXJ0IHdpdGggJ3Rlc3QnLgorICAgICAqIFVzZSB2YXJpb3VzIGFzc2VydCBtZXRob2RzIHRvIHBhc3MvZmFpbCB0aGUgdGVzdCBjYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHV0QWRkUGFja2FnZShib29sZWFuIG5lZWRfc2lnLCBib29sZWFuIG1vcmVfcHJvYykgeworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgIC8vIGluc2VydCBuZXcgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpd2FwbWFuLmFkZFBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLCBuZWVkX3NpZywgbW9yZV9wcm9jKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGUgZGF0YQorICAgICAgICBXYXBQdXNoTWFuYWdlciB3cG1hbiA9IGdldFNlcnZpY2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3cG1hbi52ZXJpZnlEYXRhKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLCBuZWVkX3NpZywgbW9yZV9wcm9jKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHBhY2thZ2UgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYWNrYWdlMSgpIHsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworCisgICAgICAgIHV0QWRkUGFja2FnZSh0cnVlLCB0cnVlKTsKKyAgICAgICAgbUFwcElkVmFsdWUgKz0gMTA7CisgICAgICAgIHV0QWRkUGFja2FnZSh0cnVlLCBmYWxzZSk7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICB1dEFkZFBhY2thZ2UoZmFsc2UsIHRydWUpOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgdXRBZGRQYWNrYWdlKGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworCisgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgbUFwcElkVmFsdWUgKz0gMTA7CisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBkdXByZWNhdGVkIHBhY2thZ2UgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUGFja2FnZTIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUgKyAxMCksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSArIDEwKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSArIDEwKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdXRVcGRhdGVQYWNrYWdlKGJvb2xlYW4gbmVlZF9zaWcsIGJvb2xlYW4gbW9yZV9wcm9jKSB7CisgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgLy8gaW5zZXJ0IG5ldyBkYXRhCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGl3YXBtYW4udXBkYXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIG5lZWRfc2lnLCBtb3JlX3Byb2MpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBkYXRhCisgICAgICAgIFdhcFB1c2hNYW5hZ2VyIHdwbWFuID0gZ2V0U2VydmljZSgpOworICAgICAgICBhc3NlcnRUcnVlKHdwbWFuLnZlcmlmeURhdGEoCisgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIG5lZWRfc2lnLCBtb3JlX3Byb2MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGluZyBwYWNrYWdlIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGFja2FnZTEoKSB7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKworICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgbUFwcElkVmFsdWUgKz0gMTA7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIHV0VXBkYXRlUGFja2FnZShmYWxzZSwgZmFsc2UpOworICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgdXRVcGRhdGVQYWNrYWdlKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgIHV0VXBkYXRlUGFja2FnZSh0cnVlLCBmYWxzZSk7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICB1dFVwZGF0ZVBhY2thZ2UodHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworCisgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRpbmcgaW52YWxpZCBwYWNrYWdlIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGFja2FnZTIoKSB7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4udXBkYXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSArIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwgMCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShpd2FwbWFuLnVwZGF0ZVBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsIDAsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpd2FwbWFuLnVwZGF0ZVBhY2thZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lICsgImR1bW15X2RhdGEiLCBtQ2xhc3NOYW1lLCAwLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXdhcG1hbi51cGRhdGVQYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSArICJkdW1teV9kYXRhIiwgMCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBtQ2xhc3NOYW1lICsgImR1bW15X2RhdGEiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdXREZWxldGVQYWNrYWdlKCkgeworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGl3YXBtYW4uZGVsZXRlUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBkYXRhCisgICAgICAgIFdhcFB1c2hNYW5hZ2VyIHdwbWFuID0gZ2V0U2VydmljZSgpOworICAgICAgICBhc3NlcnRUcnVlKCF3cG1hbi5pc0RhdGFFeGlzdCgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGluZyBwYWNrYWdlIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUGFja2FnZTEoKSB7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKworICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICB0cnkgeworICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgbUFwcElkVmFsdWUgKz0gMTA7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSArPSAyMDsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIHV0RGVsZXRlUGFja2FnZSgpOworICAgICAgICBtQXBwSWRWYWx1ZSArPSAxMDsKKyAgICAgICAgdXREZWxldGVQYWNrYWdlKCk7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlICs9IDIwOworICAgICAgICB1dERlbGV0ZVBhY2thZ2UoKTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgKz0gMjA7CisgICAgICAgIHV0RGVsZXRlUGFja2FnZSgpOworCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGluZyBpbnZhbGlkIHBhY2thZ2UgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVQYWNrYWdlMigpIHsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSArIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlICsgMjApLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlICsgMTApLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlICsgMjApLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpKTsKKworICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByb3RlY3RlZCBpbnQgZW5jb2RlVWludDMyKGludCB1aW50MzJWYWwsIGJ5dGVbXSBhcnIsIGludCBzdGFydCkgeworICAgICAgICBpbnQgYml0ID0gMTsKKyAgICAgICAgaW50IHRvcGJpdCA9IDA7CisgICAgICAgIGludCBlbmNvZGVMZW47CisgICAgICAgIGludCB0bXBWYWw7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1aW50MzJWYWwgPj0gMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzE7IGkrKykgeworICAgICAgICAgICAgaWYgKChiaXQgJiB1aW50MzJWYWwpID4gMCkgdG9wYml0ID0gaTsKKyAgICAgICAgICAgIGJpdCA9IChiaXQgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZW5jb2RlTGVuID0gdG9wYml0LzcgKyAxOworICAgICAgICBpZiAoYXJyID09IG51bGwpIHJldHVybiBlbmNvZGVMZW47CisKKyAgICAgICAgLy9Mb2cuZChMT0dfVEFHLCAidWludDMyVmFsID0gIiArIEludGVnZXIudG9IZXhTdHJpbmcodWludDMyVmFsKSArICIsIHRvcGJpdCA9ICIKKyAgICAgICAgLy8gICAgICArIHRvcGJpdCArICIsIGVuY29kZUxlbiA9ICIgKyBlbmNvZGVMZW4pOworCisgICAgICAgIHRtcFZhbCA9IHVpbnQzMlZhbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IGVuY29kZUxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBsb25nIHZhbCA9IDA7CisgICAgICAgICAgICBpZiAoaSA8IGVuY29kZUxlbiAtIDEpIHZhbCA9IDB4ODA7CisgICAgICAgICAgICB2YWwgfD0gdG1wVmFsICYgMHg3ZjsKKyAgICAgICAgICAgIGFycltzdGFydCArIGldID0gKGJ5dGUpICh2YWwgJiAweEZGKTsKKyAgICAgICAgICAgIHRtcFZhbCA9ICh0bXBWYWwgPj4gNyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVuY29kZUxlbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGVuY29kZVNob3J0SW50KGludCBzaW50VmFsLCBieXRlW10gYXJyLCBpbnQgc3RhcnQpIHsKKyAgICAgICAgaW50IGVuY29kZUxlbiA9IDA7CisKKyAgICAgICAgaWYgKHNpbnRWYWwgPj0gMHg4MCkgcmV0dXJuIGVuY29kZUxlbjsKKyAgICAgICAgZW5jb2RlTGVuID0gMTsKKyAgICAgICAgYXJyW3N0YXJ0XSA9IChieXRlKSAoc2ludFZhbCB8IDB4ODApOworICAgICAgICByZXR1cm4gZW5jb2RlTGVuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgUmFuZG9tIFdTUCBoZWFkZXIgd2l0aCBpbnRlZ2VyIGFwcGxpY2F0aW9uIElECisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmFuZG9tV3NwSGVhZGVyKGJ5dGVbXSBhcnIsIFJhbmRvbSByZCwgaW50IGhlYWRlclN0YXJ0LAorICAgICAgICAgICAgYm9vbGVhbiBub0FwcElkKSB7CisKKyAgICAgICAgYm9vbGVhbiBhcHBJZEFkZGVkID0gZmFsc2U7CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImhlYWRlclN0YXJ0ID0gIiArIGhlYWRlclN0YXJ0ICsgIiwgYXBwSWQgPSAiICsgbUFwcElkVmFsdWUKKyAgICAgICAgICAgICAgICArICIoIiArIEludGVnZXIudG9IZXhTdHJpbmcobUFwcElkVmFsdWUpICsgIikiKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgInJhbmRvbSBhcnIgbGVuZ3RoOiIgKyBhcnIubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nIHR5cGVuYW1lW10gPSBuZXcgU3RyaW5nW10geyAic2hvcnQgaW50IiwgImxvbmcgaW50IiwgInN0cmluZyIsICJ1aW50MzIifTsKKworICAgICAgICB3aGlsZSAoIWFwcElkQWRkZWQpIHsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGluZGV4ID0gaGVhZGVyU3RhcnQ7CisgICAgICAgICAgICBpbnQgbGVuID0gYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgYm9vbGVhbiBhZGRBcHBpZCA9IGZhbHNlOworICAgICAgICAgICAgaW50IHRtcFZhbCA9IDA7CisgICAgICAgICAgICBpbnQgdG1wVmFsMiA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGFkZDsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZmllbGQgbmFtZQorICAgICAgICAgICAgICAgICAqIDA6IHNob3J0IGludAorICAgICAgICAgICAgICAgICAqIDE6IGxvbmcgaW50CisgICAgICAgICAgICAgICAgICogMjogdGV4dAorICAgICAgICAgICAgICAgICAqIChubyB1aW50IGZvciBwYXJhbSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0eXBlID0gcmQubmV4dEludCgzKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIGhlYWRlciBzaG9ydCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDEwMCAmJiAhYXBwSWRBZGRlZCkgYWRkQXBwaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBhZGQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGhlYWRlciBsb25nIGludAorICAgICAgICAgICAgICAgICAgICBhZGQgPSAxICsgcmQubmV4dEludCgyOSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMiArIHJkLm5leHRJbnQoMTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgYWRkID49IGxlbikgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGhlYWRlciBuYW1lCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBoZWFkZXIgc2hvcnQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoMHg4MCB8IHJkLm5leHRJbnQoMTI4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChhcnJbaW5kZXhdID09IChieXRlKSAweGFmKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJhcHBJZCBhZGRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgMHhhZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vQXBwSWQgY2FzZSwgYXBwSWQgZmxkIG11c3QgYmUgZGVjaWV2ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9BcHBJZCkgYXJyW2luZGV4XSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgKGFkZCAtIDEpOworICAgICAgICAgICAgICAgICAgICB0bXBWYWwyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDI1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwyID0gKHRtcFZhbDIgPDwgOCkgfCB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IGFwcGxpY2F0aW9uIGlkCisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWYWwyID09IDB4MmYpIGFycltpbmRleCArIDFdKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFkZCAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgxMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbCA8IDMyKSB0bXBWYWw9ICgzMiArIHRtcFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZmllbGQgbmFtZSBpbmRleDoiICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidHlwZToiICsgdHlwZW5hbWVbdHlwZV0gKyAiLCBhZGQ6IiArIGFkZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpPCBpbmRleCArIGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4ZmYgJiBhcnJbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKGFyciwgaW5kZXggKyAxLCBhZGQgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoc3RyLmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGFkZDsKKworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBmaWVsZCB2YWx1ZQorICAgICAgICAgICAgICAgICAqIDA6IHNob3J0IGludAorICAgICAgICAgICAgICAgICAqIDE6IGxvbmcgaW50CisgICAgICAgICAgICAgICAgICogMjogdGV4dAorICAgICAgICAgICAgICAgICAqIDM6IHVpbnQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJkLm5leHRJbnQoNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BCaXQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobUFwcElkVmFsdWUgJiBiaXQpID4gMCkgdG9wQml0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPSAoYml0IDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gMiArIHRvcEJpdC84OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gMSArIHJkLm5leHRJbnQoMjkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBhZGQgPSAyICsgcmQubmV4dEludCgxMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHVpbnQzMgorICAgICAgICAgICAgICAgICAgICBhZGQgPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyBhZGQgPj0gbGVuKSBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIGZpbGwgZmllbGQgdmFsdWUKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIGhlYWRlciBzaG9ydCBpbnQKKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoMHg4MCB8IHJkLm5leHRJbnQoMTI4KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRBcHBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXBwaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkQWRkZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpIChhZGQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9IG1BcHBJZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gYWRkOyBpID4gMTsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaSAtIDFdID0gKGJ5dGUpICh0bXBWYWwgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSAodG1wVmFsID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoYWRkIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSByZC5uZXh0SW50KDI1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOi8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFkZCAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgxMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbCA8IDMyKSB0bXBWYWw9ICgzMiArIHRtcFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBoZWFkZXIgdXZhcmludAorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpIDMxOworICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDB4MEZGRkZGRkYpOworICAgICAgICAgICAgICAgICAgICBhZGQgPSAxICsgZW5jb2RlVWludDMyKHRtcFZhbCwgbnVsbCwgaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlVWludDMyKHRtcFZhbCwgYXJyLCBpbmRleCArIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJmaWVsZCB2YWx1ZSBpbmRleDoiICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidHlwZToiICsgdHlwZW5hbWVbdHlwZV0gKyAiLCBhZGQ6IiArIGFkZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpPCBpbmRleCArIGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4ZmYgJiBhcnJbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKGFyciwgaW5kZXggKyAxLCBhZGQgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoc3RyLmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGFkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub0FwcElkKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhhcnIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBSYW5kb20gV1NQIGhlYWRlciB3aXRoIHN0cmluZyBhcHBsaWNhdGlvbiBJRAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJhbmRvbVdzcEhlYWRlclN0ckFwcElkKGJ5dGVbXSBhcnIsIFJhbmRvbSByZCwgaW50IGhlYWRlclN0YXJ0LAorICAgICAgICAgICAgYm9vbGVhbiByYW5kb21TdHIpIHsKKworICAgICAgICBib29sZWFuIGFwcElkQWRkZWQgPSBmYWxzZTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAicmFuZG9tIGFyciBsZW5ndGg6IiArIGFyci5sZW5ndGgpOworICAgICAgICBTdHJpbmcgdHlwZW5hbWVbXSA9IG5ldyBTdHJpbmdbXSB7ICJzaG9ydCBpbnQiLCAibG9uZyBpbnQiLCAic3RyaW5nIiwgInVpbnQzMiJ9OworCisgICAgICAgIHdoaWxlICghYXBwSWRBZGRlZCkgeworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBoZWFkZXJTdGFydDsKKyAgICAgICAgICAgIGludCBsZW4gPSBhcnIubGVuZ3RoOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBib29sZWFuIGFkZEFwcGlkID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgdG1wVmFsID0gMDsKKyAgICAgICAgICAgIGludCB0bXBWYWwyID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYWRkOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBmaWVsZCBuYW1lCisgICAgICAgICAgICAgICAgICogMDogc2hvcnQgaW50CisgICAgICAgICAgICAgICAgICogMTogbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgKiAyOiB0ZXh0CisgICAgICAgICAgICAgICAgICogKG5vIHVpbnQgZm9yIHBhcmFtIHZhbHVlKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHR5cGUgPSByZC5uZXh0SW50KDMpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMTAwICYmICFhcHBJZEFkZGVkKSBhZGRBcHBpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyByZC5uZXh0SW50KDI5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBhZGQgPSAyICsgcmQubmV4dEludCgxMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyBhZGQgPj0gbGVuKSBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIGZpbGwgaGVhZGVyIG5hbWUKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIGhlYWRlciBzaG9ydCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGlmICghYWRkQXBwaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpICgweDgwIHwgcmQubmV4dEludCgxMjgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGFycltpbmRleF0gPT0gKGJ5dGUpIDB4YWYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImFwcElkIGFkZGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAweGFmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgKGFkZCAtIDEpOworICAgICAgICAgICAgICAgICAgICB0bXBWYWwyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwgPSByZC5uZXh0SW50KDI1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWYWwyID0gKHRtcFZhbDIgPDwgOCkgfCB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IGFwcGxpY2F0aW9uIGlkCisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWYWwyID09IDB4MmYpIGFycltpbmRleCArIDFdKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFkZCAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgxMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFZhbCA8IDMyKSB0bXBWYWw9ICgzMiArIHRtcFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZmllbGQgbmFtZSBpbmRleDoiICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidHlwZToiICsgdHlwZW5hbWVbdHlwZV0gKyAiLCBhZGQ6IiArIGFkZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBhZGQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoSW50ZWdlci50b0hleFN0cmluZygweGZmICYgYXJyW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4ZmYgJiBhcnJbaW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyhhcnIsIGluZGV4ICsgMSwgYWRkIC0gMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHN0ci5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCdcbicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmRleCArPSBhZGQ7CisKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZmllbGQgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiAwOiBzaG9ydCBpbnQKKyAgICAgICAgICAgICAgICAgKiAxOiBsb25nIGludAorICAgICAgICAgICAgICAgICAqIDI6IHRleHQKKyAgICAgICAgICAgICAgICAgKiAzOiB1aW50CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSByZC5uZXh0SW50KDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIGhlYWRlciBzaG9ydCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gaGVhZGVyIGxvbmcgaW50CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyByZC5uZXh0SW50KDI5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBoZWFkZXIgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRBcHBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbVN0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyByZC5uZXh0SW50KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmFuZFN0cj0gbmV3IGJ5dGVbYWRkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgxMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wVmFsIDwgMzIpIHRtcFZhbD0gKDMyICsgdG1wVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZFN0cltpXSA9IChieXRlKSB0bXBWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcHBJZE5hbWUgPSBuZXcgU3RyaW5nKHJhbmRTdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gbUFwcElkTmFtZS5sZW5ndGgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAyICsgcmQubmV4dEludCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdWludDMyCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCArIGFkZCA+PSBsZW4pIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gZmlsbCBmaWVsZCB2YWx1ZQorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gaGVhZGVyIHNob3J0IGludAorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXhdID0gKGJ5dGUpICgweDgwIHwgcmQubmV4dEludCgxMjgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBoZWFkZXIgbG9uZyBpbnQKKyAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4XSA9IChieXRlKSAoYWRkIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhZGQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHJkLm5leHRJbnQoMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOi8vIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEFwcGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRBcHBpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWRBZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4ICsgaV0gPSAoYnl0ZSkgKG1BcHBJZE5hbWUuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQXBwSWROYW1lIGFkZGVkIFsiICsgbUFwcElkTmFtZSArICJdIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmFsID0gcmQubmV4dEludCgxMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWYWwgPCAzMikgdG1wVmFsPSAoMzIgKyB0bXBWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycltpbmRleCArIGldID0gKGJ5dGUpIHRtcFZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXggKyBpXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGhlYWRlciB1dmFyaW50CisgICAgICAgICAgICAgICAgICAgIGFycltpbmRleF0gPSAoYnl0ZSkgMzE7CisgICAgICAgICAgICAgICAgICAgIHRtcFZhbCA9IHJkLm5leHRJbnQoMHgwRkZGRkZGRik7CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IDEgKyBlbmNvZGVVaW50MzIodG1wVmFsLCBudWxsLCBpbmRleCArIDEpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVVaW50MzIodG1wVmFsLCBhcnIsIGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImZpZWxkIHZhbHVlIGluZGV4OiIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ0eXBlOiIgKyB0eXBlbmFtZVt0eXBlXSArICIsIGFkZDoiICsgYWRkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBpbmRleCArIGFkZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4ZmYgJiBhcnJbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoMHhmZiAmIGFycltpbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKGFyciwgaW5kZXggKyAxLCBhZGQgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoc3RyLmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGFkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKExPR19UQUcsICJoZWFkZXJTdGFydCA9ICIgKyBoZWFkZXJTdGFydCArICIsIG1BcHBJZE5hbWUgPSAiICsgbUFwcElkTmFtZSk7CisgICAgICAgIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhhcnIpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGNyZWF0ZVBEVShpbnQgdGVzdE51bSkgeworICAgICAgICBieXRlW10gYXJyYXkgPSBudWxsOworICAgICAgICAvLyBieXRlW10gd3NwID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHRlc3ROdW0pIHsKKyAgICAgICAgICAgIC8vIHNhbXBsZSBwZHUKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYnl0ZVtdIGFycmF5MSA9IHsKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIC8vIFRJRAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgLy8gVHlwZSA9IHdhcCBwdXNoCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyBMZW5ndGggdG8gYmUgc2V0IGxhdGVyLgorCisgICAgICAgICAgICAgICAgICAgIC8vIENvbnRlbnQtVHlwZQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAoKG1Db250ZW50VHlwZVZhbHVlID4+IDgpICYgMHhmZiksCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAobUNvbnRlbnRUeXBlVmFsdWUgJiAweGZmKSwKKworICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbi1pZAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAoKG1BcHBJZFZhbHVlID4+IDgpICYgMHhmZiksCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAobUFwcElkVmFsdWUmIDB4ZmYpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgYXJyYXkxWzJdID0gKGJ5dGUpIChhcnJheTEubGVuZ3RoIC0gMyk7CisgICAgICAgICAgICBtV3NwSGVhZGVyID0gYXJyYXkxOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgNzsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJMZW4gPSBhcnJheTEubGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIGludmFsaWQgd3NwIGhlYWRlcgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBieXRlW10gYXJyYXkyID0geworICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gaW52YWxpZCBkYXRhCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbVdzcEhlYWRlciA9IGFycmF5MjsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aDsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJMZW4gPSBhcnJheTIubGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSB3c3AgaGVhZGVyCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGludCBhcnJTaXplID0gMTUwICsgcmQubmV4dEludCgxMDApOworICAgICAgICAgICAgYnl0ZVtdIGFycmF5MyA9IG5ldyBieXRlW2FyclNpemVdOworICAgICAgICAgICAgaW50IGhkckVuY29kZUxlbjsKKworICAgICAgICAgICAgYXJyYXkzWzBdID0gKGJ5dGUpIDB4MDsKKyAgICAgICAgICAgIGFycmF5M1sxXSA9IChieXRlKSAweDY7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCwgbnVsbCwgMik7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCAtIGhkckVuY29kZUxlbiAtIDIsIGFycmF5MywgMik7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgMl0gPSAoYnl0ZSkgMHgzOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDNdID0gKGJ5dGUpIDB4MjsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyA0XSA9IChieXRlKSAoKG1Db250ZW50VHlwZVZhbHVlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgNV0gPSAoYnl0ZSkgKG1Db250ZW50VHlwZVZhbHVlICYgMHhmZik7CisgICAgICAgICAgICBjcmVhdGVSYW5kb21Xc3BIZWFkZXIoYXJyYXkzLCByZCwgaGRyRW5jb2RlTGVuICsgNiwgZmFsc2UpOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgaGRyRW5jb2RlTGVuICsgNjsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJMZW4gPSBhcnJheTMubGVuZ3RoOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlVmFsdWUgPSAiICsgbUNvbnRlbnRUeXBlVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiKCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSArICIpIik7CisKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gcmFuZG9tIHdzcCBoZWFkZXIgdy9vIGFwcGlkCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHJkID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgYXJyU2l6ZSA9IDE1MCArIHJkLm5leHRJbnQoMTAwKTsKKyAgICAgICAgICAgIGFycmF5MyA9IG5ldyBieXRlW2FyclNpemVdOworCisgICAgICAgICAgICBhcnJheTNbMF0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgYXJyYXkzWzFdID0gKGJ5dGUpIDB4NjsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoLCBudWxsLCAyKTsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoIC0gaGRyRW5jb2RlTGVuIC0gMiwgYXJyYXkzLCAyKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAyXSA9IChieXRlKSAweDM7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgM10gPSAoYnl0ZSkgMHgyOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDRdID0gKGJ5dGUpICgobUNvbnRlbnRUeXBlVmFsdWUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyA1XSA9IChieXRlKSAobUNvbnRlbnRUeXBlVmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIGNyZWF0ZVJhbmRvbVdzcEhlYWRlcihhcnJheTMsIHJkLCBoZHJFbmNvZGVMZW4gKyA2LCB0cnVlKTsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIGhkckVuY29kZUxlbiArIDY7CisgICAgICAgICAgICBtV3NwSGVhZGVyTGVuID0gYXJyYXkzLmxlbmd0aDsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZVZhbHVlID0gIiArIG1Db250ZW50VHlwZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICsgIigiICsgSW50ZWdlci50b0hleFN0cmluZyhtQ29udGVudFR5cGVWYWx1ZSkgKyAiKSIpOworCisgICAgICAgICAgICBtV3NwSGVhZGVyID0gYXJyYXkzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSB3c3AgaGVhZGVyIHcvIHJhbmRvbSBhcHBpZCBzdHJpbmcKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgcmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBhcnJTaXplID0gMTUwICsgcmQubmV4dEludCgxMDApOworICAgICAgICAgICAgYXJyYXkzID0gbmV3IGJ5dGVbYXJyU2l6ZV07CisKKyAgICAgICAgICAgIGFycmF5M1swXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICBhcnJheTNbMV0gPSAoYnl0ZSkgMHg2OworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGgsIG51bGwsIDIpOworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGggLSBoZHJFbmNvZGVMZW4gLSAyLCBhcnJheTMsIDIpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDJdID0gKGJ5dGUpIDB4MzsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAzXSA9IChieXRlKSAweDI7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgNF0gPSAoYnl0ZSkgKChtQ29udGVudFR5cGVWYWx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDVdID0gKGJ5dGUpIChtQ29udGVudFR5cGVWYWx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgY3JlYXRlUmFuZG9tV3NwSGVhZGVyU3RyQXBwSWQoYXJyYXkzLCByZCwgaGRyRW5jb2RlTGVuICsgNiwgdHJ1ZSk7CisgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgPSBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBoZHJFbmNvZGVMZW4gKyA2OworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5My5sZW5ndGg7CisKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQ29udGVudFR5cGVWYWx1ZSA9ICIgKyBtQ29udGVudFR5cGVWYWx1ZQorICAgICAgICAgICAgICAgICAgICArICIoIiArIEludGVnZXIudG9IZXhTdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpICsgIikiKTsKKworICAgICAgICAgICAgbVdzcEhlYWRlciA9IGFycmF5MzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyByYW5kb20gd3NwIGhlYWRlciB3LyBPTUEgYXBwaWQgc3RyaW5nCisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHJkID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgYXJyU2l6ZSA9IDE1MCArIHJkLm5leHRJbnQoMTAwKTsKKyAgICAgICAgICAgIGFycmF5MyA9IG5ldyBieXRlW2FyclNpemVdOworCisgICAgICAgICAgICBhcnJheTNbMF0gPSAoYnl0ZSkgMHgwOworICAgICAgICAgICAgYXJyYXkzWzFdID0gKGJ5dGUpIDB4NjsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoLCBudWxsLCAyKTsKKyAgICAgICAgICAgIGhkckVuY29kZUxlbiA9IGVuY29kZVVpbnQzMihhcnJheTMubGVuZ3RoIC0gaGRyRW5jb2RlTGVuIC0gMiwgYXJyYXkzLCAyKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyAyXSA9IChieXRlKSAweDM7CisgICAgICAgICAgICBhcnJheTNbaGRyRW5jb2RlTGVuICsgM10gPSAoYnl0ZSkgMHgyOworICAgICAgICAgICAgYXJyYXkzW2hkckVuY29kZUxlbiArIDRdID0gKGJ5dGUpICgobUNvbnRlbnRUeXBlVmFsdWUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5M1toZHJFbmNvZGVMZW4gKyA1XSA9IChieXRlKSAobUNvbnRlbnRUeXBlVmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIGNyZWF0ZVJhbmRvbVdzcEhlYWRlclN0ckFwcElkKGFycmF5MywgcmQsIGhkckVuY29kZUxlbiArIDYsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIGhkckVuY29kZUxlbiArIDY7CisgICAgICAgICAgICBtV3NwSGVhZGVyTGVuID0gYXJyYXkzLmxlbmd0aDsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZVZhbHVlID0gIiArIG1Db250ZW50VHlwZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICsgIigiICsgSW50ZWdlci50b0hleFN0cmluZyhtQ29udGVudFR5cGVWYWx1ZSkgKyAiKSIpOworCisgICAgICAgICAgICBtV3NwSGVhZGVyID0gYXJyYXkzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSB3c3AgaGVhZGVyIHcvIE9NQSBjb250ZW50IHR5cGUKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgcmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBhcnJTaXplID0gMTUwICsgcmQubmV4dEludCgxMDApOworICAgICAgICAgICAgYXJyYXkzID0gbmV3IGJ5dGVbYXJyU2l6ZV07CisKKyAgICAgICAgICAgIGFycmF5M1swXSA9IChieXRlKSAweDA7CisgICAgICAgICAgICBhcnJheTNbMV0gPSAoYnl0ZSkgMHg2OworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGgsIG51bGwsIDIpOworICAgICAgICAgICAgaGRyRW5jb2RlTGVuID0gZW5jb2RlVWludDMyKGFycmF5My5sZW5ndGggLSBoZHJFbmNvZGVMZW4gLSAyLCBhcnJheTMsIDIpOworCisgICAgICAgICAgICAvLyBlbmNvZGUgY29udGVudCB0eXBlCisgICAgICAgICAgICBpbnQgY29udGVudExlbiA9IG1Db250ZW50VHlwZU5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICBpbnQgbmV4dCA9IDIgKyBoZHJFbmNvZGVMZW47CisgICAgICAgICAgICBtV3NwQ29udGVudFR5cGVTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG5leHQ7CisgICAgICAgICAgICAvLyBuZXh0ICs9IGVuY29kZVVpbnQzMihjb250ZW50TGVuLCBhcnJheTMsIG5leHQpOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlTmFtZSA9ICIgKyBtQ29udGVudFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiwgY29udGVudExlbiA9ICIgKyBjb250ZW50TGVuKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnRMZW47IGkrKykgeworICAgICAgICAgICAgICAgIGFycmF5M1tuZXh0ICsgaV0gPSAoYnl0ZSkgbUNvbnRlbnRUeXBlTmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheTNbbmV4dCArIGldID0gKGJ5dGUpIDB4MDsKKworICAgICAgICAgICAgY3JlYXRlUmFuZG9tV3NwSGVhZGVyKGFycmF5MywgcmQsIG5leHQgKyBjb250ZW50TGVuICsgMSwgZmFsc2UpOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICsgbmV4dCArIGNvbnRlbnRMZW4gKyAxOworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5My5sZW5ndGg7CisKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gcmFuZG9tIHdzcCBoZWFkZXIgdy8gT01BIGNvbnRlbnQgdHlwZSwgT01BIGFwcCBJRAorICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICByZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGFyclNpemUgPSAxNTAgKyByZC5uZXh0SW50KDEwMCk7CisgICAgICAgICAgICBhcnJheTMgPSBuZXcgYnl0ZVthcnJTaXplXTsKKworICAgICAgICAgICAgYXJyYXkzWzBdID0gKGJ5dGUpIDB4MDsKKyAgICAgICAgICAgIGFycmF5M1sxXSA9IChieXRlKSAweDY7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCwgbnVsbCwgMik7CisgICAgICAgICAgICBoZHJFbmNvZGVMZW4gPSBlbmNvZGVVaW50MzIoYXJyYXkzLmxlbmd0aCAtIGhkckVuY29kZUxlbiAtIDIsIGFycmF5MywgMik7CisKKyAgICAgICAgICAgIC8vIGVuY29kZSBjb250ZW50IHR5cGUKKyAgICAgICAgICAgIGNvbnRlbnRMZW4gPSBtQ29udGVudFR5cGVOYW1lLmxlbmd0aCgpOworICAgICAgICAgICAgbmV4dCA9IDIgKyBoZHJFbmNvZGVMZW47CisgICAgICAgICAgICBtV3NwQ29udGVudFR5cGVTdGFydCA9IG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG5leHQ7CisgICAgICAgICAgICAvLyBuZXh0ICs9IGVuY29kZVVpbnQzMihjb250ZW50TGVuLCBhcnJheTMsIG5leHQpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZU5hbWUgPSAiICsgbUNvbnRlbnRUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRlbnRMZW4gPSAiICsgY29udGVudExlbik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50TGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhcnJheTNbbmV4dCArIGldID0gKGJ5dGUpIG1Db250ZW50VHlwZU5hbWUuY2hhckF0KGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXkzW25leHQgKyBpXSA9IChieXRlKSAweDA7CisKKyAgICAgICAgICAgIGNyZWF0ZVJhbmRvbVdzcEhlYWRlclN0ckFwcElkKGFycmF5MywgcmQsIG5leHQgKyBjb250ZW50TGVuICsgMSwgZmFsc2UpOworICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ID0gbUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICsgbmV4dCArIGNvbnRlbnRMZW4gKyAxOworICAgICAgICAgICAgbVdzcEhlYWRlckxlbiA9IGFycmF5My5sZW5ndGg7CisKKyAgICAgICAgICAgIG1Xc3BIZWFkZXIgPSBhcnJheTM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYXJyYXkgPSBuZXcgYnl0ZVttR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBtV3NwSGVhZGVyLmxlbmd0aAorICAgICAgICAgICAgICAgICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUdzbUhlYWRlciwgMCwgYXJyYXksIDAsIG1Hc21IZWFkZXIubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVXNlckRhdGFIZWFkZXIsIDAsIGFycmF5LAorICAgICAgICAgICAgICAgIG1Hc21IZWFkZXIubGVuZ3RoLCBtVXNlckRhdGFIZWFkZXIubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtV3NwSGVhZGVyLCAwLCBhcnJheSwKKyAgICAgICAgICAgICAgICBtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGgsIG1Xc3BIZWFkZXIubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWVzc2FnZUJvZHksIDAsIGFycmF5LAorICAgICAgICAgICAgICAgIG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG1Xc3BIZWFkZXIubGVuZ3RoLCAKKyAgICAgICAgICAgICAgICBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGFycmF5OworCisgICAgfQorCisgICAgSW50ZW50IGNyZWF0ZUludGVudChpbnQgcGR1VHlwZSwgaW50IHRyYW5JZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCB0cmFuSWQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdVR5cGUiLCBwZHVUeXBlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJoZWFkZXIiLCBtR3NtSGVhZGVyKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgbU1lc3NhZ2VCb2R5KTsKKyAgICAgICAgLy8gaW50ZW50LnB1dEV4dHJhKCJjb250ZW50VHlwZVBhcmFtZXRlcnMiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGludGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHByb2Nlc3NpbmcgdGVzdCwgc3RhcnQgYWN0aXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc01zZzEoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBwZHUubGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAobUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIGludCBwZHVUeXBlID0gNjsKKyAgICAgICAgaW50IHRyYW5JZCA9IDA7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2VOYW1lID0gbVBhY2thZ2VOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJBY3Rpdml0eSI7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSkKKyAgICAgICAgICAgICAgICAgICAgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID09CisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gb3JpZ2luYWxQYWNrYWdlTmFtZTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgcHJvY2Vzc2luZyB0ZXN0LCBzdGFydCBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NNc2cyKCkgeworICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDEpOworICAgICAgICBpbnQgaGVhZGVyTGVuID0gcGR1Lmxlbmd0aCAtIChtR3NtSGVhZGVyLmxlbmd0aCArCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG1NZXNzYWdlQm9keS5sZW5ndGgpOworICAgICAgICBpbnQgcGR1VHlwZSA9IDY7CisgICAgICAgIGludCB0cmFuSWQgPSAwOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxQYWNrYWdlTmFtZSA9IG1QYWNrYWdlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyU2VydmljZSI7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoKGl3YXBtYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHBkdVR5cGUsIHRyYW5JZCkpCisgICAgICAgICAgICAgICAgICAgICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKSA9PQorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QYWNrYWdlTmFtZSA9IG9yaWdpbmFsUGFja2FnZU5hbWU7CisgICAgICAgIG1DbGFzc05hbWUgPSBvcmlnaW5hbENsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHByb2Nlc3NpbmcgdGVzdCwgbm8gc2lnbmF0dXJlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NNc2czKCkgeworICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDEpOworICAgICAgICBpbnQgaGVhZGVyTGVuID0gcGR1Lmxlbmd0aCAtCisgICAgICAgICAgICAgICAgKG1Hc21IZWFkZXIubGVuZ3RoICsgbVVzZXJEYXRhSGVhZGVyLmxlbmd0aCArIG1NZXNzYWdlQm9keS5sZW5ndGgpOworICAgICAgICBpbnQgcGR1VHlwZSA9IDY7CisgICAgICAgIGludCB0cmFuSWQgPSAwOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxQYWNrYWdlTmFtZSA9IG1QYWNrYWdlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBtUGFja2FnZU5hbWUgPSAiY29tLmFuZHJvaWQuZGV2ZWxvcG1lbnQiOworICAgICAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5kZXZlbG9wbWVudC5EZXZlbG9wbWVudCI7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKGl3YXBtYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHBkdVR5cGUsIHRyYW5JZCkpCisgICAgICAgICAgICAgICAgICAgICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKSA9PQorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QYWNrYWdlTmFtZSA9IG9yaWdpbmFsUGFja2FnZU5hbWU7CisgICAgICAgIG1DbGFzc05hbWUgPSBvcmlnaW5hbENsYXNzTmFtZTsKKyAgICB9CisKKyAgICBJRGF0YVZlcmlmeSBnZXRWZXJpZnlJbnRlcmZhY2UoKSB7CisgICAgICAgIHdoaWxlIChtSVZlcmlmeSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgYWN0aXZpdHkgcmVjZWl2ZSBkYXRhLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoVElNRV9XQUlUKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JVmVyaWZ5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogTWVzc2FnZSBwcm9jZXNzaW5nIHRlc3QsIHJlY2VpdmVkIGJvZHkgZGF0YSB2ZXJpZmljYXRpb24gdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzTXNnNCgpIHsKKyAgICAgICAgYnl0ZVtdIG9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtTWVzc2FnZUJvZHk7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweGVlLAorICAgICAgICAgICAgICAgIChieXRlKSAweGZmLAorICAgICAgICB9OworCisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBwZHUubGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAobUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIGludCBwZHVUeXBlID0gNjsKKyAgICAgICAgaW50IHRyYW5JZCA9IDA7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2VOYW1lID0gbVBhY2thZ2VOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICAgICAgSURhdGFWZXJpZnkgZGF0YXZlcmlmeSA9IGdldFZlcmlmeUludGVyZmFjZSgpOworCisgICAgICAgICAgICBkYXRhdmVyaWZ5LnJlc2V0RGF0YSgpOworCisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5SZWNlaXZlckFjdGl2aXR5IjsKKyAgICAgICAgICAgIGl3YXBtYW4uYWRkUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFksIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGl3YXBtYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHBkdVR5cGUsIHRyYW5JZCkpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisgICAgICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyU2VydmljZSI7CisgICAgICAgICAgICBtTWVzc2FnZUJvZHkgPSBuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGJiLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MjIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGFhLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhiYiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MTEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDIyLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhYSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YmIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDExLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgyMiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGJiLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MjIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGFhLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhiYiwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MTEsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDIyLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhYSwKKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YmIsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDExLAorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHgyMiwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGl3YXBtYW4ucHJvY2Vzc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHBkdVR5cGUsIHRyYW5JZCkpOworCisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCBIZXhEdW1wLmR1bXBIZXhTdHJpbmcobU1lc3NhZ2VCb2R5KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gb3JpZ2luYWxQYWNrYWdlTmFtZTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgICAgICBtTWVzc2FnZUJvZHkgPSBvcmlnaW5hbE1lc3NhZ2VCb2R5OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgcHJvY2Vzc2luZyB0ZXN0LCBzZW5kIGludmFsaWQgc21zIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc01zZzUoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMik7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBwZHUubGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAobUdzbUhlYWRlci5sZW5ndGggKyBtVXNlckRhdGFIZWFkZXIubGVuZ3RoICsgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIGludCBwZHVUeXBlID0gNjsKKyAgICAgICAgaW50IHRyYW5JZCA9IDA7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2VOYW1lID0gbVBhY2thZ2VOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJBY3Rpdml0eSI7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9BQ1RJVklUWSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSkKKyAgICAgICAgICAgICAgICAgICAgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID09CisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gb3JpZ2luYWxQYWNrYWdlTmFtZTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgcHJvY2Vzc2luZyB0ZXN0LCBubyByZWNlaXZlciBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzTXNnNigpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgxKTsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IHBkdS5sZW5ndGggLQorICAgICAgICAgICAgICAgIChtR3NtSGVhZGVyLmxlbmd0aCArIG1Vc2VyRGF0YUhlYWRlci5sZW5ndGggKyBtTWVzc2FnZUJvZHkubGVuZ3RoKTsKKyAgICAgICAgaW50IHBkdVR5cGUgPSA2OworICAgICAgICBpbnQgdHJhbklkID0gMDsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUGFja2FnZU5hbWUgPSBtUGFja2FnZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgbUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zbXNwdXNoLnVuaXRUZXN0cy5Ob1JlY2VpdmVyIjsKKworICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgIElXYXBQdXNoTWFuYWdlciBpd2FwbWFuID0gZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgoaXdhcG1hbi5wcm9jZXNzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlbnQocGR1VHlwZSwgdHJhbklkKSkKKyAgICAgICAgICAgICAgICAgICAgJiBXYXBQdXNoTWFuYWdlclBhcmFtcy5NRVNTQUdFX0hBTkRMRUQpID09CisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgIGl3YXBtYW4uZGVsZXRlUGFja2FnZShJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksIG1QYWNrYWdlTmFtZSwgbUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX1NFUlZJQ0UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKChpd2FwbWFuLnByb2Nlc3NNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1BcHBJZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVudChwZHVUeXBlLCB0cmFuSWQpKQorICAgICAgICAgICAgICAgICAgICAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCkgPT0KKyAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtUGFja2FnZU5hbWUgPSBvcmlnaW5hbFBhY2thZ2VOYW1lOworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3NwVHlwZURlY29kZXIgdGVzdCwgbm9ybWFsIHBkdQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyMSgpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4RkZGRik7CisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDEpOworICAgICAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLnNlZWtYV2FwQXBwbGljYXRpb25JZChtV3NwSGVhZGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCArIG1Xc3BIZWFkZXJMZW4gLSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLmRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGluZGV4KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1BcHBJZFZhbHVlOiAiICsgbUFwcElkVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB2YWw6ICIgKyBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BcHBJZFZhbHVlID09IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdzcFR5cGVEZWNvZGVyIHRlc3QsIG5vIGhlYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyMigpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIG1BcHBJZFZhbHVlID0gcmQubmV4dEludCgweEZGRkYpOworICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDIpOworICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKHBkdSk7CisKKyAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQobVdzcEhlYWRlclN0YXJ0LAorICAgICAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCArIG1Xc3BIZWFkZXJMZW4gLSAxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzKTsKKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXc3BUeXBlRGVjb2RlciB0ZXN0LCBkZWNvZGUgYXBwaWQgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyMygpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZFZhbHVlID0gcmQubmV4dEludCgweDBGRkZGRkZGKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gcmQubmV4dEludCgweDBGRkYpOworICAgICAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSgzKTsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHBkdURlY29kZXIgPSBuZXcgV3NwVHlwZURlY29kZXIocGR1KTsKKworICAgICAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQobVdzcEhlYWRlclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgKyBtV3NwSGVhZGVyTGVuIC0gMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcyk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5kZWNvZGVYV2FwQXBwbGljYXRpb25JZChpbmRleCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcyk7CisKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQXBwSWRWYWx1ZTogIiArIG1BcHBJZFZhbHVlCisgICAgICAgICAgICAgICAgICAgICsgIiwgdmFsOiAiICsgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQXBwSWRWYWx1ZSA9PSAoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisgICAgLyoKKyAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmMoKSB7CisgICAgICBieXRlW10gYXJyID0gbmV3IGJ5dGVbMjBdOworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGluZGV4ICs9IGVuY29kZVVpbnQzMigweDg3YTUsIGFyciwgaW5kZXgpOworICAgICAgaW5kZXggKz0gZW5jb2RlVWludDMyKDB4MSwgYXJyLCBpbmRleCk7CisgICAgICBpbmRleCArPSBlbmNvZGVVaW50MzIoMHg5YiwgYXJyLCBpbmRleCk7CisgICAgICBpbmRleCArPSBlbmNvZGVVaW50MzIoMHgxMCwgYXJyLCBpbmRleCk7CisgICAgICBpbmRleCArPSBlbmNvZGVVaW50MzIoMHhlMDg4NywgYXJyLCBpbmRleCk7CisgICAgICBpbmRleCArPSBlbmNvZGVVaW50MzIoMHg3OTFhMjNkMCwgYXJyLCBpbmRleCk7CisKKyAgICAgIExvZy5kKExPR19UQUcsIEhleER1bXAuZHVtcEhleFN0cmluZyhhcnIpKTsKKyAgICAgIH0KKyAgICAqLworCisgICAgLyoqCisgICAgICogV3NwVHlwZURlY29kZXIgdGVzdCwgbm8gYXBwaWQgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyNCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZFZhbHVlID0gcmQubmV4dEludCgweDBGRkZGRkZGKTsKKyAgICAgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gcmQubmV4dEludCgweDBGRkYpOworICAgICAgICAgICAgYnl0ZVtdIHBkdSA9IGNyZWF0ZVBEVSg0KTsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHBkdURlY29kZXIgPSBuZXcgV3NwVHlwZURlY29kZXIocGR1KTsKKworICAgICAgICAgICAgcmVzID0gcGR1RGVjb2Rlci5zZWVrWFdhcEFwcGxpY2F0aW9uSWQobVdzcEhlYWRlclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtV3NwSGVhZGVyU3RhcnQgKyBtV3NwSGVhZGVyTGVuIC0gMSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShyZXMpOworCisgICAgICAgIH0KKworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3NwVHlwZURlY29kZXIgdGVzdCwgZGVjb2RlIHN0cmluZyBhcHBpZCB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXI1KCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbUFwcElkVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRkZGRkYpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSByZC5uZXh0SW50KDB4MEZGRik7CisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDUpOworICAgICAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLnNlZWtYV2FwQXBwbGljYXRpb25JZChtV3NwSGVhZGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1Xc3BIZWFkZXJTdGFydCArIG1Xc3BIZWFkZXJMZW4gLSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gKGludCkgcGR1RGVjb2Rlci5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLmRlY29kZVhXYXBBcHBsaWNhdGlvbklkKGluZGV4KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1BcHBJZFZhbHVlOiBbIiArIG1BcHBJZE5hbWUgKyAiXSwgdmFsOiBbIgorICAgICAgICAgICAgICAgICAgICArIHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKSArICJdIik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BcHBJZE5hbWUuZXF1YWxzKHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgbUFwcElkTmFtZSA9IG9yaWdpbmFsQXBwSWROYW1lOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXc3BUeXBlRGVjb2RlciB0ZXN0LCBkZWNvZGUgc3RyaW5nIGFwcGlkIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlcjYoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPTUFfQVBQTElDQVRJT05fSURfTkFNRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZE5hbWUgPSBPTUFfQVBQTElDQVRJT05fSURfTkFNRVNbaV07CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IHJkLm5leHRJbnQoMHgwRkZGKTsKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoNik7CisgICAgICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKHBkdSk7CisKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuc2Vla1hXYXBBcHBsaWNhdGlvbklkKG1Xc3BIZWFkZXJTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVdzcEhlYWRlclN0YXJ0ICsgbVdzcEhlYWRlckxlbiAtIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKTsKKyAgICAgICAgICAgIHJlcyA9IHBkdURlY29kZXIuZGVjb2RlWFdhcEFwcGxpY2F0aW9uSWQoaW5kZXgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXMpOworCisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUFwcElkVmFsdWU6IFsiICsgbUFwcElkTmFtZSArICJdLCB2YWw6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpICsgIl0iKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFwcElkTmFtZS5lcXVhbHMocGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdzcFR5cGVEZWNvZGVyIHRlc3QsIGRlY29kZSBPTUEgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZXI3KCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT01BX0NPTlRFTlRfVFlQRV9OQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IE9NQV9DT05URU5UX1RZUEVfTkFNRVNbaV07CisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDcpOworICAgICAgICAgICAgV3NwVHlwZURlY29kZXIgcGR1RGVjb2RlciA9IG5ldyBXc3BUeXBlRGVjb2RlcihwZHUpOworCisgICAgICAgICAgICByZXMgPSBwZHVEZWNvZGVyLmRlY29kZUNvbnRlbnRUeXBlKG1Xc3BDb250ZW50VHlwZVN0YXJ0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzKTsKKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZU5hbWU6IFsiICsgbUNvbnRlbnRUeXBlTmFtZSArICJdLCB2YWw6IFsiCisgICAgICAgICAgICAgICAgICAgICsgcGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpICsgIl0iKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUNvbnRlbnRUeXBlTmFtZS5lcXVhbHMocGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29waWVkIGZyb20gV2FwUHVzaE92ZXJTbXMuCisgICAgICogVGhlIGNvZGUgZmxvdyBpcyBub3QgY2hhbmdlZCBmcm9tIHRoZSBvcmlnaW5hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRpc3BhdGNoV2FwUGR1KGJ5dGVbXSBwZHUsIElXYXBQdXNoTWFuYWdlciB3YXBQdXNoTWFuKSB7CisKKyAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLmQoTE9HX1RBRywgIlJ4OiAiICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhwZHUpKTsKKworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgdHJhbnNhY3Rpb25JZCA9IHBkdVtpbmRleCsrXSAmIDB4RkY7CisgICAgICAgIGludCBwZHVUeXBlID0gcGR1W2luZGV4KytdICYgMHhGRjsKKyAgICAgICAgaW50IGhlYWRlckxlbmd0aCA9IDA7CisKKyAgICAgICAgaWYgKChwZHVUeXBlICE9IFdzcFR5cGVEZWNvZGVyLlBEVV9UWVBFX1BVU0gpICYmCisgICAgICAgICAgICAgICAgKHBkdVR5cGUgIT0gV3NwVHlwZURlY29kZXIuUERVX1RZUEVfQ09ORklSTUVEX1BVU0gpKSB7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgbm9uLVBVU0ggV0FQIFBEVS4gVHlwZSA9ICIgKyBwZHVUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKKyAgICAgICAgfQorCisgICAgICAgIFdzcFR5cGVEZWNvZGVyIHBkdURlY29kZXIgPSBuZXcgV3NwVHlwZURlY29kZXIocGR1KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2UgSGVhZGVyTGVuKHVuc2lnbmVkIGludGVnZXIpLgorICAgICAgICAgKiBGcm9tIHdhcC0yMzAtd3NwLTIwMDEwNzA1LWEgc2VjdGlvbiA4LjEuMgorICAgICAgICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgdWludHZhciBpcyAzMiBiaXRzLgorICAgICAgICAgKiBTbyBpdCB3aWxsIGJlIGVuY29kZWQgaW4gbm8gbW9yZSB0aGFuIDUgb2N0ZXRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBkdURlY29kZXIuZGVjb2RlVWludHZhckludGVnZXIoaW5kZXgpID09IGZhbHNlKSB7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBIZWFkZXIgTGVuZ3RoIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19HRU5FUklDX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGhlYWRlckxlbmd0aCA9IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICBpbmRleCArPSBwZHVEZWNvZGVyLmdldERlY29kZWREYXRhTGVuZ3RoKCk7CisKKyAgICAgICAgaW50IGhlYWRlclN0YXJ0SW5kZXggPSBpbmRleDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2UgQ29udGVudC1UeXBlLgorICAgICAgICAgKiBGcm9tIHdhcC0yMzAtd3NwLTIwMDEwNzA1LWEgc2VjdGlvbiA4LjQuMi4yNAorICAgICAgICAgKgorICAgICAgICAgKiBDb250ZW50LXR5cGUtdmFsdWUgPSBDb25zdHJhaW5lZC1tZWRpYSB8IENvbnRlbnQtZ2VuZXJhbC1mb3JtCisgICAgICAgICAqIENvbnRlbnQtZ2VuZXJhbC1mb3JtID0gVmFsdWUtbGVuZ3RoIE1lZGlhLXR5cGUKKyAgICAgICAgICogTWVkaWEtdHlwZSA9IChXZWxsLWtub3duLW1lZGlhIHwgRXh0ZW5zaW9uLU1lZGlhKSAqKFBhcmFtZXRlcikKKyAgICAgICAgICogVmFsdWUtbGVuZ3RoID0gU2hvcnQtbGVuZ3RoIHwgKExlbmd0aC1xdW90ZSBMZW5ndGgpCisgICAgICAgICAqIFNob3J0LWxlbmd0aCA9IDxBbnkgb2N0ZXQgMC0zMD4gICAob2N0ZXQgPD0gV0FQX1BEVV9TSE9SVF9MRU5HVEhfTUFYKQorICAgICAgICAgKiBMZW5ndGgtcXVvdGUgPSA8T2N0ZXQgMzE+ICAgICAgICAgKFdBUF9QRFVfTEVOR1RIX1FVT1RFKQorICAgICAgICAgKiBMZW5ndGggPSBVaW50dmFyLWludGVnZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwZHVEZWNvZGVyLmRlY29kZUNvbnRlbnRUeXBlKGluZGV4KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIlJlY2VpdmVkIFBEVS4gSGVhZGVyIENvbnRlbnQtVHlwZSBlcnJvci4iKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgbG9uZyBiaW5hcnlDb250ZW50VHlwZSA9IHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICBpbmRleCArPSBwZHVEZWNvZGVyLmdldERlY29kZWREYXRhTGVuZ3RoKCk7CisKKyAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlckxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOworCisgICAgICAgIGJ5dGVbXSBpbnRlbnREYXRhOworCisgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX0NPKSkgeworICAgICAgICAgICAgaW50ZW50RGF0YSA9IHBkdTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkYXRhSW5kZXggPSBoZWFkZXJTdGFydEluZGV4ICsgaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgaW50ZW50RGF0YSA9IG5ldyBieXRlW3BkdS5sZW5ndGggLSBkYXRhSW5kZXhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGRhdGFJbmRleCwgaW50ZW50RGF0YSwgMCwgaW50ZW50RGF0YS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlZWsgZm9yIGFwcGxpY2F0aW9uIElEIGZpZWxkIGluIFdTUCBoZWFkZXIuCisgICAgICAgICAqIElmIGFwcGxpY2F0aW9uIElEIGlzIGZvdW5kLCBXYXBQdXNoTWFuYWdlciBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlCisgICAgICAgICAqIHByb2Nlc3NpbmcuIFNpbmNlIFdhcFB1c2hNYW5hZ2VyIGlzIG9wdGlvbmFsIG1vZHVsZSwgaWYgV2FwUHVzaE1hbmFnZXIKKyAgICAgICAgICogaXMgbm90IGZvdW5kLCBsZWdhY3kgbWVzc2FnZSBwcm9jZXNzaW5nIHdpbGwgYmUgY29udGludWVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBkdURlY29kZXIuc2Vla1hXYXBBcHBsaWNhdGlvbklkKGluZGV4LCBpbmRleCArIGhlYWRlckxlbmd0aCAtIDEpKSB7CisgICAgICAgICAgICBpbmRleCA9IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICAgICAgcGR1RGVjb2Rlci5kZWNvZGVYV2FwQXBwbGljYXRpb25JZChpbmRleCk7CisgICAgICAgICAgICBTdHJpbmcgd2FwQXBwSWQgPSBwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAod2FwQXBwSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhcEFwcElkID0gSW50ZWdlci50b1N0cmluZygoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9ICgobWltZVR5cGUgPT0gbnVsbCkgPworICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKGJpbmFyeUNvbnRlbnRUeXBlKSA6IG1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJhcHBpZCBmb3VuZDogIiArIHdhcEFwcElkICsgIjoiICsgY29udGVudFR5cGUpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc0Z1cnRoZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIElXYXBQdXNoTWFuYWdlciB3YXBQdXNoTWFuID0gbVdhcENvbm4uZ2V0V2FwUHVzaE1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAod2FwUHVzaE1hbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJ3YXAgcHVzaCBtYW5hZ2VyIG5vdCBmb3VuZCEiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRyYW5zYWN0aW9uSWQiLCB0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVUeXBlIiwgcGR1VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiaGVhZGVyIiwgaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgaW50ZW50RGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiY29udGVudFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHVEZWNvZGVyLmdldENvbnRlbnRQYXJhbWV0ZXJzKCkpOworCisgICAgICAgICAgICAgICAgICAgIGludCBwcm9jUmV0ID0gd2FwUHVzaE1hbi5wcm9jZXNzTWVzc2FnZSh3YXBBcHBJZCwgY29udGVudFR5cGUsIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJwcm9jUmV0OiIgKyBwcm9jUmV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jUmV0ICYgV2FwUHVzaE1hbmFnZXJQYXJhbXMuTUVTU0FHRV9IQU5ETEVEKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvY1JldCAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkZVUlRIRVJfUFJPQ0VTU0lORykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Z1cnRoZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NGdXJ0aGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJyZW1vdGUgZnVuYyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAiZmFsbCBiYWNrIHRvIGV4aXN0aW5nIGhhbmRsZXIiKTsKKworICAgICAgICByZXR1cm4gQWN0aXZpdHkuUkVTVUxUX09LOworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gcmV0cmlldmVXc3BCb2R5KCkgeworICAgICAgICBieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVttV3NwSGVhZGVyLmxlbmd0aCArIG1NZXNzYWdlQm9keS5sZW5ndGhdOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVdzcEhlYWRlciwgMCwgYXJyYXksIDAsIG1Xc3BIZWFkZXIubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWVzc2FnZUJvZHksIDAsIGFycmF5LCBtV3NwSGVhZGVyLmxlbmd0aCwgbU1lc3NhZ2VCb2R5Lmxlbmd0aCk7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlTmFtZShpbnQgY3R5cGVWYWwpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE9NQV9DT05URU5UX1RZUEVfVkFMVUVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY3R5cGVWYWwgPT0gT01BX0NPTlRFTlRfVFlQRV9WQUxVRVNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01BX0NPTlRFTlRfVFlQRV9OQU1FU1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRlbnRUeXBlTWFwcGVkKGludCBjdHlwZVZhbCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgT01BX0NPTlRFTlRfVFlQRV9WQUxVRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHlwZVZhbCA9PSBPTUFfQ09OVEVOVF9UWVBFX1ZBTFVFU1tpXSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVncmF0aW9uIHRlc3QgMSwgc2ltcGxlIGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdyYXRpb24xKCkgeworICAgICAgICBib29sZWFuIHJlczsKKyAgICAgICAgaW50IG9yaWdpbmFsQXBwSWRWYWx1ZSA9IG1BcHBJZFZhbHVlOworICAgICAgICBpbnQgb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlICA9IG1Db250ZW50VHlwZVZhbHVlOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxBcHBJZE5hbWUgPSBtQXBwSWROYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDb250ZW50VHlwZU5hbWUgPSBtQ29udGVudFR5cGVOYW1lOworICAgICAgICBTdHJpbmcgb3JpZ2luYWxDbGFzc05hbWUgPSBtQ2xhc3NOYW1lOworICAgICAgICBieXRlW10gb3JpZ2luYWxNZXNzYWdlQm9keSA9IG1NZXNzYWdlQm9keTsKKyAgICAgICAgUmFuZG9tIHJkID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIG1NZXNzYWdlQm9keSA9IG5ldyBieXRlWzEwMCArIHJkLm5leHRJbnQoMTAwKV07CisgICAgICAgIHJkLm5leHRCeXRlcyhtTWVzc2FnZUJvZHkpOworCisgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMSk7CisgICAgICAgIGJ5dGVbXSB3YXBwdXNoUGR1ID0gcmV0cmlldmVXc3BCb2R5KCk7CisKKworICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyQWN0aXZpdHkiOworICAgICAgICAvLyBQaG9uZSBkdW1teSA9IG5ldyBEdW1teVBob25lKGdldENvbnRleHQoKSk7CisgICAgICAgIC8vIFBob25lIGdzbSA9IFBob25lRmFjdG9yeS5nZXRHc21QaG9uZSgpOworICAgICAgICAvLyBHU01QaG9uZSBnc20gPSBuZXcgR1NNUGhvbmUoZ2V0Q29udGV4dCgpLCBuZXcgU2ltdWxhdGVkQ29tbWFuZHMoKSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIC8vIFdhcFB1c2hPdmVyU21zIGRpc3BhdGNoZXIgPSBuZXcgV2FwUHVzaE92ZXJTbXMoZHVtbXksIG51bGwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzZXQgdXAgZGF0YQorICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIElEYXRhVmVyaWZ5IGRhdGF2ZXJpZnkgPSBnZXRWZXJpZnlJbnRlcmZhY2UoKTsKKworICAgICAgICAgICAgZGF0YXZlcmlmeS5yZXNldERhdGEoKTsKKworICAgICAgICAgICAgaWYgKGlzQ29udGVudFR5cGVNYXBwZWQobUNvbnRlbnRUeXBlVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgLy8gY29udGVudCB0eXBlIGlzIG1hcHBlZAorICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBnZXRDb250ZW50VHlwZU5hbWUobUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQ29udGVudFR5cGVWYWx1ZSBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRUeXBlTmFtZSArICI6IiArIG1Db250ZW50VHlwZVZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IEludGVnZXIudG9TdHJpbmcobUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkFQUF9UWVBFX0FDVElWSVRZLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdSh3YXBwdXNoUGR1LCBpd2FwbWFuKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGF0YQorICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgICAgICBtTWVzc2FnZUJvZHkgPSBvcmlnaW5hbE1lc3NhZ2VCb2R5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVncmF0aW9uIHRlc3QgMiwgcmFuZG9tIG1BcHBJZFZhbHVlKGludCksIGFsbCBPTUEgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludGVncmF0aW9uMigpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ29udGVudFR5cGVOYW1lID0gbUNvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKyAgICAgICAgYnl0ZVtdIG9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtTWVzc2FnZUJvZHk7CisgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICBJRGF0YVZlcmlmeSBkYXRhdmVyaWZ5ID0gZ2V0VmVyaWZ5SW50ZXJmYWNlKCk7CisgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJBY3Rpdml0eSI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPTUFfQ09OVEVOVF9UWVBFX05BTUVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gT01BX0NPTlRFTlRfVFlQRV9OQU1FU1tpXTsKKyAgICAgICAgICAgIG1BcHBJZFZhbHVlID0gcmQubmV4dEludCgweDBGRkZGRkZGKTsKKworICAgICAgICAgICAgbU1lc3NhZ2VCb2R5ID0gbmV3IGJ5dGVbMTAwICsgcmQubmV4dEludCgxMDApXTsKKyAgICAgICAgICAgIHJkLm5leHRCeXRlcyhtTWVzc2FnZUJvZHkpOworCisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDcpOworICAgICAgICAgICAgYnl0ZVtdIHdhcHB1c2hQZHUgPSByZXRyaWV2ZVdzcEJvZHkoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhdmVyaWZ5LnJlc2V0RGF0YSgpOworICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgV2FwUHVzaE1hbmFnZXJQYXJhbXMuQVBQX1RZUEVfQUNUSVZJVFksIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFdhcFBkdSh3YXBwdXNoUGR1LCBpd2FwbWFuKTsKKworICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmRlbGV0ZVBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50VHlwZU5hbWUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKHdhcHB1c2hQZHUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBtQ2xhc3NOYW1lID0gb3JpZ2luYWxDbGFzc05hbWU7CisgICAgICAgIG1BcHBJZE5hbWUgPSBvcmlnaW5hbEFwcElkTmFtZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IG9yaWdpbmFsQ29udGVudFR5cGVOYW1lOworICAgICAgICBtQXBwSWRWYWx1ZSA9IG9yaWdpbmFsQXBwSWRWYWx1ZTsKKyAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIG1NZXNzYWdlQm9keSA9IG9yaWdpbmFsTWVzc2FnZUJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdyYXRpb24gdGVzdCAzLCBpdGVyYXRlIE9tYUFwcGxpY2F0aW9uIElELCByYW5kb20gYmluYXJ5IGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ3JhdGlvbjMoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBpbnQgb3JpZ2luYWxBcHBJZFZhbHVlID0gbUFwcElkVmFsdWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbEFwcElkTmFtZSA9IG1BcHBJZE5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZSA9IG1Db250ZW50VHlwZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisgICAgICAgIGJ5dGVbXSBvcmlnaW5hbE1lc3NhZ2VCb2R5ID0gbU1lc3NhZ2VCb2R5OworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgSURhdGFWZXJpZnkgZGF0YXZlcmlmeSA9IGdldFZlcmlmeUludGVyZmFjZSgpOworICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyU2VydmljZSI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPTUFfQVBQTElDQVRJT05fSURfTkFNRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZE5hbWUgPSBPTUFfQVBQTElDQVRJT05fSURfTkFNRVNbaV07CisgICAgICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IHJkLm5leHRJbnQoMHgwRkZGKTsKKworICAgICAgICAgICAgbU1lc3NhZ2VCb2R5ID0gbmV3IGJ5dGVbMTAwICsgcmQubmV4dEludCgxMDApXTsKKyAgICAgICAgICAgIHJkLm5leHRCeXRlcyhtTWVzc2FnZUJvZHkpOworCisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDYpOworICAgICAgICAgICAgYnl0ZVtdIHdhcHB1c2hQZHUgPSByZXRyaWV2ZVdzcEJvZHkoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhdmVyaWZ5LnJlc2V0RGF0YSgpOworICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICAgICAgaWYgKGlzQ29udGVudFR5cGVNYXBwZWQobUNvbnRlbnRUeXBlVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgdHlwZSBpcyBtYXBwZWQgdG8gaW50ZWdlciB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gZ2V0Q29udGVudFR5cGVOYW1lKG1Db250ZW50VHlwZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1Db250ZW50VHlwZVZhbHVlIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRUeXBlVmFsdWUgKyAiOiIgKyBtQ29udGVudFR5cGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gSW50ZWdlci50b1N0cmluZyhtQ29udGVudFR5cGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKG1BcHBJZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHUod2FwcHVzaFBkdSwgaXdhcG1hbik7CisKKyAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKG1BcHBJZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50VHlwZU5hbWUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKHdhcHB1c2hQZHUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgICAgICBtTWVzc2FnZUJvZHkgPSBvcmlnaW5hbE1lc3NhZ2VCb2R5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVncmF0aW9uIHRlc3QgNCwgaXRlcmF0ZSBPbWFBcHBsaWNhdGlvbiBJRCwgT21hIGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ3JhdGlvbjQoKSB7CisgICAgICAgIGJvb2xlYW4gcmVzOworICAgICAgICBpbnQgb3JpZ2luYWxBcHBJZFZhbHVlID0gbUFwcElkVmFsdWU7CisgICAgICAgIGludCBvcmlnaW5hbENvbnRlbnRUeXBlVmFsdWUgID0gbUNvbnRlbnRUeXBlVmFsdWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbEFwcElkTmFtZSA9IG1BcHBJZE5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZSA9IG1Db250ZW50VHlwZU5hbWU7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbENsYXNzTmFtZSA9IG1DbGFzc05hbWU7CisgICAgICAgIGJ5dGVbXSBvcmlnaW5hbE1lc3NhZ2VCb2R5ID0gbU1lc3NhZ2VCb2R5OworICAgICAgICBSYW5kb20gcmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIGl3YXBtYW4gPSBnZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgSURhdGFWZXJpZnkgZGF0YXZlcmlmeSA9IGdldFZlcmlmeUludGVyZmFjZSgpOworICAgICAgICBtQ2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNtc3B1c2gudW5pdFRlc3RzLlJlY2VpdmVyU2VydmljZSI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPTUFfQVBQTElDQVRJT05fSURfTkFNRVMubGVuZ3RoCisgICAgICAgICAgICAgICAgKyBPTUFfQ09OVEVOVF9UWVBFX05BTUVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtQXBwSWROYW1lID0gT01BX0FQUExJQ0FUSU9OX0lEX05BTUVTW3JkLm5leHRJbnQoT01BX0FQUExJQ0FUSU9OX0lEX05BTUVTLmxlbmd0aCldOworICAgICAgICAgICAgaW50IGNvbnRJbmRleCA9IHJkLm5leHRJbnQoT01BX0NPTlRFTlRfVFlQRV9OQU1FUy5sZW5ndGgpOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSA9IE9NQV9DT05URU5UX1RZUEVfTkFNRVNbY29udEluZGV4XTsKKworICAgICAgICAgICAgbU1lc3NhZ2VCb2R5ID0gbmV3IGJ5dGVbMTAwICsgcmQubmV4dEludCgxMDApXTsKKyAgICAgICAgICAgIHJkLm5leHRCeXRlcyhtTWVzc2FnZUJvZHkpOworCisgICAgICAgICAgICBieXRlW10gcGR1ID0gY3JlYXRlUERVKDgpOworICAgICAgICAgICAgYnl0ZVtdIHdhcHB1c2hQZHUgPSByZXRyaWV2ZVdzcEJvZHkoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhdmVyaWZ5LnJlc2V0RGF0YSgpOworICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkYXRhCisgICAgICAgICAgICAgICAgaXdhcG1hbi5hZGRQYWNrYWdlKG1BcHBJZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHUod2FwcHVzaFBkdSwgaXdhcG1hbik7CisKKyAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKG1BcHBJZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50VHlwZU5hbWUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ08pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGF0YXZlcmlmeS52ZXJpZnlEYXRhKHdhcHB1c2hQZHUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YShtTWVzc2FnZUJvZHkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUNsYXNzTmFtZSA9IG9yaWdpbmFsQ2xhc3NOYW1lOworICAgICAgICBtQXBwSWROYW1lID0gb3JpZ2luYWxBcHBJZE5hbWU7CisgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBvcmlnaW5hbENvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgbUFwcElkVmFsdWUgPSBvcmlnaW5hbEFwcElkVmFsdWU7CisgICAgICAgIG1Db250ZW50VHlwZVZhbHVlID0gb3JpZ2luYWxDb250ZW50VHlwZVZhbHVlOworICAgICAgICBtTWVzc2FnZUJvZHkgPSBvcmlnaW5hbE1lc3NhZ2VCb2R5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVncmF0aW9uIHRlc3QgNSwgaXRlcmF0ZSBiaW5hcnkgT21hQXBwbGljYXRpb24gSUQsIE9tYSBiaW5hcnkgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludGVncmF0aW9uNSgpIHsKKyAgICAgICAgYm9vbGVhbiByZXM7CisgICAgICAgIGludCBvcmlnaW5hbEFwcElkVmFsdWUgPSBtQXBwSWRWYWx1ZTsKKyAgICAgICAgaW50IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZSAgPSBtQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQXBwSWROYW1lID0gbUFwcElkTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ29udGVudFR5cGVOYW1lID0gbUNvbnRlbnRUeXBlTmFtZTsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsQ2xhc3NOYW1lID0gbUNsYXNzTmFtZTsKKyAgICAgICAgYnl0ZVtdIG9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtTWVzc2FnZUJvZHk7CisgICAgICAgIFJhbmRvbSByZCA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBJV2FwUHVzaE1hbmFnZXIgaXdhcG1hbiA9IGdldEludGVyZmFjZSgpOworICAgICAgICBJRGF0YVZlcmlmeSBkYXRhdmVyaWZ5ID0gZ2V0VmVyaWZ5SW50ZXJmYWNlKCk7CisgICAgICAgIG1DbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc21zcHVzaC51bml0VGVzdHMuUmVjZWl2ZXJTZXJ2aWNlIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9NQV9BUFBMSUNBVElPTl9JRF9WQUxVRVMubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgT01BX0NPTlRFTlRfVFlQRV9WQUxVRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1BcHBJZFZhbHVlID0gT01BX0FQUExJQ0FUSU9OX0lEX1ZBTFVFU1tyZC5uZXh0SW50KAorICAgICAgICAgICAgICAgICAgICBPTUFfQVBQTElDQVRJT05fSURfVkFMVUVTLmxlbmd0aCldOworICAgICAgICAgICAgbUNvbnRlbnRUeXBlVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBPTUFfQ09OVEVOVF9UWVBFX1ZBTFVFU1tyZC5uZXh0SW50KE9NQV9DT05URU5UX1RZUEVfVkFMVUVTLmxlbmd0aCldOworCisgICAgICAgICAgICBtTWVzc2FnZUJvZHkgPSBuZXcgYnl0ZVsxMDAgKyByZC5uZXh0SW50KDEwMCldOworICAgICAgICAgICAgcmQubmV4dEJ5dGVzKG1NZXNzYWdlQm9keSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwZHUgPSBjcmVhdGVQRFUoMyk7CisgICAgICAgICAgICBieXRlW10gd2FwcHVzaFBkdSA9IHJldHJpZXZlV3NwQm9keSgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGF2ZXJpZnkucmVzZXREYXRhKCk7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGRhdGEKKyAgICAgICAgICAgICAgICBpZiAoaXNDb250ZW50VHlwZU1hcHBlZChtQ29udGVudFR5cGVWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCB0eXBlIGlzIG1hcHBlZCB0byBpbnRlZ2VyIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBnZXRDb250ZW50VHlwZU5hbWUobUNvbnRlbnRUeXBlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUNvbnRlbnRUeXBlVmFsdWUgbWFwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udGVudFR5cGVWYWx1ZSArICI6IiArIG1Db250ZW50VHlwZU5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VHlwZU5hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKG1Db250ZW50VHlwZVZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpd2FwbWFuLmFkZFBhY2thZ2UoSW50ZWdlci50b1N0cmluZyhtQXBwSWRWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFR5cGVOYW1lLCBtUGFja2FnZU5hbWUsIG1DbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBXYXBQdXNoTWFuYWdlclBhcmFtcy5BUFBfVFlQRV9TRVJWSUNFLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHUod2FwcHVzaFBkdSwgaXdhcG1hbik7CisKKyAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBkYXRhCisgICAgICAgICAgICAgICAgaXdhcG1hbi5kZWxldGVQYWNrYWdlKEludGVnZXIudG9TdHJpbmcobUFwcElkVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlTmFtZSwgbVBhY2thZ2VOYW1lLCBtQ2xhc3NOYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChtQ29udGVudFR5cGVOYW1lLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX0NPKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGF2ZXJpZnkudmVyaWZ5RGF0YSh3YXBwdXNoUGR1KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhdmVyaWZ5LnZlcmlmeURhdGEobU1lc3NhZ2VCb2R5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1DbGFzc05hbWUgPSBvcmlnaW5hbENsYXNzTmFtZTsKKyAgICAgICAgbUFwcElkTmFtZSA9IG9yaWdpbmFsQXBwSWROYW1lOworICAgICAgICBtQ29udGVudFR5cGVOYW1lID0gb3JpZ2luYWxDb250ZW50VHlwZU5hbWU7CisgICAgICAgIG1BcHBJZFZhbHVlID0gb3JpZ2luYWxBcHBJZFZhbHVlOworICAgICAgICBtQ29udGVudFR5cGVWYWx1ZSA9IG9yaWdpbmFsQ29udGVudFR5cGVWYWx1ZTsKKyAgICAgICAgbU1lc3NhZ2VCb2R5ID0gb3JpZ2luYWxNZXNzYWdlQm9keTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQppbmRleCBmM2QwN2FiLi4yMzlmZDc2IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCkBAIC0xNjMsNiArMTYzLDEyIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uOwogCisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVjcmVhdGVSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgcmVjcmVhdGVTY3JlZW5zKCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBXaGV0aGVyIHdlIGFyZSBzdHVjayBvbiB0aGUgbG9jayBzY3JlZW4gYmVjYXVzZSB0aGUgc2ltIGlzCiAgICAgICogICBtaXNzaW5nLgpAQCAtMjQ0LDcgKzI1MCw4IEBACiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY3JlYXRlTWUoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLSAgICAgICAgICAgICAgICByZWNyZWF0ZVNjcmVlbnMoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlY3JlYXRlUnVubmFibGUpOworICAgICAgICAgICAgICAgIHBvc3QobVJlY3JlYXRlUnVubmFibGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0YWtlRW1lcmdlbmN5Q2FsbEFjdGlvbigpIHsKQEAgLTQ2Myw2ICs0NzAsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZWNyZWF0ZVJ1bm5hYmxlKTsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3YWtlV2hlblJlYWR5VHEoaW50IGtleUNvZGUpIHsKICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvbldha2VLZXkiKTsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRU5VICYmIGlzU2VjdXJlKCkgJiYgKG1Nb2RlID09IE1vZGUuTG9ja1NjcmVlbikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCA4YWFhMzI1Li40MzNmMWY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC05NzUsNyArOTc1LDYgQEAKIHsKICAgICBpbnQzMl90KiBjb25zdCBvdXRUZW1wID0gc3RhdGUtPm91dHB1dFRlbXA7CiAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoaW50MzJfdCkgKiBNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnQ7Ci0gICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemUpOwogCiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogCkBAIC05OTcsNiArOTk2LDcgQEAKICAgICAgICAgfQogICAgICAgICBlMCAmPSB+KGUxKTsKICAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKKyAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemUpOwogICAgICAgICB3aGlsZSAoZTEpIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNGUyZjFlMy4uNDkzMWNjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTI0LDYgKzEyNCwxNCBAQAogICAgIHB1YmxpYyBBbGFybU1hbmFnZXJTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1EZXNjcmlwdG9yID0gaW5pdCgpOworCisgICAgICAgIC8vIFdlIGhhdmUgdG8gc2V0IGN1cnJlbnQgVGltZVpvbmUgaW5mbyB0byBrZXJuZWwKKyAgICAgICAgLy8gYmVjYXVzZSBrZXJuZWwgZG9lc24ndCBrZWVwIHRoaXMgYWZ0ZXIgcmVib290CisgICAgICAgIFN0cmluZyB0eiA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KFRJTUVaT05FX1BST1BFUlRZKTsKKyAgICAgICAgaWYgKHR6ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFRpbWVab25lKHR6KTsKKyAgICAgICAgfQorCiAgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAgICAgICAgIG1XYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggOGYwODE2ZC4uYTY0Y2ViOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpbWF4LldpbWF4TWFuYWdlckNvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKQEAgLTU2LDYgKzU3LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIAogCiAKQEAgLTg5Nyw2ICs5MDAsOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSByZXF1ZXN0Um91dGVUb0hvc3RBZGRyZXNzIGluc3RlYWQKKyAgICAgKgogICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKICAgICAgKiBob3N0IHZpYSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgaW50ZXJmYWNlLgogICAgICAqIEBwYXJhbSBuZXR3b3JrVHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV0d29yayBvdmVyIHdoaWNoIHRyYWZmaWMgdG8gdGhlCkBAIC05MDYsNiArOTExLDI1IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBuZXR3b3JrVHlwZSwgaW50IGhvc3RBZGRyZXNzKSB7CisgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MoaG9zdEFkZHJlc3MpOworCisgICAgICAgIGlmIChpbmV0QWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhuZXR3b3JrVHlwZSwgaW5ldEFkZHJlc3MuZ2V0QWRkcmVzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogaG9zdCB2aWEgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gbmV0d29ya1R5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldHdvcmsgb3ZlciB3aGljaCB0cmFmZmljIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBob3N0IGlzIHRvIGJlIHJvdXRlZAorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMKKyAgICAgKiBkZXNpcmVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhpbnQgbmV0d29ya1R5cGUsIGJ5dGVbXSBob3N0QWRkcmVzcykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKG5ldHdvcmtUeXBlKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTE1LDExICs5MzksMTggQEAKICAgICAgICAgaWYgKHRyYWNrZXIgPT0gbnVsbCB8fCAhdHJhY2tlci5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgfHwKICAgICAgICAgICAgICAgICB0cmFja2VyLmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewogICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZXF1ZXN0Um91dGVUb0hvc3Qgb24gZG93biBuZXR3b3JrICgiICsgbmV0d29ya1R5cGUgKyAiKSAtIGRyb3BwZWQiKTsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyBvbiBkb3duIG5ldHdvcmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIgKyBuZXR3b3JrVHlwZSArICIpIC0gZHJvcHBlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFja2VyLnJlcXVlc3RSb3V0ZVRvSG9zdChob3N0QWRkcmVzcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGhvc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFja2VyLnJlcXVlc3RSb3V0ZVRvSG9zdChpbmV0QWRkcmVzcyk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRHJvcEJveE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAwZTQ1MTQ1Li4zOTgxNTI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjE4LDggKzIxOCwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHJlYWQgPiAwKTsKIAotICAgICAgICAgICAgY3JlYXRlRW50cnkodGVtcCwgdGFnLCBmbGFncyk7CisgICAgICAgICAgICBsb25nIHRpbWUgPSBjcmVhdGVFbnRyeSh0ZW1wLCB0YWcsIGZsYWdzKTsKICAgICAgICAgICAgIHRlbXAgPSBudWxsOworCisgICAgICAgICAgICBJbnRlbnQgZHJvcGJveEludGVudCA9IG5ldyBJbnRlbnQoRHJvcEJveE1hbmFnZXIuQUNUSU9OX0RST1BCT1hfRU5UUllfQURERUQpOworICAgICAgICAgICAgZHJvcGJveEludGVudC5wdXRFeHRyYShEcm9wQm94TWFuYWdlci5FWFRSQV9UQUcsIHRhZyk7CisgICAgICAgICAgICBkcm9wYm94SW50ZW50LnB1dEV4dHJhKERyb3BCb3hNYW5hZ2VyLkVYVFJBX1RJTUUsIHRpbWUpOworICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChkcm9wYm94SW50ZW50LCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9MT0dTKTsKKwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3Qgd3JpdGU6ICIgKyB0YWcsIGUpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNTk3LDcgKzYwMyw3IEBACiAgICAgfQogCiAgICAgLyoqIE1vdmVzIGEgdGVtcG9yYXJ5IGZpbGUgdG8gYSBmaW5hbCBsb2cgZmlsZW5hbWUgYW5kIGVucm9sbHMgaXQuICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVFbnRyeShGaWxlIHRlbXAsIFN0cmluZyB0YWcsIGludCBmbGFncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBsb25nIGNyZWF0ZUVudHJ5KEZpbGUgdGVtcCwgU3RyaW5nIHRhZywgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBsb25nIHQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAogICAgICAgICAvLyBSZXF1aXJlIGVhY2ggZW50cnkgdG8gaGF2ZSBhIHVuaXF1ZSB0aW1lc3RhbXA7IGlmIHRoZXJlIGFyZSBlbnRyaWVzCkBAIC02MzYsNiArNjQyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVucm9sbEVudHJ5KG5ldyBFbnRyeUZpbGUodGVtcCwgbURyb3BCb3hEaXIsIHRhZywgdCwgZmxhZ3MsIG1CbG9ja1NpemUpKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggYTE5MTU0OS4uNGQ5MzRiNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTExNDQsNiArMTE0NCwxNyBAQAogICAgICAgICAgICAgLy8gUG9zdCBhIHVubW91bnQgbWVzc2FnZS4KICAgICAgICAgICAgIFNodXRkb3duQ2FsbEJhY2sgdWNiID0gbmV3IFNodXRkb3duQ2FsbEJhY2socGF0aCwgb2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobUhhbmRsZXIub2J0YWluTWVzc2FnZShIX1VOTU9VTlRfUE1fVVBEQVRFLCB1Y2IpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT2JzZXJ2ZXIgaXMgd2FpdGluZyBmb3Igb25TaHV0RG93bkNvbXBsZXRlIHdoZW4gd2UgYXJlIGRvbmUuCisgICAgICAgICAgICAgKiBTaW5jZSBub3RoaW5nIHdpbGwgYmUgZG9uZSBzZW5kIG5vdGlmaWNhdGlvbiBkaXJlY3RseSBzbyBzaHV0ZG93bgorICAgICAgICAgICAgICogc2VxdWVuY2UgY2FuIGNvbnRpbnVlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uU2h1dERvd25Db21wbGV0ZShTdG9yYWdlUmVzdWx0Q29kZS5PcGVyYXRpb25TdWNjZWVkZWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIHdoZW4gc2h1dHRpbmcgZG93biIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDk4LDcgKzE1MDksOCBAQAogICAgICAgICB9IGNhdGNoIChOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaW50IGNvZGUgPSBlLmdldENvZGUoKTsKICAgICAgICAgICAgIGlmIChjb2RlID09IFZvbGRSZXNwb25zZUNvZGUuT3BGYWlsZWRTdG9yYWdlTm90Rm91bmQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvbnRhaW5lciAnJXMnIG5vdCBmb3VuZCIsIGlkKSk7CisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiQ29udGFpbmVyICclcycgbm90IGZvdW5kIiwgaWQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgJWQiLCBjb2RlKSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCmluZGV4IGNmODdhOWQuLjg4ZDk0YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCkBAIC05NywxMSArOTcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZS5SRVNFUlZFRCk7CiAKICAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KGFkZHJlc3MpOwotICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkRhZW1vbkNvbm5lY3RlZCgpOwogCiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgbU91dHB1dFN0cmVhbSA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKIAorICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkRhZW1vbkNvbm5lY3RlZCgpOworCiAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwogICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggYjI2ZGFjNzIuLjU0MDM4OWUgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTMzLDExICsxMzMsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUJhdHRlcnlGdWxsOwogICAgIHByaXZhdGUgTm90aWZpY2F0aW9uUmVjb3JkIG1MZWROb3RpZmljYXRpb247CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9MT1dfQVJHQiA9IDB4RkZGRjAwMDA7IC8vIENoYXJnaW5nIExvdyAtIHJlZCBzb2xpZCBvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX01FRElVTV9BUkdCID0gMHhGRkZGRkYwMDsgICAgLy8gQ2hhcmdpbmcgLSBvcmFuZ2Ugc29saWQgb24KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9GVUxMX0FSR0IgPSAweEZGMDBGRjAwOyAvLyBDaGFyZ2luZyBGdWxsIC0gZ3JlZW4gc29saWQgb24KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9CTElOS19PTiA9IDEyNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9CTElOS19PRkYgPSAyODc1OworICAgIHByaXZhdGUgc3RhdGljIGludCBtQmF0dGVyeUxvd0FSR0I7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1CYXR0ZXJ5TWVkaXVtQVJHQjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUJhdHRlcnlGdWxsQVJHQjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUJhdHRlcnlMZWRPbjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUJhdHRlcnlMZWRPZmY7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaWREZWJ1Z1N0cmluZyhDb250ZXh0IGJhc2VDb250ZXh0LCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBpZCkgewogICAgICAgICBDb250ZXh0IGMgPSBudWxsOwpAQCAtNDUwLDYgKzQ1MCwxNyBAQAogICAgICAgICBtRGVmYXVsdE5vdGlmaWNhdGlvbkxlZE9mZiA9IHJlc291cmNlcy5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfZGVmYXVsdE5vdGlmaWNhdGlvbkxlZE9mZik7CiAKKyAgICAgICAgbUJhdHRlcnlMb3dBUkdCID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TG93QVJHQik7CisgICAgICAgIG1CYXR0ZXJ5TWVkaXVtQVJHQiA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLmNvbmZpZ19ub3RpZmljYXRpb25zQmF0dGVyeU1lZGl1bUFSR0IpOworICAgICAgICBtQmF0dGVyeUZ1bGxBUkdCID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5RnVsbEFSR0IpOworICAgICAgICBtQmF0dGVyeUxlZE9uID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25vdGlmaWNhdGlvbnNCYXR0ZXJ5TGVkT24pOworICAgICAgICBtQmF0dGVyeUxlZE9mZiA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLmNvbmZpZ19ub3RpZmljYXRpb25zQmF0dGVyeUxlZE9mZik7CisKICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYWxsb3dpbmcgbm90aWZpY2F0aW9ucyB1bnRpbCB0aGUgc2V0dXAgd2l6YXJkIGhhcyBydW4gb25jZS4KICAgICAgICAgLy8gQWZ0ZXIgdGhhdCwgaW5jbHVkaW5nIHN1YnNlcXVlbnQgYm9vdHMsIGluaXQgd2l0aCBub3RpZmljYXRpb25zIHR1cm5lZCBvbi4KICAgICAgICAgLy8gVGhpcyB3b3JrcyBvbiB0aGUgZmlyc3QgYm9vdCBiZWNhdXNlIHRoZSBzZXR1cCB3aXphcmQgd2lsbCB0b2dnbGUgdGhpcwpAQCAtMTA2NSwxNyArMTA3NiwxNyBAQAogICAgICAgICAvLyBCYXR0ZXJ5IGxvdyBhbHdheXMgc2hvd3MsIG90aGVyIHN0YXRlcyBvbmx5IHNob3cgaWYgY2hhcmdpbmcuCiAgICAgICAgIGlmIChtQmF0dGVyeUxvdykgewogICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5Q2hhcmdpbmcpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpZ2h0LnNldENvbG9yKEJBVFRFUllfTE9XX0FSR0IpOworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IobUJhdHRlcnlMb3dBUkdCKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRmxhc2ggd2hlbiBiYXR0ZXJ5IGlzIGxvdyBhbmQgbm90IGNoYXJnaW5nCi0gICAgICAgICAgICAgICAgbUJhdHRlcnlMaWdodC5zZXRGbGFzaGluZyhCQVRURVJZX0xPV19BUkdCLCBMaWdodHNTZXJ2aWNlLkxJR0hUX0ZMQVNIX1RJTUVELAotICAgICAgICAgICAgICAgICAgICAgICAgQkFUVEVSWV9CTElOS19PTiwgQkFUVEVSWV9CTElOS19PRkYpOworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Rmxhc2hpbmcobUJhdHRlcnlMb3dBUkdCLCBMaWdodHNTZXJ2aWNlLkxJR0hUX0ZMQVNIX1RJTUVELAorICAgICAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlMZWRPbiwgbUJhdHRlcnlMZWRPZmYpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1CYXR0ZXJ5Q2hhcmdpbmcpIHsKICAgICAgICAgICAgIGlmIChtQmF0dGVyeUZ1bGwpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpZ2h0LnNldENvbG9yKEJBVFRFUllfRlVMTF9BUkdCKTsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeUxpZ2h0LnNldENvbG9yKG1CYXR0ZXJ5RnVsbEFSR0IpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpZ2h0LnNldENvbG9yKEJBVFRFUllfTUVESVVNX0FSR0IpOworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQuc2V0Q29sb3IobUJhdHRlcnlNZWRpdW1BUkdCKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1CYXR0ZXJ5TGlnaHQudHVybk9mZigpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUHJvY2Vzc1N0YXRzLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qcm9jZXNzU3RhdHMuamF2YQppbmRleCAwMjBmOWVkLi40M2RiY2MwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qcm9jZXNzU3RhdHMuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qcm9jZXNzU3RhdHMuamF2YQpAQCAtODExLDcgKzgxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhtQnVmZmVyLCAwLCAwLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhtQnVmZmVyLCAwLCBpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1ZpYnJhdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlicmF0b3JTZXJ2aWNlLmphdmEKaW5kZXggZjBiNTk1NS4uODZjMzBmOCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlicmF0b3JTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlicmF0b3JTZXJ2aWNlLmphdmEKQEAgLTI0Myw2ICsyNDMsNyBAQAogICAgIC8vIExvY2sgaGVsZCBvbiBtVmlicmF0aW9ucwogICAgIHByaXZhdGUgdm9pZCBzdGFydE5leHRWaWJyYXRpb25Mb2NrZWQoKSB7CiAgICAgICAgIGlmIChtVmlicmF0aW9ucy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgbUN1cnJlbnRWaWJyYXRpb24gPSBudWxsOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50VmlicmF0aW9uID0gbVZpYnJhdGlvbnMuZ2V0Rmlyc3QoKTsKQEAgLTI2OSwxNyArMjcwLDI3IEBACiAgICAgICAgICAgICBWaWJyYXRpb24gdmliID0gaXRlci5uZXh0KCk7CiAgICAgICAgICAgICBpZiAodmliLm1Ub2tlbiA9PSB0b2tlbikgewogICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdW5saW5rVmlicmF0aW9uKHZpYik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHZpYjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBXZSBtaWdodCBiZSBsb29raW5nIGZvciBhIHNpbXBsZSB2aWJyYXRpb24gd2hpY2ggaXMgb25seSBzdG9yZWQgaW4KICAgICAgICAgLy8gbUN1cnJlbnRWaWJyYXRpb24uCiAgICAgICAgIGlmIChtQ3VycmVudFZpYnJhdGlvbiAhPSBudWxsICYmIG1DdXJyZW50VmlicmF0aW9uLm1Ub2tlbiA9PSB0b2tlbikgeworICAgICAgICAgICAgdW5saW5rVmlicmF0aW9uKG1DdXJyZW50VmlicmF0aW9uKTsKICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZpYnJhdGlvbjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdW5saW5rVmlicmF0aW9uKFZpYnJhdGlvbiB2aWIpIHsKKyAgICAgICAgaWYgKHZpYi5tUGF0dGVybiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBWaWJyYXRpb24gb2JqZWN0IGhhcyBhIHBhdHRlcm4sCisgICAgICAgICAgICAvLyB0aGUgVmlicmF0aW9uIG9iamVjdCBoYXMgYWxzbyBiZWVuIGxpbmtlZFRvRGVhdGguCisgICAgICAgICAgICB2aWIubVRva2VuLnVubGlua1RvRGVhdGgodmliLCAwKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgVmlicmF0ZVRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIGZpbmFsIFZpYnJhdGlvbiBtVmlicmF0aW9uOwogICAgICAgICBib29sZWFuIG1Eb25lOwpAQCAtMzU2LDYgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgdmlicmF0aW9uIGZpbmlzaGVkIG5hdHVyYWxseSwgc3RhcnQgdGhlIG5leHQKICAgICAgICAgICAgICAgICAgICAgLy8gdmlicmF0aW9uLgogICAgICAgICAgICAgICAgICAgICBtVmlicmF0aW9ucy5yZW1vdmUobVZpYnJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHVubGlua1ZpYnJhdGlvbihtVmlicmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgc3RhcnROZXh0VmlicmF0aW9uTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2FsbHBhcGVyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dhbGxwYXBlck1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggODU5Yzg1Yy4uOTk3ZTc1MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2FsbHBhcGVyTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XYWxscGFwZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC01ODcsNiArNTg3LDggQEAKICAgICAgICAgICAgICAgICBtSVdpbmRvd01hbmFnZXIucmVtb3ZlV2luZG93VG9rZW4obVdhbGxwYXBlckNvbm5lY3Rpb24ubVRva2VuKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtV2FsbHBhcGVyQ29ubmVjdGlvbi5tU2VydmljZSA9IG51bGw7CisgICAgICAgICAgICBtV2FsbHBhcGVyQ29ubmVjdGlvbi5tRW5naW5lID0gbnVsbDsKICAgICAgICAgICAgIG1XYWxscGFwZXJDb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGVmZDBiYjQuLjY2N2I1NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTIyLDkgKzUyMiw4IEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aHIubVNlcnZpY2U7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhyLm1TZXJ2aWNlOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBXTVRocmVhZCBleHRlbmRzIFRocmVhZCB7CkBAIC0xNDgyLDYgKzE0ODEsNyBAQAogICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdiID0gbG9jYWxtV2luZG93cy5nZXQoZm91bmRJLTEpOwogICAgICAgICAgICAgICAgIGlmICh3Yi5tQmFzZUxheWVyIDwgbWF4TGF5ZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHdiLm1BdHRhY2hlZFdpbmRvdyAhPSBmb3VuZFcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHdiLm1BdHRhY2hlZFdpbmRvdyAhPSBmb3VuZFcubUF0dGFjaGVkV2luZG93ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAod2IubUF0dHJzLnR5cGUgIT0gVFlQRV9BUFBMSUNBVElPTl9TVEFSVElORyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yi5tVG9rZW4gIT0gZm91bmRXLm1Ub2tlbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3aW5kb3cgaXMgbm90IHJlbGF0ZWQgdG8gdGhlIHByZXZpb3VzIG9uZSBpbiBhbnkKQEAgLTU0MjEsNiArNTQyMSw3IEBACiAgICAgICAgIGludCBkZXZpY2VJZCA9IGV2LmdldERldmljZUlkKCk7CiAgICAgICAgIGludCBzY2FuY29kZSA9IGV2LmdldFNjYW5Db2RlKCk7CiAgICAgICAgIGludCBzb3VyY2UgPSBldi5nZXRTb3VyY2UoKTsKKyAgICAgICAgaW50IGZsYWdzID0gZXYuZ2V0RmxhZ3MoKTsKICAgICAgICAgCiAgICAgICAgIGlmIChzb3VyY2UgPT0gSW5wdXREZXZpY2UuU09VUkNFX1VOS05PV04pIHsKICAgICAgICAgICAgIHNvdXJjZSA9IElucHV0RGV2aWNlLlNPVVJDRV9LRVlCT0FSRDsKQEAgLTU0MzAsNyArNTQzMSw3IEBACiAgICAgICAgIGlmIChkb3duVGltZSA9PSAwKSBkb3duVGltZSA9IGV2ZW50VGltZTsKIAogICAgICAgICBLZXlFdmVudCBuZXdFdmVudCA9IG5ldyBLZXlFdmVudChkb3duVGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sIGNvZGUsIHJlcGVhdENvdW50LCBtZXRhU3RhdGUsCi0gICAgICAgICAgICAgICAgZGV2aWNlSWQsIHNjYW5jb2RlLCBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNLCBzb3VyY2UpOworICAgICAgICAgICAgICAgIGRldmljZUlkLCBzY2FuY29kZSwgZmxhZ3MgfCBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNLCBzb3VyY2UpOwogCiAgICAgICAgIGZpbmFsIGludCBwaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTc2MDEsNyArNzYwMiw4IEBACiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gYWxsQXBwV2luZG93cy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKHdpbiA9PSBzdGFydGluZ1dpbmRvdyB8fCB3aW4ubUFwcEZyZWV6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW4ubVZpZXdWaXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luLm1BdHRycy50eXBlID09IFRZUEVfQVBQTElDQVRJT05fU1RBUlRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbi5tQXR0cnMudHlwZSA9PSBUWVBFX0FQUExJQ0FUSU9OX1NUQVJUSU5HCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW4ubURlc3Ryb3lpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZDAwNDAzNC4uODgzZmRkYSAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTUsNiArNTUsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRSZWNlaXZlcjsKQEAgLTExMTYsNyArMTExNyw3IEBACiAgICAgICAgICAgICAgICAgZC5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICBkLnNldFRpdGxlKCJTeXN0ZW0gVUlEcyBJbmNvbnNpc3RlbnQiKTsKICAgICAgICAgICAgICAgICBkLnNldE1lc3NhZ2UoIlVJRHMgb24gdGhlIHN5c3RlbSBhcmUgaW5jb25zaXN0ZW50LCB5b3UgbmVlZCB0byB3aXBlIHlvdXIgZGF0YSBwYXJ0aXRpb24gb3IgeW91ciBkZXZpY2Ugd2lsbCBiZSB1bnN0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICBkLnNldEJ1dHRvbigiSSdtIEZlZWxpbmcgTHVja3kiLAorICAgICAgICAgICAgICAgIGQuc2V0QnV0dG9uKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkUsICJJJ20gRmVlbGluZyBMdWNreSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKElNX0ZFRUxJTkdfTFVDS1lfTVNHKSk7CiAgICAgICAgICAgICAgICAgbVVpZEFsZXJ0ID0gZDsKICAgICAgICAgICAgICAgICBkLnNob3coKTsKQEAgLTM2NzgsMTAgKzM2NzksMTIgQEAKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwa2dzID0gaW50ZW50LmdldFN0cmluZ0FycmF5RXh0cmEoSW50ZW50LkVYVFJBX1BBQ0tBR0VTKTsKICAgICAgICAgICAgICAgICBpZiAocGtncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IHBrZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVN0b3BQYWNrYWdlTG9ja2VkKHBrZywgLTEsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0Q29kZShBY3Rpdml0eS5SRVNVTFRfT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQWN0aXZpdHlNYW5hZ2VyU2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVN0b3BQYWNrYWdlTG9ja2VkKHBrZywgLTEsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKEFjdGl2aXR5LlJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDM4MiwxMiArNDM4NSwxNSBAQAogICAgICAgICBwZXJtLm1vZGVGbGFncyB8PSBtb2RlRmxhZ3M7CiAgICAgICAgIGlmIChvd25lciA9PSBudWxsKSB7CiAgICAgICAgICAgICBwZXJtLmdsb2JhbE1vZGVGbGFncyB8PSBtb2RlRmxhZ3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG1vZGVGbGFncyZJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7Ci0gICAgICAgICAgICBwZXJtLnJlYWRPd25lcnMuYWRkKG93bmVyKTsKLSAgICAgICAgICAgIG93bmVyLmFkZFJlYWRQZXJtaXNzaW9uKHBlcm0pOwotICAgICAgICB9IGVsc2UgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKLSAgICAgICAgICAgIHBlcm0ud3JpdGVPd25lcnMuYWRkKG93bmVyKTsKLSAgICAgICAgICAgIG93bmVyLmFkZFdyaXRlUGVybWlzc2lvbihwZXJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgcGVybS5yZWFkT3duZXJzLmFkZChvd25lcik7CisgICAgICAgICAgICAgICAgIG93bmVyLmFkZFJlYWRQZXJtaXNzaW9uKHBlcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgcGVybS53cml0ZU93bmVycy5hZGQob3duZXIpOworICAgICAgICAgICAgICAgICBvd25lci5hZGRXcml0ZVBlcm1pc3Npb24ocGVybSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY0MzUsNyArNjQ0MSwyOCBAQAogICAgICAgICAgICAgICAgIHNyLmNyYXNoQ291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICAvLyBJZiB0aGUgY3Jhc2hpbmcgcHJvY2VzcyBpcyB3aGF0IHdlIGNvbnNpZGVyIHRvIGJlIHRoZSAiaG9tZSBwcm9jZXNzIiBhbmQgaXQgaGFzIGJlZW4KKyAgICAgICAgLy8gcmVwbGFjZWQgYnkgYSB0aGlyZC1wYXJ0eSBhcHAsIGNsZWFyIHRoZSBwYWNrYWdlIHByZWZlcnJlZCBhY3Rpdml0aWVzIGZyb20gcGFja2FnZXMKKyAgICAgICAgLy8gd2l0aCBhIGhvbWUgYWN0aXZpdHkgcnVubmluZyBpbiB0aGUgcHJvY2VzcyB0byBwcmV2ZW50IGEgcmVwZWF0ZWRseSBjcmFzaGluZyBhcHAKKyAgICAgICAgLy8gZnJvbSBibG9ja2luZyB0aGUgdXNlciB0byBtYW51YWxseSBjbGVhciB0aGUgbGlzdC4KKyAgICAgICAgaWYgKGFwcCA9PSBtSG9tZVByb2Nlc3MgJiYgbUhvbWVQcm9jZXNzLmFjdGl2aXRpZXMuc2l6ZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiAobUhvbWVQcm9jZXNzLmluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pID09IDApIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbUhvbWVQcm9jZXNzLmFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoci5pc0hvbWVBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyBwYWNrYWdlIHByZWZlcnJlZCBhY3Rpdml0aWVzIGZyb20gIiArIHIucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlUaHJlYWQuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xlYXJQYWNrYWdlUHJlZmVycmVkQWN0aXZpdGllcyhyLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBtIGlzIGluIHNhbWUgcHJvY2VzcywgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1Qcm9jZXNzQ3Jhc2hUaW1lcy5wdXQoYXBwLmluZm8ucHJvY2Vzc05hbWUsIGFwcC5pbmZvLnVpZCwgbm93KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNjc5MCw2ICs2ODE3LDkgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZCgiU3ViamVjdDogIikuYXBwZW5kKHN1YmplY3QpLmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIkJ1aWxkOiAiKS5hcHBlbmQoQnVpbGQuRklOR0VSUFJJTlQpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgaWYgKERlYnVnLmlzRGVidWdnZXJDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJEZWJ1Z2dlcjogQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIlxuIik7CiAKICAgICAgICAgLy8gRG8gdGhlIHJlc3QgaW4gYSB3b3JrZXIgdGhyZWFkIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsZXIgb24gSS9PCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKaW5kZXggZjUyZDMyMi4uNDYzNDkzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQpAQCAtMjEzOSw3ICsyMTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgc3RhcnRlZCwgd2hpY2ggbWVhbnMgbm90IGJyaW5naW5nIGl0IHRvIHRoZSBmcm9udAogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2FsbGVyIGlzIG5vdCBpdHNlbGYgaW4gdGhlIGZyb250LgogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCBjdXJUb3AgPSB0b3BSdW5uaW5nTm9uRGVsYXllZEFjdGl2aXR5TG9ja2VkKG5vdFRvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb3AudGFzayAhPSB0YXNrVG9wLnRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvcCAhPSBudWxsICYmIGN1clRvcC50YXNrICE9IHRhc2tUb3AudGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgci5pbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQlJPVUdIVF9UT19GUk9OVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbGxlckF0RnJvbnQgPSBzb3VyY2VSZWNvcmQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjdXJUb3AudGFzayA9PSBzb3VyY2VSZWNvcmQudGFzazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FwcFdhaXRpbmdGb3JEZWJ1Z2dlckRpYWxvZy5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKaW5kZXggOGU5ODE4ZC4uOWZiNDhiMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwV2FpdGluZ0ZvckRlYnVnZ2VyRGlhbG9nLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCkBAIC00OSw3ICs1MCw3IEBACiAgICAgICAgIHRleHQuYXBwZW5kKCIgaXMgd2FpdGluZyBmb3IgdGhlIGRlYnVnZ2VyIHRvIGF0dGFjaC4iKTsKIAogICAgICAgICBzZXRNZXNzYWdlKHRleHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNldEJ1dHRvbigiRm9yY2UgQ2xvc2UiLCBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKDEsIGFwcCkpOworICAgICAgICBzZXRCdXR0b24oRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9QT1NJVElWRSwgIkZvcmNlIENsb3NlIiwgbUhhbmRsZXIub2J0YWluTWVzc2FnZSgxLCBhcHApKTsKICAgICAgICAgc2V0VGl0bGUoIldhaXRpbmcgRm9yIERlYnVnZ2VyIik7CiAgICAgICAgIGdldFdpbmRvdygpLnNldFRpdGxlKCJXYWl0aW5nIEZvciBEZWJ1Z2dlcjogIiArIGFwcC5pbmZvLnByb2Nlc3NOYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0ZhY3RvcnlFcnJvckRpYWxvZy5qYXZhCmluZGV4IDJlMjU0NzQuLmIxOWJiNWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9GYWN0b3J5RXJyb3JEaWFsb2cuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuYW07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKQEAgLTI2LDcgKzI3LDggQEAKICAgICAgICAgc2V0Q2FuY2VsYWJsZShmYWxzZSk7CiAgICAgICAgIHNldFRpdGxlKGNvbnRleHQuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5mYWN0b3J5dGVzdF9mYWlsZWQpKTsKICAgICAgICAgc2V0TWVzc2FnZShtc2cpOwotICAgICAgICBzZXRCdXR0b24oY29udGV4dC5nZXRUZXh0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmZhY3Rvcnl0ZXN0X3JlYm9vdCksCisgICAgICAgIHNldEJ1dHRvbihEaWFsb2dJbnRlcmZhY2UuQlVUVE9OX1BPU0lUSVZFLAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5mYWN0b3J5dGVzdF9yZWJvb3QpLAogICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoMCkpOwogICAgICAgICBnZXRXaW5kb3coKS5zZXRUaXRsZSgiRmFjdG9yeSBFcnJvciIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKaW5kZXggOGU3Y2FkYy4uZDQ1MTNlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZS5jcHAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICBqaW50IGhlYWx0aERlYWQ7CiAgICAgamludCBoZWFsdGhPdmVyVm9sdGFnZTsKICAgICBqaW50IGhlYWx0aFVuc3BlY2lmaWVkRmFpbHVyZTsKKyAgICBqaW50IGhlYWx0aENvbGQ7CiB9Owogc3RhdGljIEJhdHRlcnlNYW5hZ2VyQ29uc3RhbnRzIGdDb25zdGFudHM7CiAKQEAgLTEwNCw2ICsxMDUsNyBAQAogc3RhdGljIGppbnQgZ2V0QmF0dGVyeUhlYWx0aChjb25zdCBjaGFyKiBzdGF0dXMpCiB7CiAgICAgc3dpdGNoIChzdGF0dXNbMF0pIHsKKyAgICAgICAgY2FzZSAnQyc6IHJldHVybiBnQ29uc3RhbnRzLmhlYWx0aENvbGQ7ICAgICAgICAgLy8gQ29sZAogICAgICAgICBjYXNlICdEJzogcmV0dXJuIGdDb25zdGFudHMuaGVhbHRoRGVhZDsgICAgICAgICAvLyBEZWFkCiAgICAgICAgIGNhc2UgJ0cnOiByZXR1cm4gZ0NvbnN0YW50cy5oZWFsdGhHb29kOyAgICAgICAgIC8vIEdvb2QKICAgICAgICAgY2FzZSAnTyc6IHsKQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIAogICAgIGpib29sZWFuIHZhbHVlID0gZmFsc2U7CiAgICAgaWYgKHJlYWRGcm9tRmlsZShwYXRoLCBidWYsIFNJWkUpID4gMCkgewotICAgICAgICBpZiAoYnVmWzBdID09ICcxJykgeworICAgICAgICBpZiAoYnVmWzBdICE9ICcwJykgewogICAgICAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzkwLDYgKzM5Miw5IEBACiAgICAgZ0NvbnN0YW50cy5oZWFsdGhVbnNwZWNpZmllZEZhaWx1cmUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGNsYXp6LCAKICAgICAgICAgICAgIGVudi0+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+cyBmcm9tIGEgbGlzdCBvZiBSYXdTbXNEYXRhCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkLmphdmEKaW5kZXggMWJmMmQzYy4uYTAxYjAwZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9BZG5SZWNvcmQuamF2YQpAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgcHJpdmF0ZSB2b2lkCiAgICAgcGFyc2VSZWNvcmQoYnl0ZVtdIHJlY29yZCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgYWxwaGFUYWcgPSBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nKAorICAgICAgICAgICAgYWxwaGFUYWcgPSBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLCAwLCByZWNvcmQubGVuZ3RoIC0gRk9PVEVSX1NJWkVfQllURVMpOwogCiAgICAgICAgICAgICBpbnQgZm9vdGVyT2Zmc2V0ID0gcmVjb3JkLmxlbmd0aCAtIEZPT1RFUl9TSVpFX0JZVEVTOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZENhY2hlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQppbmRleCBjOGMwNjU4Li5hMTc1ZDQ5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkQ2FjaGUuamF2YQpAQCAtMTg2LDcgKzE4NiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQXJyYXlMaXN0PEFkblJlY29yZD4gIG9sZEFkbkxpc3Q7Ci0gICAgICAgIG9sZEFkbkxpc3QgPSBnZXRSZWNvcmRzSWZMb2FkZWQoZWZpZCk7CisKKyAgICAgICAgaWYgKGVmaWQgPT0gRUZfUEJSKSB7CisgICAgICAgICAgICBvbGRBZG5MaXN0ID0gbVVzaW1QaG9uZUJvb2tNYW5hZ2VyLmxvYWRFZkZpbGVzRnJvbVVzaW0oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZEFkbkxpc3QgPSBnZXRSZWNvcmRzSWZMb2FkZWQoZWZpZCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAob2xkQWRuTGlzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShyZXNwb25zZSwgIkFkbiBsaXN0IG5vdCBleGlzdCBmb3IgRUY6IiArIGVmaWQpOwpAQCAtMjA4LDYgKzIxMywxNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGVmaWQgPT0gRUZfUEJSKSB7CisgICAgICAgICAgICBBZG5SZWNvcmQgZm91bmRBZG4gPSBvbGRBZG5MaXN0LmdldChpbmRleC0xKTsKKyAgICAgICAgICAgIGVmaWQgPSBmb3VuZEFkbi5lZmlkOworICAgICAgICAgICAgZXh0ZW5zaW9uRUYgPSBmb3VuZEFkbi5leHRSZWNvcmQ7CisgICAgICAgICAgICBpbmRleCA9IGZvdW5kQWRuLnJlY29yZE51bWJlcjsKKworICAgICAgICAgICAgbmV3QWRuLmVmaWQgPSBlZmlkOworICAgICAgICAgICAgbmV3QWRuLmV4dFJlY29yZCA9IGV4dGVuc2lvbkVGOworICAgICAgICAgICAgbmV3QWRuLnJlY29yZE51bWJlciA9IGluZGV4OworICAgICAgICB9CisKICAgICAgICAgTWVzc2FnZSBwZW5kaW5nUmVzcG9uc2UgPSB1c2VyV3JpdGVSZXNwb25zZS5nZXQoZWZpZCk7CiAKICAgICAgICAgaWYgKHBlbmRpbmdSZXNwb25zZSAhPSBudWxsKSB7CkBAIC0zMzEsNiArMzQ3LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhZG5MaWtlRmlsZXMuZ2V0KGVmaWQpLnNldChpbmRleCAtIDEsIGFkbik7CisgICAgICAgICAgICAgICAgICAgIG1Vc2ltUGhvbmVCb29rTWFuYWdlci5pbnZhbGlkYXRlQ2FjaGUoKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gdXNlcldyaXRlUmVzcG9uc2UuZ2V0KGVmaWQpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhCmluZGV4IGI5NjIzNzUuLjgxNWZiZmI0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQmFzZUNvbW1hbmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhCkBAIC03MywxMCArNzMsMTAgQEAKICAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtU21zT25TaW1SZWdpc3RyYW50OwogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TbXNTdGF0dXNSZWdpc3RyYW50OwogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1Tc25SZWdpc3RyYW50OwotICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TdGtTZXNzaW9uRW5kUmVnaXN0cmFudDsKLSAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtU3RrUHJvQ21kUmVnaXN0cmFudDsKLSAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtU3RrRXZlbnRSZWdpc3RyYW50OwotICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1TdGtDYWxsU2V0VXBSZWdpc3RyYW50OworICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1DYXRTZXNzaW9uRW5kUmVnaXN0cmFudDsKKyAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtQ2F0UHJvQ21kUmVnaXN0cmFudDsKKyAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtQ2F0RXZlbnRSZWdpc3RyYW50OworICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1DYXRDYWxsU2V0VXBSZWdpc3RyYW50OwogICAgIHByb3RlY3RlZCBSZWdpc3RyYW50IG1JY2NTbXNGdWxsUmVnaXN0cmFudDsKICAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtRW1lcmdlbmN5Q2FsbGJhY2tNb2RlUmVnaXN0cmFudDsKICAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtSWNjUmVmcmVzaFJlZ2lzdHJhbnQ7CkBAIC0zOTUsMzYgKzM5NSwzNiBAQAogICAgICAgICBtU3NuUmVnaXN0cmFudC5jbGVhcigpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldE9uU3RrU2Vzc2lvbkVuZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIG1TdGtTZXNzaW9uRW5kUmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2F0U2Vzc2lvbkVuZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1DYXRTZXNzaW9uRW5kUmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHVuU2V0T25TdGtTZXNzaW9uRW5kKEhhbmRsZXIgaCkgewotICAgICAgICBtU3RrU2Vzc2lvbkVuZFJlZ2lzdHJhbnQuY2xlYXIoKTsKKyAgICBwdWJsaWMgdm9pZCB1blNldE9uQ2F0U2Vzc2lvbkVuZChIYW5kbGVyIGgpIHsKKyAgICAgICAgbUNhdFNlc3Npb25FbmRSZWdpc3RyYW50LmNsZWFyKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0T25TdGtQcm9hY3RpdmVDbWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICBtU3RrUHJvQ21kUmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2F0UHJvYWN0aXZlQ21kKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUNhdFByb0NtZFJlZ2lzdHJhbnQgPSBuZXcgUmVnaXN0cmFudCAoaCwgd2hhdCwgb2JqKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB1blNldE9uU3RrUHJvYWN0aXZlQ21kKEhhbmRsZXIgaCkgewotICAgICAgICBtU3RrUHJvQ21kUmVnaXN0cmFudC5jbGVhcigpOworICAgIHB1YmxpYyB2b2lkIHVuU2V0T25DYXRQcm9hY3RpdmVDbWQoSGFuZGxlciBoKSB7CisgICAgICAgIG1DYXRQcm9DbWRSZWdpc3RyYW50LmNsZWFyKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0T25TdGtFdmVudChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIG1TdGtFdmVudFJlZ2lzdHJhbnQgPSBuZXcgUmVnaXN0cmFudCAoaCwgd2hhdCwgb2JqKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNhdEV2ZW50KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUNhdEV2ZW50UmVnaXN0cmFudCA9IG5ldyBSZWdpc3RyYW50IChoLCB3aGF0LCBvYmopOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHVuU2V0T25TdGtFdmVudChIYW5kbGVyIGgpIHsKLSAgICAgICAgbVN0a0V2ZW50UmVnaXN0cmFudC5jbGVhcigpOworICAgIHB1YmxpYyB2b2lkIHVuU2V0T25DYXRFdmVudChIYW5kbGVyIGgpIHsKKyAgICAgICAgbUNhdEV2ZW50UmVnaXN0cmFudC5jbGVhcigpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldE9uU3RrQ2FsbFNldFVwKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgbVN0a0NhbGxTZXRVcFJlZ2lzdHJhbnQgPSBuZXcgUmVnaXN0cmFudCAoaCwgd2hhdCwgb2JqKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNhdENhbGxTZXRVcChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1DYXRDYWxsU2V0VXBSZWdpc3RyYW50ID0gbmV3IFJlZ2lzdHJhbnQgKGgsIHdoYXQsIG9iaik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdW5TZXRPblN0a0NhbGxTZXRVcChIYW5kbGVyIGgpIHsKLSAgICAgICAgbVN0a0NhbGxTZXRVcFJlZ2lzdHJhbnQuY2xlYXIoKTsKKyAgICBwdWJsaWMgdm9pZCB1blNldE9uQ2F0Q2FsbFNldFVwKEhhbmRsZXIgaCkgeworICAgICAgICBtQ2F0Q2FsbFNldFVwUmVnaXN0cmFudC5jbGVhcigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldE9uSWNjU21zRnVsbChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCmluZGV4IDVkZTlhYTkuLmI4YmY4YWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCkBAIC0zNzQsNDggKzM3NCw0OCBAQAogICAgIHZvaWQgdW5TZXRPblN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKEhhbmRsZXIgaCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBTZXNzaW9uIEVuZCBOb3RpZmljYXRpb25zIGZvciBTVEsuCisgICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgU2Vzc2lvbiBFbmQgTm90aWZpY2F0aW9ucyBmb3IgQ0FULgogICAgICAqIFVubGlrZSB0aGUgcmVnaXN0ZXIqIG1ldGhvZHMsIHRoZXJlJ3Mgb25seSBvbmUgbm90aWZpY2F0aW9uIGhhbmRsZXIKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgZm9yIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgogICAgICAqIEBwYXJhbSB3aGF0IFVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUuCiAgICAgICogQHBhcmFtIG9iaiBVc2VyIG9iamVjdC4KICAgICAgKi8KLSAgICB2b2lkIHNldE9uU3RrU2Vzc2lvbkVuZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKLSAgICB2b2lkIHVuU2V0T25TdGtTZXNzaW9uRW5kKEhhbmRsZXIgaCk7CisgICAgdm9pZCBzZXRPbkNhdFNlc3Npb25FbmQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaik7CisgICAgdm9pZCB1blNldE9uQ2F0U2Vzc2lvbkVuZChIYW5kbGVyIGgpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgUHJvYWN0aXZlIENvbW1hbmRzIGZvciBTVEsuCisgICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgUHJvYWN0aXZlIENvbW1hbmRzIGZvciBDQVQuCiAgICAgICogVW5saWtlIHRoZSByZWdpc3RlciogbWV0aG9kcywgdGhlcmUncyBvbmx5IG9uZSBub3RpZmljYXRpb24gaGFuZGxlcgogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciBmb3Igbm90aWZpY2F0aW9uIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIHdoYXQgVXNlci1kZWZpbmVkIG1lc3NhZ2UgY29kZS4KICAgICAgKiBAcGFyYW0gb2JqIFVzZXIgb2JqZWN0LgogICAgICAqLwotICAgIHZvaWQgc2V0T25TdGtQcm9hY3RpdmVDbWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaik7Ci0gICAgdm9pZCB1blNldE9uU3RrUHJvYWN0aXZlQ21kKEhhbmRsZXIgaCk7CisgICAgdm9pZCBzZXRPbkNhdFByb2FjdGl2ZUNtZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKKyAgICB2b2lkIHVuU2V0T25DYXRQcm9hY3RpdmVDbWQoSGFuZGxlciBoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIEV2ZW50IE5vdGlmaWNhdGlvbnMgZm9yIFNUSy4KKyAgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciBFdmVudCBOb3RpZmljYXRpb25zIGZvciBDQVQuCiAgICAgICogVW5saWtlIHRoZSByZWdpc3RlciogbWV0aG9kcywgdGhlcmUncyBvbmx5IG9uZSBub3RpZmljYXRpb24gaGFuZGxlcgogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciBmb3Igbm90aWZpY2F0aW9uIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIHdoYXQgVXNlci1kZWZpbmVkIG1lc3NhZ2UgY29kZS4KICAgICAgKiBAcGFyYW0gb2JqIFVzZXIgb2JqZWN0LgogICAgICAqLwotICAgIHZvaWQgc2V0T25TdGtFdmVudChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKLSAgICB2b2lkIHVuU2V0T25TdGtFdmVudChIYW5kbGVyIGgpOworICAgIHZvaWQgc2V0T25DYXRFdmVudChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKKyAgICB2b2lkIHVuU2V0T25DYXRFdmVudChIYW5kbGVyIGgpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGFuZGxlciBmb3IgQ2FsbCBTZXQgVXAgTm90aWZpY2F0aW9ucyBmb3IgU1RLLgorICAgICAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIENhbGwgU2V0IFVwIE5vdGlmaWNhdGlvbnMgZm9yIENBVC4KICAgICAgKiBVbmxpa2UgdGhlIHJlZ2lzdGVyKiBtZXRob2RzLCB0aGVyZSdzIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBoYW5kbGVyCiAgICAgICoKICAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIGZvciBub3RpZmljYXRpb24gbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgogICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCiAgICAgICovCi0gICAgdm9pZCBzZXRPblN0a0NhbGxTZXRVcChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKTsKLSAgICB2b2lkIHVuU2V0T25TdGtDYWxsU2V0VXAoSGFuZGxlciBoKTsKKyAgICB2b2lkIHNldE9uQ2F0Q2FsbFNldFVwKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopOworICAgIHZvaWQgdW5TZXRPbkNhdENhbGxTZXRVcChIYW5kbGVyIGgpOwogCiAgICAgLyoqCiAgICAgICogRW5hYmxlcy9kaXNiYWJsZXMgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIHJlbGF0ZWQgbm90aWZpY2F0aW9ucyBmcm9tCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVNtcy5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lTbXMuYWlkbAppbmRleCA2NWJhZDk2Li45MGRlNWUxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVNtcy5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JU21zLmFpZGwKQEAgLTE0NCw0ICsxNDQsMzAgQEAKICAgICAgICAgICAgIGluIExpc3Q8U3RyaW5nPiBwYXJ0cywgaW4gTGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50cywKICAgICAgICAgICAgIGluIExpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKTsKIAorICAgIC8qKgorICAgICAqIEVuYWJsZSByZWNlcHRpb24gb2YgY2VsbCBicm9hZGNhc3QgKFNNUy1DQikgbWVzc2FnZXMgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIuIE5vdGUgdGhhdCBpZiB0d28gZGlmZmVyZW50IGNsaWVudHMgZW5hYmxlIHRoZSBzYW1lCisgICAgICogbWVzc2FnZSBpZGVudGlmaWVyLCB0aGV5IG11c3QgYm90aCBkaXNhYmxlIGl0IGZvciB0aGUgZGV2aWNlIHRvIHN0b3AKKyAgICAgKiByZWNlaXZpbmcgdGhvc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZUlkZW50aWZpZXIgTWVzc2FnZSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiBUUyAyMy4wNDEKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2VlICNkaXNhYmxlQ2VsbEJyb2FkY2FzdChpbnQpCisgICAgICovCisgICAgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcik7CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllci4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAorICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlSWRlbnRpZmllciBNZXNzYWdlIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIFRTIDIzLjA0MQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIEBzZWUgI2VuYWJsZUNlbGxCcm9hZGNhc3QoaW50KQorICAgICAqLworICAgIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKTsKKwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lXYXBQdXNoTWFuYWdlci5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lXYXBQdXNoTWFuYWdlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWNiOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVdhcFB1c2hNYW5hZ2VyLmFpZGwKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworaW50ZXJmYWNlIElXYXBQdXNoTWFuYWdlciB7CisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIFdBUCBwdXNoIG1lc3NhZ2UgYW5kIHRyaWdnZXJzIHRoZSByZWNlaXZlciBhcHBsaWNhdGlvbiByZWdpc3RlcmVkCisgICAgICogaW4gdGhlIGFwcGxpY2F0aW9uIElEIHRhYmxlLgorICAgICAqLworICAgIGludCBwcm9jZXNzTWVzc2FnZShTdHJpbmcgYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLCBpbiBJbnRlbnQgaW50ZW50KTsKKworICAgIC8qKgorICAgICAqIEFkZCByZWNlaXZlciBhcHBsaWNhdGlvbiBpbnRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0YWJsZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW5zZXJ0aW5nIHRoZSBpbmZvcm1hdGlvbiBpcyBzdWNjZXNzZnVsbC4gSW5zZXJ0aW5nIHRoZSBkdXBsaWNhdGVkCisgICAgICogcmVjb3JkIGluIHRoZSBhcHBsaWNhdGlvbiBJRCB0YWJsZSBpcyBub3QgYWxsb3dlZC4gVXNlIHVwZGF0ZS9kZWxldGUgbWV0aG9kLgorICAgICAqLworICAgIGJvb2xlYW4gYWRkUGFja2FnZShTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lLCBTdHJpbmcgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgIGludCBhcHBfdHlwZSwgYm9vbGVhbiBuZWVkX3NpZ25hdHVyZSwgYm9vbGVhbiBmdXJ0aGVyX3Byb2Nlc3NpbmcpOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyByZWNlaXZlciBhcHBsaWNhdGlvbiB0aGF0IGlzIGxhc3QgYWRkZWQuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHVwZGF0aW5nIHRoZSBpbmZvcm1hdGlvbiBpcyBzdWNjZXNzZnVsbC4KKyAgICAgKi8KKyAgICBib29sZWFuIHVwZGF0ZVBhY2thZ2UoU3RyaW5nIHhfYXBwX2lkLCBTdHJpbmcgY29udGVudF90eXBlLAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSwgU3RyaW5nIGNsYXNzX25hbWUsCisgICAgICAgICAgICBpbnQgYXBwX3R5cGUsIGJvb2xlYW4gbmVlZF9zaWduYXR1cmUsIGJvb2xlYW4gZnVydGhlcl9wcm9jZXNzaW5nKTsKKworICAgIC8qKgorICAgICAqIERlbGl0ZXMgcmVjZWl2ZXIgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uCisgICAgICogUmV0dXJucyB0cnVlIGlmIGRlbGV0aW5nIGlzIHN1Y2Nlc3NmdWxsLgorICAgICAqLworICAgIGJvb2xlYW4gZGVsZXRlUGFja2FnZShTdHJpbmcgeF9hcHBfaWQsIFN0cmluZyBjb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSwgU3RyaW5nIGNsYXNzX25hbWUpOworfQorCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQppbmRleCBkM2EzNGVjLi5lMjcwY2U5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKQEAgLTQ4Nyw2ICs0ODcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kc0ludGVyZmFjZS5TRVJWSUNFX0NMQVNTX0RBVEEgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRzSW50ZXJmYWNlLlNFUlZJQ0VfQ0xBU1NfRkFYOwogCisgICAgICAgICAgICBpZiAoIW1QaG9uZS5tSXNUaGVDdXJyZW50QWN0aXZlUGhvbmUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShtTG9nVGFnLCAiUmVjZWl2ZWQgbWVzc2FnZSAiICsgbXNnICsgIlsiICsgbXNnLndoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpbGUgYmVpbmcgZGVzdHJveWVkLiBJZ25vcmluZy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFOgogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBudWxsOwpAQCAtNjI2LDcgKzYzMiwxMyBAQAogICAgICAgICAgICAgICAgIGluZGV4ID0gbUljY0NhcmRTdGF0dXMuZ2V0R3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEljY0NhcmRBcHBsaWNhdGlvbiBhcHAgPSBtSWNjQ2FyZFN0YXR1cy5nZXRBcHBsaWNhdGlvbihpbmRleCk7CisgICAgICAgICAgICBJY2NDYXJkQXBwbGljYXRpb24gYXBwOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBJY2NDYXJkU3RhdHVzLkNBUkRfTUFYX0FQUFMpIHsKKyAgICAgICAgICAgICAgICBhcHAgPSBtSWNjQ2FyZFN0YXR1cy5nZXRBcHBsaWNhdGlvbihpbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJbSWNjQ2FyZF0gSW52YWxpZCBTdWJzY3JpcHRpb24gQXBwbGljYXRpb24gaW5kZXg6IiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJbSWNjQ2FyZF0gU3Vic2NyaXB0aW9uIEFwcGxpY2F0aW9uIGluIG5vdCBwcmVzZW50Iik7CkBAIC02NzIsMTIgKzY4NCwxMSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIElDQyBjYXJkIGlzIHByZXNlbnQKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJY2NDYXJkKCkgewotICAgICAgICBib29sZWFuIGlzSWNjUHJlc2VudDsKLSAgICAgICAgaWYgKG1QaG9uZS5nZXRQaG9uZU5hbWUoKS5lcXVhbHMoIkdTTSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljY0NhcmRTdGF0dXMuZ2V0Q2FyZFN0YXRlKCkuaXNDYXJkUHJlc2VudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETzogTWFrZSB3b3JrIHdpdGggYSBDRE1BIGRldmljZSB3aXRoIGEgUlVJTSBjYXJkLgorICAgICAgICBpZiAobUljY0NhcmRTdGF0dXMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmV0dXJucyBJQ0MgY2FyZCBzdGF0dXMgZm9yIGJvdGggR1NNIGFuZCBDRE1BIG1vZGUKKyAgICAgICAgICAgIHJldHVybiBtSWNjQ2FyZFN0YXR1cy5nZXRDYXJkU3RhdGUoKS5pc0NhcmRQcmVzZW50KCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YQppbmRleCBhY2M5MTk3Li5iMTJkMmQ0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ29uc3RhbnRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9TUE5fQ1BIUyA9IDB4NmYxNDsKICAgICBzdGF0aWMgZmluYWwgaW50IEVGX1NQTl9TSE9SVF9DUEhTID0gMHg2ZjE4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfSU5GT19DUEhTID0gMHg2ZjE2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NQX0NQSFMgPSAweDZmMTU7CiAKICAgICAvLyBDRE1BIFJVSU0gZmlsZSBpZHMgZnJvbSAzR1BQMiBDLlMwMDIzLTAKICAgICBzdGF0aWMgZmluYWwgaW50IEVGX0NTVCA9IDB4NmYzMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDlmOGU1N2YuLjJmMjJkNzQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNjIsOCArNjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2QoIkdFVF9SRUNPUkRfU0laRSBTaXplICIgKyByZWNvcmRTaXplWzBdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG90YWwgIiArIHJlY29yZFNpemVbMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAjcmVjb3JkICIgKyByZWNvcmRTaXplWzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX0RPTkU6CkBAIC0xNDQsNiArMTQ0LDkgQEAKICAgICAgICAgaWYgKERCRykgbG9nZCgidXBkYXRlQWRuUmVjb3Jkc0luRWZCeVNlYXJjaDogZWZpZD0iICsgZWZpZCArCiAgICAgICAgICAgICAgICAgIiAoIisgb2xkVGFnICsgIiwiICsgb2xkUGhvbmVOdW1iZXIgKyAiKSIrICI9PT4iICsKICAgICAgICAgICAgICAgICAiICgiKyBuZXdUYWcgKyAiLCIgKyBuZXdQaG9uZU51bWJlciArICIpIisgIiBwaW4yPSIgKyBwaW4yKTsKKworICAgICAgICBlZmlkID0gdXBkYXRlRWZGb3JJY2NUeXBlKGVmaWQpOworCiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyUHJveHkuamF2YQppbmRleCAxOTEwYTljLi41MDQ5MjQ5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlclByb3h5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXJQcm94eS5qYXZhCkBAIC02OCw0ICs2OCwxMiBAQAogICAgICAgICAgICAgICAgIHBhcnRzLCBzZW50SW50ZW50cywgZGVsaXZlcnlJbnRlbnRzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmVuYWJsZUNlbGxCcm9hZGNhc3QobWVzc2FnZUlkZW50aWZpZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmRpc2FibGVDZWxsQnJvYWRjYXN0KG1lc3NhZ2VJZGVudGlmaWVyKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKaW5kZXggNzE5MzZmMS4uNWJkNzUyMyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKQEAgLTUxLDYgKzUxLDggQEAKICAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpKCcwJyArIHYpKTsKIAogICAgICAgICAgICAgdiA9IChkYXRhW2ldID4+IDQpICYgMHhmOworICAgICAgICAgICAgLy8gU29tZSBQTE1OcyBoYXZlICdmJyBhcyBoaWdoIG5pYmJsZSwgaWdub3JlIGl0CisgICAgICAgICAgICBpZiAodiA9PSAweGYpIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKHYgPiA5KSAgYnJlYWs7CiAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKSgnMCcgKyB2KSk7CiAgICAgICAgIH0KQEAgLTE0OCw2ICsxNTAsNDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nVWNzMkhlbHBlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHMgPSBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nR3NtOEJpdEhlbHBlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbWV0aG9kIHtAbGluayAjYWRuU3RyaW5nRmllbGRUb1N0cmluZ30uCisgICAgICoKKyAgICAgKiBFeGNlcHRpb246CisgICAgICogSWYgdGhlIFNJTSBpcyBLb3JlYW4gKE1DQyBlcXVhbHMgIjQ1MCIpLCBLU0M1NjAxIGVuY29kaW5nIHdpbGwgYmUKKyAgICAgKiBhc3N1bWVkIChpbnN0ZWFkIG9mIEdTTThCaXQpLiBUaGlzIGNvdWxkIGxlYWQgdG8gdW5pbnRlbmRlZCBjb25zZXF1ZW5jZXMsCisgICAgICogaWYgdGhlIEFETiBhbHBoYVRhZyB3YXMgc2F2ZWQgd2l0aCBHU004Qml0LiBUaGlzIGlzIGNvbnNpZGVyZWQgYW4KKyAgICAgKiBhY2NlcHRhYmxlIHJpc2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nVWNzMkhlbHBlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBieXRlIHN0b3AgPSAoYnl0ZSkweEZGOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuIDwgbGVuZ3RoICYmIGRhdGFbbGVuXSAhPSBzdG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBvZmZzZXQsIGxlbiwgIktTQzU2MDEiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImltcGxhdXNpYmxlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nR3NtOEJpdEhlbHBlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nCisgICAgYWRuU3RyaW5nRmllbGRUb1N0cmluZ1VjczJIZWxwZXIoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKICAgICAgICAgaWYgKGxlbmd0aCA+PSAxKSB7CiAgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdID09IChieXRlKSAweDgwKSB7CiAgICAgICAgICAgICAgICAgaW50IHVjc2xlbiA9IChsZW5ndGggLSAxKSAvIDI7CkBAIC0yMjMsNiArMjY2LDExIEBACiAgICAgICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcKKyAgICBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nR3NtOEJpdEhlbHBlcihieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgICByZXR1cm4gR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQppbmRleCBjN2Q0ZWFkLi4yNjM4MDU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQpAQCAtMTcxNyw0ICsxNzE3LDE1IEBACiAgICAgdm9pZCB1bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZShIYW5kbGVyIGgpOwogCiAKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGRpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBwcm9wZXJ0eSBpcyBub3QgZ29vZC4KKyAgICAgKiBBIGZ1Y250aW9uIG9mIHR5cGUgZ2V0UGhvbmVQcm9wKHByb3BUeXBlKSB3aGVyZSBwcm9wVHlwZSBpcyBhbgorICAgICAqIGVudW0gb2YgR1NNK0NETUErTFRFIHByb3BzIHdvdWxkIGJlIGEgYmV0dGVyIGFwcHJvYWNoLgorICAgICAqCisgICAgICogR2V0ICJSZXN0cmljdGlvbiBvZiBtZW51IG9wdGlvbnMgZm9yIG1hbnVhbCBQTE1OIHNlbGVjdGlvbiIgYml0CisgICAgICogc3RhdHVzIGZyb20gRUZfQ1NQIGRhdGEsIHRoaXMgYmVsb25ncyB0byAiVmFsdWUgQWRkZWQgU2VydmljZXMgR3JvdXAiLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGJpdCBpcyBzZXQgb3IgRUZfQ1NQIGRhdGEgaXMgdW5hdmFpbGFibGUsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBpc0NzcFBsbW5FbmFibGVkKCk7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKaW5kZXggOWM2YjQzMi4uZjE1ZDViMiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQpAQCAtMTAyMCw2ICsxMDIwLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NzcFBsbW5FbmFibGVkKCkgeworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjbGFzcyBHU01QaG9uZS4KKyAgICAgICAgLy8gTm90IGltcGxlbWVudGVkIGluIENETUFQaG9uZS4KKyAgICAgICAgbG9nVW5leHBlY3RlZEdzbU1ldGhvZENhbGwoImlzQ3NwUGxtbkVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbW1vbiBlcnJvciBsb2dnZXIgbWV0aG9kIGZvciB1bmV4cGVjdGVkIGNhbGxzIHRvIENETUEtb25seSBtZXRob2RzLgogICAgICAqLwpAQCAtMTAyOCw0ICsxMDM1LDEyIEBACiAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgIiArIG5hbWUgKyAiKCkgaW4gUGhvbmVCYXNlIHNob3VsZCBub3QgYmUgIiArCiAgICAgICAgICAgICAgICAgImNhbGxlZCwgQ0RNQVBob25lIGluYWN0aXZlLiIpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBlcnJvciBsb2dnZXIgbWV0aG9kIGZvciB1bmV4cGVjdGVkIGNhbGxzIHRvIEdTTS9XQ0RNQS1vbmx5IG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1VuZXhwZWN0ZWRHc21NZXRob2RDYWxsKFN0cmluZyBuYW1lKSB7CisgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgIiArIG5hbWUgKyAiKCkgaW4gUGhvbmVCYXNlIHNob3VsZCBub3QgYmUgIiArCisgICAgICAgICAgICAgICAgImNhbGxlZCwgR1NNUGhvbmUgaW5hY3RpdmUuIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKaW5kZXggNmYwODg2OC4uNzdmMWU2YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCkBAIC04NDMsNCArODQzLDggQEAKICAgICBwdWJsaWMgdm9pZCB1bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZShIYW5kbGVyIGgpewogICAgICAgICBtQWN0aXZlUGhvbmUudW5zZXRPbkVjYk1vZGVFeGl0UmVzcG9uc2UoaCk7CiAgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDc3BQbG1uRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc0NzcFBsbW5FbmFibGVkKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCmluZGV4IDA5YTQ1MDYuLmUwNTk1NTUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKQEAgLTE0MSw2ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgIHRoaXMubU5leHQgPSBzUG9vbDsKICAgICAgICAgICAgICAgICBzUG9vbCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgc1Bvb2xTaXplKys7CisgICAgICAgICAgICAgICAgbVJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzAsNiArMzcxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnIub25FcnJvcihHRU5FUklDX0ZBSUxVUkUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyLnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGFyZSAiRG9uZSIgb25seSBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RzIG9yIHJlcGxpZXMuIFRodXMgdGhpcyBjb2RlIHBhdGggd2lsbCBvbmx5IHJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWtlIGxvY2sgb24gZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrSWZEb25lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlTdWJ0cmFjdGVkICYmIG1SZXF1ZXN0TWVzc2FnZXNQZW5kaW5nID4gMCkgewpAQCAtMTk4OSwyNiArMTk5NSwzMCBAQAogICAgICAgICBzZW5kU2NyZWVuU3RhdGUodHJ1ZSk7CiAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0UmFkaW9TdGF0ZUZyb21SSUxJbnQoaW50IHN0YXRlKSB7Ci0gICAgICAgIFJhZGlvU3RhdGUgbmV3U3RhdGU7CisgICAgcHJpdmF0ZSBSYWRpb1N0YXRlIGdldFJhZGlvU3RhdGVGcm9tSW50KGludCBzdGF0ZUludCkgeworICAgICAgICBSYWRpb1N0YXRlIHN0YXRlOwogCiAgICAgICAgIC8qIFJJTF9SYWRpb1N0YXRlIHJpbC5oICovCi0gICAgICAgIHN3aXRjaChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuUkFESU9fT0ZGOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLlJBRElPX1VOQVZBSUxBQkxFOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLlNJTV9OT1RfUkVBRFk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX0xPQ0tFRF9PUl9BQlNFTlQ7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX1JFQURZOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLlJVSU1fTk9UX1JFQURZOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLlJVSU1fUkVBRFk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OiBuZXdTdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9MT0NLRURfT1JfQUJTRU5UOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODogbmV3U3RhdGUgPSBSYWRpb1N0YXRlLk5WX05PVF9SRUFEWTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk6IG5ld1N0YXRlID0gUmFkaW9TdGF0ZS5OVl9SRUFEWTsgYnJlYWs7CisgICAgICAgIHN3aXRjaChzdGF0ZUludCkgeworICAgICAgICAgICAgY2FzZSAwOiBzdGF0ZSA9IFJhZGlvU3RhdGUuUkFESU9fT0ZGOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogc3RhdGUgPSBSYWRpb1N0YXRlLlJBRElPX1VOQVZBSUxBQkxFOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogc3RhdGUgPSBSYWRpb1N0YXRlLlNJTV9OT1RfUkVBRFk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBzdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX0xPQ0tFRF9PUl9BQlNFTlQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiBzdGF0ZSA9IFJhZGlvU3RhdGUuU0lNX1JFQURZOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogc3RhdGUgPSBSYWRpb1N0YXRlLlJVSU1fTk9UX1JFQURZOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjogc3RhdGUgPSBSYWRpb1N0YXRlLlJVSU1fUkVBRFk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OiBzdGF0ZSA9IFJhZGlvU3RhdGUuUlVJTV9MT0NLRURfT1JfQUJTRU5UOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODogc3RhdGUgPSBSYWRpb1N0YXRlLk5WX05PVF9SRUFEWTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk6IHN0YXRlID0gUmFkaW9TdGF0ZS5OVl9SRUFEWTsgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBSSUxfUmFkaW9TdGF0ZTogIiArc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgUklMX1JhZGlvU3RhdGU6ICIgKyBzdGF0ZUludCk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzd2l0Y2hUb1JhZGlvU3RhdGUoUmFkaW9TdGF0ZSBuZXdTdGF0ZSkgewogCiAgICAgICAgIGlmIChtSW5pdGlhbFJhZGlvU3RhdGVDaGFuZ2UpIHsKICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5pc09uKCkpIHsKQEAgLTIwNjcsNiArMjA3NywxMiBAQAogICAgIHNlbmQoUklMUmVxdWVzdCBycikgewogICAgICAgICBNZXNzYWdlIG1zZzsKIAorICAgICAgICBpZiAobVNvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICByci5vbkVycm9yKFJBRElPX05PVF9BVkFJTEFCTEUsIG51bGwpOworICAgICAgICAgICAgcnIucmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgbXNnID0gbVNlbmRlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NFTkQsIHJyKTsKIAogICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKQEAgLTIzOTgsNyArMjQxNCw3IEBACiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNUUklDVEVEX1NUQVRFX0NIQU5HRUQ6IHJldCA9IHJlc3BvbnNlSW50cyhwKTsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNQT05TRV9TSU1fU1RBVFVTX0NIQU5HRUQ6ICByZXQgPSAgcmVzcG9uc2VWb2lkKHApOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX0NETUFfTkVXX1NNUzogIHJldCA9ICByZXNwb25zZUNkbWFTbXMocCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX0JST0FEQ0FTVF9TTVM6ICByZXQgPSAgcmVzcG9uc2VTdHJpbmcocCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX0JST0FEQ0FTVF9TTVM6ICByZXQgPSAgcmVzcG9uc2VSYXcocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfQ0RNQV9SVUlNX1NNU19TVE9SQUdFX0ZVTEw6ICByZXQgPSAgcmVzcG9uc2VWb2lkKHApOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX0VOVEVSX0VNRVJHRU5DWV9DQUxMQkFDS19NT0RFOiByZXQgPSByZXNwb25zZVZvaWQocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfQ0RNQV9DQUxMX1dBSVRJTkc6IHJldCA9IHJlc3BvbnNlQ2RtYUNhbGxXYWl0aW5nKHApOyBicmVhazsKQEAgLTI0MjAsOSArMjQzNiwxMCBAQAogICAgICAgICBzd2l0Y2gocmVzcG9uc2UpIHsKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX1JBRElPX1NUQVRFX0NIQU5HRUQ6CiAgICAgICAgICAgICAgICAgLyogaGFzIGJvbnVzIHJhZGlvIHN0YXRlIGludCAqLwotICAgICAgICAgICAgICAgIHNldFJhZGlvU3RhdGVGcm9tUklMSW50KHAucmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICBSYWRpb1N0YXRlIG5ld1N0YXRlID0gZ2V0UmFkaW9TdGF0ZUZyb21JbnQocC5yZWFkSW50KCkpOworICAgICAgICAgICAgICAgIGlmIChSSUxKX0xPR0QpIHVuc2xqTG9nTW9yZShyZXNwb25zZSwgbmV3U3RhdGUudG9TdHJpbmcoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoUklMSl9MT0dEKSB1bnNsakxvZ01vcmUocmVzcG9uc2UsIG1TdGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2hUb1JhZGlvU3RhdGUobmV3U3RhdGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNQT05TRV9DQUxMX1NUQVRFX0NIQU5HRUQ6CiAgICAgICAgICAgICAgICAgaWYgKFJJTEpfTE9HRCkgdW5zbGpMb2cocmVzcG9uc2UpOwpAQCAtMjU0MCw4ICsyNTU3LDggQEAKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1NUS19TRVNTSU9OX0VORDoKICAgICAgICAgICAgICAgICBpZiAoUklMSl9MT0dEKSB1bnNsakxvZyhyZXNwb25zZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAobVN0a1Nlc3Npb25FbmRSZWdpc3RyYW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0a1Nlc3Npb25FbmRSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCisgICAgICAgICAgICAgICAgaWYgKG1DYXRTZXNzaW9uRW5kUmVnaXN0cmFudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYXRTZXNzaW9uRW5kUmVnaXN0cmFudC5ub3RpZnlSZWdpc3RyYW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Jlc3VsdCAobnVsbCwgcmV0LCBudWxsKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0OSw4ICsyNTY2LDggQEAKICAgICAgICAgICAgIGNhc2UgUklMX1VOU09MX1NUS19QUk9BQ1RJVkVfQ09NTUFORDoKICAgICAgICAgICAgICAgICBpZiAoUklMSl9MT0dEKSB1bnNsakxvZ1JldChyZXNwb25zZSwgcmV0KTsKIAotICAgICAgICAgICAgICAgIGlmIChtU3RrUHJvQ21kUmVnaXN0cmFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGtQcm9DbWRSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCisgICAgICAgICAgICAgICAgaWYgKG1DYXRQcm9DbWRSZWdpc3RyYW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhdFByb0NtZFJlZ2lzdHJhbnQubm90aWZ5UmVnaXN0cmFudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNSZXN1bHQgKG51bGwsIHJldCwgbnVsbCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1NTgsOCArMjU3NSw4IEBACiAgICAgICAgICAgICBjYXNlIFJJTF9VTlNPTF9TVEtfRVZFTlRfTk9USUZZOgogICAgICAgICAgICAgICAgIGlmIChSSUxKX0xPR0QpIHVuc2xqTG9nUmV0KHJlc3BvbnNlLCByZXQpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1TdGtFdmVudFJlZ2lzdHJhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RrRXZlbnRSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCisgICAgICAgICAgICAgICAgaWYgKG1DYXRFdmVudFJlZ2lzdHJhbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ2F0RXZlbnRSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jUmVzdWx0IChudWxsLCByZXQsIG51bGwpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTY3LDggKzI1ODQsOCBAQAogICAgICAgICAgICAgY2FzZSBSSUxfVU5TT0xfU1RLX0NBTExfU0VUVVA6CiAgICAgICAgICAgICAgICAgaWYgKFJJTEpfTE9HRCkgdW5zbGpMb2dSZXQocmVzcG9uc2UsIHJldCk7CiAKLSAgICAgICAgICAgICAgICBpZiAobVN0a0NhbGxTZXRVcFJlZ2lzdHJhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RrQ2FsbFNldFVwUmVnaXN0cmFudC5ub3RpZnlSZWdpc3RyYW50KAorICAgICAgICAgICAgICAgIGlmIChtQ2F0Q2FsbFNldFVwUmVnaXN0cmFudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYXRDYWxsU2V0VXBSZWdpc3RyYW50Lm5vdGlmeVJlZ2lzdHJhbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jUmVzdWx0IChudWxsLCByZXQsIG51bGwpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNDY5LDYgKzM0ODYsOCBAQAogICAgICAgICBSSUxSZXF1ZXN0IHJyID0gUklMUmVxdWVzdC5vYnRhaW4oCiAgICAgICAgICAgICAgICAgUklMQ29uc3RhbnRzLlJJTF9SRVFVRVNUX1FVRVJZX1RUWV9NT0RFLCByZXNwb25zZSk7CiAKKyAgICAgICAgaWYgKFJJTEpfTE9HRCkgcmlsakxvZyhyci5zZXJpYWxTdHJpbmcoKSArICI+ICIgKyByZXF1ZXN0VG9TdHJpbmcocnIubVJlcXVlc3QpKTsKKwogICAgICAgICBzZW5kKHJyKTsKICAgICB9CiAKQEAgLTM0ODIsNiArMzUwMSw5IEBACiAgICAgICAgIHJyLm1wLndyaXRlSW50KDEpOwogICAgICAgICByci5tcC53cml0ZUludCh0dHlNb2RlKTsKIAorICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKHJyLnNlcmlhbFN0cmluZygpICsgIj4gIiArIHJlcXVlc3RUb1N0cmluZyhyci5tUmVxdWVzdCkKKyAgICAgICAgICAgICAgICArICIgOiAiICsgdHR5TW9kZSk7CisKICAgICAgICAgc2VuZChycik7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQppbmRleCAwYjEyYjM0Li5hZDM0NTUwIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTExMyw2ICsxMTMsOSBAQAogICAgIC8qKiBSYWRpbyBpcyBPTiAqLwogICAgIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgaW50IEVWRU5UX1JBRElPX09OID0gMTI7CiAKKyAgICAvKiogTmV3IGJyb2FkY2FzdCBTTVMgKi8KKyAgICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGludCBFVkVOVF9ORVdfQlJPQURDQVNUX1NNUyA9IDEzOworCiAgICAgcHJvdGVjdGVkIFBob25lIG1QaG9uZTsKICAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKQEAgLTM5Myw2ICszOTYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVQT1JUX01FTU9SWV9TVEFUVVNfRE9ORSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFVkVOVF9ORVdfQlJPQURDQVNUX1NNUzoKKyAgICAgICAgICAgIGhhbmRsZUJyb2FkY2FzdFNtcygoQXN5bmNSZXN1bHQpbXNnLm9iaik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAwNCw0ICsxMDExLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlQnJvYWRjYXN0U21zKEFzeW5jUmVzdWx0IGFyKTsKKworICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoQnJvYWRjYXN0UGR1cyhieXRlW11bXSBwZHVzKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJhbmRyb2lkLnByb3ZpZGVyLnRlbGVwaG9ueS5TTVNfQ0JfUkVDRUlWRUQiKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVzIiwgcGR1cyk7CisKKyAgICAgICAgaWYgKENvbmZpZy5MT0dEKQorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGlzcGF0Y2hpbmcgIiArIHBkdXMubGVuZ3RoICsgIiBTTVMgQ0IgcGR1cyIpOworCisgICAgICAgIGRpc3BhdGNoKGludGVudCwgImFuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX1NNUyIpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVJlZ2lvbkNhY2hlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUmVnaW9uQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Y2ZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVJlZ2lvbkNhY2hlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworCitwdWJsaWMgY2xhc3MgU2ltUmVnaW9uQ2FjaGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1DQ19VTlNFVCAgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQ0NfS09SRUFOID0gNDUwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlZ2lvbkZyb21NY2MgPSBNQ0NfVU5TRVQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZWdpb24gYXMgcmVhZCBmcm9tIHRoZSBNQ0Mgb2YgdGhlIFNJTSBjYXJkLgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSB7QGxpbmsgVGVsZXBob255UHJvcGVydGllcyMKKyAgICAgKiBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQ30KKyAgICAgKiByZXR1cm5zIG51bGwgb3IgYW4gZW1wdHkgU3RyaW5nLCB0aGUgdmFsdWUgaXMge0BsaW5rICNNQ0NfVU5TRVR9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjYWNoZWQgcmVnaW9uLCBpZiBzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UmVnaW9uKCkgeworICAgICAgICBpZiAocmVnaW9uRnJvbU1jYyA9PSBNQ0NfVU5TRVQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwbG1uID0gU3lzdGVtUHJvcGVydGllcy5nZXQoCisgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueVByb3BlcnRpZXMuUFJPUEVSVFlfSUNDX09QRVJBVE9SX05VTUVSSUMsCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgICAgICBpZiAocGxtbiAhPSBudWxsICYmIHBsbW4ubGVuZ3RoKCkgPj0gMykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkZyb21NY2MgPSBJbnRlZ2VyLnBhcnNlSW50KHBsbW4uc3Vic3RyaW5nKDAsIDMpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdGhhdCBjYW4gYmUgZG9uZSBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVnaW9uRnJvbU1jYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE1hbmFnZXJQYXJhbXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXBQdXNoTWFuYWdlclBhcmFtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE1hbmFnZXJQYXJhbXMuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKKy8qKgorICogV2FwUHVzaE1hbmFnZXIgY29uc3RhbnQgdmFsdWUgZGVmaW5pdGlvbnMKKyAqLworcHVibGljIGNsYXNzIFdhcFB1c2hNYW5hZ2VyUGFyYW1zIHsKKyAgICAvKioKKyAgICAgKiBBcHBsaWNhdGlvbiB0eXBlIGFjdGl2aXR5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1RZUEVfQUNUSVZJVFkgPSAwOworCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gdHlwZSBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1RZUEVfU0VSVklDRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIE1lc3NhZ2UgcmV0dXJuIHZhbHVlCisgICAgICogTWVzc2FnZSBpcyBoYW5kbGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9IQU5ETEVEID0gMHgxOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBNZXNzYWdlIHJldHVybiB2YWx1ZQorICAgICAqIEFwcGxpY2F0aW9uIElEIG9yIGNvbnRlbnQgdHlwZSB3YXMgbm90IGZvdW5kIGluIHRoZSBhcHBsaWNhdGlvbiBJRCB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9RVUVSWV9GQUlMRUQgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIE1lc3NhZ2UgcmV0dXJuIHZhbHVlCisgICAgICogUmVjZWl2ZXIgYXBwbGljYXRpb24gc2lnbmF0dXJlIGNoZWNrIGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRV9OT19NQVRDSCA9IDB4NDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgTWVzc2FnZSByZXR1cm4gdmFsdWUKKyAgICAgKiBSZWNlaXZlciBhcHBsaWNhdGlvbiB3YXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRUNFSVZFUl9OQU1FID0gMHg4OworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBNZXNzYWdlIHJldHVybiB2YWx1ZQorICAgICAqIFVua25vd24gZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OX0NBVUdIVCA9IDB4MTA7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIE1lc3NhZ2UgcmV0dXJuIHZhbHVlCisgICAgICogTmVlZCBmdXJ0aGVyIHByb2Nlc3NpbmcgYWZ0ZXIgV2FwUHVzaE1hbmFnZXIgbWVzc2FnZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVSVEhFUl9QUk9DRVNTSU5HID0gMHg4MDAwOworCit9CisKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXBQdXNoT3ZlclNtcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dhcFB1c2hPdmVyU21zLmphdmEKaW5kZXggMTY4YjYzYi4uNzcwNDY2NyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dhcFB1c2hPdmVyU21zLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dhcFB1c2hPdmVyU21zLmphdmEKQEAgLTE0LDE2ICsxNCwyMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255OwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNtcy5JbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQoraW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBXQVAgcHVzaCBoYW5kbGVyIGNsYXNzLgpAQCAtNDMsMTEgKzQ3LDgzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgV0FLRV9MT0NLX1RJTUVPVVQgPSA1MDAwOwogCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgQklORF9SRVRSWV9JTlRFUlZBTCA9IDEwMDA7CisgICAgLyoqCisgICAgICogQSBoYW5kbGUgdG8gV2FwUHVzaE1hbmFnZXIgaW50ZXJmYWNlCisgICAgICovCisgICAgcHJpdmF0ZSBXYXBQdXNoQ29ubmVjdGlvbiBtV2FwQ29ubiA9IG51bGw7CisgICAgcHJpdmF0ZSBjbGFzcyBXYXBQdXNoQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBJV2FwUHVzaE1hbmFnZXIgbVdhcFB1c2hNYW47CisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtT3duZXI7CisKKyAgICAgICAgcHVibGljIFdhcFB1c2hDb25uZWN0aW9uKENvbnRleHQgb3duZXJDb250ZXh0KSB7CisgICAgICAgICAgICBtT3duZXIgPSBvd25lckNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1XYXBQdXNoTWFuID0gSVdhcFB1c2hNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAid2FwcHVzaCBtYW5hZ2VyIGNvbm5lY3RlZCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLmhhc2hDb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgbVdhcFB1c2hNYW4gPSBudWxsOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLnYoTE9HX1RBRywgIndhcHB1c2ggbWFuYWdlciBkaXNjb25uZWN0ZWQuIik7CisgICAgICAgICAgICAvLyBXYXBQdXNoTWFuYWdlciBtdXN0IGJlIGFsd2F5cyBhdHRhY2hlZC4KKyAgICAgICAgICAgIHJlYmluZFdhcFB1c2hNYW5hZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogYmluZCBXYXBQdXNoTWFuYWdlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYmluZFdhcFB1c2hNYW5hZ2VyKCkgeworICAgICAgICAgICAgaWYgKG1XYXBQdXNoTWFuICE9IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgZmluYWwgU2VydmljZUNvbm5lY3Rpb24gd2FwUHVzaENvbm5lY3Rpb24gPSB0aGlzOworCisgICAgICAgICAgICBtT3duZXIuYmluZFNlcnZpY2UobmV3IEludGVudChJV2FwUHVzaE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgd2FwUHVzaENvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcmViaW5kIFdhcFB1c2hNYW5hZ2VyCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIFdhcFB1c2hNYW5hZ2VyIGlzIGRpc2Nvbm5lY3RlZCB1bmV4cGVjdGVkbHkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcmViaW5kV2FwUHVzaE1hbmFnZXIoKSB7CisgICAgICAgICAgICBpZiAobVdhcFB1c2hNYW4gIT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBmaW5hbCBTZXJ2aWNlQ29ubmVjdGlvbiB3YXBQdXNoQ29ubmVjdGlvbiA9IHRoaXM7CisgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1XYXBQdXNoTWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci5iaW5kU2VydmljZShuZXcgSW50ZW50KElXYXBQdXNoTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXBQdXNoQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKEJJTkRfUkVUUllfSU5URVJWQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy52KExPR19UQUcsICJzbGVlcCBpbnRlcnJ1cHRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGludGVyZmFjZSB0byBXYXBQdXNoTWFuYWdlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElXYXBQdXNoTWFuYWdlciBnZXRXYXBQdXNoTWFuYWdlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2FwUHVzaE1hbjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBXYXBQdXNoT3ZlclNtcyhQaG9uZSBwaG9uZSwgU01TRGlzcGF0Y2hlciBzbXNEaXNwYXRjaGVyKSB7CiAgICAgICAgIG1TbXNEaXNwYXRjaGVyID0gc21zRGlzcGF0Y2hlcjsKICAgICAgICAgbUNvbnRleHQgPSBwaG9uZS5nZXRDb250ZXh0KCk7CisgICAgICAgIG1XYXBDb25uID0gbmV3IFdhcFB1c2hDb25uZWN0aW9uKG1Db250ZXh0KTsKKyAgICAgICAgbVdhcENvbm4uYmluZFdhcFB1c2hNYW5hZ2VyKCk7CiAgICAgfQogCisKICAgICAvKioKICAgICAgKiBEaXNwYXRjaGVzIGluYm91bmQgbWVzc2FnZXMgdGhhdCBhcmUgaW4gdGhlIFdBUCBQRFUgZm9ybWF0LiBTZWUKICAgICAgKiB3YXAtMjMwLXdzcC0yMDAxMDcwNS1hIHNlY3Rpb24gOCBmb3IgZGV0YWlscyBvbiB0aGUgV0FQIFBEVSBmb3JtYXQuCkBAIC01OSw3ICsxMzUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZGlzcGF0Y2hXYXBQZHUoYnl0ZVtdIHBkdSkgewogCi0gICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoTE9HX1RBRywgIlJ4OiAiICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhwZHUpKTsKKyAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLmQoTE9HX1RBRywgIlJ4OiAiICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhwZHUpKTsKIAogICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgICBpbnQgdHJhbnNhY3Rpb25JZCA9IHBkdVtpbmRleCsrXSAmIDB4RkY7CkBAIC02OCw3ICsxNDQsNyBAQAogCiAgICAgICAgIGlmICgocGR1VHlwZSAhPSBXc3BUeXBlRGVjb2Rlci5QRFVfVFlQRV9QVVNIKSAmJgogICAgICAgICAgICAgICAgIChwZHVUeXBlICE9IFdzcFR5cGVEZWNvZGVyLlBEVV9UWVBFX0NPTkZJUk1FRF9QVVNIKSkgewotICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgbm9uLVBVU0ggV0FQIFBEVS4gVHlwZSA9ICIgKyBwZHVUeXBlKTsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBub24tUFVTSCBXQVAgUERVLiBUeXBlID0gIiArIHBkdVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19IQU5ETEVEOwogICAgICAgICB9CiAKQEAgLTgxLDcgKzE1Nyw3IEBACiAgICAgICAgICAqIFNvIGl0IHdpbGwgYmUgZW5jb2RlZCBpbiBubyBtb3JlIHRoYW4gNSBvY3RldHMuCiAgICAgICAgICAqLwogICAgICAgICBpZiAocGR1RGVjb2Rlci5kZWNvZGVVaW50dmFySW50ZWdlcihpbmRleCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLncoTE9HX1RBRywgIlJlY2VpdmVkIFBEVS4gSGVhZGVyIExlbmd0aCBlcnJvci4iKTsKKyAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJSZWNlaXZlZCBQRFUuIEhlYWRlciBMZW5ndGggZXJyb3IuIik7CiAgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0dFTkVSSUNfRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgaGVhZGVyTGVuZ3RoID0gKGludClwZHVEZWNvZGVyLmdldFZhbHVlMzIoKTsKQEAgLTEwMiwxNDEgKzE3OCw5OSBAQAogICAgICAgICAgKiBMZW5ndGggPSBVaW50dmFyLWludGVnZXIKICAgICAgICAgICovCiAgICAgICAgIGlmIChwZHVEZWNvZGVyLmRlY29kZUNvbnRlbnRUeXBlKGluZGV4KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBIZWFkZXIgQ29udGVudC1UeXBlIGVycm9yLiIpOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIlJlY2VpdmVkIFBEVS4gSGVhZGVyIENvbnRlbnQtVHlwZSBlcnJvci4iKTsKICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfR0VORVJJQ19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBpbnQgYmluYXJ5Q29udGVudFR5cGU7CisKICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gcGR1RGVjb2Rlci5nZXRWYWx1ZVN0cmluZygpOwotICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYmluYXJ5Q29udGVudFR5cGUgPSAoaW50KXBkdURlY29kZXIuZ2V0VmFsdWUzMigpOwotICAgICAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgaGF2ZSBtb3JlIGdlbmVyaWMgd2F5IHRvIG1hcCBiaW5hcnlDb250ZW50VHlwZSBjb2RlIHRvIG1pbWVUeXBlLgotICAgICAgICAgICAgc3dpdGNoIChiaW5hcnlDb250ZW50VHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfRFJNX1JJR0hUU19YTUw6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1hNTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9EUk1fUklHSFRTX1dCWE1MOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfRFJNX1JJR0hUU19XQlhNTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX1NJOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9TSTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX1NMOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9TTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX0NPOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9DTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9NTVM6Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9NTVM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfVk5EX0RPQ09NT19QRjoKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX1ZORF9ET0NPTU9fUEY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfU1VQTF9JTklUOgotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfU1VQTF9JTklUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBQRFUuIFVuc3VwcG9ydGVkIENvbnRlbnQtVHlwZSA9ICIgKyBiaW5hcnlDb250ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfRFJNX1JJR0hUU19YTUwpKSB7Ci0gICAgICAgICAgICAgICAgYmluYXJ5Q29udGVudFR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9EUk1fUklHSFRTX1hNTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfRFJNX1JJR0hUU19XQlhNTCkpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX0RSTV9SSUdIVFNfV0JYTUw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX1BVU0hfU0kpKSB7Ci0gICAgICAgICAgICAgICAgYmluYXJ5Q29udGVudFR5cGUgPSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX1NJOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX1NMKSkgewotICAgICAgICAgICAgICAgIGJpbmFyeUNvbnRlbnRUeXBlID0gV3NwVHlwZURlY29kZXIuQ09OVEVOVF9UWVBFX0JfUFVTSF9TTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9DTykpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfQ087Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX01NUykpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX01NUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfVk5EX0RPQ09NT19QRikpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1ZORF9ET0NPTU9fUEY7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX01JTUVfVFlQRV9CX1NVUExfSU5JVCkpIHsKLSAgICAgICAgICAgICAgICBiaW5hcnlDb250ZW50VHlwZSA9IFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1NVUExfSU5JVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cudyhMT0dfVEFHLCAiUmVjZWl2ZWQgUERVLiBVbmtub3duIENvbnRlbnQtVHlwZSA9ICIgKyBtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVudHMuUkVTVUxUX1NNU19IQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGxvbmcgYmluYXJ5Q29udGVudFR5cGUgPSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKTsKICAgICAgICAgaW5kZXggKz0gcGR1RGVjb2Rlci5nZXREZWNvZGVkRGF0YUxlbmd0aCgpOwogCi0gICAgICAgIGJvb2xlYW4gZGlzcGF0Y2hlZEJ5QXBwbGljYXRpb24gPSBmYWxzZTsKLSAgICAgICAgc3dpdGNoIChiaW5hcnlDb250ZW50VHlwZSkgewotICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX0NPOgotICAgICAgICAgICAgICAgIGRpc3BhdGNoV2FwUGR1X1B1c2hDTyhwZHUsIHRyYW5zYWN0aW9uSWQsIHBkdVR5cGUsIGhlYWRlclN0YXJ0SW5kZXgsIGhlYWRlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hlZEJ5QXBwbGljYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9NTVM6Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHVfTU1TKHBkdSwgdHJhbnNhY3Rpb25JZCwgcGR1VHlwZSwgaGVhZGVyU3RhcnRJbmRleCwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVkQnlBcHBsaWNhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXNwYXRjaGVkQnlBcHBsaWNhdGlvbiA9PSBmYWxzZSkgewotICAgICAgICAgICAgZGlzcGF0Y2hXYXBQZHVfZGVmYXVsdChwZHUsIHRyYW5zYWN0aW9uSWQsIHBkdVR5cGUsIG1pbWVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXJMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBY3Rpdml0eS5SRVNVTFRfT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoV2FwUGR1X2RlZmF1bHQoYnl0ZVtdIHBkdSwgaW50IHRyYW5zYWN0aW9uSWQsIGludCBwZHVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgaW50IGhlYWRlclN0YXJ0SW5kZXgsIGludCBoZWFkZXJMZW5ndGgpIHsKICAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlckxlbmd0aF07CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOwotICAgICAgICBpbnQgZGF0YUluZGV4ID0gaGVhZGVyU3RhcnRJbmRleCArIGhlYWRlckxlbmd0aDsKLSAgICAgICAgYnl0ZVtdIGRhdGE7CiAKLSAgICAgICAgZGF0YSA9IG5ldyBieXRlW3BkdS5sZW5ndGggLSBkYXRhSW5kZXhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBkdSwgZGF0YUluZGV4LCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIGJ5dGVbXSBpbnRlbnREYXRhOworCisgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmVxdWFscyhXc3BUeXBlRGVjb2Rlci5DT05URU5UX1RZUEVfQl9QVVNIX0NPKSkgeworICAgICAgICAgICAgaW50ZW50RGF0YSA9IHBkdTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkYXRhSW5kZXggPSBoZWFkZXJTdGFydEluZGV4ICsgaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgaW50ZW50RGF0YSA9IG5ldyBieXRlW3BkdS5sZW5ndGggLSBkYXRhSW5kZXhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIGRhdGFJbmRleCwgaW50ZW50RGF0YSwgMCwgaW50ZW50RGF0YS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlZWsgZm9yIGFwcGxpY2F0aW9uIElEIGZpZWxkIGluIFdTUCBoZWFkZXIuCisgICAgICAgICAqIElmIGFwcGxpY2F0aW9uIElEIGlzIGZvdW5kLCBXYXBQdXNoTWFuYWdlciBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlCisgICAgICAgICAqIHByb2Nlc3NpbmcuIFNpbmNlIFdhcFB1c2hNYW5hZ2VyIGlzIG9wdGlvbmFsIG1vZHVsZSwgaWYgV2FwUHVzaE1hbmFnZXIKKyAgICAgICAgICogaXMgbm90IGZvdW5kLCBsZWdhY3kgbWVzc2FnZSBwcm9jZXNzaW5nIHdpbGwgYmUgY29udGludWVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBkdURlY29kZXIuc2Vla1hXYXBBcHBsaWNhdGlvbklkKGluZGV4LCBpbmRleCArIGhlYWRlckxlbmd0aCAtIDEpKSB7CisgICAgICAgICAgICBpbmRleCA9IChpbnQpIHBkdURlY29kZXIuZ2V0VmFsdWUzMigpOworICAgICAgICAgICAgcGR1RGVjb2Rlci5kZWNvZGVYV2FwQXBwbGljYXRpb25JZChpbmRleCk7CisgICAgICAgICAgICBTdHJpbmcgd2FwQXBwSWQgPSBwZHVEZWNvZGVyLmdldFZhbHVlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAod2FwQXBwSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhcEFwcElkID0gSW50ZWdlci50b1N0cmluZygoaW50KSBwZHVEZWNvZGVyLmdldFZhbHVlMzIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9ICgobWltZVR5cGUgPT0gbnVsbCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoYmluYXJ5Q29udGVudFR5cGUpIDogbWltZVR5cGUpOworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLnYoTE9HX1RBRywgImFwcGlkIGZvdW5kOiAiICsgd2FwQXBwSWQgKyAiOiIgKyBjb250ZW50VHlwZSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzRnVydGhlciA9IHRydWU7CisgICAgICAgICAgICAgICAgSVdhcFB1c2hNYW5hZ2VyIHdhcFB1c2hNYW4gPSBtV2FwQ29ubi5nZXRXYXBQdXNoTWFuYWdlcigpOworCisgICAgICAgICAgICAgICAgaWYgKHdhcFB1c2hNYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudyhMT0dfVEFHLCAid2FwIHB1c2ggbWFuYWdlciBub3QgZm91bmQhIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIHBkdVR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImhlYWRlciIsIGhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGF0YSIsIGludGVudERhdGEpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImNvbnRlbnRUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1RGVjb2Rlci5nZXRDb250ZW50UGFyYW1ldGVycygpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgcHJvY1JldCA9IHdhcFB1c2hNYW4ucHJvY2Vzc01lc3NhZ2Uod2FwQXBwSWQsIGNvbnRlbnRUeXBlLCBpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAicHJvY1JldDoiICsgcHJvY1JldCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvY1JldCAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLk1FU1NBR0VfSEFORExFRCkgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvY1JldCAmIFdhcFB1c2hNYW5hZ2VyUGFyYW1zLkZVUlRIRVJfUFJPQ0VTU0lORykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Z1cnRoZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NGdXJ0aGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcpIExvZy53KExPR19UQUcsICJyZW1vdGUgZnVuYyBmYWlsZWQuLi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQ29uZmlnLkRFQlVHKSBMb2cudihMT0dfVEFHLCAiZmFsbCBiYWNrIHRvIGV4aXN0aW5nIGhhbmRsZXIiKTsKKworICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRykgTG9nLncoTE9HX1RBRywgIkhlYWRlciBDb250ZW50LVR5cGUgZXJyb3IuIik7CisgICAgICAgICAgICByZXR1cm4gSW50ZW50cy5SRVNVTFRfU01TX0dFTkVSSUNfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGVybWlzc2lvbjsKKworICAgICAgICBpZiAobWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX01NUykpIHsKKyAgICAgICAgICAgIHBlcm1pc3Npb24gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfTU1TIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcm1pc3Npb24gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfV0FQX1BVU0giOworICAgICAgICB9CiAKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5XQVBfUFVTSF9SRUNFSVZFRF9BQ1RJT04pOwogICAgICAgICBpbnRlbnQuc2V0VHlwZShtaW1lVHlwZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYSgidHJhbnNhY3Rpb25JZCIsIHRyYW5zYWN0aW9uSWQpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdVR5cGUiLCBwZHVUeXBlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJoZWFkZXIiLCBoZWFkZXIpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRhdGEiLCBkYXRhKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkYXRhIiwgaW50ZW50RGF0YSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY29udGVudFR5cGVQYXJhbWV0ZXJzIiwgcGR1RGVjb2Rlci5nZXRDb250ZW50UGFyYW1ldGVycygpKTsKIAotICAgICAgICBtU21zRGlzcGF0Y2hlci5kaXNwYXRjaChpbnRlbnQsICJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCIpOwotICAgIH0KKyAgICAgICAgbVNtc0Rpc3BhdGNoZXIuZGlzcGF0Y2goaW50ZW50LCBwZXJtaXNzaW9uKTsKIAotICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFdhcFBkdV9QdXNoQ08oYnl0ZVtdIHBkdSwgaW50IHRyYW5zYWN0aW9uSWQsIGludCBwZHVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlclN0YXJ0SW5kZXgsIGludCBoZWFkZXJMZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlckxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBoZWFkZXJTdGFydEluZGV4LCBoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudHMuV0FQX1BVU0hfUkVDRUlWRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LnNldFR5cGUoV3NwVHlwZURlY29kZXIuQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX0NPKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIHBkdVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoImhlYWRlciIsIGhlYWRlcik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiZGF0YSIsIHBkdSk7Ci0KLSAgICAgICAgbVNtc0Rpc3BhdGNoZXIuZGlzcGF0Y2goaW50ZW50LCAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfV0FQX1BVU0giKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hXYXBQZHVfTU1TKGJ5dGVbXSBwZHUsIGludCB0cmFuc2FjdGlvbklkLCBpbnQgcGR1VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJTdGFydEluZGV4LCBpbnQgaGVhZGVyTGVuZ3RoKSB7Ci0gICAgICAgIGJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVtoZWFkZXJMZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBkdSwgaGVhZGVyU3RhcnRJbmRleCwgaGVhZGVyLCAwLCBoZWFkZXIubGVuZ3RoKTsKLSAgICAgICAgaW50IGRhdGFJbmRleCA9IGhlYWRlclN0YXJ0SW5kZXggKyBoZWFkZXJMZW5ndGg7Ci0gICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbcGR1Lmxlbmd0aCAtIGRhdGFJbmRleF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGR1LCBkYXRhSW5kZXgsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnRzLldBUF9QVVNIX1JFQ0VJVkVEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5zZXRUeXBlKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfTUlNRV9UWVBFX0JfTU1TKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1VHlwZSIsIHBkdVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoImhlYWRlciIsIGhlYWRlcik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiZGF0YSIsIGRhdGEpOwotCi0gICAgICAgIG1TbXNEaXNwYXRjaGVyLmRpc3BhdGNoKGludGVudCwgImFuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX01NUyIpOworICAgICAgICByZXR1cm4gQWN0aXZpdHkuUkVTVUxUX09LOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dzcFR5cGVEZWNvZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV3NwVHlwZURlY29kZXIuamF2YQppbmRleCA1ZGM4OWYwLi5jOGRkNzE4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV3NwVHlwZURlY29kZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV3NwVHlwZURlY29kZXIuamF2YQpAQCAtMTYsMTEgKzE2LDEyIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIC8qKgotICogIEltcGxlbWVudCB0aGUgV1NQIGRhdGEgdHlwZSBkZWNvZGVyLgorICogSW1wbGVtZW50IHRoZSBXU1AgZGF0YSB0eXBlIGRlY29kZXIuCiAgKgotICogIEBoaWRlCisgKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgV3NwVHlwZURlY29kZXIgewogCkBAIC0zMCwzNyArMzEsMTc3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUERVX1RZUEVfUFVTSCA9IDB4MDY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUERVX1RZUEVfQ09ORklSTUVEX1BVU0ggPSAweDA3OwogCi0gICAgLy8gVE9ETyB3ZSBzaG91bGQgaGF2ZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgYmluYXJ5IGNvZGUgYW5kIG1pbWUgdHlwZSBzdHJpbmcuCi0gICAgLy8gIHNlZSBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9vbW5hL29tbmEtd3NwLWNvbnRlbnQtdHlwZS5hc3B4CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IFdFTExfS05PV05fTUlNRV9UWVBFUyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9EUk1fUklHSFRTX1hNTCA9IDB4NGE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfRFJNX1JJR0hUU19XQlhNTCA9IDB4NGI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfUFVTSF9TSSA9IDB4MmU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfUFVTSF9TTCA9IDB4MzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfUFVTSF9DTyA9IDB4MzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0JfTU1TID0gMHgzZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQl9WTkRfRE9DT01PX1BGID0gMHgwMzEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9CX1NVUExfSU5JVCA9IDB4MzEyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1hNTCA9Ci0gICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3htbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9EUk1fUklHSFRTX1dCWE1MID0KLSAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMrd2J4bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUlNRV9UWVBFX0JfUFVTSF9TSSA9ICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NSU1FX1RZUEVfQl9QVVNIX1NMID0gImFwcGxpY2F0aW9uL3ZuZC53YXAuc2xjIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01JTUVfVFlQRV9CX1BVU0hfQ08gPSAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUlNRV9UWVBFX0JfTU1TID0gImFwcGxpY2F0aW9uL3ZuZC53YXAubW1zLW1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUlNRV9UWVBFX0JfVk5EX0RPQ09NT19QRiA9ICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01JTUVfVFlQRV9CX1NVUExfSU5JVCA9ICJhcHBsaWNhdGlvbi92bmQub21hbG9jLXN1cGwtaW5pdCI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IFdFTExfS05PV05fUEFSQU1FVEVSUyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTUVURVJfSURfWF9XQVBfQVBQTElDQVRJT05fSUQgPSAweDJmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRX1ZBTFVFID0gMHgwMDsKIAorICAgIHN0YXRpYyB7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMCwgIiovKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDEsICJ0ZXh0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyLCAidGV4dC9odG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMywgInRleHQvcGxhaW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDA0LCAidGV4dC94LWhkbWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDA1LCAidGV4dC94LXR0bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDA2LCAidGV4dC94LXZDYWxlbmRhciIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDcsICJ0ZXh0L3gtdkNhcmQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDA4LCAidGV4dC92bmQud2FwLndtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDksICJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwQSwgInRleHQvdm5kLndhcC53dGEtZXZlbnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBCLCAibXVsdGlwYXJ0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBDLCAibXVsdGlwYXJ0L21peGVkIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwRCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBFLCAibXVsdGlwYXJ0L2J5dGVyYW50ZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDBGLCAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxMCwgImFwcGxpY2F0aW9uLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDExLCAiYXBwbGljYXRpb24vamF2YS12bSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDEzLCAiYXBwbGljYXRpb24veC1oZG1sYyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTQsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDE1LCAiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAud3RhLWV2ZW50YyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTcsICJhcHBsaWNhdGlvbi92bmQud2FwLnVhcHJvZiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MTgsICJhcHBsaWNhdGlvbi92bmQud2FwLnd0bHMtY2EtY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDE5LCAiYXBwbGljYXRpb24vdm5kLndhcC53dGxzLXVzZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDFBLCAiYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDFCLCAiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MUMsICJpbWFnZS8qIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxRCwgImltYWdlL2dpZiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MUUsICJpbWFnZS9qcGVnIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgxRiwgImltYWdlL3RpZmYiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDIwLCAiaW1hZ2UvcG5nIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyMSwgImltYWdlL3ZuZC53YXAud2JtcCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MjIsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC4qIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyMywgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0Lm1peGVkIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyNCwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmZvcm0tZGF0YSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MjUsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5ieXRlcmFuZ2VzIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmFsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyNywgImFwcGxpY2F0aW9uL3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MjgsICJ0ZXh0L3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MjksICJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyQSwgImFwcGxpY2F0aW9uL3gteDk2OC1jcm9zcy1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyQiwgImFwcGxpY2F0aW9uL3gteDk2OC1jYS1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyQywgImFwcGxpY2F0aW9uL3gteDk2OC11c2VyLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDJELCAidGV4dC92bmQud2FwLnNpIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyRSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgyRiwgInRleHQvdm5kLndhcC5zbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzAsICJhcHBsaWNhdGlvbi92bmQud2FwLnNsYyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzEsICJ0ZXh0L3ZuZC53YXAuY28iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDMyLCAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDMzLCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQucmVsYXRlZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzQsICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzUsICJ0ZXh0L3ZuZC53YXAuY29ubmVjdGl2aXR5LXhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzYsICJhcHBsaWNhdGlvbi92bmQud2FwLmNvbm5lY3Rpdml0eS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MzcsICJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzOCwgImFwcGxpY2F0aW9uL3ZuZC53YXAuaGFzaGVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzOSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2lnbmVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzQSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuY2VydC1yZXNwb25zZSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4M0IsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDNDLCAiYXBwbGljYXRpb24vd21sK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4M0QsICJ0ZXh0L2NzcyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4M0UsICJhcHBsaWNhdGlvbi92bmQud2FwLm1tcy1tZXNzYWdlIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgzRiwgImFwcGxpY2F0aW9uL3ZuZC53YXAucm9sbG92ZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQwLCAiYXBwbGljYXRpb24vdm5kLndhcC5sb2NjK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0MSwgImFwcGxpY2F0aW9uL3ZuZC53YXAubG9jK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NDIsICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0MywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0NCwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0NSwgImFwcGxpY2F0aW9uL3ZuZC53YXAueGh0bWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0NiwgImFwcGxpY2F0aW9uL3ZuZC53di5jc3AuY2lyIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0NywgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0OCwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLm1lc3NhZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDQ5LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NEEsICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0QiwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NEMsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NEQsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0RSwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHg0RiwgImF1ZGlvLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDUwLCAidmlkZW8vKiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4NTEsICJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDUyLCAiYXBwbGljYXRpb24vbWlrZXkiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDUzLCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2QiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDU0LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDEsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjAyLCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuc2lnbmFsIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjAzLCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDQsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0LXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjA1LCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZC13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwNiwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMDcsICJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5wcm92aXNpb25pbmctc3RhdHVzLXVyaSIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwOCwgIngtd2FwLm11bHRpcGFydC92bmQudXBsYW5ldC5oZWFkZXItc2V0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMjA5LCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwQSwgImFwcGxpY2F0aW9uL3ZuZC5waG9uZWNvbS5tbWMtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAyMEIsICJhcHBsaWNhdGlvbi92bmQubm9raWEuc3luY3NldCt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDIwQywgImltYWdlL3gtdXAtd3BuZyIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwMCwgImFwcGxpY2F0aW9uL2lvdGEubW1jLXdieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzAxLCAiYXBwbGljYXRpb24vaW90YS5tbWMteG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzAyLCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDMsICJhcHBsaWNhdGlvbi92bmQuc3luY21sK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzA0LCAidGV4dC92bmQud2FwLmVtbit4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMDUsICJ0ZXh0L2NhbGVuZGFyIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzA2LCAiYXBwbGljYXRpb24vdm5kLm9tYWRzLWVtYWlsK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwNywgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1maWxlK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwOCwgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzA5LCAidGV4dC9kaXJlY3Rvcnk7cHJvZmlsZT12Q2FyZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwQSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuZW1uK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzBCLCAiYXBwbGljYXRpb24vdm5kLm5va2lhLmlwZGMtcHVyY2hhc2UtcmVzcG9uc2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMEMsICJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuc2NyZWVuMyt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMEQsICJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuc2NyZWVuMytnemlwIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzBFLCAiYXBwbGljYXRpb24vdm5kLmNtY2Muc2V0dGluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMwRiwgImFwcGxpY2F0aW9uL3ZuZC5jbWNjLmJvbWJpbmcrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTAsICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzExLCAiYXBwbGljYXRpb24vdm5kLmRvY29tby51YiIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxMiwgImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0Iik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzEzLCAiYXBwbGljYXRpb24vdm5kLm9tYS5ncm91cC11c2FnZS1saXN0K3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxNCwgImFwcGxpY2F0aW9uL29tYS1kaXJlY3RvcnkreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTUlNRV9UWVBFUy5wdXQoMHgwMzE1LCAiYXBwbGljYXRpb24vdm5kLmRvY29tby5wZjIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTYsICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yb2FwLXRyaWdnZXIrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTcsICJhcHBsaWNhdGlvbi92bmQuc2JtLm1pZDIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMTgsICJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxOSwgImFwcGxpY2F0aW9uL3ZuYy5jbWNjLmRjZCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9NSU1FX1RZUEVTLnB1dCgweDAzMUEsICJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIpOworICAgICAgICBXRUxMX0tOT1dOX01JTUVfVFlQRVMucHV0KDB4MDMxQiwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QucHJvdmlzaW9uaW5ndHJpZ2dlciIpOworCisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMCwgIlEiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDAxLCAiQ2hhcnNldCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDIsICJMZXZlbCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDMsICJUeXBlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwNywgIkRpZmZlcmVuY2VzIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwOCwgIlBhZGRpbmciKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA5LCAiVHlwZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MEUsICJNYXgtQWdlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxMCwgIlNlY3VyZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTEsICJTRUMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEyLCAiTUFDIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxMywgIkNyZWF0aW9uLWRhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE0LCAiTW9kaWZpY2F0aW9uLWRhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE1LCAiUmVhZC1kYXRlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxNiwgIlNpemUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE3LCAiTmFtZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTgsICJGaWxlbmFtZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTksICJTdGFydCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MUEsICJTdGFydC1pbmZvIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxQiwgIkNvbW1lbnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFDLCAiRG9tYWluIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxRCwgIlBhdGgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQl9QVVNIX0NPID0gImFwcGxpY2F0aW9uL3ZuZC53YXAuY29jIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQl9NTVMgPSAiYXBwbGljYXRpb24vdm5kLndhcC5tbXMtbWVzc2FnZSI7CiAKICAgICBieXRlW10gd3NwRGF0YTsKICAgICBpbnQgICAgZGF0YUxlbmd0aDsKICAgICBsb25nICAgdW5zaWduZWQzMmJpdDsKICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7CiAKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZW50UGFyYW1ldGVyczsKKwogICAgIHB1YmxpYyBXc3BUeXBlRGVjb2RlcihieXRlW10gcGR1KSB7CiAgICAgICAgIHdzcERhdGEgPSBwZHU7CiAgICAgfQpAQCAtNzEsMTcgKzIxMiwxNyBAQAogICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIlRleHQtc3RyaW5nIiBpbiB0aGlzIHBkdQogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFRleHQtc3RyaW5nKSBvY2N1cgotICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlU3RyaW5nKCkgbWV0aG9kIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUKKyAgICAgKiAgICAgICAgIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZVRleHRTdHJpbmcoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKICAgICAgICAgd2hpbGUgKHdzcERhdGFbaW5kZXhdICE9IDApIHsKICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YUxlbmd0aCAgPSBpbmRleCAtIHN0YXJ0SW5kZXggKyAxOworICAgICAgICBkYXRhTGVuZ3RoID0gaW5kZXggLSBzdGFydEluZGV4ICsgMTsKICAgICAgICAgaWYgKHdzcERhdGFbc3RhcnRJbmRleF0gPT0gMTI3KSB7Ci0gICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG5ldyBTdHJpbmcod3NwRGF0YSwgc3RhcnRJbmRleCsxLCBkYXRhTGVuZ3RoIC0gMik7CisgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG5ldyBTdHJpbmcod3NwRGF0YSwgc3RhcnRJbmRleCArIDEsIGRhdGFMZW5ndGggLSAyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZyh3c3BEYXRhLCBzdGFydEluZGV4LCBkYXRhTGVuZ3RoIC0gMSk7CiAgICAgICAgIH0KQEAgLTg5LDEzICsyMzAsMzMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZWNvZGUgdGhlICJUb2tlbi10ZXh0IiB0eXBlIGZvciBXU1AgcGR1CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlICJUb2tlbi10ZXh0IiBpbiB0aGlzIHBkdQorICAgICAqCisgICAgICogQHJldHVybiBhbHdheXMgdHJ1ZQorICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlVG9rZW5UZXh0KGludCBzdGFydEluZGV4KSB7CisgICAgICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgICAgIHdoaWxlICh3c3BEYXRhW2luZGV4XSAhPSAwKSB7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgICAgIGRhdGFMZW5ndGggPSBpbmRleCAtIHN0YXJ0SW5kZXggKyAxOworICAgICAgICBzdHJpbmdWYWx1ZSA9IG5ldyBTdHJpbmcod3NwRGF0YSwgc3RhcnRJbmRleCwgZGF0YUxlbmd0aCAtIDEpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIERlY29kZSB0aGUgIlNob3J0LWludGVnZXIiIHR5cGUgZm9yIFdTUCBwZHUKICAgICAgKgogICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIlNob3J0LWludGVnZXIiIGluIHRoaXMgcGR1CiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgU2hvcnQtaW50ZWdlcikgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlU2hvcnRJbnRlZ2VyKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIGlmICgod3NwRGF0YVtzdGFydEluZGV4XSAmIDB4ODApID09IDApIHsKQEAgLTExMyw3ICsyNzQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIExvbmctaW50ZWdlcikgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlTG9uZ0ludGVnZXIoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaW50IGxlbmd0aE11bHRpT2N0ZXQgPSB3c3BEYXRhW3N0YXJ0SW5kZXhdICYgMHhmZjsKQEAgLTEyMiwxMCArMjgzLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQzMmJpdCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGk9MTsgaTw9bGVuZ3RoTXVsdGlPY3RldDsgaSsrKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZDMyYml0ID0gKHVuc2lnbmVkMzJiaXQgPDwgOCkgfCAod3NwRGF0YVtzdGFydEluZGV4K2ldICYgMHhmZik7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGxlbmd0aE11bHRpT2N0ZXQ7IGkrKykgeworICAgICAgICAgICAgdW5zaWduZWQzMmJpdCA9ICh1bnNpZ25lZDMyYml0IDw8IDgpIHwgKHdzcERhdGFbc3RhcnRJbmRleCArIGldICYgMHhmZik7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YUxlbmd0aCA9IDErbGVuZ3RoTXVsdGlPY3RldDsKKyAgICAgICAgZGF0YUxlbmd0aCA9IDEgKyBsZW5ndGhNdWx0aU9jdGV0OwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTEzNiw3ICsyOTcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIEludGVnZXItVmFsdWUpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCi0gICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZUludGVnZXJWYWx1ZShpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpZiAoZGVjb2RlU2hvcnRJbnRlZ2VyKHN0YXJ0SW5kZXgpID09IHRydWUpIHsKQEAgLTE1MiwxMCArMzEzLDEwIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgVWludHZhci1pbnRlZ2VyKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVVaW50dmFySW50ZWdlcihpbnQgc3RhcnRJbmRleCkgewotICAgICAgICBpbnQgIGluZGV4ID0gc3RhcnRJbmRleDsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKIAogICAgICAgICB1bnNpZ25lZDMyYml0ID0gMDsKICAgICAgICAgd2hpbGUgKCh3c3BEYXRhW2luZGV4XSAmIDB4ODApICE9IDApIHsKQEAgLTE3Nyw3ICszMzgsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFZhbHVlLWxlbmd0aCkgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlVmFsdWVMZW5ndGgoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaWYgKCh3c3BEYXRhW3N0YXJ0SW5kZXhdICYgMHhmZikgPiBXQVBfUERVX0xFTkdUSF9RVU9URSkgewpAQCAtMTg3LDIyICszNDgsMjIgQEAKICAgICAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSB3c3BEYXRhW3N0YXJ0SW5kZXhdOwogICAgICAgICAgICAgZGF0YUxlbmd0aCA9IDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWNvZGVVaW50dmFySW50ZWdlcihzdGFydEluZGV4KzEpOwotICAgICAgICAgICAgZGF0YUxlbmd0aCArKzsKKyAgICAgICAgICAgIGRlY29kZVVpbnR2YXJJbnRlZ2VyKHN0YXJ0SW5kZXggKyAxKTsKKyAgICAgICAgICAgIGRhdGFMZW5ndGgrKzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAqIERlY29kZSB0aGUgIkV4dGVuc2lvbi1tZWRpYSIgdHlwZSBmb3IgV1NQIFBEVS4KLSAgICAqCi0gICAgKiBAcGFyYW0gc3RhcnRJbmRleCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlICJFeHRlbnNpb24tbWVkaWEiIGluIHRoaXMgUERVLgotICAgICoKLSAgICAqIEByZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHN1Y2ggYXMgaWYgdGhlcmUgaXMgbm8gRXh0ZW5zaW9uLW1lZGlhIGF0IHN0YXJ0SW5kZXguCi0gICAgKiBTaWRlLWVmZmVjdHM6IHVwZGF0ZXMgc3RyaW5nVmFsdWUgKGF2YWlsYWJsZSB3aXRoIGdldFZhbHVlU3RyaW5nKCkpLCB3aGljaCB3aWxsIGJlCi0gICAgKiBudWxsIG9uIGVycm9yLiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBQRFUgaXMgYXZhaWxhYmxlIHdpdGggZ2V0VmFsdWUzMigpLCAwCi0gICAgKiBvbiBlcnJvci4KLSAgICAqLworICAgICAqIERlY29kZSB0aGUgIkV4dGVuc2lvbi1tZWRpYSIgdHlwZSBmb3IgV1NQIFBEVS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIkV4dGVuc2lvbi1tZWRpYSIgaW4gdGhpcyBQRFUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGVycm9yLCBzdWNoIGFzIGlmIHRoZXJlIGlzIG5vIEV4dGVuc2lvbi1tZWRpYSBhdCBzdGFydEluZGV4LgorICAgICAqICAgICAgICAgU2lkZS1lZmZlY3RzOiB1cGRhdGVzIHN0cmluZ1ZhbHVlIChhdmFpbGFibGUgd2l0aAorICAgICAqICAgICAgICAgZ2V0VmFsdWVTdHJpbmcoKSksIHdoaWNoIHdpbGwgYmUgbnVsbCBvbiBlcnJvci4gVGhlIGxlbmd0aCBvZiB0aGUKKyAgICAgKiAgICAgICAgIGRhdGEgaW4gdGhlIFBEVSBpcyBhdmFpbGFibGUgd2l0aCBnZXRWYWx1ZTMyKCksIDAgb24gZXJyb3IuCisgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlRXh0ZW5zaW9uTWVkaWEoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKICAgICAgICAgZGF0YUxlbmd0aCA9IDA7CkBAIC0yMTQsNyArMzc1LDcgQEAKICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KIAotICAgICAgICBkYXRhTGVuZ3RoICA9IGluZGV4IC0gc3RhcnRJbmRleCArIDE7CisgICAgICAgIGRhdGFMZW5ndGggPSBpbmRleCAtIHN0YXJ0SW5kZXggKyAxOwogICAgICAgICBzdHJpbmdWYWx1ZSA9IG5ldyBTdHJpbmcod3NwRGF0YSwgc3RhcnRJbmRleCwgZGF0YUxlbmd0aCAtIDEpOwogCiAgICAgICAgIHJldHVybiBydHJuOwpAQCAtMjI3LDcgKzM4OCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgQ29uc3RyYWluZWQtZW5jb2RpbmcpIG9jY3VyCiAgICAgICogICAgICAgICByZXR1cm4gdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBmaXJzdCBieSBnZXRWYWx1ZVN0cmluZygpIGFuZCBzZWNvbmQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAotICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVDb25zdHJhaW5lZEVuY29kaW5nKGludCBzdGFydEluZGV4KSB7CiAgICAgICAgIGlmIChkZWNvZGVTaG9ydEludGVnZXIoc3RhcnRJbmRleCkgPT0gdHJ1ZSkgewpAQCAtMjQyLDMxICs0MDMsMTYyIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlICJDb250ZW50LXR5cGUiIGluIHRoaXMgcGR1CiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgQ29udGVudC10eXBlKSBvY2N1cgotICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZmlyc3QgYnkgZ2V0VmFsdWVTdHJpbmcoKSBhbmQgc2Vjb25kIGJ5IGdldFZhbHVlMzIoKQotICAgICAqICAgICAgICAgbWV0aG9kIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgQ29udGVudC10eXBlKSBvY2N1cnMKKyAgICAgKiAgICAgICAgIElmIGEgY29udGVudCB0eXBlIGV4aXN0cyBpbiB0aGUgaGVhZGVycyAoZWl0aGVyIGFzIGlubGluZSBzdHJpbmcsIG9yIGFzIHdlbGwta25vd24KKyAgICAgKiAgICAgICAgIHZhbHVlKSwgZ2V0VmFsdWVTdHJpbmcoKSB3aWxsIHJldHVybiBpdC4gSWYgYSAnd2VsbCBrbm93biB2YWx1ZScgaXMgZW5jb3VudGVyZWQgdGhhdAorICAgICAqICAgICAgICAgY2Fubm90IGJlIG1hcHBlZCB0byBhIHN0cmluZyBtaW1lIHR5cGUsIGdldFZhbHVlU3RyaW5nKCkgd2lsbCByZXR1cm4gbnVsbCwgYW5kCisgICAgICogICAgICAgICBnZXRWYWx1ZTMyKCkgd2lsbCByZXR1cm4gdGhlIHVua25vd24gY29udGVudCB0eXBlIHZhbHVlLgorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIEFueSBjb250ZW50IHR5cGUgcGFyYW1ldGVycyB3aWxsIGJlIGFjY2Vzc2libGUgdmlhIGdldENvbnRlbnRQYXJhbWV0ZXJzKCkKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVDb250ZW50VHlwZShpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpbnQgbWVkaWFQcmVmaXhMZW5ndGg7Ci0gICAgICAgIGxvbmcgbWVkaWFGaWVsZExlbmd0aDsKKyAgICAgICAgY29udGVudFBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKIAotICAgICAgICBpZiAoZGVjb2RlVmFsdWVMZW5ndGgoc3RhcnRJbmRleCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVDb25zdHJhaW5lZEVuY29kaW5nKHN0YXJ0SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIG1lZGlhUHJlZml4TGVuZ3RoID0gZ2V0RGVjb2RlZERhdGFMZW5ndGgoKTsKLSAgICAgICAgbWVkaWFGaWVsZExlbmd0aCA9IGdldFZhbHVlMzIoKTsKLSAgICAgICAgaWYgKGRlY29kZUludGVnZXJWYWx1ZShzdGFydEluZGV4ICsgbWVkaWFQcmVmaXhMZW5ndGgpID09IHRydWUpIHsKLSAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gbWVkaWFQcmVmaXhMZW5ndGg7Ci0gICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVjb2RlRXh0ZW5zaW9uTWVkaWEoc3RhcnRJbmRleCArIG1lZGlhUHJlZml4TGVuZ3RoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBkYXRhTGVuZ3RoICs9IG1lZGlhUHJlZml4TGVuZ3RoOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGVjb2RlVmFsdWVMZW5ndGgoc3RhcnRJbmRleCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZGVjb2RlQ29uc3RyYWluZWRFbmNvZGluZyhzdGFydEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kV2VsbEtub3duTWltZVR5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGhlYWRlcnNMZW5ndGggPSAoaW50KSB1bnNpZ25lZDMyYml0OworICAgICAgICAgICAgbWVkaWFQcmVmaXhMZW5ndGggPSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGRlY29kZUludGVnZXJWYWx1ZShzdGFydEluZGV4ICsgbWVkaWFQcmVmaXhMZW5ndGgpID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoICs9IG1lZGlhUHJlZml4TGVuZ3RoOworICAgICAgICAgICAgICAgIGludCByZWFkTGVuZ3RoID0gZGF0YUxlbmd0aDsKKyAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZXhwYW5kV2VsbEtub3duTWltZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBsb25nIHdlbGxLbm93blZhbHVlID0gdW5zaWduZWQzMmJpdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBzdHJpbmdWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZENvbnRlbnRQYXJhbWV0ZXJzKHN0YXJ0SW5kZXggKyBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlcnNMZW5ndGggLSAoZGF0YUxlbmd0aCAtIG1lZGlhUHJlZml4TGVuZ3RoKSksIDApKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gcmVhZExlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQzMmJpdCA9IHdlbGxLbm93blZhbHVlOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG1pbWVUeXBlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlY29kZUV4dGVuc2lvbk1lZGlhKHN0YXJ0SW5kZXggKyBtZWRpYVByZWZpeExlbmd0aCkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKz0gbWVkaWFQcmVmaXhMZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHJlYWRMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgIGV4cGFuZFdlbGxLbm93bk1pbWVUeXBlKCk7CisgICAgICAgICAgICAgICAgbG9uZyB3ZWxsS25vd25WYWx1ZSA9IHVuc2lnbmVkMzJiaXQ7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gc3RyaW5nVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRDb250ZW50UGFyYW1ldGVycyhzdGFydEluZGV4ICsgZGF0YUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXJzTGVuZ3RoIC0gKGRhdGFMZW5ndGggLSBtZWRpYVByZWZpeExlbmd0aCkpLCAwKSkgeworICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoICs9IHJlYWRMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkMzJiaXQgPSB3ZWxsS25vd25WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBtaW1lVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9zb21ldGhpbmcgZG9lc24ndCBhZGQgdXAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRDb250ZW50UGFyYW1ldGVycyhpbnQgc3RhcnRJbmRleCwgaW50IGxlZnRUb1JlYWQsIGludCBhY2N1bXVsYXRvcikgeworCisgICAgICAgIGludCB0b3RhbFJlYWQgPSAwOworCisgICAgICAgIGlmIChsZWZ0VG9SZWFkID4gMCkgeworICAgICAgICAgICAgYnl0ZSBuZXh0Qnl0ZSA9IHdzcERhdGFbc3RhcnRJbmRleF07CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgobmV4dEJ5dGUgJiAweDgwKSA9PSAweDAwICYmIG5leHRCeXRlID4gMzEpIHsgLy8gdW50eXBlZAorICAgICAgICAgICAgICAgIGRlY29kZVRva2VuVGV4dChzdGFydEluZGV4KTsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHN0cmluZ1ZhbHVlOworICAgICAgICAgICAgICAgIHRvdGFsUmVhZCArPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gdHlwZWQKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVhZCArPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpbnQgd2VsbEtub3duUGFyYW1ldGVyVmFsdWUgPSAoaW50KSB1bnNpZ25lZDMyYml0OworICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IFdFTExfS05PV05fUEFSQU1FVEVSUy5nZXQod2VsbEtub3duUGFyYW1ldGVyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSAidW5hc3NpZ25lZC8weCIgKyBMb25nLnRvSGV4U3RyaW5nKHdlbGxLbm93blBhcmFtZXRlclZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSAiUSIgcGFyYW1ldGVyLCB2YWx1ZSBpcyBhIHVpbnR2YXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdlbGxLbm93blBhcmFtZXRlclZhbHVlID09IFFfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVVaW50dmFySW50ZWdlcihzdGFydEluZGV4ICsgdG90YWxSZWFkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVhZCArPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodW5zaWduZWQzMmJpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBhcmFtZXRlcnMucHV0KHBhcmFtLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRDb250ZW50UGFyYW1ldGVycyhzdGFydEluZGV4ICsgdG90YWxSZWFkLCBsZWZ0VG9SZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsUmVhZCwgYWNjdW11bGF0b3IgKyB0b3RhbFJlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVjb2RlTm9WYWx1ZShzdGFydEluZGV4ICsgdG90YWxSZWFkKSkgeworICAgICAgICAgICAgICAgIHRvdGFsUmVhZCArPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXggKyB0b3RhbFJlYWQpKSB7CisgICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gKGludCkgdW5zaWduZWQzMmJpdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50VmFsdWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YoaW50VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVjb2RlVG9rZW5UZXh0KHN0YXJ0SW5kZXggKyB0b3RhbFJlYWQpOworICAgICAgICAgICAgICAgIHRvdGFsUmVhZCArPSBkYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcXVvdGVkIHN0cmluZywgc28gcmVtb3ZlIHRoZSBxdW90ZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZW50UGFyYW1ldGVycy5wdXQocGFyYW0sIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkQ29udGVudFBhcmFtZXRlcnMoc3RhcnRJbmRleCArIHRvdGFsUmVhZCwgbGVmdFRvUmVhZCAtIHRvdGFsUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKyB0b3RhbFJlYWQpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhTGVuZ3RoID0gYWNjdW11bGF0b3I7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBuZXh0IGJ5dGUgaXMgTm8tVmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIkNvbnRlbnQgbGVuZ3RoIiBpbiB0aGlzIHBkdQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBuZXh0IGJ5dGUgaXMgMHgwMAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVOb1ZhbHVlKGludCBzdGFydEluZGV4KSB7CisgICAgICAgIGlmICh3c3BEYXRhW3N0YXJ0SW5kZXhdID09IDApIHsKKyAgICAgICAgICAgIGRhdGFMZW5ndGggPSAxOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSBzdHJpbmdWYWx1ZSB3aXRoIHRoZSBtaW1lIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgaW4gdW5zaWduZWQzMmJpdAorICAgICAqCisgICAgICogU2V0cyB1bnNpZ25lZDMyYml0IHRvIC0xIGlmIHN0cmluZ1ZhbHVlIGlzIGFscmVhZHkgcG9wdWxhdGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZFdlbGxLbm93bk1pbWVUeXBlKCkgeworICAgICAgICBpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGJpbmFyeUNvbnRlbnRUeXBlID0gKGludCkgdW5zaWduZWQzMmJpdDsKKyAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gV0VMTF9LTk9XTl9NSU1FX1RZUEVTLmdldChiaW5hcnlDb250ZW50VHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZDMyYml0ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBEZWNvZGUgdGhlICJDb250ZW50IGxlbmd0aCIgdHlwZSBmb3IgV1NQIHBkdQogICAgICAqCkBAIC0yNzQsNyArNTY2LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBDb250ZW50IGxlbmd0aCkgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlQ29udGVudExlbmd0aChpbnQgc3RhcnRJbmRleCkgewogICAgICAgICByZXR1cm4gZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXgpOwpAQCAtMjg3LDcgKzU3OSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gZXJyb3Iobm90IGEgQ29udGVudCBsb2NhdGlvbikgb2NjdXIKICAgICAgKiAgICAgICAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlU3RyaW5nKCkgbWV0aG9kCi0gICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRWYWx1ZTMyKCkgbWV0aG9kCisgICAgICogICAgICAgICBsZW5ndGggb2YgZGF0YSBpbiBwZHUgY2FuIGJlIHJldHJpZXZlZCBieSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpIG1ldGhvZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRlY29kZUNvbnRlbnRMb2NhdGlvbihpbnQgc3RhcnRJbmRleCkgewogICAgICAgICByZXR1cm4gZGVjb2RlVGV4dFN0cmluZyhzdGFydEluZGV4KTsKQEAgLTMwMCw3ICs1OTIsOCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFgtV2FwLUFwcGxpY2F0aW9uLUlkKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZmlyc3QgYnkgZ2V0VmFsdWVTdHJpbmcoKSBhbmQgc2Vjb25kIGJ5IGdldFZhbHVlMzIoKQotICAgICAqICAgICAgICAgbWV0aG9kIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIG1ldGhvZAorICAgICAqICAgICAgICAgbGVuZ3RoIG9mIGRhdGEgaW4gcGR1IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RGVjb2RlZERhdGFMZW5ndGgoKSBtZXRob2QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVYV2FwQXBwbGljYXRpb25JZChpbnQgc3RhcnRJbmRleCkgewogICAgICAgICBpZiAoZGVjb2RlSW50ZWdlclZhbHVlKHN0YXJ0SW5kZXgpID09IHRydWUpIHsKQEAgLTMxMSwxMyArNjA0LDc3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2VlayBmb3IgdGhlICJYLVdhcC1BcHBsaWNhdGlvbi1JZCIgZmllbGQgZm9yIFdTUCBwZHUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBzZWVrIHBvaW50ZXIKKyAgICAgKiBAcGFyYW0gZW5kSW5kZXggVmFsaWQgc2VlayBhcmVhIGVuZCBwb2ludAorICAgICAqCisgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFgtV2FwLUFwcGxpY2F0aW9uLUlkKSBvY2N1cgorICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWUzMigpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2Vla1hXYXBBcHBsaWNhdGlvbklkKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDw9IGVuZEluZGV4OyApIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiA4LjQuMS4xICBGaWVsZCBuYW1lCisgICAgICAgICAgICAgICAgICogRmllbGQgbmFtZSBpcyBpbnRlZ2VyIG9yIHRleHQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZUludGVnZXJWYWx1ZShpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkVmFsdWUgPSAoaW50KSBnZXRWYWx1ZTMyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gUEFSQU1FVEVSX0lEX1hfV0FQX0FQUExJQ0FUSU9OX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDMyYml0ID0gaW5kZXggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY29kZVRleHRTdHJpbmcoaW5kZXgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGdldERlY29kZWREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gZW5kSW5kZXgpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIDguNC4xLjIgRmllbGQgdmFsdWVzCisgICAgICAgICAgICAgICAgICogVmFsdWUgSW50ZXJwcmV0YXRpb24gb2YgRmlyc3QgT2N0ZXQKKyAgICAgICAgICAgICAgICAgKiAwIC0gMzAgVGhpcyBvY3RldCBpcyBmb2xsb3dlZCBieSB0aGUgaW5kaWNhdGVkIG51bWJlciAoMCAtIDMwKQorICAgICAgICAgICAgICAgICAgICAgICAgb2YgZGF0YSBvY3RldHMKKyAgICAgICAgICAgICAgICAgKiAzMSBUaGlzIG9jdGV0IGlzIGZvbGxvd2VkIGJ5IGEgdWludHZhciwgd2hpY2ggaW5kaWNhdGVzIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgKiAgICAgIG9mIGRhdGEgb2N0ZXRzIGFmdGVyIGl0CisgICAgICAgICAgICAgICAgICogMzIgLSAxMjcgVGhlIHZhbHVlIGlzIGEgdGV4dCBzdHJpbmcsIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvIG9jdGV0CisgICAgICAgICAgICAgICAgICAgICAgICAoTlVMIGNoYXJhY3RlcikKKyAgICAgICAgICAgICAgICAgKiAxMjggLSAyNTUgSXQgaXMgYW4gZW5jb2RlZCA3LWJpdCB2YWx1ZTsgdGhpcyBoZWFkZXIgaGFzIG5vIG1vcmUgZGF0YQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJ5dGUgdmFsID0gd3NwRGF0YVtpbmRleF07CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gdmFsICYmIHZhbCA8PSBXQVBfUERVX1NIT1JUX0xFTkdUSF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gd3NwRGF0YVtpbmRleF0gKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09IFdBUF9QRFVfTEVOR1RIX1FVT1RFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gZW5kSW5kZXgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNvZGVVaW50dmFySW50ZWdlcihpbmRleCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gZ2V0RGVjb2RlZERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdBUF9QRFVfTEVOR1RIX1FVT1RFIDwgdmFsICYmIHZhbCA8PSAxMjcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNvZGVUZXh0U3RyaW5nKGluZGV4KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBnZXREZWNvZGVkRGF0YUxlbmd0aCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9zZWVrIGFwcGxpY2F0aW9uIElEIGZhaWxlZC4gV1NQIGhlYWRlciBtaWdodCBiZSBjb3JydXB0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRGVjb2RlIHRoZSAiWC1XYXAtQ29udGVudC1VUkkiIHR5cGUgZm9yIFdTUCBwZHUKICAgICAgKgogICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgIlgtV2FwLUNvbnRlbnQtVVJJIiBpbiB0aGlzIHBkdQogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZSB3aGVuIGVycm9yKG5vdCBhIFgtV2FwLUNvbnRlbnQtVVJJKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlWFdhcENvbnRlbnRVUkkoaW50IHN0YXJ0SW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGRlY29kZVRleHRTdHJpbmcoc3RhcnRJbmRleCk7CkBAIC0zMzAsNyArNjg3LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gZmFsc2Ugd2hlbiBlcnJvcihub3QgYSBYLVdhcC1Jbml0aWF0b3ItVVJJKSBvY2N1cgogICAgICAqICAgICAgICAgcmV0dXJuIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0VmFsdWVTdHJpbmcoKSBtZXRob2QKLSAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFZhbHVlMzIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgIGxlbmd0aCBvZiBkYXRhIGluIHBkdSBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldERlY29kZWREYXRhTGVuZ3RoKCkgbWV0aG9kCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGVjb2RlWFdhcEluaXRpYXRvclVSSShpbnQgc3RhcnRJbmRleCkgewogICAgICAgICByZXR1cm4gZGVjb2RlVGV4dFN0cmluZyhzdGFydEluZGV4KTsKQEAgLTM1Niw0ICs3MTMsMTggQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQW55IHBhcmFtZXRlcnMgZW5jb3VudGVyZWQgYXMgcGFydCBvZiBhIGRlY29kZUNvbnRlbnRUeXBlKCkgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgY29udGVudCBwYXJhbWV0ZXJzIGtleWVkIGJ5IHRoZWlyIG5hbWVzLCBvciBudWxsIGlmCisgICAgICogICAgICAgICBkZWNvZGVDb250ZW50VHlwZSgpIGhhcyBub3QgYmVlbiBjYWxsZWQgSWYgYW55IHVuYXNzaWduZWQKKyAgICAgKiAgICAgICAgIHdlbGwta25vd24gcGFyYW1ldGVycyBhcmUgZW5jb3VudGVyZWQsIHRoZSBrZXkgb2YgdGhlIG1hcCB3aWxsIGJlCisgICAgICogICAgICAgICAndW5hc3NpZ25lZC8weC4uLicsIHdoZXJlICcuLi4nIGlzIHRoZSBoZXggdmFsdWUgb2YgdGhlCisgICAgICogICAgICAgICB1bmFzc2lnbmVkIHBhcmFtZXRlci4gIElmIGEgcGFyYW1ldGVyIGhhcyBOby1WYWx1ZSB0aGUgdmFsdWUgd2lsbCBiZSBudWxsLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENvbnRlbnRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gY29udGVudFBhcmFtZXRlcnM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQXBwSW50ZXJmYWNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0FwcEludGVyZmFjZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0FwcEludGVyZmFjZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0FwcEludGVyZmFjZS5qYXZhCmluZGV4IDU4ZjFmOTcuLjJlYjZjY2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0FwcEludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQXBwSW50ZXJmYWNlLmphdmEKQEAgLTE0LDI5ICsxNCwyOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBTVEsgQXBwIGFuZCBTVEsgVGVsZXBob255CisgKiBJbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBTVEsgQXBwIGFuZCBDQVQgVGVsZXBob255CiAgKgogICoge0BoaWRlfQogICovCiBwdWJsaWMgaW50ZXJmYWNlIEFwcEludGVyZmFjZSB7CiAKICAgICAvKgotICAgICAqIEludGVudCdzIGFjdGlvbnMgd2hpY2ggYXJlIGJyb2FkY2FzdGVkIGJ5IHRoZSBUZWxlcGhvbnkgb25jZSBhIG5ldyBTVEsKKyAgICAgKiBJbnRlbnQncyBhY3Rpb25zIHdoaWNoIGFyZSBicm9hZGNhc3RlZCBieSB0aGUgVGVsZXBob255IG9uY2UgYSBuZXcgQ0FUCiAgICAgICogcHJvYWN0aXZlIGNvbW1hbmQsIHNlc3Npb24gZW5kIGFycml2ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEtfQ01EX0FDVElPTiA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUX0NNRF9BQ1RJT04gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5zdGsuY29tbWFuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RLX1NFU1NJT05fRU5EX0FDVElPTiA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUX1NFU1NJT05fRU5EX0FDVElPTiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLnN0ay5zZXNzaW9uX2VuZCI7CiAKICAgICAvKgogICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZyb20gYXBwIHRvIHRlbGVwaG9ueSB0byBwYXNzIGEgcmVzdWx0IGNvZGUgYW5kIHVzZXIncwotICAgICAqIGlucHV0IGJhY2sgdG8gdGhlIFNJTS4KKyAgICAgKiBpbnB1dCBiYWNrIHRvIHRoZSBJQ0MuCiAgICAgICovCi0gICAgdm9pZCBvbkNtZFJlc3BvbnNlKFN0a1Jlc3BvbnNlTWVzc2FnZSByZXNNc2cpOworICAgIHZvaWQgb25DbWRSZXNwb25zZShDYXRSZXNwb25zZU1lc3NhZ2UgcmVzTXNnKTsKIAogICAgIC8qCiAgICAgICogRW51bWVyYXRpb24gZm9yIHJlcHJlc2VudGluZyAiVHlwZSBvZiBDb21tYW5kIiBvZiBwcm9hY3RpdmUgY29tbWFuZHMuCkBAIC01OCw3ICs1OCw4IEBACiAgICAgICAgIFNFVF9VUF9FVkVOVF9MSVNUKDB4MDUpLAogICAgICAgICBTRVRfVVBfSURMRV9NT0RFX1RFWFQoMHgyOCksCiAgICAgICAgIFNFVF9VUF9NRU5VKDB4MjUpLAotICAgICAgICBTRVRfVVBfQ0FMTCgweDEwKTsKKyAgICAgICAgU0VUX1VQX0NBTEwoMHgxMCksCisgICAgICAgIFBST1ZJREVfTE9DQUxfSU5GT1JNQVRJT04oMHgyNik7CiAKICAgICAgICAgcHJpdmF0ZSBpbnQgbVZhbHVlOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9CZXJUbHYuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQmVyVGx2LmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQmVyVGx2LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQmVyVGx2LmphdmEKaW5kZXggMTlkMzI3OS4uNzc0YmZhMyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQmVyVGx2LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9CZXJUbHYuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtDbWRNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdENtZE1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtDbWRNZXNzYWdlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0Q21kTWVzc2FnZS5qYXZhCmluZGV4IDU0MjVhNDMuLjUxNTViYjIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0NtZE1lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdENtZE1lc3NhZ2UuamF2YQpAQCAtMTQsMTcgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiAvKioKLSAqIENsYXNzIHVzZWQgdG8gcGFzcyBTVEsgbWVzc2FnZXMgZnJvbSB0ZWxlcGhvbnkgdG8gYXBwbGljYXRpb24uIEFwcGxpY2F0aW9uCisgKiBDbGFzcyB1c2VkIHRvIHBhc3MgQ0FUIG1lc3NhZ2VzIGZyb20gdGVsZXBob255IHRvIGFwcGxpY2F0aW9uLiBBcHBsaWNhdGlvbgogICogc2hvdWxkIGNhbGwgZ2V0WFhYKCkgdG8gZ2V0IGNvbW1hbmRzJ3Mgc3BlY2lmaWMgdmFsdWVzLgogICoKICAqLwotcHVibGljIGNsYXNzIFN0a0NtZE1lc3NhZ2UgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKK3B1YmxpYyBjbGFzcyBDYXRDbWRNZXNzYWdlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAgICAgLy8gbWVtYmVycwogICAgIENvbW1hbmREZXRhaWxzIG1DbWREZXQ7CiAgICAgcHJpdmF0ZSBUZXh0TWVzc2FnZSBtVGV4dE1zZzsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgcHVibGljIFRleHRNZXNzYWdlIGNhbGxNc2c7CiAgICAgfQogCi0gICAgU3RrQ21kTWVzc2FnZShDb21tYW5kUGFyYW1zIGNtZFBhcmFtcykgeworICAgIENhdENtZE1lc3NhZ2UoQ29tbWFuZFBhcmFtcyBjbWRQYXJhbXMpIHsKICAgICAgICAgbUNtZERldCA9IGNtZFBhcmFtcy5jbWREZXQ7CiAgICAgICAgIHN3aXRjaChnZXRDbWRUeXBlKCkpIHsKICAgICAgICAgY2FzZSBTRVRfVVBfTUVOVToKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTdGtDbWRNZXNzYWdlKFBhcmNlbCBpbikgeworICAgIHB1YmxpYyBDYXRDbWRNZXNzYWdlKFBhcmNlbCBpbikgewogICAgICAgICBtQ21kRGV0ID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CiAgICAgICAgIG1UZXh0TXNnID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CiAgICAgICAgIG1NZW51ID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CkBAIC0xMzAsMTMgKzEzMCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U3RrQ21kTWVzc2FnZT4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U3RrQ21kTWVzc2FnZT4oKSB7Ci0gICAgICAgIHB1YmxpYyBTdGtDbWRNZXNzYWdlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0a0NtZE1lc3NhZ2UoaW4pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENhdENtZE1lc3NhZ2U+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENhdENtZE1lc3NhZ2U+KCkgeworICAgICAgICBwdWJsaWMgQ2F0Q21kTWVzc2FnZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXRDbWRNZXNzYWdlKGluKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBTdGtDbWRNZXNzYWdlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RrQ21kTWVzc2FnZVtzaXplXTsKKyAgICAgICAgcHVibGljIENhdENtZE1lc3NhZ2VbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXRDbWRNZXNzYWdlW3NpemVdOwogICAgICAgICB9CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdEV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2ZGUzNjYuLjFiZjEzNjkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0RXhjZXB0aW9uLmphdmEKQEAgLTE0LDE4ICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwogCiAKIC8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBleGNlcHRpb25zIGluIFNUSyBzZXJ2aWNlLgorICogQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBleGNlcHRpb25zIGluIENBVCBzZXJ2aWNlLgogICoKICAqIHtAaGlkZX0KICAqLwotY2xhc3MgU3RrRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFN0a0V4Y2VwdGlvbigpIHsKK2NsYXNzIENhdEV4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24geworICAgIHB1YmxpYyBDYXRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrTG9nLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdExvZy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0xvZy5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdExvZy5qYXZhCmluZGV4IGJkNmJjOGYuLmUxOWZmNDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0xvZy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0TG9nLmphdmEKQEAgLTE0LDExICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGtMb2cgeworcHVibGljIGFic3RyYWN0IGNsYXNzIENhdExvZyB7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGQoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1zZykgewpAQCAtMjcsNyArMjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNhbGxlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgTG9nLmQoIlNUSyIsIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSArICI6ICIKKyAgICAgICAgTG9nLmQoIkNBVCIsIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSArICI6ICIKICAgICAgICAgICAgICAgICArIG1zZyk7CiAgICAgfQogCkBAIC0zNiw2ICszNiw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBMb2cuZCgiU1RLIiwgY2FsbGVyICsgIjogIiArIG1zZyk7CisgICAgICAgIExvZy5kKCJDQVQiLCBjYWxsZXIgKyAiOiAiICsgbXNnKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtSZXNwb25zZU1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0UmVzcG9uc2VNZXNzYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrUmVzcG9uc2VNZXNzYWdlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ2F0UmVzcG9uc2VNZXNzYWdlLmphdmEKaW5kZXggMDRhNTJlNi4uY2ZjYWMzNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrUmVzcG9uc2VNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRSZXNwb25zZU1lc3NhZ2UuamF2YQpAQCAtMTQsOSArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAotcHVibGljIGNsYXNzIFN0a1Jlc3BvbnNlTWVzc2FnZSB7CitwdWJsaWMgY2xhc3MgQ2F0UmVzcG9uc2VNZXNzYWdlIHsKICAgICAgICAgQ29tbWFuZERldGFpbHMgY21kRGV0ID0gbnVsbDsKICAgICAgICAgUmVzdWx0Q29kZSByZXNDb2RlICA9IFJlc3VsdENvZGUuT0s7CiAgICAgICAgIGludCB1c2Vyc01lbnVTZWxlY3Rpb24gPSAwOwpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICBib29sZWFuIHVzZXJzWWVzTm9TZWxlY3Rpb24gPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiB1c2Vyc0NvbmZpcm0gPSBmYWxzZTsKIAotICAgICAgICBwdWJsaWMgU3RrUmVzcG9uc2VNZXNzYWdlKFN0a0NtZE1lc3NhZ2UgY21kTXNnKSB7CisgICAgICAgIHB1YmxpYyBDYXRSZXNwb25zZU1lc3NhZ2UoQ2F0Q21kTWVzc2FnZSBjbWRNc2cpIHsKICAgICAgICAgICAgIHRoaXMuY21kRGV0ID0gY21kTXNnLm1DbWREZXQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrU2VydmljZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRTZXJ2aWNlLmphdmEKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrU2VydmljZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NhdFNlcnZpY2UuamF2YQppbmRleCAyOWVkOTVjLi4zNjA1OWFkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TdGtTZXJ2aWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9DYXRTZXJ2aWNlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjIsMTIgKzIyLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUNhcmQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0ZpbGVIYW5kbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NSZWNvcmRzOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIApAQCAtMTExLDE3ICsxMTIsMTkgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBjbGFzcyBTdGtTZXJ2aWNlIGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIEFwcEludGVyZmFjZSB7CitwdWJsaWMgY2xhc3MgQ2F0U2VydmljZSBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBBcHBJbnRlcmZhY2UgewogCiAgICAgLy8gQ2xhc3MgbWVtYmVycwotICAgIHByaXZhdGUgc3RhdGljIFNJTVJlY29yZHMgbVNpbVJlY29yZHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgSWNjUmVjb3JkcyBtSWNjUmVjb3JkczsKIAogICAgIC8vIFNlcnZpY2UgbWVtYmVycy4KLSAgICBwcml2YXRlIHN0YXRpYyBTdGtTZXJ2aWNlIHNJbnN0YW5jZTsKKyAgICAvLyBQcm90ZWN0cyBzaW5nbGV0b24gaW5zdGFuY2UgbGF6eSBpbml0aWFsaXphdGlvbi4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc0luc3RhbmNlTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDYXRTZXJ2aWNlIHNJbnN0YW5jZTsKICAgICBwcml2YXRlIENvbW1hbmRzSW50ZXJmYWNlIG1DbWRJZjsKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBTdGtDbWRNZXNzYWdlIG1DdXJybnRDbWQgPSBudWxsOwotICAgIHByaXZhdGUgU3RrQ21kTWVzc2FnZSBtTWVudUNtZCA9IG51bGw7CisgICAgcHJpdmF0ZSBDYXRDbWRNZXNzYWdlIG1DdXJybnRDbWQgPSBudWxsOworICAgIHByaXZhdGUgQ2F0Q21kTWVzc2FnZSBtTWVudUNtZCA9IG51bGw7CiAKICAgICBwcml2YXRlIFJpbE1lc3NhZ2VEZWNvZGVyIG1Nc2dEZWNvZGVyID0gbnVsbDsKIApAQCAtMTM2LDcgKzEzOSw3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBNU0dfSURfUklMX01TR19ERUNPREVEICAgICAgICAgID0gMTA7CiAKICAgICAvLyBFdmVudHMgdG8gc2lnbmFsIFNJTSBwcmVzZW5jZSBvciBhYnNlbnQgaW4gdGhlIGRldmljZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lEX1NJTV9MT0FERUQgICAgICAgPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lEX0lDQ19SRUNPUkRTX0xPQURFRCAgICAgICA9IDIwOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVl9JRF9LRVlQQUQgICAgICA9IDB4MDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVl9JRF9ESVNQTEFZICAgICA9IDB4MDI7CkBAIC0xNDYsMTAgKzE0OSwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZfSURfTkVUV09SSyAgICAgPSAweDgzOwogCiAgICAgLyogSW50ZW50aW9uYWxseSBwcml2YXRlIGZvciBzaW5nbGV0b24gKi8KLSAgICBwcml2YXRlIFN0a1NlcnZpY2UoQ29tbWFuZHNJbnRlcmZhY2UgY2ksIFNJTVJlY29yZHMgc3IsIENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIFNJTUZpbGVIYW5kbGVyIGZoLCBTaW1DYXJkIHNjKSB7Ci0gICAgICAgIGlmIChjaSA9PSBudWxsIHx8IHNyID09IG51bGwgfHwgY29udGV4dCA9PSBudWxsIHx8IGZoID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBzYyA9PSBudWxsKSB7CisgICAgcHJpdmF0ZSBDYXRTZXJ2aWNlKENvbW1hbmRzSW50ZXJmYWNlIGNpLCBJY2NSZWNvcmRzIGlyLCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBJY2NGaWxlSGFuZGxlciBmaCwgSWNjQ2FyZCBpYykgeworICAgICAgICBpZiAoY2kgPT0gbnVsbCB8fCBpciA9PSBudWxsIHx8IGNvbnRleHQgPT0gbnVsbCB8fCBmaCA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgaWMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiU2VydmljZTogSW5wdXQgcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE2MCwzMyArMTYzLDMzIEBACiAgICAgICAgIG1Nc2dEZWNvZGVyID0gUmlsTWVzc2FnZURlY29kZXIuZ2V0SW5zdGFuY2UodGhpcywgZmgpOwogCiAgICAgICAgIC8vIFJlZ2lzdGVyIHJpbCBldmVudHMgaGFuZGxpbmcuCi0gICAgICAgIG1DbWRJZi5zZXRPblN0a1Nlc3Npb25FbmQodGhpcywgTVNHX0lEX1NFU1NJT05fRU5ELCBudWxsKTsKLSAgICAgICAgbUNtZElmLnNldE9uU3RrUHJvYWN0aXZlQ21kKHRoaXMsIE1TR19JRF9QUk9BQ1RJVkVfQ09NTUFORCwgbnVsbCk7Ci0gICAgICAgIG1DbWRJZi5zZXRPblN0a0V2ZW50KHRoaXMsIE1TR19JRF9FVkVOVF9OT1RJRlksIG51bGwpOwotICAgICAgICBtQ21kSWYuc2V0T25TdGtDYWxsU2V0VXAodGhpcywgTVNHX0lEX0NBTExfU0VUVVAsIG51bGwpOworICAgICAgICBtQ21kSWYuc2V0T25DYXRTZXNzaW9uRW5kKHRoaXMsIE1TR19JRF9TRVNTSU9OX0VORCwgbnVsbCk7CisgICAgICAgIG1DbWRJZi5zZXRPbkNhdFByb2FjdGl2ZUNtZCh0aGlzLCBNU0dfSURfUFJPQUNUSVZFX0NPTU1BTkQsIG51bGwpOworICAgICAgICBtQ21kSWYuc2V0T25DYXRFdmVudCh0aGlzLCBNU0dfSURfRVZFTlRfTk9USUZZLCBudWxsKTsKKyAgICAgICAgbUNtZElmLnNldE9uQ2F0Q2FsbFNldFVwKHRoaXMsIE1TR19JRF9DQUxMX1NFVFVQLCBudWxsKTsKICAgICAgICAgLy9tQ21kSWYuc2V0T25TaW1SZWZyZXNoKHRoaXMsIE1TR19JRF9SRUZSRVNILCBudWxsKTsKIAotICAgICAgICBtU2ltUmVjb3JkcyA9IHNyOworICAgICAgICBtSWNjUmVjb3JkcyA9IGlyOwogCiAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBTSU0gcmVhZHkgZXZlbnQuCi0gICAgICAgIG1TaW1SZWNvcmRzLnJlZ2lzdGVyRm9yUmVjb3Jkc0xvYWRlZCh0aGlzLCBNU0dfSURfU0lNX0xPQURFRCwgbnVsbCk7CisgICAgICAgIG1JY2NSZWNvcmRzLnJlZ2lzdGVyRm9yUmVjb3Jkc0xvYWRlZCh0aGlzLCBNU0dfSURfSUNDX1JFQ09SRFNfTE9BREVELCBudWxsKTsKIAogICAgICAgICBtQ21kSWYucmVwb3J0U3RrU2VydmljZUlzUnVubmluZyhudWxsKTsKLSAgICAgICAgU3RrTG9nLmQodGhpcywgIlN0a1NlcnZpY2U6IGlzIHJ1bm5pbmciKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgIklzIHJ1bm5pbmciKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBtU2ltUmVjb3Jkcy51bnJlZ2lzdGVyRm9yUmVjb3Jkc0xvYWRlZCh0aGlzKTsKLSAgICAgICAgbUNtZElmLnVuU2V0T25TdGtTZXNzaW9uRW5kKHRoaXMpOwotICAgICAgICBtQ21kSWYudW5TZXRPblN0a1Byb2FjdGl2ZUNtZCh0aGlzKTsKLSAgICAgICAgbUNtZElmLnVuU2V0T25TdGtFdmVudCh0aGlzKTsKLSAgICAgICAgbUNtZElmLnVuU2V0T25TdGtDYWxsU2V0VXAodGhpcyk7CisgICAgICAgIG1JY2NSZWNvcmRzLnVucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHRoaXMpOworICAgICAgICBtQ21kSWYudW5TZXRPbkNhdFNlc3Npb25FbmQodGhpcyk7CisgICAgICAgIG1DbWRJZi51blNldE9uQ2F0UHJvYWN0aXZlQ21kKHRoaXMpOworICAgICAgICBtQ21kSWYudW5TZXRPbkNhdEV2ZW50KHRoaXMpOworICAgICAgICBtQ21kSWYudW5TZXRPbkNhdENhbGxTZXRVcCh0aGlzKTsKIAogICAgICAgICB0aGlzLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBTdGtMb2cuZCh0aGlzLCAiU2VydmljZSBmaW5hbGl6ZWQiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgIlNlcnZpY2UgZmluYWxpemVkIik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJpbE1zZyhSaWxNZXNzYWdlIHJpbE1zZykgewpAQCAtMjQxLDU1ICsyNDQsNTMgQEAKICAgICAgKgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcm9hY3RpdmVDb21tYW5kKENvbW1hbmRQYXJhbXMgY21kUGFyYW1zKSB7Ci0gICAgICAgIFN0a0xvZy5kKHRoaXMsIGNtZFBhcmFtcy5nZXRDb21tYW5kVHlwZSgpLm5hbWUoKSk7CisgICAgICAgIENhdExvZy5kKHRoaXMsIGNtZFBhcmFtcy5nZXRDb21tYW5kVHlwZSgpLm5hbWUoKSk7CiAKLSAgICAgICAgU3RrQ21kTWVzc2FnZSBjbWRNc2cgPSBuZXcgU3RrQ21kTWVzc2FnZShjbWRQYXJhbXMpOworICAgICAgICBDYXRDbWRNZXNzYWdlIGNtZE1zZyA9IG5ldyBDYXRDbWRNZXNzYWdlKGNtZFBhcmFtcyk7CiAgICAgICAgIHN3aXRjaCAoY21kUGFyYW1zLmdldENvbW1hbmRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBTRVRfVVBfTUVOVToKLSAgICAgICAgICAgIGlmIChyZW1vdmVNZW51KGNtZE1zZy5nZXRNZW51KCkpKSB7Ci0gICAgICAgICAgICAgICAgbU1lbnVDbWQgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWVudUNtZCA9IGNtZE1zZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRUZXJtaW5hbFJlc3BvbnNlKGNtZFBhcmFtcy5jbWREZXQsIFJlc3VsdENvZGUuT0ssIGZhbHNlLCAwLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJU1BMQVlfVEVYVDoKLSAgICAgICAgICAgIC8vIHdoZW4gYXBwbGljYXRpb24gaXMgbm90IHJlcXVpcmVkIHRvIHJlc3BvbmQsIHNlbmQgYW4gaW1tZWRpYXRlCi0gICAgICAgICAgICAvLyByZXNwb25zZS4KLSAgICAgICAgICAgIGlmICghY21kTXNnLmdlVGV4dE1lc3NhZ2UoKS5yZXNwb25zZU5lZWRlZCkgewotICAgICAgICAgICAgICAgIHNlbmRUZXJtaW5hbFJlc3BvbnNlKGNtZFBhcmFtcy5jbWREZXQsIFJlc3VsdENvZGUuT0ssIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRUZSRVNIOgotICAgICAgICAgICAgLy8gTUUgc2lkZSBvbmx5IGhhbmRsZXMgcmVmcmVzaCBjb21tYW5kcyB3aGljaCBtZWFudCB0byByZW1vdmUgSURMRQotICAgICAgICAgICAgLy8gTU9ERSBURVhULgotICAgICAgICAgICAgY21kUGFyYW1zLmNtZERldC50eXBlT2ZDb21tYW5kID0gQ29tbWFuZFR5cGUuU0VUX1VQX0lETEVfTU9ERV9URVhUCi0gICAgICAgICAgICAgICAgICAgIC52YWx1ZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1VQX0lETEVfTU9ERV9URVhUOgotICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIDAsIG51bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEFVTkNIX0JST1dTRVI6Ci0gICAgICAgIGNhc2UgU0VMRUNUX0lURU06Ci0gICAgICAgIGNhc2UgR0VUX0lOUFVUOgotICAgICAgICBjYXNlIEdFVF9JTktFWToKLSAgICAgICAgY2FzZSBTRU5EX0RUTUY6Ci0gICAgICAgIGNhc2UgU0VORF9TTVM6Ci0gICAgICAgIGNhc2UgU0VORF9TUzoKLSAgICAgICAgY2FzZSBTRU5EX1VTU0Q6Ci0gICAgICAgIGNhc2UgUExBWV9UT05FOgotICAgICAgICBjYXNlIFNFVF9VUF9DQUxMOgotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBvbiB0ZWxlcGhvbnkhCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFNFVF9VUF9NRU5VOgorICAgICAgICAgICAgICAgIGlmIChyZW1vdmVNZW51KGNtZE1zZy5nZXRNZW51KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZW51Q21kID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWVudUNtZCA9IGNtZE1zZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZFRlcm1pbmFsUmVzcG9uc2UoY21kUGFyYW1zLmNtZERldCwgUmVzdWx0Q29kZS5PSywgZmFsc2UsIDAsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNQTEFZX1RFWFQ6CisgICAgICAgICAgICAgICAgLy8gd2hlbiBhcHBsaWNhdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8gcmVzcG9uZCwgc2VuZCBhbiBpbW1lZGlhdGUgcmVzcG9uc2UuCisgICAgICAgICAgICAgICAgaWYgKCFjbWRNc2cuZ2VUZXh0TWVzc2FnZSgpLnJlc3BvbnNlTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRUZXJtaW5hbFJlc3BvbnNlKGNtZFBhcmFtcy5jbWREZXQsIFJlc3VsdENvZGUuT0ssIGZhbHNlLCAwLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJFRlJFU0g6CisgICAgICAgICAgICAgICAgLy8gTUUgc2lkZSBvbmx5IGhhbmRsZXMgcmVmcmVzaCBjb21tYW5kcyB3aGljaCBtZWFudCB0byByZW1vdmUgSURMRQorICAgICAgICAgICAgICAgIC8vIE1PREUgVEVYVC4KKyAgICAgICAgICAgICAgICBjbWRQYXJhbXMuY21kRGV0LnR5cGVPZkNvbW1hbmQgPSBDb21tYW5kVHlwZS5TRVRfVVBfSURMRV9NT0RFX1RFWFQudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VUX1VQX0lETEVfTU9ERV9URVhUOgorICAgICAgICAgICAgICAgIHNlbmRUZXJtaW5hbFJlc3BvbnNlKGNtZFBhcmFtcy5jbWREZXQsIFJlc3VsdENvZGUuT0ssIGZhbHNlLCAwLCBudWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPVklERV9MT0NBTF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgICAgICBzZW5kVGVybWluYWxSZXNwb25zZShjbWRQYXJhbXMuY21kRGV0LCBSZXN1bHRDb2RlLk9LLCBmYWxzZSwgMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBMQVVOQ0hfQlJPV1NFUjoKKyAgICAgICAgICAgIGNhc2UgU0VMRUNUX0lURU06CisgICAgICAgICAgICBjYXNlIEdFVF9JTlBVVDoKKyAgICAgICAgICAgIGNhc2UgR0VUX0lOS0VZOgorICAgICAgICAgICAgY2FzZSBTRU5EX0RUTUY6CisgICAgICAgICAgICBjYXNlIFNFTkRfU01TOgorICAgICAgICAgICAgY2FzZSBTRU5EX1NTOgorICAgICAgICAgICAgY2FzZSBTRU5EX1VTU0Q6CisgICAgICAgICAgICBjYXNlIFBMQVlfVE9ORToKKyAgICAgICAgICAgIGNhc2UgU0VUX1VQX0NBTEw6CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBvbiB0ZWxlcGhvbnkhCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJVbnN1cHBvcnRlZCBjb21tYW5kIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1DdXJybnRDbWQgPSBjbWRNc2c7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFwcEludGVyZmFjZS5TVEtfQ01EX0FDVElPTik7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFwcEludGVyZmFjZS5DQVRfQ01EX0FDVElPTik7CiAgICAgICAgIGludGVudC5wdXRFeHRyYSgiU1RLIENNRCIsIGNtZE1zZyk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9CkBAIC0yOTksMTAgKzMwMCwxMCBAQAogICAgICAqCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlc3Npb25FbmQoKSB7Ci0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJTRVNTSU9OIEVORCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAiU0VTU0lPTiBFTkQiKTsKIAogICAgICAgICBtQ3Vycm50Q21kID0gbU1lbnVDbWQ7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFwcEludGVyZmFjZS5TVEtfU0VTU0lPTl9FTkRfQUNUSU9OKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQXBwSW50ZXJmYWNlLkNBVF9TRVNTSU9OX0VORF9BQ1RJT04pOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCkBAIC0zMTUsNiArMzE2LDExIEBACiAgICAgICAgIH0KICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAorICAgICAgICBJbnB1dCBjbWRJbnB1dCA9IG51bGw7CisgICAgICAgIGlmIChtQ3Vycm50Q21kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZElucHV0ID0gbUN1cnJudENtZC5nZUlucHV0KCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBjb21tYW5kIGRldGFpbHMKICAgICAgICAgaW50IHRhZyA9IENvbXByZWhlbnNpb25UbHZUYWcuQ09NTUFORF9ERVRBSUxTLnZhbHVlKCk7CiAgICAgICAgIGlmIChjbWREZXQuY29tcFJlcXVpcmVkKSB7CkBAIC0zMjcsNyArMzMzLDEzIEBACiAgICAgICAgIGJ1Zi53cml0ZShjbWREZXQuY29tbWFuZFF1YWxpZmllcik7CiAKICAgICAgICAgLy8gZGV2aWNlIGlkZW50aXRpZXMKLSAgICAgICAgdGFnID0gMHg4MCB8IENvbXByZWhlbnNpb25UbHZUYWcuREVWSUNFX0lERU5USVRJRVMudmFsdWUoKTsKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFRTMTAyLjIyMy9UUzMxLjExMSBzZWN0aW9uIDYuOCBTdHJ1Y3R1cmUgb2YKKyAgICAgICAgLy8gVEVSTUlOQUwgUkVTUE9OU0UsICJGb3IgYWxsIFNJTVBMRS1UTFYgb2JqZWN0cyB3aXRoIE1pbj1OLAorICAgICAgICAvLyB0aGUgTUUgc2hvdWxkIHNldCB0aGUgQ1IoY29tcHJlaGVuc2lvbiByZXF1aXJlZCkgZmxhZyB0bworICAgICAgICAvLyBjb21wcmVoZW5zaW9uIG5vdCByZXF1aXJlZC4oQ1I9MCkiCisgICAgICAgIC8vIFNpbmNlIERFVklDRV9JREVOVElUSUVTIGFuZCBEVVJBVElPTiBUTFZzIGhhdmUgTWluPU4sCisgICAgICAgIC8vIHRoZSBDUiBmbGFnIGlzIG5vdCBzZXQuCisgICAgICAgIHRhZyA9IENvbXByZWhlbnNpb25UbHZUYWcuREVWSUNFX0lERU5USVRJRVMudmFsdWUoKTsKICAgICAgICAgYnVmLndyaXRlKHRhZyk7CiAgICAgICAgIGJ1Zi53cml0ZSgweDAyKTsgLy8gbGVuZ3RoCiAgICAgICAgIGJ1Zi53cml0ZShERVZfSURfVEVSTUlOQUwpOyAvLyBzb3VyY2UgZGV2aWNlIGlkCkBAIC0zNDgsMTcgKzM2MCw2NSBAQAogICAgICAgICAvLyBGaWxsIG9wdGlvbmFsIGRhdGEgZm9yIGVhY2ggY29ycmVzcG9uZGluZyBjb21tYW5kCiAgICAgICAgIGlmIChyZXNwICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlc3AuZm9ybWF0KGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGVPcHRpb25hbFRhZ3MoY21kRGV0LCByZXN1bHRDb2RlLCBjbWRJbnB1dCwgYnVmKTsKICAgICAgICAgfQogCiAgICAgICAgIGJ5dGVbXSByYXdEYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CiAgICAgICAgIFN0cmluZyBoZXhTdHJpbmcgPSBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKHJhd0RhdGEpOwogICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIHsKLSAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJURVJNSU5BTCBSRVNQT05TRTogIiArIGhleFN0cmluZyk7CisgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiVEVSTUlOQUwgUkVTUE9OU0U6ICIgKyBoZXhTdHJpbmcpOwogICAgICAgICB9CiAKICAgICAgICAgbUNtZElmLnNlbmRUZXJtaW5hbFJlc3BvbnNlKGhleFN0cmluZywgbnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuY29kZU9wdGlvbmFsVGFncyhDb21tYW5kRGV0YWlscyBjbWREZXQsCisgICAgICAgICAgICBSZXN1bHRDb2RlIHJlc3VsdENvZGUsIElucHV0IGNtZElucHV0LCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmKSB7CisgICAgICAgIHN3aXRjaCAoQXBwSW50ZXJmYWNlLkNvbW1hbmRUeXBlLmZyb21JbnQoY21kRGV0LnR5cGVPZkNvbW1hbmQpKSB7CisgICAgICAgICAgICBjYXNlIEdFVF9JTktFWToKKyAgICAgICAgICAgICAgICAvLyBFVFNJIFRTIDEwMiAzODQsMjcuMjIuNC4yLjguNC4yLgorICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcmVzcG9uc2UgZm9yIEdFVF9JTktFWSBjb21tYW5kIGFuZCB0aGUgcmVzcG9uc2UgdGltZW91dAorICAgICAgICAgICAgICAgIC8vIG9jY3VyZWQsIHRoZW4gYWRkIERVUkFUSU9OIFRMViBmb3IgdmFyaWFibGUgdGltZW91dCBjYXNlLgorICAgICAgICAgICAgICAgIGlmICgocmVzdWx0Q29kZS52YWx1ZSgpID09IFJlc3VsdENvZGUuTk9fUkVTUE9OU0VfRlJPTV9VU0VSLnZhbHVlKCkpICYmCisgICAgICAgICAgICAgICAgICAgIChjbWRJbnB1dCAhPSBudWxsKSAmJiAoY21kSW5wdXQuZHVyYXRpb24gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5LZXlSZXNwb25zZShidWYsIGNtZElucHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST1ZJREVfTE9DQUxfSU5GT1JNQVRJT046CisgICAgICAgICAgICAgICAgaWYgKChjbWREZXQuY29tbWFuZFF1YWxpZmllciA9PSBDb21tYW5kUGFyYW1zRmFjdG9yeS5MQU5HVUFHRV9TRVRUSU5HKSAmJgorICAgICAgICAgICAgICAgICAgICAocmVzdWx0Q29kZS52YWx1ZSgpID09IFJlc3VsdENvZGUuT0sudmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UGxpUmVzcG9uc2UoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJlbmNvZGVPcHRpb25hbFRhZ3MoKSBVbnN1cHBvcnRlZCBDbWQ6IiArIGNtZERldC50eXBlT2ZDb21tYW5kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRJbktleVJlc3BvbnNlKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYsIElucHV0IGNtZElucHV0KSB7CisgICAgICAgIGludCB0YWcgPSBDb21wcmVoZW5zaW9uVGx2VGFnLkRVUkFUSU9OLnZhbHVlKCk7CisKKyAgICAgICAgYnVmLndyaXRlKHRhZyk7CisgICAgICAgIGJ1Zi53cml0ZSgweDAyKTsgLy8gbGVuZ3RoCisgICAgICAgIGJ1Zi53cml0ZShjbWRJbnB1dC5kdXJhdGlvbi50aW1lVW5pdC5TRUNPTkQudmFsdWUoKSk7IC8vIFRpbWUgKFVuaXQsU2Vjb25kcykKKyAgICAgICAgYnVmLndyaXRlKGNtZElucHV0LmR1cmF0aW9uLnRpbWVJbnRlcnZhbCk7IC8vIFRpbWUgRHVyYXRpb24KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0UGxpUmVzcG9uc2UoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZikgeworCisgICAgICAgIC8vIExvY2FsZSBMYW5ndWFnZSBTZXR0aW5nCisgICAgICAgIFN0cmluZyBsYW5nID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3Quc3lzLmxhbmd1YWdlIik7CisKKyAgICAgICAgaWYgKGxhbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGFnCisgICAgICAgICAgICBpbnQgdGFnID0gQ29tcHJlaGVuc2lvblRsdlRhZy5MQU5HVUFHRS52YWx1ZSgpOworICAgICAgICAgICAgYnVmLndyaXRlKHRhZyk7CisgICAgICAgICAgICBSZXNwb25zZURhdGEud3JpdGVMZW5ndGgoYnVmLCBsYW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGJ1Zi53cml0ZShsYW5nLmdldEJ5dGVzKCksIDAsIGxhbmcubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRNZW51U2VsZWN0aW9uKGludCBtZW51SWQsIGJvb2xlYW4gaGVscFJlcXVpcmVkKSB7CiAKQEAgLTQ0NiwzNyArNTA2LDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVXNlZCBmb3IgaW5zdGFudGlhdGluZy91cGRhdGluZyB0aGUgU2VydmljZSBmcm9tIHRoZSBHc21QaG9uZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBVc2VkIGZvciBpbnN0YW50aWF0aW5nL3VwZGF0aW5nIHRoZSBTZXJ2aWNlIGZyb20gdGhlIEdzbVBob25lIG9yIENkbWFQaG9uZSBjb25zdHJ1Y3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjaSBDb21tYW5kc0ludGVyZmFjZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gc3IgU0lNUmVjb3JkcyBvYmplY3QKKyAgICAgKiBAcGFyYW0gaXIgSWNjUmVjb3JkcyBvYmplY3QKICAgICAgKiBAcGFyYW0gY29udGV4dCBwaG9uZSBhcHAgY29udGV4dAotICAgICAqIEBwYXJhbSBmaCBTSU0gZmlsZSBoYW5kbGVyCi0gICAgICogQHBhcmFtIHNjIEdTTSBTSU0gY2FyZAorICAgICAqIEBwYXJhbSBmaCBJY2MgZmlsZSBoYW5kbGVyCisgICAgICogQHBhcmFtIGljIEljYyBjYXJkCiAgICAgICogQHJldHVybiBUaGUgb25seSBTZXJ2aWNlIG9iamVjdCBpbiB0aGUgc3lzdGVtCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdGtTZXJ2aWNlIGdldEluc3RhbmNlKENvbW1hbmRzSW50ZXJmYWNlIGNpLCBTSU1SZWNvcmRzIHNyLAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBTSU1GaWxlSGFuZGxlciBmaCwgU2ltQ2FyZCBzYykgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjaSA9PSBudWxsIHx8IHNyID09IG51bGwgfHwgY29udGV4dCA9PSBudWxsIHx8IGZoID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU3RrIFRlbGVwaG9ueSBzZXJ2aWNlIik7Ci0gICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTdGtTZXJ2aWNlKGNpLCBzciwgY29udGV4dCwgZmgsIHNjKTsKLSAgICAgICAgICAgIFN0a0xvZy5kKHNJbnN0YW5jZSwgIk5FVyBzSW5zdGFuY2UiKTsKLSAgICAgICAgfSBlbHNlIGlmICgoc3IgIT0gbnVsbCkgJiYgKG1TaW1SZWNvcmRzICE9IHNyKSkgewotICAgICAgICAgICAgU3RrTG9nLmQoc0luc3RhbmNlLCAiUmVpbml0aWFsaXplIHRoZSBTZXJ2aWNlIHdpdGggU0lNUmVjb3JkcyIpOwotICAgICAgICAgICAgbVNpbVJlY29yZHMgPSBzcjsKKyAgICBwdWJsaWMgc3RhdGljIENhdFNlcnZpY2UgZ2V0SW5zdGFuY2UoQ29tbWFuZHNJbnRlcmZhY2UgY2ksIEljY1JlY29yZHMgaXIsCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEljY0ZpbGVIYW5kbGVyIGZoLCBJY2NDYXJkIGljKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlTG9jaykgeworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNpID09IG51bGwgfHwgaXIgPT0gbnVsbCB8fCBjb250ZXh0ID09IG51bGwgfHwgZmggPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2F0IFRlbGVwaG9ueSBzZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IENhdFNlcnZpY2UoY2ksIGlyLCBjb250ZXh0LCBmaCwgaWMpOworICAgICAgICAgICAgICAgIENhdExvZy5kKHNJbnN0YW5jZSwgIk5FVyBzSW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGlyICE9IG51bGwpICYmIChtSWNjUmVjb3JkcyAhPSBpcikpIHsKKyAgICAgICAgICAgICAgICBDYXRMb2cuZChzSW5zdGFuY2UsICJSZWluaXRpYWxpemUgdGhlIFNlcnZpY2Ugd2l0aCBTSU1SZWNvcmRzIik7CisgICAgICAgICAgICAgICAgbUljY1JlY29yZHMgPSBpcjsKIAotICAgICAgICAgICAgLy8gcmUtUmVnaXN0ZXIgZm9yIFNJTSByZWFkeSBldmVudC4KLSAgICAgICAgICAgIG1TaW1SZWNvcmRzLnJlZ2lzdGVyRm9yUmVjb3Jkc0xvYWRlZChzSW5zdGFuY2UsIE1TR19JRF9TSU1fTE9BREVELCBudWxsKTsKLSAgICAgICAgICAgIFN0a0xvZy5kKHNJbnN0YW5jZSwgInNyIGNoYW5nZWQgcmVpbml0aWFsaXplIGFuZCByZXR1cm4gY3VycmVudCBzSW5zdGFuY2UiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0a0xvZy5kKHNJbnN0YW5jZSwgIlJldHVybiBjdXJyZW50IHNJbnN0YW5jZSIpOworICAgICAgICAgICAgICAgIC8vIHJlLVJlZ2lzdGVyIGZvciBTSU0gcmVhZHkgZXZlbnQuCisgICAgICAgICAgICAgICAgbUljY1JlY29yZHMucmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKHNJbnN0YW5jZSwgTVNHX0lEX0lDQ19SRUNPUkRTX0xPQURFRCwgbnVsbCk7CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQoc0luc3RhbmNlLCAic3IgY2hhbmdlZCByZWluaXRpYWxpemUgYW5kIHJldHVybiBjdXJyZW50IHNJbnN0YW5jZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDYXRMb2cuZChzSW5zdGFuY2UsICJSZXR1cm4gY3VycmVudCBzSW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ5Niw3ICs1NTgsNyBAQAogICAgICAgICBjYXNlIE1TR19JRF9QUk9BQ1RJVkVfQ09NTUFORDoKICAgICAgICAgY2FzZSBNU0dfSURfRVZFTlRfTk9USUZZOgogICAgICAgICBjYXNlIE1TR19JRF9SRUZSRVNIOgotICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgInJpbCBtZXNzYWdlIGFycml2ZWQiKTsKKyAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJyaWwgbWVzc2FnZSBhcnJpdmVkIik7CiAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG51bGw7CiAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQXN5bmNSZXN1bHQgYXIgPSAoQXN5bmNSZXN1bHQpIG1zZy5vYmo7CkBAIC01MTMsMjAgKzU3NSwyMCBAQAogICAgICAgICBjYXNlIE1TR19JRF9DQUxMX1NFVFVQOgogICAgICAgICAgICAgbU1zZ0RlY29kZXIuc2VuZFN0YXJ0RGVjb2RpbmdNZXNzYWdlUGFyYW1zKG5ldyBSaWxNZXNzYWdlKG1zZy53aGF0LCBudWxsKSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNU0dfSURfU0lNX0xPQURFRDoKKyAgICAgICAgY2FzZSBNU0dfSURfSUNDX1JFQ09SRFNfTE9BREVEOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVNHX0lEX1JJTF9NU0dfREVDT0RFRDoKICAgICAgICAgICAgIGhhbmRsZVJpbE1zZygoUmlsTWVzc2FnZSkgbXNnLm9iaik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNU0dfSURfUkVTUE9OU0U6Ci0gICAgICAgICAgICBoYW5kbGVDbWRSZXNwb25zZSgoU3RrUmVzcG9uc2VNZXNzYWdlKSBtc2cub2JqKTsKKyAgICAgICAgICAgIGhhbmRsZUNtZFJlc3BvbnNlKChDYXRSZXNwb25zZU1lc3NhZ2UpIG1zZy5vYmopOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVucmVjb2duaXplZCBTVEsgY29tbWFuZDogIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5yZWNvZ25pemVkIENBVCBjb21tYW5kOiAiICsgbXNnLndoYXQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uQ21kUmVzcG9uc2UoU3RrUmVzcG9uc2VNZXNzYWdlIHJlc01zZykgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvbkNtZFJlc3BvbnNlKENhdFJlc3BvbnNlTWVzc2FnZSByZXNNc2cpIHsKICAgICAgICAgaWYgKHJlc01zZyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTUzNSw3ICs1OTcsNyBAQAogICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmVzcG9uc2UoU3RrUmVzcG9uc2VNZXNzYWdlIHJlc01zZykgeworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlc3BvbnNlKENhdFJlc3BvbnNlTWVzc2FnZSByZXNNc2cpIHsKICAgICAgICAgaWYgKG1DdXJybnRDbWQgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIChyZXNNc2cuY21kRGV0LmNvbXBhcmVUbyhtQ3Vycm50Q21kLm1DbWREZXQpKTsKICAgICAgICAgfQpAQCAtNTQ4LDEzICs2MTAsMTMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIlVuYWJsZSB0byBnZXQgTWVudSdzIGl0ZW1zIHNpemUiKTsKKyAgICAgICAgICAgIENhdExvZy5kKHRoaXMsICJVbmFibGUgdG8gZ2V0IE1lbnUncyBpdGVtcyBzaXplIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNtZFJlc3BvbnNlKFN0a1Jlc3BvbnNlTWVzc2FnZSByZXNNc2cpIHsKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ21kUmVzcG9uc2UoQ2F0UmVzcG9uc2VNZXNzYWdlIHJlc01zZykgewogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGRldGFpbHMgbWF0Y2ggdGhlIGxhc3QgdmFsaWQgY29tbWFuZC4gQW4gaW52YWxpZAogICAgICAgICAvLyByZXNwb25zZSBpcyBhIG9uZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcHJvYWN0aXZlIGNvbW1hbmQKICAgICAgICAgLy8gYW5kIHNlbmRpbmcgaXQgY2FuICJjb25mdXNlIiB0aGUgYmFzZWJhbmQvcmlsLgpAQCAtNTYzLDcgKzYyNSw3IEBACiAgICAgICAgIC8vIGJ5IHRoZSBmcmFtZXdvcmsgaW5zaWRlIHRoZSBoaXN0b3J5IHN0YWNrLiBUaGF0IGFjdGl2aXR5IHdpbGwgYmUKICAgICAgICAgLy8gYXZhaWxhYmxlIGZvciByZWxhdW5jaCB1c2luZyB0aGUgbGF0ZXN0IGFwcGxpY2F0aW9uIGRpYWxvZwogICAgICAgICAvLyAobG9uZyBwcmVzcyBvbiB0aGUgaG9tZSBidXR0b24pLiBSZWxhdW5jaGluZyB0aGF0IGFjdGl2aXR5IGNhbiBzZW5kCi0gICAgICAgIC8vIHRoZSBzYW1lIGNvbW1hbmQncyByZXN1bHQgYWdhaW4gdG8gdGhlIFN0a1NlcnZpY2UgYW5kIGNhbiBjYXVzZSBpdCB0bworICAgICAgICAvLyB0aGUgc2FtZSBjb21tYW5kJ3MgcmVzdWx0IGFnYWluIHRvIHRoZSBDYXRTZXJ2aWNlIGFuZCBjYW4gY2F1c2UgaXQgdG8KICAgICAgICAgLy8gZ2V0IG91dCBvZiBzeW5jIHdpdGggdGhlIFNJTS4KICAgICAgICAgaWYgKCF2YWxpZGF0ZVJlc3BvbnNlKHJlc01zZykpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbW1hbmREZXRhaWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmREZXRhaWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZERldGFpbHMuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21tYW5kRGV0YWlscy5qYXZhCmluZGV4IGU4MWZmOTguLmUzZjA3OTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbW1hbmREZXRhaWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21tYW5kRGV0YWlscy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZFBhcmFtcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21tYW5kUGFyYW1zLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZFBhcmFtcy5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmRQYXJhbXMuamF2YQppbmRleCAzZGE2NTJmLi4yMmE1YzhjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Db21tYW5kUGFyYW1zLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZFBhcmFtc0ZhY3RvcnkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tbWFuZFBhcmFtc0ZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kUGFyYW1zRmFjdG9yeS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmRQYXJhbXNGYWN0b3J5LmphdmEKaW5kZXggY2U0YzQ1OS4uMTIyMDRhMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tbWFuZFBhcmFtc0ZhY3RvcnkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbW1hbmRQYXJhbXNGYWN0b3J5LmphdmEKQEAgLTE0LDE0ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC01Miw4ICs1MiwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9OQUFfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9VSUNDX1JFU0VUICAgICAgICAgICAgICAgICAgICAgPSAweDA0OwogCisgICAgLy8gQ29tbWFuZCBRdWFsaWZpZXIgdmFsdWVzIGZvciBQTEkgY29tbWFuZAorICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFOR1VBR0VfU0VUVElORyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0OworCiAgICAgc3RhdGljIHN5bmNocm9uaXplZCBDb21tYW5kUGFyYW1zRmFjdG9yeSBnZXRJbnN0YW5jZShSaWxNZXNzYWdlRGVjb2RlciBjYWxsZXIsCi0gICAgICAgICAgICBTSU1GaWxlSGFuZGxlciBmaCkgeworICAgICAgICAgICAgSWNjRmlsZUhhbmRsZXIgZmgpIHsKICAgICAgICAgaWYgKHNJbnN0YW5jZSAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgICAgICB9CkBAIC02Myw3ICs2Niw3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgQ29tbWFuZFBhcmFtc0ZhY3RvcnkoUmlsTWVzc2FnZURlY29kZXIgY2FsbGVyLCBTSU1GaWxlSGFuZGxlciBmaCkgeworICAgIHByaXZhdGUgQ29tbWFuZFBhcmFtc0ZhY3RvcnkoUmlsTWVzc2FnZURlY29kZXIgY2FsbGVyLCBJY2NGaWxlSGFuZGxlciBmaCkgewogICAgICAgICBtQ2FsbGVyID0gY2FsbGVyOwogICAgICAgICBtSWNvbkxvYWRlciA9IEljb25Mb2FkZXIuZ2V0SW5zdGFuY2UodGhpcywgZmgpOwogICAgIH0KQEAgLTc5LDcgKzgyLDcgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBjbWREZXQgPSBWYWx1ZVBhcnNlci5yZXRyaWV2ZUNvbW1hbmREZXRhaWxzKGN0bHZDbWREZXQpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlc3VsdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJGYWlsZWQgdG8gcHJvY2VlcyBjb21tYW5kIGRldGFpbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIkZhaWxlZCB0byBwcm9jZWVzIGNvbW1hbmQgZGV0YWlscyIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTEyLDcgKzExNSwxMCBAQAogICAgICAgICBBcHBJbnRlcmZhY2UuQ29tbWFuZFR5cGUgY21kVHlwZSA9IEFwcEludGVyZmFjZS5Db21tYW5kVHlwZQogICAgICAgICAgICAgICAgIC5mcm9tSW50KGNtZERldC50eXBlT2ZDb21tYW5kKTsKICAgICAgICAgaWYgKGNtZFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VuZENtZFBhcmFtcyhSZXN1bHRDb2RlLkNNRF9UWVBFX05PVF9VTkRFUlNUT09EKTsKKyAgICAgICAgICAgIC8vIFRoaXMgUFJPQUNUSVZFIENPTU1BTkQgaXMgcHJlc2VudGx5IG5vdCBoYW5kbGVkLiBIZW5jZSBzZXQKKyAgICAgICAgICAgIC8vIHJlc3VsdCBjb2RlIGFzIEJFWU9ORF9URVJNSU5BTF9DQVBBQklMSVRZIGluIFRSLgorICAgICAgICAgICAgbUNtZFBhcmFtcyA9IG5ldyBDb21tYW5kUGFyYW1zKGNtZERldCk7CisgICAgICAgICAgICBzZW5kQ21kUGFyYW1zKFJlc3VsdENvZGUuQkVZT05EX1RFUk1JTkFMX0NBUEFCSUxJVFkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE1NSwxMCArMTYxLDEzIEBACiAgICAgICAgICAgICAgY2FzZSBQTEFZX1RPTkU6CiAgICAgICAgICAgICAgICAgY21kUGVuZGluZyA9IHByb2Nlc3NQbGF5VG9uZShjbWREZXQsIGN0bHZzKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIFBST1ZJREVfTE9DQUxfSU5GT1JNQVRJT046CisgICAgICAgICAgICAgICAgY21kUGVuZGluZyA9IHByb2Nlc3NQcm92aWRlTG9jYWxJbmZvKGNtZERldCwgY3RsdnMpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBwcm9hY3RpdmUgY29tbWFuZHMKICAgICAgICAgICAgICAgICBtQ21kUGFyYW1zID0gbmV3IENvbW1hbmRQYXJhbXMoY21kRGV0KTsKLSAgICAgICAgICAgICAgICBzZW5kQ21kUGFyYW1zKFJlc3VsdENvZGUuQ01EX1RZUEVfTk9UX1VOREVSU1RPT0QpOworICAgICAgICAgICAgICAgIHNlbmRDbWRQYXJhbXMoUmVzdWx0Q29kZS5CRVlPTkRfVEVSTUlOQUxfQ0FQQUJJTElUWSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZXN1bHRFeGNlcHRpb24gZSkgewpAQCAtMjU5LDcgKzI2OCw3IEBACiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKQogICAgICAgICAgICAgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgRGlzcGxheVRleHQiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgRGlzcGxheVRleHQiKTsKIAogICAgICAgICBUZXh0TWVzc2FnZSB0ZXh0TXNnID0gbmV3IFRleHRNZXNzYWdlKCk7CiAgICAgICAgIEljb25JZCBpY29uSWQgPSBudWxsOwpAQCAtMzE5LDcgKzMyOCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZXRVcElkbGVNb2RlVGV4dChDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXRVcElkbGVNb2RlVGV4dCIpOworICAgICAgICBDYXRMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXRVcElkbGVNb2RlVGV4dCIpOwogCiAgICAgICAgIFRleHRNZXNzYWdlIHRleHRNc2cgPSBuZXcgVGV4dE1lc3NhZ2UoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC0zNjIsNyArMzcxLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0dldElua2V5KENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIEdldElua2V5Iik7CisgICAgICAgIENhdExvZy5kKHRoaXMsICJwcm9jZXNzIEdldElua2V5Iik7CiAKICAgICAgICAgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC0zODAsNiArMzg5LDEyIEBACiAgICAgICAgICAgICBpY29uSWQgPSBWYWx1ZVBhcnNlci5yZXRyaWV2ZUljb25JZChjdGx2KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHBhcnNlIGR1cmF0aW9uCisgICAgICAgIGN0bHYgPSBzZWFyY2hGb3JUYWcoQ29tcHJlaGVuc2lvblRsdlRhZy5EVVJBVElPTiwgY3RsdnMpOworICAgICAgICBpZiAoY3RsdiAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dC5kdXJhdGlvbiA9IFZhbHVlUGFyc2VyLnJldHJpZXZlRHVyYXRpb24oY3Rsdik7CisgICAgICAgIH0KKwogICAgICAgICBpbnB1dC5taW5MZW4gPSAxOwogICAgICAgICBpbnB1dC5tYXhMZW4gPSAxOwogCkBAIC00MTIsNyArNDI3LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0dldElucHV0KENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIEdldElucHV0Iik7CisgICAgICAgIENhdExvZy5kKHRoaXMsICJwcm9jZXNzIEdldElucHV0Iik7CiAKICAgICAgICAgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC00NzYsNyArNDkxLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1JlZnJlc2goQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIFJlZnJlc2giKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgUmVmcmVzaCIpOwogCiAgICAgICAgIC8vIFJFRlJFU0ggcHJvYWN0aXZlIGNvbW1hbmQgaXMgcmVyb3V0ZWQgYnkgdGhlIGJhc2ViYW5kIGFuZCBoYW5kbGVkIGJ5CiAgICAgICAgIC8vIHRoZSB0ZWxlcGhvbnkgbGF5ZXIuIElETEUgVEVYVCBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgYSBSRUZSRVNIIGNvbW1hbmQKQEAgLTUwNSw3ICs1MjAsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU2VsZWN0SXRlbShDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKIAotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBTZWxlY3RJdGVtIik7CisgICAgICAgIENhdExvZy5kKHRoaXMsICJwcm9jZXNzIFNlbGVjdEl0ZW0iKTsKIAogICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudSgpOwogICAgICAgICBJY29uSWQgdGl0bGVJY29uSWQgPSBudWxsOwpAQCAtNTM0LDcgKzU0OSw3IEBACiAKICAgICAgICAgY3RsdiA9IHNlYXJjaEZvclRhZyhDb21wcmVoZW5zaW9uVGx2VGFnLklURU1fSUQsIGN0bHZzKTsKICAgICAgICAgaWYgKGN0bHYgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU1RLIGl0ZW1zIGFyZSBsaXN0ZWQgMS4uLm4gd2hpbGUgbGlzdCBzdGFydCBhdCAwLCBuZWVkIHRvCisgICAgICAgICAgICAvLyBDQVQgaXRlbXMgYXJlIGxpc3RlZCAxLi4ubiB3aGlsZSBsaXN0IHN0YXJ0IGF0IDAsIG5lZWQgdG8KICAgICAgICAgICAgIC8vIHN1YnRyYWN0IG9uZS4KICAgICAgICAgICAgIG1lbnUuZGVmYXVsdEl0ZW0gPSBWYWx1ZVBhcnNlci5yZXRyaWV2ZUl0ZW1JZChjdGx2KSAtIDE7CiAgICAgICAgIH0KQEAgLTYwMiw3ICs2MTcsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRXZlbnROb3RpZnkoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgRXZlbnROb3RpZnkiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgRXZlbnROb3RpZnkiKTsKIAogICAgICAgICBUZXh0TWVzc2FnZSB0ZXh0TXNnID0gbmV3IFRleHRNZXNzYWdlKCk7CiAgICAgICAgIEljb25JZCBpY29uSWQgPSBudWxsOwpAQCAtNjQ1LDcgKzY2MCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZXRVcEV2ZW50TGlzdChDb21tYW5kRGV0YWlscyBjbWREZXQsCiAgICAgICAgICAgICBMaXN0PENvbXByZWhlbnNpb25UbHY+IGN0bHZzKSB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgU2V0VXBFdmVudExpc3QiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgU2V0VXBFdmVudExpc3QiKTsKICAgICAgICAgLy8KICAgICAgICAgLy8gQ29tcHJlaGVuc2lvblRsdiBjdGx2ID0gc2VhcmNoRm9yVGFnKENvbXByZWhlbnNpb25UbHZUYWcuRVZFTlRfTElTVCwKICAgICAgICAgLy8gY3RsdnMpOwpAQCAtNjcwLDEwICs2ODUsMTAgQEAKICAgICAgKiAgICAgICAgIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLgogICAgICAqIEB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uCiAgICAgICovCi0gICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTGF1bmNoQnJvd3NlcihDb21tYW5kRGV0YWlscyBjbWREZXQsCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NMYXVuY2hCcm93c2VyKENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewogCi0gICAgICAgIFN0a0xvZy5kKHRoaXMsICJwcm9jZXNzIExhdW5jaEJyb3dzZXIiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgTGF1bmNoQnJvd3NlciIpOwogCiAgICAgICAgIFRleHRNZXNzYWdlIGNvbmZpcm1Nc2cgPSBuZXcgVGV4dE1lc3NhZ2UoKTsKICAgICAgICAgSWNvbklkIGljb25JZCA9IG51bGw7CkBAIC03NDQsMTAgKzc1OSwxMCBAQAogICAgICAqICAgICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQudAogICAgICAqIEB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uCiAgICAgICovCi0gICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUGxheVRvbmUoQ29tbWFuZERldGFpbHMgY21kRGV0LAorICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUGxheVRvbmUoQ29tbWFuZERldGFpbHMgY21kRGV0LAogICAgICAgICAgICAgTGlzdDxDb21wcmVoZW5zaW9uVGx2PiBjdGx2cykgdGhyb3dzIFJlc3VsdEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RrTG9nLmQodGhpcywgInByb2Nlc3MgUGxheVRvbmUiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgUGxheVRvbmUiKTsKIAogICAgICAgICBUb25lIHRvbmUgPSBudWxsOwogICAgICAgICBUZXh0TWVzc2FnZSB0ZXh0TXNnID0gbmV3IFRleHRNZXNzYWdlKCk7CkBAIC04MTAsOSArODI1LDkgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbW1hbmQgaXMgcHJvY2Vzc2luZyBpcyBwZW5kaW5nIGFuZCBhZGRpdGlvbmFsCiAgICAgICogICAgICAgICBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4KICAgICAgKi8KLSAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZXR1cENhbGwoQ29tbWFuZERldGFpbHMgY21kRGV0LAorICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU2V0dXBDYWxsKENvbW1hbmREZXRhaWxzIGNtZERldCwKICAgICAgICAgICAgIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewotICAgICAgICBTdGtMb2cuZCh0aGlzLCAicHJvY2VzcyBTZXR1cENhbGwiKTsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgU2V0dXBDYWxsIik7CiAKICAgICAgICAgSXRlcmF0b3I8Q29tcHJlaGVuc2lvblRsdj4gaXRlciA9IGN0bHZzLml0ZXJhdG9yKCk7CiAgICAgICAgIENvbXByZWhlbnNpb25UbHYgY3RsdiA9IG51bGw7CkBAIC04NjMsNCArODc4LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUHJvdmlkZUxvY2FsSW5mbyhDb21tYW5kRGV0YWlscyBjbWREZXQsIExpc3Q8Q29tcHJlaGVuc2lvblRsdj4gY3RsdnMpCisgICAgICAgICAgICB0aHJvd3MgUmVzdWx0RXhjZXB0aW9uIHsKKyAgICAgICAgQ2F0TG9nLmQodGhpcywgInByb2Nlc3MgUHJvdmlkZUxvY2FsSW5mbyIpOworICAgICAgICBzd2l0Y2ggKGNtZERldC5jb21tYW5kUXVhbGlmaWVyKSB7CisgICAgICAgICAgICBjYXNlIExBTkdVQUdFX1NFVFRJTkc6CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIlBMSSBbTEFOR1VBR0VfU0VUVElOR10iKTsKKyAgICAgICAgICAgICAgICBtQ21kUGFyYW1zID0gbmV3IENvbW1hbmRQYXJhbXMoY21kRGV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIlBMSVsiICsgY21kRGV0LmNvbW1hbmRRdWFsaWZpZXIgKyAiXSBDb21tYW5kIE5vdCBTdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBtQ21kUGFyYW1zID0gbmV3IENvbW1hbmRQYXJhbXMoY21kRGV0KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0RXhjZXB0aW9uKFJlc3VsdENvZGUuQkVZT05EX1RFUk1JTkFMX0NBUEFCSUxJVFkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbXByZWhlbnNpb25UbHYuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvQ29tcHJlaGVuc2lvblRsdi5qYXZhCmluZGV4IGZmZGU2YTMuLjk5ZjY2MmQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHYuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0NvbXByZWhlbnNpb25UbHYuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9EdXJhdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9EdXJhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvRHVyYXRpb24uamF2YQppbmRleCA5ZDhjYzk3Li5lOGNkNDA0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9EdXJhdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvRHVyYXRpb24uamF2YQpAQCAtMTQsMTQgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiAKIC8qKgotICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyAiRHVyYXRpb24iIG9iamVjdCBmb3IgU1RLLgorICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyAiRHVyYXRpb24iIG9iamVjdCBmb3IgQ0FULgogICoKICAqIHtAaGlkZX0KICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvRm9udFNpemUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvRm9udFNpemUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Gb250U2l6ZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ZvbnRTaXplLmphdmEKaW5kZXggYmQ0ZjQ5Zi4uMDJjN2VhMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvRm9udFNpemUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ZvbnRTaXplLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIAogLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JY29uTG9hZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ljb25Mb2FkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JY29uTG9hZGVyLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSWNvbkxvYWRlci5qYXZhCmluZGV4IGZjMDJkMmEuLjJmYTE4MTEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ljb25Mb2FkZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ljb25Mb2FkZXIuamF2YQpAQCAtMTQsOSArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNRmlsZUhhbmRsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0ZpbGVIYW5kbGVyOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKQEAgLTQwLDcgKzQwLDcgQEAKICAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBtSWQgPSBudWxsOwogICAgIHByaXZhdGUgQml0bWFwIG1DdXJyZW50SWNvbiA9IG51bGw7CiAgICAgcHJpdmF0ZSBpbnQgbVJlY29yZE51bWJlcjsKLSAgICBwcml2YXRlIFNJTUZpbGVIYW5kbGVyIG1TaW1GSCA9IG51bGw7CisgICAgcHJpdmF0ZSBJY2NGaWxlSGFuZGxlciBtU2ltRkggPSBudWxsOwogICAgIHByaXZhdGUgTWVzc2FnZSBtRW5kTXNnID0gbnVsbDsKICAgICBwcml2YXRlIGJ5dGVbXSBtSWNvbkRhdGEgPSBudWxsOwogICAgIC8vIG11bHRpIGljb25zIHN0YXRlIG1lbWJlcnMKQEAgLTY4LDE5ICs2OCwxOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTFVUX0VOVFJZX1NJWkUgPSAzOwogCiAKLSAgICBwcml2YXRlIEljb25Mb2FkZXIoTG9vcGVyIGxvb3BlciAsIFNJTUZpbGVIYW5kbGVyIGZoKSB7CisgICAgcHJpdmF0ZSBJY29uTG9hZGVyKExvb3BlciBsb29wZXIgLCBJY2NGaWxlSGFuZGxlciBmaCkgewogICAgICAgICBzdXBlcihsb29wZXIpOwogICAgICAgICBtU2ltRkggPSBmaDsKIAogICAgICAgICBtSWNvbnNDYWNoZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEJpdG1hcD4oNTApOwogICAgIH0KIAotICAgIHN0YXRpYyBJY29uTG9hZGVyIGdldEluc3RhbmNlKEhhbmRsZXIgY2FsbGVyLCBTSU1GaWxlSGFuZGxlciBmaCkgeworICAgIHN0YXRpYyBJY29uTG9hZGVyIGdldEluc3RhbmNlKEhhbmRsZXIgY2FsbGVyLCBJY2NGaWxlSGFuZGxlciBmaCkgewogICAgICAgICBpZiAoc0xvYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gc0xvYWRlcjsKICAgICAgICAgfQogICAgICAgICBpZiAoZmggIT0gbnVsbCkgewotICAgICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU3RrIEljb24gTG9hZGVyIik7CisgICAgICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJDYXQgSWNvbiBMb2FkZXIiKTsKICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBJY29uTG9hZGVyKHRocmVhZC5nZXRMb29wZXIoKSwgZmgpOwogICAgICAgICB9CkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJJY29uIGxvYWQgZmFpbGVkIik7CisgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiSWNvbiBsb2FkIGZhaWxlZCIpOwogICAgICAgICAgICAgLy8gcG9zdCBudWxsIGljb24gYmFjayB0byB0aGUgY2FsbGVyLgogICAgICAgICAgICAgcG9zdEljb24oKTsKICAgICAgICAgfQpAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGl4ZWxJbmRleCAhPSBudW1PZlBpeGVscykgewotICAgICAgICAgICAgU3RrTG9nLmQoIkljb25Mb2FkZXIiLCAicGFyc2VUb0JuVzsgc2l6ZSBlcnJvciIpOworICAgICAgICAgICAgQ2F0TG9nLmQoIkljb25Mb2FkZXIiLCAicGFyc2VUb0JuVzsgc2l6ZSBlcnJvciIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlQml0bWFwKHBpeGVscywgd2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ltYWdlRGVzY3JpcHRvci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9JbWFnZURlc2NyaXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JbWFnZURlc2NyaXB0b3IuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9JbWFnZURlc2NyaXB0b3IuamF2YQppbmRleCA4ODBiOWU1Li43MTFkOTc3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JbWFnZURlc2NyaXB0b3IuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0ltYWdlRGVzY3JpcHRvci5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAvKioKICAqIHtAaGlkZX0KQEAgLTY5LDcgKzY5LDcgQEAKIAogICAgICAgICAgICAgZC5sZW5ndGggPSAoKHJhd0RhdGFbdmFsdWVJbmRleCsrXSAmIDB4ZmYpIDw8IDggfCAocmF3RGF0YVt2YWx1ZUluZGV4KytdICYgMHhmZikpOwogICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0a0xvZy5kKCJJbWFnZURlc2NyaXB0ZXIiLCAicGFyc2U7IGZhaWxlZCBwYXJzaW5nIGltYWdlIGRlc2NyaXB0b3IiKTsKKyAgICAgICAgICAgIENhdExvZy5kKCJJbWFnZURlc2NyaXB0ZXIiLCAicGFyc2U7IGZhaWxlZCBwYXJzaW5nIGltYWdlIGRlc2NyaXB0b3IiKTsKICAgICAgICAgICAgIGQgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSW5wdXQuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSW5wdXQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JbnB1dC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0lucHV0LmphdmEKaW5kZXggMTlmNzI0Yi4uMTNhNWFkNCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSW5wdXQuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0lucHV0LmphdmEKQEAgLTE0LDE0ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIAogLyoqCi0gKiBDb250YWluZXIgY2xhc3MgZm9yIFNUSyBHRVQgSU5QVVQsIEdFVCBJTiBLRVkgY29tbWFuZHMgcGFyYW1ldGVycy4KKyAqIENvbnRhaW5lciBjbGFzcyBmb3IgQ0FUIEdFVCBJTlBVVCwgR0VUIElOIEtFWSBjb21tYW5kcyBwYXJhbWV0ZXJzLgogICoKICAqLwogcHVibGljIGNsYXNzIElucHV0IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CkBAIC0zNiw2ICszNiw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gZWNobzsKICAgICBwdWJsaWMgYm9vbGVhbiB5ZXNObzsKICAgICBwdWJsaWMgYm9vbGVhbiBoZWxwQXZhaWxhYmxlOworICAgIHB1YmxpYyBEdXJhdGlvbiBkdXJhdGlvbjsKIAogICAgIElucHV0KCkgewogICAgICAgICB0ZXh0ID0gIiI7CkBAIC00OSw2ICs1MCw3IEBACiAgICAgICAgIGVjaG8gPSBmYWxzZTsKICAgICAgICAgeWVzTm8gPSBmYWxzZTsKICAgICAgICAgaGVscEF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBkdXJhdGlvbiA9IG51bGw7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBJbnB1dChQYXJjZWwgaW4pIHsKQEAgLTYzLDYgKzY1LDcgQEAKICAgICAgICAgZWNobyA9IGluLnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICB5ZXNObyA9IGluLnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICBoZWxwQXZhaWxhYmxlID0gaW4ucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGR1cmF0aW9uID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewpAQCAtODEsNiArODQsNyBAQAogICAgICAgICBkZXN0LndyaXRlSW50KGVjaG8gPyAxIDogMCk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoeWVzTm8gPyAxIDogMCk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoaGVscEF2YWlsYWJsZSA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUoZHVyYXRpb24sIDApOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0PiBDUkVBVE9SID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dD4oKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JdGVtLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0l0ZW0uamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JdGVtLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvSXRlbS5qYXZhCmluZGV4IGIyZjMzOGMuLmQ0NzAyYmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW0uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0l0ZW0uamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvTGF1bmNoQnJvd3Nlck1vZGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTGF1bmNoQnJvd3Nlck1vZGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9MYXVuY2hCcm93c2VyTW9kZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0xhdW5jaEJyb3dzZXJNb2RlLmphdmEKaW5kZXggMzAyMjczYy4uYWYwNDNkMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvTGF1bmNoQnJvd3Nlck1vZGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L0xhdW5jaEJyb3dzZXJNb2RlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIAogLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9NZW51LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L01lbnUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9NZW51LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvTWVudS5qYXZhCmluZGV4IDMzMWY2OWQuLjdiYmFlMDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L01lbnUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwpAQCAtMjQsNyArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIENvbnRhaW5lciBjbGFzcyBmb3IgU1RLIG1lbnUgKFNFVCBVUCBNRU5VLCBTRUxFQ1QgSVRFTSkgcGFyYW1ldGVycy4KKyAqIENvbnRhaW5lciBjbGFzcyBmb3IgQ0FUIG1lbnUgKFNFVCBVUCBNRU5VLCBTRUxFQ1QgSVRFTSkgcGFyYW1ldGVycy4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBNZW51IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9QcmVzZW50YXRpb25UeXBlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1ByZXNlbnRhdGlvblR5cGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9QcmVzZW50YXRpb25UeXBlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUHJlc2VudGF0aW9uVHlwZS5qYXZhCmluZGV4IDcxYmRjZGMuLjdjOGNkOGMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ByZXNlbnRhdGlvblR5cGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1ByZXNlbnRhdGlvblR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3BvbnNlRGF0YS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SZXNwb25zZURhdGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXNwb25zZURhdGEuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SZXNwb25zZURhdGEuamF2YQppbmRleCBhZmQxYmJhLi42NzdkNjZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXNwb25zZURhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3BvbnNlRGF0YS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CkBAIC0yOCw2ICsyOCwxNiBAQAogICAgICAqIHRoZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcm1hdChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUxlbmd0aChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIC8vIEFzIHBlciBFVFNJIDEwMi4yMjAgU2VjNy4xLjIsIGlmIHRoZSB0b3RhbCBsZW5ndGggaXMgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIDB4N0YsIGl0IHNob3VsZCBiZSBjb2RlZCBpbiB0d28gYnl0ZXMgYW5kIHRoZSBmaXJzdCBieXRlCisgICAgICAgIC8vIHNob3VsZCBiZSAweDgxLgorICAgICAgICBpZiAobGVuZ3RoID4gMHg3RikgeworICAgICAgICAgICAgYnVmLndyaXRlKDB4ODEpOworICAgICAgICB9CisgICAgICAgIGJ1Zi53cml0ZShsZW5ndGgpOworICAgIH0KIH0KIAogY2xhc3MgU2VsZWN0SXRlbVJlc3BvbnNlRGF0YSBleHRlbmRzIFJlc3BvbnNlRGF0YSB7CkBAIC0xMjAsNyArMTMwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGxlbmd0aCAtIG9uZSBtb3JlIGZvciBkYXRhIGNvZGluZyBzY2hlbWUuCi0gICAgICAgIGJ1Zi53cml0ZShkYXRhLmxlbmd0aCArIDEpOworICAgICAgICB3cml0ZUxlbmd0aChidWYsIGRhdGEubGVuZ3RoICsgMSk7CiAKICAgICAgICAgLy8gZGF0YSBjb2Rpbmcgc2NoZW1lCiAgICAgICAgIGlmIChtSXNVY3MyKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRDb2RlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3VsdENvZGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRDb2RlLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvUmVzdWx0Q29kZS5qYXZhCmluZGV4IGI5NmE1MjQuLjg1NDQxNzUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdENvZGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3VsdENvZGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SZXN1bHRFeGNlcHRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SZXN1bHRFeGNlcHRpb24uamF2YQppbmRleCAyZWIxNmM5Li4xYzJjYjYzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAKIC8qKgpAQCAtMjIsNyArMjIsNyBAQAogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGNsYXNzIFJlc3VsdEV4Y2VwdGlvbiBleHRlbmRzIFN0a0V4Y2VwdGlvbiB7CitwdWJsaWMgY2xhc3MgUmVzdWx0RXhjZXB0aW9uIGV4dGVuZHMgQ2F0RXhjZXB0aW9uIHsKICAgICBwcml2YXRlIFJlc3VsdENvZGUgbVJlc3VsdDsKICAgICBwcml2YXRlIGludCBtQWRkaXRpb25hbEluZm87CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1JpbE1lc3NhZ2VEZWNvZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1JpbE1lc3NhZ2VEZWNvZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmlsTWVzc2FnZURlY29kZXIuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SaWxNZXNzYWdlRGVjb2Rlci5qYXZhCmluZGV4IGE4MjE3N2MuLmExOTdjOWEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1JpbE1lc3NhZ2VEZWNvZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9SaWxNZXNzYWdlRGVjb2Rlci5qYXZhCkBAIC0xNCw5ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtMjYsNyArMjYsNyBAQAogCiAvKioKICAqIENsYXNzIHVzZWQgZm9yIHF1ZXVpbmcgcmF3IHJpbCBtZXNzYWdlcywgZGVjb2RpbmcgdGhlbSBpbnRvIENvbW1hblBhcmFtcwotICogb2JqZWN0cyBhbmQgc2VuZGluZyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIFNUSyBTZXJ2aWNlLgorICogb2JqZWN0cyBhbmQgc2VuZGluZyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIENBVCBTZXJ2aWNlLgogICovCiBjbGFzcyBSaWxNZXNzYWdlRGVjb2RlciBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7CiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgKiBAcGFyYW0gZmgKICAgICAgKiBAcmV0dXJuIFJpbE1lc3NzYWdlRGVjb2RlcgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFJpbE1lc3NhZ2VEZWNvZGVyIGdldEluc3RhbmNlKEhhbmRsZXIgY2FsbGVyLCBTSU1GaWxlSGFuZGxlciBmaCkgeworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFJpbE1lc3NhZ2VEZWNvZGVyIGdldEluc3RhbmNlKEhhbmRsZXIgY2FsbGVyLCBJY2NGaWxlSGFuZGxlciBmaCkgewogICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBSaWxNZXNzYWdlRGVjb2RlcihjYWxsZXIsIGZoKTsKICAgICAgICAgICAgIHNJbnN0YW5jZS5zdGFydCgpOwpAQCAtODUsMTIgKzg1LDEyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRDbWRGb3JFeGVjdXRpb24oUmlsTWVzc2FnZSByaWxNc2cpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ2FsbGVyLm9idGFpbk1lc3NhZ2UoU3RrU2VydmljZS5NU0dfSURfUklMX01TR19ERUNPREVELAorICAgICAgICBNZXNzYWdlIG1zZyA9IG1DYWxsZXIub2J0YWluTWVzc2FnZShDYXRTZXJ2aWNlLk1TR19JRF9SSUxfTVNHX0RFQ09ERUQsCiAgICAgICAgICAgICAgICAgbmV3IFJpbE1lc3NhZ2UocmlsTXNnKSk7CiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFJpbE1lc3NhZ2VEZWNvZGVyKEhhbmRsZXIgY2FsbGVyLCBTSU1GaWxlSGFuZGxlciBmaCkgeworICAgIHByaXZhdGUgUmlsTWVzc2FnZURlY29kZXIoSGFuZGxlciBjYWxsZXIsIEljY0ZpbGVIYW5kbGVyIGZoKSB7CiAgICAgICAgIHN1cGVyKCJSaWxNZXNzYWdlRGVjb2RlciIpOwogCiAgICAgICAgIGFkZFN0YXRlKG1TdGF0ZVN0YXJ0KTsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVN0YXRlQ21kUGFyYW1zUmVhZHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RrTG9nLmQodGhpcywgIlN0YXRlU3RhcnQgdW5leHBlY3RlZCBleHBlY3RpbmcgU1RBUlQ9IiArCisgICAgICAgICAgICAgICAgQ2F0TG9nLmQodGhpcywgIlN0YXRlU3RhcnQgdW5leHBlY3RlZCBleHBlY3RpbmcgU1RBUlQ9IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EX1NUQVJUICsgIiBnb3QgIiArIG1zZy53aGF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgICAgICAgICAgc2VuZENtZEZvckV4ZWN1dGlvbihtQ3VycmVudFJpbE1lc3NhZ2UpOwogICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU3RhdGVTdGFydCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0a0xvZy5kKHRoaXMsICJTdGF0ZUNtZFBhcmFtc1JlYWR5IGV4cGVjdGluZyBDTURfUEFSQU1TX1JFQURZPSIKKyAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiU3RhdGVDbWRQYXJhbXNSZWFkeSBleHBlY3RpbmcgQ01EX1BBUkFNU19SRUFEWT0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDTURfUEFSQU1TX1JFQURZICsgIiBnb3QgIiArIG1zZy53aGF0KTsKICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgIH0KQEAgLTEzNiwyMSArMTM2LDIxIEBACiAKICAgICAgICAgbUN1cnJlbnRSaWxNZXNzYWdlID0gcmlsTXNnOwogICAgICAgICBzd2l0Y2gocmlsTXNnLm1JZCkgewotICAgICAgICBjYXNlIFN0a1NlcnZpY2UuTVNHX0lEX1NFU1NJT05fRU5EOgotICAgICAgICBjYXNlIFN0a1NlcnZpY2UuTVNHX0lEX0NBTExfU0VUVVA6CisgICAgICAgIGNhc2UgQ2F0U2VydmljZS5NU0dfSURfU0VTU0lPTl9FTkQ6CisgICAgICAgIGNhc2UgQ2F0U2VydmljZS5NU0dfSURfQ0FMTF9TRVRVUDoKICAgICAgICAgICAgIG1DdXJyZW50UmlsTWVzc2FnZS5tUmVzQ29kZSA9IFJlc3VsdENvZGUuT0s7CiAgICAgICAgICAgICBzZW5kQ21kRm9yRXhlY3V0aW9uKG1DdXJyZW50UmlsTWVzc2FnZSk7CiAgICAgICAgICAgICBkZWNvZGluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFN0a1NlcnZpY2UuTVNHX0lEX1BST0FDVElWRV9DT01NQU5EOgotICAgICAgICBjYXNlIFN0a1NlcnZpY2UuTVNHX0lEX0VWRU5UX05PVElGWToKLSAgICAgICAgY2FzZSBTdGtTZXJ2aWNlLk1TR19JRF9SRUZSRVNIOgorICAgICAgICBjYXNlIENhdFNlcnZpY2UuTVNHX0lEX1BST0FDVElWRV9DT01NQU5EOgorICAgICAgICBjYXNlIENhdFNlcnZpY2UuTVNHX0lEX0VWRU5UX05PVElGWToKKyAgICAgICAgY2FzZSBDYXRTZXJ2aWNlLk1TR19JRF9SRUZSRVNIOgogICAgICAgICAgICAgYnl0ZVtdIHJhd0RhdGEgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByYXdEYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygoU3RyaW5nKSByaWxNc2cubURhdGEpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyB6b21iaWUgbWVzc2FnZXMgYXJlIGRyb3BwZWQKLSAgICAgICAgICAgICAgICBTdGtMb2cuZCh0aGlzLCAiZGVjb2RlTWVzc2FnZVBhcmFtcyBkcm9wcGluZyB6b21iaWUgbWVzc2FnZXMiKTsKKyAgICAgICAgICAgICAgICBDYXRMb2cuZCh0aGlzLCAiZGVjb2RlTWVzc2FnZVBhcmFtcyBkcm9wcGluZyB6b21iaWUgbWVzc2FnZXMiKTsKICAgICAgICAgICAgICAgICBkZWNvZGluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRBbGlnbm1lbnQuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dEFsaWdubWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRBbGlnbm1lbnQuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0QWxpZ25tZW50LmphdmEKaW5kZXggYzVkZDUwZS4uN2ZiNThhNSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEFsaWdubWVudC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dEFsaWdubWVudC5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEF0dHJpYnV0ZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0QXR0cmlidXRlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEF0dHJpYnV0ZS5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRBdHRyaWJ1dGUuamF2YQppbmRleCBhY2U0MzAwLi4wZGVhNjQwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0QXR0cmlidXRlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIAogLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0Q29sb3IuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dENvbG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dENvbG9yLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVGV4dENvbG9yLmphdmEKaW5kZXggMTI2ZmM2Mi4uNjQ0N2U3NCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dENvbG9yLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0Q29sb3IuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogCiAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RleHRNZXNzYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dE1lc3NhZ2UuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0TWVzc2FnZS5qYXZhCmluZGV4IDNiNmEwOWEuLjVmZmQwNzYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9UZXh0TWVzc2FnZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0OwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1RvbmUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVG9uZS5qYXZhCmluZGV4IGI2NGU3NzdkLi4yN2I0NDg5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Ub25lLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lU2V0dGluZ3MuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVG9uZVNldHRpbmdzLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVG9uZVNldHRpbmdzLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jYXQvVG9uZVNldHRpbmdzLmphdmEKaW5kZXggOTBjYzZjMS4uNjM3NWFmYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVG9uZVNldHRpbmdzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9Ub25lU2V0dGluZ3MuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0azsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdDsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ZhbHVlUGFyc2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L1ZhbHVlUGFyc2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVmFsdWVQYXJzZXIuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9WYWx1ZVBhcnNlci5qYXZhCmluZGV4IDA5YTg2MGUuLjM0ZTQ4MTEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ZhbHVlUGFyc2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9WYWx1ZVBhcnNlci5qYXZhCkBAIC0xNCwxMSArMTQsMTEgQEAKICAqIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGs7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uLlRpbWVVbml0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jYXQuRHVyYXRpb24uVGltZVVuaXQ7CiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAqLwogICAgIHN0YXRpYyBJdGVtc0ljb25JZCByZXRyaWV2ZUl0ZW1zSWNvbklkKENvbXByZWhlbnNpb25UbHYgY3RsdikKICAgICAgICAgICAgIHRocm93cyBSZXN1bHRFeGNlcHRpb24gewotICAgICAgICBTdGtMb2cuZCgiVmFsdWVQYXJzZXIiLCAicmV0cmlldmVJdGVtc0ljb25JZDoiKTsKKyAgICAgICAgQ2F0TG9nLmQoIlZhbHVlUGFyc2VyIiwgInJldHJpZXZlSXRlbXNJY29uSWQ6Iik7CiAgICAgICAgIEl0ZW1zSWNvbklkIGlkID0gbmV3IEl0ZW1zSWNvbklkKCk7CiAKICAgICAgICAgYnl0ZVtdIHJhd1ZhbHVlID0gY3Rsdi5nZXRSYXdWYWx1ZSgpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9wYWNrYWdlLmh0bWwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2F0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZiZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NhdC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw1IEBACis8SFRNTD4KKzxCT0RZPgorUHJvdmlkZXMgY2xhc3NlcyBmb3IgSUNDIFRvb2xraXQgU2VydmljZSAoQ0FUKS4KKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKaW5kZXggYzExZGQwYi4uMzg5MGE5OCAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2F0LkNhdFNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZEV4Y2VwdGlvbjsKQEAgLTEwOCw3ICsxMDksNyBAQAogICAgIFBob25lU3ViSW5mbyBtU3ViSW5mbzsKICAgICBFcmlNYW5hZ2VyIG1FcmlNYW5hZ2VyOwogICAgIFdha2VMb2NrIG1XYWtlTG9jazsKLQorICAgIENhdFNlcnZpY2UgbUNjYXRTZXJ2aWNlOwogCiAgICAgLy8gbU52TG9hZGVkUmVnaXN0cmFudHMgYXJlIGluZm9ybWVkIGFmdGVyIHRoZSBFVkVOVF9OVl9SRUFEWQogICAgIHByaXZhdGUgUmVnaXN0cmFudExpc3QgbU52TG9hZGVkUmVnaXN0cmFudHMgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKQEAgLTE2MCw2ICsxNjEsOCBAQAogICAgICAgICBtUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIgPSBuZXcgUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIodGhpcywgbVNNUyk7CiAgICAgICAgIG1TdWJJbmZvID0gbmV3IFBob25lU3ViSW5mbyh0aGlzKTsKICAgICAgICAgbUVyaU1hbmFnZXIgPSBuZXcgRXJpTWFuYWdlcih0aGlzLCBjb250ZXh0LCBFcmlNYW5hZ2VyLkVSSV9GUk9NX1hNTCk7CisgICAgICAgIG1DY2F0U2VydmljZSA9IENhdFNlcnZpY2UuZ2V0SW5zdGFuY2UobUNNLCBtUnVpbVJlY29yZHMsIG1Db250ZXh0LAorICAgICAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlciwgbVJ1aW1DYXJkKTsKIAogICAgICAgICBtQ00ucmVnaXN0ZXJGb3JBdmFpbGFibGUodGhpcywgRVZFTlRfUkFESU9fQVZBSUxBQkxFLCBudWxsKTsKICAgICAgICAgbVJ1aW1SZWNvcmRzLnJlZ2lzdGVyRm9yUmVjb3Jkc0xvYWRlZCh0aGlzLCBFVkVOVF9SVUlNX1JFQ09SRFNfTE9BREVELCBudWxsKTsKQEAgLTIyMCw2ICsyMjMsNyBAQAogICAgICAgICAgICAgbUNNLnVucmVnaXN0ZXJGb3JOVlJlYWR5KHRoaXMpOyAvL0VWRU5UX05WX1JFQURZCiAgICAgICAgICAgICBtU1NULnVucmVnaXN0ZXJGb3JOZXR3b3JrQXR0YWNoKHRoaXMpOyAvL0VWRU5UX1JFR0lTVEVSRURfVE9fTkVUV09SSwogICAgICAgICAgICAgbUNNLnVuU2V0T25TdXBwU2VydmljZU5vdGlmaWNhdGlvbih0aGlzKTsKKyAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtRXhpdEVjbVJ1bm5hYmxlKTsKIAogICAgICAgICAgICAgbVBlbmRpbmdNbWlzLmNsZWFyKCk7CiAKQEAgLTIzNSw2ICsyMzksNyBAQAogICAgICAgICAgICAgbVJ1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmRpc3Bvc2UoKTsKICAgICAgICAgICAgIG1TdWJJbmZvLmRpc3Bvc2UoKTsKICAgICAgICAgICAgIG1FcmlNYW5hZ2VyLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIG1DY2F0U2VydmljZS5kaXNwb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MCw2ICsyNTUsOCBAQAogICAgICAgICAgICAgdGhpcy5tQ1QgPSBudWxsOwogICAgICAgICAgICAgdGhpcy5tU1NUID0gbnVsbDsKICAgICAgICAgICAgIHRoaXMubUVyaU1hbmFnZXIgPSBudWxsOworICAgICAgICAgICAgdGhpcy5tQ2NhdFNlcnZpY2UgPSBudWxsOworICAgICAgICAgICAgdGhpcy5tRXhpdEVjbVJ1bm5hYmxlID0gbnVsbDsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGRjZWZmMmEuLmQ2ZmMxMzQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNDgzLDYgKzQ4MywxMSBAQAogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUJyb2FkY2FzdFNtcyhBc3luY1Jlc3VsdCBhcikgeworICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkCisgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBOb3QgaW1wbGVtZW50ZWQgZm9yIENETUEuIik7CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgcmVzdWx0VG9DYXVzZShpbnQgcmMpIHsKICAgICAgICAgc3dpdGNoIChyYykgewogICAgICAgICBjYXNlIEFjdGl2aXR5LlJFU1VMVF9PSzoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMmNhZDZjYy4uNWI2YmMxZgotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTU1MiwzMiArNTUyLDUzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcG93ZXJPZmZSYWRpb1NhZmVseSgpewotICAgICAgICAvLyBjbGVhbiBkYXRhIGNvbm5lY3Rpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3dlck9mZlJhZGlvU2FmZWx5KCkgewogICAgICAgICBEYXRhQ29ubmVjdGlvblRyYWNrZXIgZGNUcmFja2VyID0gcGhvbmUubURhdGFDb25uZWN0aW9uOwogCiAgICAgICAgIE1lc3NhZ2UgbXNnID0gZGNUcmFja2VyLm9idGFpbk1lc3NhZ2UoRGF0YUNvbm5lY3Rpb25UcmFja2VyLkVWRU5UX0NMRUFOX1VQX0NPTk5FQ1RJT04pOwotICAgICAgICBtc2cuYXJnMSA9IDE7IC8vIHRlYXJEb3duIGlzIHRydWUKICAgICAgICAgbXNnLm9iaiA9IENETUFQaG9uZS5SRUFTT05fUkFESU9fVFVSTkVEX09GRjsKLSAgICAgICAgZGNUcmFja2VyLnNlbmRNZXNzYWdlKG1zZyk7CiAKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICghbVBlbmRpbmdSYWRpb1Bvd2VyT2ZmQWZ0ZXJEYXRhT2ZmKSB7Ci0gICAgICAgICAgICAgICAgRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlIGN1cnJlbnRTdGF0ZSA9IGRjVHJhY2tlci5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgIT0gRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlLkNPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFN0YXRlICE9IERhdGFDb25uZWN0aW9uVHJhY2tlci5TdGF0ZS5ESVNDT05ORUNUSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gRGF0YUNvbm5lY3Rpb25UcmFja2VyLlN0YXRlLklOSVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhIGRpc2Nvbm5lY3RlZCwgdHVybiBvZmYgcmFkaW8gcmlnaHQgYXdheS4iKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZ3VwQW5kUG93ZXJPZmYoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfU0VUX1JBRElPX1BPV0VSX09GRiwgMzAwMDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FpdCB1cCB0byAzMCBzZWMgZm9yIGRhdGEgdG8gZGlzY29ubmVjdCwgdGhlbiB0dXJuIG9mZiByYWRpby4iKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobmV0d29ya1R5cGUgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfMXhSVFQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEluIDF4IENETUEgLCBkdXJpbmcgcmFkaW8gcG93ZXIgb2ZmIG1vZGVtIHdpbGwgZGlzY29ubmVjdCB0aGUKKyAgICAgICAgICAgICAgICAgKiBkYXRhIGNhbGwgYW5kIHNlbmRzIHRoZSBwb3dlciBkb3duIHJlZ2lzdHJhdGlvbiBtZXNzYWdlIGFsb25nCisgICAgICAgICAgICAgICAgICogd2l0aCB0aGUgZGF0YSBjYWxsIHJlbGVhc2UgbWVzc2FnZSB0byB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSAwOyAvLyB0ZWFyRG93biBpcyBmYWxzZSBzaW5jZSBtb2RlbSBkb2VzIGl0IGFueXdheSBmb3IgMVgKKyAgICAgICAgICAgICAgICBkY1RyYWNrZXIuc2VuZE1lc3NhZ2UobXNnKTsKKworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUdXJuIG9mZiB0aGUgcmFkaW8gcmlnaHQgYXdheSIpOworICAgICAgICAgICAgICAgIGhhbmd1cEFuZFBvd2VyT2ZmKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbVBlbmRpbmdSYWRpb1Bvd2VyT2ZmQWZ0ZXJEYXRhT2ZmKSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFDb25uZWN0aW9uVHJhY2tlci5TdGF0ZSBjdXJyZW50U3RhdGUgPSBkY1RyYWNrZXIuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPSBEYXRhQ29ubmVjdGlvblRyYWNrZXIuU3RhdGUuQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFN0YXRlICE9IERhdGFDb25uZWN0aW9uVHJhY2tlci5TdGF0ZS5ESVNDT05ORUNUSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFN0YXRlICE9IERhdGFDb25uZWN0aW9uVHJhY2tlci5TdGF0ZS5JTklUSU5HKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gMDsgLy8gdGVhckRvd24gaXMgZmFsc2UgYXMgaXQgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRjVHJhY2tlci5zZW5kTWVzc2FnZShtc2cpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGF0YSBkaXNjb25uZWN0ZWQsIHR1cm4gb2ZmIHJhZGlvIHJpZ2h0IGF3YXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5ndXBBbmRQb3dlck9mZigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW4gZGF0YSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IDE7IC8vIHRlYXJEb3duIGlzIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjVHJhY2tlci5zZW5kTWVzc2FnZShtc2cpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfU0VUX1JBRElPX1BPV0VSX09GRiwgMzAwMDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIldhaXQgdXB0byAzMHMgZm9yIGRhdGEgdG8gZGlzY29ubmVjdCwgdGhlbiB0dXJuIG9mZiByYWRpby4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSYWRpb1Bvd2VyT2ZmQWZ0ZXJEYXRhT2ZmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkNhbm5vdCBzZW5kIGRlbGF5ZWQgTXNnLCB0dXJuIG9mZiByYWRpbyByaWdodCBhd2F5LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmd1cEFuZFBvd2VyT2ZmKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSYWRpb1Bvd2VyT2ZmQWZ0ZXJEYXRhT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQ2Fubm90IHNlbmQgZGVsYXllZCBNc2csIHR1cm4gb2ZmIHJhZGlvIHJpZ2h0IGF3YXkuIik7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmd1cEFuZFBvd2VyT2ZmKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NTMsOCArNjc0LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlcnIgIT0gQ29tbWFuZEV4Y2VwdGlvbi5FcnJvci5PUF9OT1RfQUxMT1dFRF9CRUZPUkVfUkVHX05XICYmCi0gICAgICAgICAgICAgICAgICAgIGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcpIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQ29tbWFuZEV4Y2VwdGlvbi5FcnJvci5PUF9OT1RfQUxMT1dFRF9CRUZPUkVfUkVHX05XKSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKICAgICAgICAgICAgICAgICAgICAgICAgICJSSUwgaW1wbGVtZW50YXRpb24gaGFzIHJldHVybmVkIGFuIGVycm9yIHdoZXJlIGl0IG11c3Qgc3VjY2VlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhci5leGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggZTk3NTQ5ZC4uZjRhNmQxMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0xOTIsNiArMTkyLDE4IEBACiAgICAgICAgIHJldHVybiBtU21zOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUNlbGxCcm9hZGNhc3QoaW50IG1lc3NhZ2VJZGVudGlmaWVyKSB7CisgICAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZAorICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IhIE5vdCBpbXBsZW1lbnRlZCBmb3IgQ0RNQS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBOb3QgaW1wbGVtZW50ZWQgZm9yIENETUEuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ZjAyNGVkLi41NGNmNjEyCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTI5LDggKzI5LDEwIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkJlYXJlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkNkbWFTbXNBZGRyZXNzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5DZG1hU21zU3ViYWRkcmVzczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuU21zRW52ZWxvcGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKQEAgLTcxLDYgKzczLDE2IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNETUEiOwogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBMT0dHQUJMRV9UQUcgPSAiQ0RNQTpTTVMiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBURUxFU0VSVklDRV9JREVOVElGSUVSICAgICAgICAgICAgICAgICAgICA9IDB4MDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTRVJWSUNFX0NBVEVHT1JZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDE7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBPUklHSU5BVElOR19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBPUklHSU5BVElOR19TVUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICA9IDB4MDM7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBERVNUSU5BVElPTl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQ7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBERVNUSU5BVElPTl9TVUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICA9IDB4MDU7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCRUFSRVJfUkVQTFlfT1BUSU9OICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDY7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBDQVVTRV9DT0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDc7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCRUFSRVJfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDg7CisKICAgICAvKioKICAgICAgKiAgU3RhdHVzIG9mIGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgU01TLgogICAgICAqICBUaGlzIGZpZWxkIGFwcGxpZXMgdG8gU01TIERlbGl2ZXJ5IEFja25vd2xlZGdlIG1lc3NhZ2VzLiAwIGluZGljYXRlcyBzdWNjZXNzOwpAQCAtMTM4LDYgKzE1MCw3IEBACiAgICAgICAgIFNtc01lc3NhZ2UgbXNnID0gbmV3IFNtc01lc3NhZ2UoKTsKICAgICAgICAgU21zRW52ZWxvcGUgZW52ID0gbmV3IFNtc0VudmVsb3BlKCk7CiAgICAgICAgIENkbWFTbXNBZGRyZXNzIGFkZHIgPSBuZXcgQ2RtYVNtc0FkZHJlc3MoKTsKKyAgICAgICAgQ2RtYVNtc1N1YmFkZHJlc3Mgc3ViYWRkciA9IG5ldyBDZG1hU21zU3ViYWRkcmVzcygpOwogICAgICAgICBieXRlW10gZGF0YTsKICAgICAgICAgYnl0ZSBjb3VudDsKICAgICAgICAgaW50IGNvdW50SW50OwpAQCAtMTgwLDE1ICsxOTMsMjQgQEAKIAogICAgICAgICBhZGRyLm9yaWdCeXRlcyA9IGRhdGE7CiAKLSAgICAgICAgLy8gaWdub3JlIHN1YmFkZHJlc3MKLSAgICAgICAgcC5yZWFkSW50KCk7IC8vcF9jdXItPnNTdWJBZGRyZXNzLnN1YmFkZHJlc3NUeXBlCi0gICAgICAgIHAucmVhZEludCgpOyAvL3BfY3VyLT5zU3ViQWRkcmVzcy5vZGQKLSAgICAgICAgY291bnQgPSBwLnJlYWRCeXRlKCk7IC8vcF9jdXItPnNTdWJBZGRyZXNzLm51bWJlcl9vZl9kaWdpdHMKLSAgICAgICAgLy9wX2N1ci0+c1N1YkFkZHJlc3MuZGlnaXRzW2RpZ2l0Q291bnRdIDoKLSAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotICAgICAgICAgICAgcC5yZWFkQnl0ZSgpOworICAgICAgICBzdWJhZGRyLnR5cGUgPSBwLnJlYWRJbnQoKTsgLy8gcF9jdXItPnNTdWJBZGRyZXNzLnN1YmFkZHJlc3NUeXBlCisgICAgICAgIHN1YmFkZHIub2RkID0gcC5yZWFkQnl0ZSgpOyAgICAgLy8gcF9jdXItPnNTdWJBZGRyZXNzLm9kZAorICAgICAgICBjb3VudCA9IHAucmVhZEJ5dGUoKTsgICAgICAgICAgIC8vIHBfY3VyLT5zU3ViQWRkcmVzcy5udW1iZXJfb2ZfZGlnaXRzCisKKyAgICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICAgICAgY291bnQgPSAwOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcF9jdXItPnNTdWJBZGRyZXNzLmRpZ2l0c1tkaWdpdENvdW50XSA6CisKKyAgICAgICAgZGF0YSA9IG5ldyBieXRlW2NvdW50XTsKKworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gcC5yZWFkQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3ViYWRkci5vcmlnQnl0ZXMgPSBkYXRhOworCiAgICAgICAgIC8qIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtb2RlbS1saWI6CiAgICAgICAgICAgICBlbnYuYmVhcmVyUmVwbHkKICAgICAgICAgICAgIGVudi5yZXBseVNlcU5vCkBAIC0yMTAsNiArMjMyLDcgQEAKIAogICAgICAgICAvLyBsaW5rIHRoZSB0aGUgZmlsbGVkIG9iamVjdHMgdG8gdGhlIFNNUwogICAgICAgICBlbnYub3JpZ0FkZHJlc3MgPSBhZGRyOworICAgICAgICBlbnYub3JpZ1N1YmFkZHJlc3MgPSBzdWJhZGRyOwogICAgICAgICBtc2cub3JpZ2luYXRpbmdBZGRyZXNzID0gYWRkcjsKICAgICAgICAgbXNnLm1FbnZlbG9wZSA9IGVudjsKIApAQCAtMjU1LDYgKzI3OCw3IEBACiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDIsIHBkdSwgMCwgc2l6ZSk7CiAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgcGFyc2VkIGJlZm9yZSBpdCBjYW4gYmUgZGlzcGxheWVkCiAgICAgICAgICAgICAvLyBzZWUgZ3NtLlNtc01lc3NhZ2UKKyAgICAgICAgICAgIG1zZy5wYXJzZVBkdUZyb21FZlJlY29yZChwZHUpOwogICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNNUyBQRFUgcGFyc2luZyBmYWlsZWQ6ICIsIGV4KTsKQEAgLTUyNyw2ICs1NTEsMTQzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVjb2RlcyAzR1BQMiBzbXMgc3RvcmVkIGluIENTSU0vUlVJTSBjYXJkcyBBcyBwZXIgM0dQUDIgQy5TMDAxNS0wCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGR1RnJvbUVmUmVjb3JkKGJ5dGVbXSBwZHUpIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwZHUpOworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgU21zRW52ZWxvcGUgZW52ID0gbmV3IFNtc0VudmVsb3BlKCk7CisgICAgICAgIENkbWFTbXNBZGRyZXNzIGFkZHIgPSBuZXcgQ2RtYVNtc0FkZHJlc3MoKTsKKyAgICAgICAgQ2RtYVNtc1N1YmFkZHJlc3Mgc3ViQWRkciA9IG5ldyBDZG1hU21zU3ViYWRkcmVzcygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnYubWVzc2FnZVR5cGUgPSBkaXMucmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgd2hpbGUgKGRpcy5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVySWQgPSBkaXMucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyTGVuID0gZGlzLnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHBhcmFtZXRlckRhdGEgPSBuZXcgYnl0ZVtwYXJhbWV0ZXJMZW5dOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJJZCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRFTEVTRVJWSUNFX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogMTYgYml0IHBhcmFtZXRlciB0aGF0IGlkZW50aWZpZXMgd2hpY2ggdXBwZXIgbGF5ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlcnZpY2UgYWNjZXNzIHBvaW50IGlzIHNlbmRpbmcgb3Igc2hvdWxkIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbnYudGVsZVNlcnZpY2UgPSBkaXMucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJ0ZWxlc2VydmljZSA9ICIgKyBlbnYudGVsZVNlcnZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9DQVRFR09SWToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAxNiBiaXQgcGFyYW1ldGVyIHRoYXQgaWRlbnRpZmllcyB0eXBlIG9mIHNlcnZpY2UgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIDNHUFAyIEMuUzAwMTUtMCBUYWJsZSAzLjQuMy4yLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZW52LnNlcnZpY2VDYXRlZ29yeSA9IGRpcy5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1JJR0lOQVRJTkdfQUREUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBERVNUSU5BVElPTl9BRERSRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzLnJlYWQocGFyYW1ldGVyRGF0YSwgMCwgcGFyYW1ldGVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHdpc2VJbnB1dFN0cmVhbSBhZGRyQmlzID0gbmV3IEJpdHdpc2VJbnB1dFN0cmVhbShwYXJhbWV0ZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIuZGlnaXRNb2RlID0gYWRkckJpcy5yZWFkKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5udW1iZXJNb2RlID0gYWRkckJpcy5yZWFkKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclR5cGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIuZGlnaXRNb2RlID09IENkbWFTbXNBZGRyZXNzLkRJR0lUX01PREVfOEJJVF9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVHlwZSA9IGFkZHJCaXMucmVhZCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLnRvbiA9IG51bWJlclR5cGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkci5udW1iZXJNb2RlID09IENkbWFTbXNBZGRyZXNzLk5VTUJFUl9NT0RFX05PVF9EQVRBX05FVFdPUkspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIubnVtYmVyUGxhbiA9IGFkZHJCaXMucmVhZCg0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5udW1iZXJPZkRpZ2l0cyA9IGFkZHJCaXMucmVhZCg4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVthZGRyLm51bWJlck9mRGlnaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYiA9IDB4MDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyLmRpZ2l0TW9kZSA9PSBDZG1hU21zQWRkcmVzcy5ESUdJVF9NT0RFXzRCSVRfRFRNRikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHBlciAzR1BQMiBDLlMwMDA1LTAgVGFibGUgMi43LjEuMy4yLjQtNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhZGRyLm51bWJlck9mRGlnaXRzOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoYnl0ZSkgKDB4RiAmIGFkZHJCaXMucmVhZCg0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIHZhbHVlIGlmIGl0IGlzIDQtYml0IERUTUYgdG8gOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpbmRleF0gPSBjb252ZXJ0RHRtZlRvQXNjaWkoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyLmRpZ2l0TW9kZSA9PSBDZG1hU21zQWRkcmVzcy5ESUdJVF9NT0RFXzhCSVRfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyLm51bWJlck1vZGUgPT0gQ2RtYVNtc0FkZHJlc3MuTlVNQkVSX01PREVfTk9UX0RBVEFfTkVUV09SSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYWRkci5udW1iZXJPZkRpZ2l0czsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChieXRlKSAoMHhGRiAmIGFkZHJCaXMucmVhZCg4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRkci5udW1iZXJNb2RlID09IENkbWFTbXNBZGRyZXNzLk5VTUJFUl9NT0RFX0RBVEFfTkVUV09SSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyVHlwZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlRPRE86IE9yaWdpbmF0aW5nIEFkZHIgaXMgZW1haWwgaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT0RPOiBPcmlnaW5hdGluZyBBZGRyIGlzIGRhdGEgbmV0d29yayBhZGRyZXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk9yaWdpbmF0aW5nIEFkZHIgaXMgb2YgaW5jb3JyZWN0IHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbmNvcnJlY3QgRGlnaXQgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5vcmlnQnl0ZXMgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIk9yaWdpbmF0aW5nIEFkZHI9IiArIGFkZHIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUklHSU5BVElOR19TVUJfQUREUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBERVNUSU5BVElPTl9TVUJfQUREUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5yZWFkKHBhcmFtZXRlckRhdGEsIDAsIHBhcmFtZXRlckxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gc3ViQWRkckJpcyA9IG5ldyBCaXR3aXNlSW5wdXRTdHJlYW0ocGFyYW1ldGVyRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJBZGRyLnR5cGUgPSBzdWJBZGRyQmlzLnJlYWQoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJBZGRyLm9kZCA9IHN1YkFkZHJCaXMucmVhZEJ5dGVBcnJheSgxKVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJBZGRyTGVuID0gc3ViQWRkckJpcy5yZWFkKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHN1YmRhdGEgPSBuZXcgYnl0ZVtzdWJBZGRyTGVuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdWJBZGRyTGVuOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChieXRlKSAoMHhGRiAmIHN1YkFkZHJCaXMucmVhZCg0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgdmFsdWUgaWYgaXQgaXMgNC1iaXQgRFRNRiB0byA4IGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRhdGFbaW5kZXhdID0gY29udmVydER0bWZUb0FzY2lpKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViQWRkci5vcmlnQnl0ZXMgPSBzdWJkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkVBUkVSX1JFUExZX09QVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5yZWFkKHBhcmFtZXRlckRhdGEsIDAsIHBhcmFtZXRlckxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gcmVwbHlPcHRCaXMgPSBuZXcgQml0d2lzZUlucHV0U3RyZWFtKHBhcmFtZXRlckRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZW52LmJlYXJlclJlcGx5ID0gcmVwbHlPcHRCaXMucmVhZCg2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENBVVNFX0NPREVTOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzLnJlYWQocGFyYW1ldGVyRGF0YSwgMCwgcGFyYW1ldGVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHdpc2VJbnB1dFN0cmVhbSBjY0JpcyA9IG5ldyBCaXR3aXNlSW5wdXRTdHJlYW0ocGFyYW1ldGVyRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYucmVwbHlTZXFObyA9IGNjQmlzLnJlYWRCeXRlQXJyYXkoNilbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZXJyb3JDbGFzcyA9IGNjQmlzLnJlYWRCeXRlQXJyYXkoMilbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LmVycm9yQ2xhc3MgIT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuY2F1c2VDb2RlID0gY2NCaXMucmVhZEJ5dGVBcnJheSg4KVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJFQVJFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzLnJlYWQocGFyYW1ldGVyRGF0YSwgMCwgcGFyYW1ldGVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi5iZWFyZXJEYXRhID0gcGFyYW1ldGVyRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgcGFyYW1ldGVySWQgKCIgKyBwYXJhbWV0ZXJJZCArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFpcy5jbG9zZSgpOworICAgICAgICAgICAgZGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInBhcnNlUGR1RnJvbUVmUmVjb3JkOiBjb252ZXJzaW9uIGZyb20gcGR1IHRvIFNtc01lc3NhZ2UgZmFpbGVkIiArIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxpbmsgdGhlIGZpbGxlZCBvYmplY3RzIHRvIHRoaXMgU01TCisgICAgICAgIG9yaWdpbmF0aW5nQWRkcmVzcyA9IGFkZHI7CisgICAgICAgIGVudi5vcmlnQWRkcmVzcyA9IGFkZHI7CisgICAgICAgIGVudi5vcmlnU3ViYWRkcmVzcyA9IHN1YkFkZHI7CisgICAgICAgIG1FbnZlbG9wZSA9IGVudjsKKyAgICAgICAgbVBkdSA9IHBkdTsKKworICAgICAgICBwYXJzZVNtcygpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFBhcnNlcyBhIFNNUyBtZXNzYWdlIGZyb20gaXRzIEJlYXJlckRhdGEgc3RyZWFtLiAobW9iaWxlLXRlcm1pbmF0ZWQgb25seSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVNtcygpIHsKQEAgLTgxOCw2ICs5NzksOCBAQAogICAgICAgICBvdXRwdXQud3JpdGUobUVudmVsb3BlLnRlbGVTZXJ2aWNlKTsKICAgICAgICAgb3V0cHV0LndyaXRlKG1FbnZlbG9wZS5vcmlnQWRkcmVzcy5vcmlnQnl0ZXMsIDAsIG1FbnZlbG9wZS5vcmlnQWRkcmVzcy5vcmlnQnl0ZXMubGVuZ3RoKTsKICAgICAgICAgb3V0cHV0LndyaXRlKG1FbnZlbG9wZS5iZWFyZXJEYXRhLCAwLCBtRW52ZWxvcGUuYmVhcmVyRGF0YS5sZW5ndGgpOworICAgICAgICBvdXRwdXQud3JpdGUobUVudmVsb3BlLm9yaWdTdWJhZGRyZXNzLm9yaWdCeXRlcywgMCwKKyAgICAgICAgICAgICAgICBtRW52ZWxvcGUub3JpZ1N1YmFkZHJlc3Mub3JpZ0J5dGVzLmxlbmd0aCk7CiAKICAgICAgICAgcmV0dXJuIG91dHB1dC50b0J5dGVBcnJheSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCmluZGV4IDdiYzQ4Y2EuLjhhNGUwY2UgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQpAQCAtNTg4LDcgKzU4OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHVEYXRhLnBheWxvYWQgPSBuZXcgYnl0ZVswXTsKICAgICAgICAgICAgICAgICAgICAgdURhdGEubnVtRmllbGRzID0gMDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1RGF0YS5wYXlsb2FkID0gdURhdGEucGF5bG9hZDsKICAgICAgICAgICAgICAgICAgICAgdURhdGEubnVtRmllbGRzID0gdURhdGEucGF5bG9hZC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0NkbWFTbXNTdWJhZGRyZXNzLmphdmEKc2ltaWxhcml0eSBpbmRleCA2NCUKY29weSBmcm9tIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1N0a0V4Y2VwdGlvbi5qYXZhCmNvcHkgdG8gdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0NkbWFTbXNTdWJhZGRyZXNzLmphdmEKaW5kZXggODZkZTM2Ni4uZjljZWJmNSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU3RrRXhjZXB0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0NkbWFTbXNTdWJhZGRyZXNzLmphdmEKQEAgLTEsNSArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE1LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrOworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXM7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKK3B1YmxpYyBjbGFzcyBDZG1hU21zU3ViYWRkcmVzcyB7CisgICAgcHVibGljIGludCB0eXBlOwogCisgICAgcHVibGljIGJ5dGUgb2RkOwogCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgZXhjZXB0aW9ucyBpbiBTVEsgc2VydmljZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWNsYXNzIFN0a0V4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBTdGtFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorICAgIHB1YmxpYyBieXRlW10gb3JpZ0J5dGVzOwogfQorCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCmluZGV4IDBkY2FjYzEuLjRmMDAxNjMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtczsKIAogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkNkbWFTbXNTdWJhZGRyZXNzOworCiBwdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGV7CiAgICAgLyoqCiAgICAgICogTWVzc2FnZSBUeXBlcwpAQCAtNzQsMTcgKzc2LDIzIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWRkcmVzcyBpZGVudGlmaWVzIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBTTVMgbWVzc2FnZS4KLSAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIsIDMuNC4zLjQpCisgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLCAzLjQuMy4zKQogICAgICAqLwogICAgIHB1YmxpYyBDZG1hU21zQWRkcmVzcyBvcmlnQWRkcmVzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlkZW50aWZpZXMgdGhlIHRhcmdldCBvZiB0aGUgU01TIG1lc3NhZ2UuCi0gICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLCAzLjQuMy40KQorICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2MiwgMy40LjMuMykKICAgICAgKi8KICAgICBwdWJsaWMgQ2RtYVNtc0FkZHJlc3MgZGVzdEFkZHJlc3M7CiAKICAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luYXRpb24gc3ViYWRkcmVzcyBpZGVudGlmaWVzIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBTTVMgbWVzc2FnZS4KKyAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIsIDMuNC4zLjQpCisgICAgICovCisgICAgcHVibGljIENkbWFTbXNTdWJhZGRyZXNzIG9yaWdTdWJhZGRyZXNzOworCisgICAgLyoqCiAgICAgICogVGhlIDYtYml0IGJlYXJlciByZXBseSBwYXJhbWV0ZXIgaXMgdXNlZCB0byByZXF1ZXN0IHRoZSByZXR1cm4gb2YgYQogICAgICAqIFNNUyBBY2tub3dsZWRnZSBNZXNzYWdlLgogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2MiwgMy40LjMuNSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQppbmRleCA2ODlhOTcyLi4zOTU5YzY3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZS5TRVJWSUNFX0NMQVNTX1ZPSUNFOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9CQVNFQkFORF9WRVJTSU9OOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhdC5DYXRTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsRm9yd2FyZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxTdGF0ZUV4Y2VwdGlvbjsKQEAgLTY4LDcgKzY5LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlN0a1NlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NWbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIApAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgR3NtU01TRGlzcGF0Y2hlciBtU01TOwogICAgIFNJTVJlY29yZHMgbVNJTVJlY29yZHM7CiAgICAgU2ltQ2FyZCBtU2ltQ2FyZDsKLSAgICBTdGtTZXJ2aWNlIG1TdGtTZXJ2aWNlOworICAgIENhdFNlcnZpY2UgbVN0a1NlcnZpY2U7CiAgICAgQXJyYXlMaXN0IDxHc21NbWlDb2RlPiBtUGVuZGluZ01NSXMgPSBuZXcgQXJyYXlMaXN0PEdzbU1taUNvZGU+KCk7CiAgICAgU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlciBtU2ltUGhvbmVCb29rSW50TWFuYWdlcjsKICAgICBTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyIG1TaW1TbXNJbnRNYW5hZ2VyOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgICBtU2ltU21zSW50TWFuYWdlciA9IG5ldyBTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyKHRoaXMsIG1TTVMpOwogICAgICAgICAgICAgbVN1YkluZm8gPSBuZXcgUGhvbmVTdWJJbmZvKHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIG1TdGtTZXJ2aWNlID0gU3RrU2VydmljZS5nZXRJbnN0YW5jZShtQ00sIG1TSU1SZWNvcmRzLCBtQ29udGV4dCwKKyAgICAgICAgbVN0a1NlcnZpY2UgPSBDYXRTZXJ2aWNlLmdldEluc3RhbmNlKG1DTSwgbVNJTVJlY29yZHMsIG1Db250ZXh0LAogICAgICAgICAgICAgICAgIChTSU1GaWxlSGFuZGxlciltSWNjRmlsZUhhbmRsZXIsIG1TaW1DYXJkKTsKIAogICAgICAgICBtQ00ucmVnaXN0ZXJGb3JBdmFpbGFibGUodGhpcywgRVZFTlRfUkFESU9fQVZBSUxBQkxFLCBudWxsKTsKQEAgLTk2OCw3ICs5NjgsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGdldENhbGxXYWl0aW5nKE1lc3NhZ2Ugb25Db21wbGV0ZSkgewotICAgICAgICBtQ00ucXVlcnlDYWxsV2FpdGluZyhDb21tYW5kc0ludGVyZmFjZS5TRVJWSUNFX0NMQVNTX1ZPSUNFLCBvbkNvbXBsZXRlKTsKKyAgICAgICAgLy9BcyBwZXIgM0dQUCBUUyAyNC4wODMsIHNlY3Rpb24gMS42IFVFIGRvZXNuJ3QgbmVlZCB0byBzZW5kIHNlcnZpY2UKKyAgICAgICAgLy9jbGFzcyBwYXJhbWV0ZXIgaW4gY2FsbCB3YWl0aW5nIGludGVycm9nYXRpb24gIHRvIG5ldHdvcmsKKyAgICAgICAgbUNNLnF1ZXJ5Q2FsbFdhaXRpbmcoQ29tbWFuZHNJbnRlcmZhY2UuU0VSVklDRV9DTEFTU19OT05FLCBvbkNvbXBsZXRlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDYWxsV2FpdGluZyhib29sZWFuIGVuYWJsZSwgTWVzc2FnZSBvbkNvbXBsZXRlKSB7CkBAIC0xMjIxLDcgKzEyMjMsOCBAQAogICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBkaWZmZXJlbnQgU0lNIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4gSWYgc28gdW5zZXQgdGhlCiAgICAgICAgICAgICAgICAgLy8gdm9pY2UgbWFpbCBudW1iZXIuCiAgICAgICAgICAgICAgICAgU3RyaW5nIGltc2kgPSBnZXRWbVNpbUltc2koKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1zaSAhPSBudWxsICYmICFnZXRTdWJzY3JpYmVySWQoKS5lcXVhbHMoaW1zaSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW1zaUZyb21TSU0gPSBnZXRTdWJzY3JpYmVySWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW1zaSAhPSBudWxsICYmIGltc2lGcm9tU0lNICE9IG51bGwgJiYgIWltc2lGcm9tU0lNLmVxdWFscyhpbXNpKSkgewogICAgICAgICAgICAgICAgICAgICBzdG9yZVZvaWNlTWFpbE51bWJlcihudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc2V0Vm1TaW1JbXNpKG51bGwpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0ODAsNCArMTQ4Myw3IEBACiAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQ3NwUGxtbkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtU0lNUmVjb3Jkcy5pc0NzcFBsbW5FbmFibGVkKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21NbWlDb2RlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbU1taUNvZGUuamF2YQppbmRleCA1YzdjZTJmLi4yOTYyZTBmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbU1taUNvZGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbU1taUNvZGUuamF2YQpAQCAtNDQsNiArNDQsMTMgQEAKIAogICAgIC8vKioqKiogQ29uc3RhbnRzCiAKKyAgICAvLyBNYXggU2l6ZSBvZiB0aGUgU2hvcnQgQ29kZSAoYWthIFNob3J0IFN0cmluZyBmcm9tIFRTIDIyLjAzMCA2LjUuMikKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRU5HVEhfU0hPUlRfQ09ERSA9IDI7CisKKyAgICAvLyBUUyAyMi4wMzAgNi41LjIgRXZlcnkgU2hvcnQgU3RyaW5nIFVTU0QgY29tbWFuZCB3aWxsIGVuZCB3aXRoICMta2V5CisgICAgLy8gKGtub3duIGFzICMtU3RyaW5nKQorICAgIHN0YXRpYyBmaW5hbCBjaGFyIEVORF9PRl9VU1NEX0NPTU1BTkQgPSAnIyc7CisKICAgICAvLyBGcm9tIFRTIDIyLjAzMCA2LjUuMgogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FDVElWQVRFID0gIioiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RFQUNUSVZBVEUgPSAiIyI7CkBAIC00NzEsMjIgKzQ3OCw2OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbmV3RnJvbURpYWxTdHJpbmcuICBSZXR1cm5zIHRydWUgaWYgZGlhbFN0cmluZyBhcHBlYXJzIHRvIGJlIGEgc2hvcnQgY29kZQotICAgICAqIEFORCBjb25kaXRpb25zIGFyZSBjb3JyZWN0IGZvciBpdCB0byBiZSB0cmVhdGVkIGFzIHN1Y2guCisgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBuZXdGcm9tRGlhbFN0cmluZy4gUmV0dXJucyB0cnVlIGlmIGRpYWxTdHJpbmcgYXBwZWFycworICAgICAqIHRvIGJlIGEgc2hvcnQgY29kZSBBTkQgY29uZGl0aW9ucyBhcmUgY29ycmVjdCBmb3IgaXQgdG8gYmUgdHJlYXRlZCBhcworICAgICAqIHN1Y2guCiAgICAgICovCiAgICAgc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc1Nob3J0Q29kZShTdHJpbmcgZGlhbFN0cmluZywgR1NNUGhvbmUgcGhvbmUpIHsKICAgICAgICAgLy8gUmVmZXIgdG8gVFMgMjIuMDMwIEZpZ3VyZSAzLjUuMy4yOgotICAgICAgICAvLyBBIDEgb3IgMiBkaWdpdCAic2hvcnQgY29kZSIgaXMgdHJlYXRlZCBhcyBVU1NEIGlmIGl0IGlzIGVudGVyZWQgd2hpbGUgb24gYSBjYWxsIG9yCi0gICAgICAgIC8vIGRvZXMgbm90IHNhdGlzZnkgdGhlIGNvbmRpdGlvbiAoZXhhY3RseSAyIGRpZ2l0cyAmJiBzdGFydHMgd2l0aCAnMScpLgotICAgICAgICByZXR1cm4gKChkaWFsU3RyaW5nICE9IG51bGwgJiYgZGlhbFN0cmluZy5sZW5ndGgoKSA8PSAyKQotICAgICAgICAgICAgICAgICYmICFQaG9uZU51bWJlclV0aWxzLmlzRW1lcmdlbmN5TnVtYmVyKGRpYWxTdHJpbmcpCi0gICAgICAgICAgICAgICAgJiYgKHBob25lLmlzSW5DYWxsKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgISgoZGlhbFN0cmluZy5sZW5ndGgoKSA9PSAyICYmIGRpYWxTdHJpbmcuY2hhckF0KDApID09ICcxJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGlsZSBjb250cmFyeSB0byBUUyAyMi4wMzAsIHRoZXJlIGlzIHN0cm9uZyBwcmVjZWRlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRyZWF0aW5nICIwIiBhbmQgIjAwIiBhcyBjYWxsIHNldHVwIHN0cmluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGlhbFN0cmluZy5lcXVhbHMoIjAiKQotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRpYWxTdHJpbmcuZXF1YWxzKCIwMCIpKSkpOworICAgICAgICBpZiAoZGlhbFN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbGxlZ2FsIGRpYWwgc3RyaW5nIGNoYXJhY3RlcnMgd2lsbCBnaXZlIGEgWkVSTyBsZW5ndGguCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHdhbnQgdG8gY3Jhc2ggYXMgYW55IGFwcGxpY2F0aW9uIHdpdGgKKyAgICAgICAgLy8gY2FsbCBwcml2aWxlZ2VzIG1heSBzZW5kIGEgbm9uIGRpYWwgc3RyaW5nLgorICAgICAgICAvLyBJdCByZXR1cm4gZmFsc2UgYXMgd2hlbiB0aGUgZGlhbFN0cmluZyBpcyBlcXVhbCB0byBOVUxMLgorICAgICAgICBpZiAoZGlhbFN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc0VtZXJnZW5jeU51bWJlcihkaWFsU3RyaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGlzU2hvcnRDb2RlVVNTRChkaWFsU3RyaW5nLCBwaG9uZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGlzU2hvcnRDb2RlLiBSZXR1cm5zIHRydWUgaWYgZGlhbFN0cmluZyBhcHBlYXJzIHRvIGJlCisgICAgICogYSBzaG9ydCBjb2RlIGFuZCBpdCBpcyBhIFVTU0Qgc3RydWN0dXJlCisgICAgICoKKyAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIDNQR0cgVFMgMjIuMDMwIHNwZWNpZmljYXRpb24gRmlndXJlIDMuNS4zLjI6IEEgMSBvciAyCisgICAgICogZGlnaXQgInNob3J0IGNvZGUiIGlzIHRyZWF0ZWQgYXMgVVNTRCBpZiBpdCBpcyBlbnRlcmVkIHdoaWxlIG9uIGEgY2FsbCBvcgorICAgICAqIGRvZXMgbm90IHNhdGlzZnkgdGhlIGNvbmRpdGlvbiAoZXhhY3RseSAyIGRpZ2l0cyAmJiBzdGFydHMgd2l0aCAnMScpLCB0aGVyZQorICAgICAqIGFyZSBob3dldmVyIGV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlIChzZWUgYmVsb3cpCisgICAgICoKKyAgICAgKiBFeGNlcHRpb24gKDEpIHRvIENhbGwgaW5pdGlhdGlvbiBpczogSWYgdGhlIHVzZXIgb2YgdGhlIGRldmljZSBpcyBhbHJlYWR5IGluIGEgY2FsbAorICAgICAqIGFuZCBlbnRlcnMgYSBTaG9ydCBTdHJpbmcgd2l0aG91dCBhbnkgIy1rZXkgYXQgdGhlIGVuZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgU2hvcnQgU3RyaW5nIGlzCisgICAgICogZXF1YWwgb3IgbGVzcyB0aGVuIHRoZSBNQVhfTEVOR1RIX1NIT1JUX0NPREUgW2NvbnN0YW50IHRoYXQgaXMgZXF1YWwgdG8gMl0KKyAgICAgKgorICAgICAqIFRoZSBwaG9uZSBzaGFsbCBpbml0aWF0ZSBhIFVTU0QvU1MgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBFeGNlcHRpb24gKDIpIHRvIENhbGwgaW5pdGlhdGlvbiBpczogSWYgdGhlIHVzZXIgb2YgdGhlIGRldmljZSBlbnRlcnMgb25lCisgICAgICogRGlnaXQgZm9sbG93ZWQgYnkgdGhlICMta2V5LiBUaGlzIHJ1bGUgZGVmaW5lcyB0aGlzIFN0cmluZyBhcyB0aGUKKyAgICAgKiAjLVN0cmluZyB3aGljaCBpcyBhIFVTU0QvU1MgY29tbWFuZC4KKyAgICAgKgorICAgICAqIFRoZSBwaG9uZSBzaGFsbCBpbml0aWF0ZSBhIFVTU0QvU1MgY29tbWFuZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzU2hvcnRDb2RlVVNTRChTdHJpbmcgZGlhbFN0cmluZywgR1NNUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgaWYgKGRpYWxTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBob25lLmlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBTaG9ydCBDb2RlIChha2EgU2hvcnQgU3RyaW5nKSBpcyAyCisgICAgICAgICAgICAgICAgaWYgKGRpYWxTdHJpbmcubGVuZ3RoKCkgPD0gTUFYX0xFTkdUSF9TSE9SVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgU2hvcnQgQ29kZSAoYWthIFNob3J0IFN0cmluZykgaXMgMgorICAgICAgICAgICAgaWYgKGRpYWxTdHJpbmcubGVuZ3RoKCkgPD0gTUFYX0xFTkdUSF9TSE9SVF9DT0RFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpYWxTdHJpbmcuY2hhckF0KGRpYWxTdHJpbmcubGVuZ3RoKCkgLSAxKSA9PSBFTkRfT0ZfVVNTRF9DT01NQU5EKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGU3YjZjMzcuLjgzNTUwNDYgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCkBAIC0yMiwyMSArMjIsMjcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc0NiTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uR3NtQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5CYXNlQ29tbWFuZHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU01TRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzOwogCkBAIC00OCw2ICs1NCw4IEBACiAgICAgR3NtU01TRGlzcGF0Y2hlcihHU01QaG9uZSBwaG9uZSkgewogICAgICAgICBzdXBlcihwaG9uZSk7CiAgICAgICAgIG1Hc21QaG9uZSA9IHBob25lOworCisgICAgICAgICgoQmFzZUNvbW1hbmRzKW1DbSkuc2V0T25OZXdHc21Ccm9hZGNhc3RTbXModGhpcywgRVZFTlRfTkVXX0JST0FEQ0FTVF9TTVMsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzkyLDQgKzQwMCwxNjIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQ29tbWFuZHNJbnRlcmZhY2UuR1NNX1NNU19GQUlMX0NBVVNFX1VOU1BFQ0lGSUVEX0VSUk9SOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZHMgYWxsIGluZm8gYWJvdXQgYSBtZXNzYWdlIHBhZ2UgbmVlZGVkIHRvIGFzc2VtYmxlIGEgY29tcGxldGUKKyAgICAgKiBjb25jYXRlbmF0ZWQgbWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNtc0NiQ29uY2F0SW5mbyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU21zQ2JIZWFkZXIgbUhlYWRlcjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGxtbjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTGFjOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DaWQ7CisKKyAgICAgICAgcHVibGljIFNtc0NiQ29uY2F0SW5mbyhTbXNDYkhlYWRlciBoZWFkZXIsIFN0cmluZyBwbG1uLCBpbnQgbGFjLCBpbnQgY2lkKSB7CisgICAgICAgICAgICBtSGVhZGVyID0gaGVhZGVyOworICAgICAgICAgICAgbVBsbW4gPSBwbG1uOworICAgICAgICAgICAgbUxhYyA9IGxhYzsKKyAgICAgICAgICAgIG1DaWQgPSBjaWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGVhZGVyLm1lc3NhZ2VJZGVudGlmaWVyICogMzEgKyBtSGVhZGVyLnVwZGF0ZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNtc0NiQ29uY2F0SW5mbykgeworICAgICAgICAgICAgICAgIFNtc0NiQ29uY2F0SW5mbyBvdGhlciA9IChTbXNDYkNvbmNhdEluZm8pb2JqOworCisgICAgICAgICAgICAgICAgLy8gVHdvIHBhZ2VzIG1hdGNoIGlmIGFsbCBoZWFkZXIgYXR0cmlidXRlcyAoZXhjZXB0IHRoZSBwYWdlCisgICAgICAgICAgICAgICAgLy8gaW5kZXgpIGFyZSBpZGVudGljYWwsIGFuZCBib3RoIHBhZ2VzIGJlbG9uZyB0byB0aGUgc2FtZQorICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uICh3aGljaCBpcyBhbHNvIGRldGVybWluZWQgYnkgdGhlIHNjb3BlIHBhcmFtZXRlcikKKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlci5nZW9ncmFwaGljYWxTY29wZSA9PSBvdGhlci5tSGVhZGVyLmdlb2dyYXBoaWNhbFNjb3BlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSGVhZGVyLm1lc3NhZ2VDb2RlID09IG90aGVyLm1IZWFkZXIubWVzc2FnZUNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIudXBkYXRlTnVtYmVyID09IG90aGVyLm1IZWFkZXIudXBkYXRlTnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSGVhZGVyLm1lc3NhZ2VJZGVudGlmaWVyID09IG90aGVyLm1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZSA9PSBvdGhlci5tSGVhZGVyLmRhdGFDb2RpbmdTY2hlbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIubnJPZlBhZ2VzID09IG90aGVyLm1IZWFkZXIubnJPZlBhZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzTG9jYXRpb24ob3RoZXIubVBsbW4sIG90aGVyLm1MYWMsIG90aGVyLm1DaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGlzIGNvbmNhdGVuYXRpb24gaW5mbyBtYXRjaGVzIHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhlCisgICAgICAgICAqIGdyYW51bGFyaXR5IG9mIHRoZSBtYXRjaCBkZXBlbmRzIG9uIHRoZSBnZW9ncmFwaGljYWwgc2NvcGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwbG1uIFBMTU4KKyAgICAgICAgICogQHBhcmFtIGxhYyBMb2NhdGlvbiBhcmVhIGNvZGUKKyAgICAgICAgICogQHBhcmFtIGNpZCBDZWxsIElECisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGluZywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzTG9jYXRpb24oU3RyaW5nIHBsbW4sIGludCBsYWMsIGludCBjaWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobUhlYWRlci5nZW9ncmFwaGljYWxTY29wZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREU6CisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERV9JTU1FRElBVEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ2lkICE9IGNpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgZmFsbC10aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGFjICE9IGxhYykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgZmFsbC10aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1QbG1uICE9IG51bGwgJiYgbVBsbW4uZXF1YWxzKHBsbW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIG1hcCBob2xkcyBpbmNvbXBsZXRlIGNvbmNhdGVuYXRlZCBtZXNzYWdlcyB3YWl0aW5nIGZvciBhc3NlbWJseQorICAgIHByaXZhdGUgSGFzaE1hcDxTbXNDYkNvbmNhdEluZm8sIGJ5dGVbXVtdPiBtU21zQ2JQYWdlTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFNtc0NiQ29uY2F0SW5mbywgYnl0ZVtdW10+KCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCcm9hZGNhc3RTbXMoQXN5bmNSZXN1bHQgYXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXVtdIHBkdXMgPSBudWxsOworICAgICAgICAgICAgYnl0ZVtdIHJlY2VpdmVkUGR1ID0gKGJ5dGVbXSlhci5yZXN1bHQ7CisKKyAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjZWl2ZWRQZHUubGVuZ3RoOyBpICs9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJTTVMgQ0IgcGR1IGRhdGE6ICIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGkgKyA4ICYmIGogPCByZWNlaXZlZFBkdS5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSByZWNlaXZlZFBkdVtqXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA8IDB4MTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGIpKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU21zQ2JIZWFkZXIgaGVhZGVyID0gbmV3IFNtc0NiSGVhZGVyKHJlY2VpdmVkUGR1KTsKKyAgICAgICAgICAgIFN0cmluZyBwbG1uID0gU3lzdGVtUHJvcGVydGllcy5nZXQoVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9PUEVSQVRPUl9OVU1FUklDKTsKKyAgICAgICAgICAgIEdzbUNlbGxMb2NhdGlvbiBjZWxsTG9jYXRpb24gPSAoR3NtQ2VsbExvY2F0aW9uKW1Hc21QaG9uZS5nZXRDZWxsTG9jYXRpb24oKTsKKyAgICAgICAgICAgIGludCBsYWMgPSBjZWxsTG9jYXRpb24uZ2V0TGFjKCk7CisgICAgICAgICAgICBpbnQgY2lkID0gY2VsbExvY2F0aW9uLmdldENpZCgpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyLm5yT2ZQYWdlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBNdWx0aS1wYWdlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBTbXNDYkNvbmNhdEluZm8gY29uY2F0SW5mbyA9IG5ldyBTbXNDYkNvbmNhdEluZm8oaGVhZGVyLCBwbG1uLCBsYWMsIGNpZCk7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBvdGhlciBwYWdlcyBvZiB0aGUgc2FtZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgcGR1cyA9IG1TbXNDYlBhZ2VNYXAuZ2V0KGNvbmNhdEluZm8pOworCisgICAgICAgICAgICAgICAgaWYgKHBkdXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGl0IHRoZSBmaXJzdCBwYWdlIG9mIHRoaXMgbWVzc2FnZSwgbWFrZSByb29tIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFnZXMgYW5kIGtlZXAgdW50aWwgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgcGR1cyA9IG5ldyBieXRlW2hlYWRlci5uck9mUGFnZXNdW107CisKKyAgICAgICAgICAgICAgICAgICAgbVNtc0NiUGFnZU1hcC5wdXQoY29uY2F0SW5mbywgcGR1cyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUGFnZSBwYXJhbWV0ZXIgaXMgb25lLWJhc2VkCisgICAgICAgICAgICAgICAgcGR1c1toZWFkZXIucGFnZUluZGV4IC0gMV0gPSByZWNlaXZlZFBkdTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGR1cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGR1c1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBtaXNzaW5nIHBhZ2VzLCBleGl0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGNvbXBsZXRlLCByZW1vdmUgYW5kIGRpc3BhdGNoCisgICAgICAgICAgICAgICAgbVNtc0NiUGFnZU1hcC5yZW1vdmUoY29uY2F0SW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBwYWdlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBwZHVzID0gbmV3IGJ5dGVbMV1bXTsKKyAgICAgICAgICAgICAgICBwZHVzWzBdID0gcmVjZWl2ZWRQZHU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpc3BhdGNoQnJvYWRjYXN0UGR1cyhwZHVzKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIG1lc3NhZ2VzIHRoYXQgYXJlIG91dCBvZiBzY29wZSB0byBwcmV2ZW50IHRoZSBtYXAgZnJvbQorICAgICAgICAgICAgLy8gZ3Jvd2luZyBpbmRlZmluaXRlbHksIGNvbnRhaW5pbmcgaW5jb21wbGV0ZSBtZXNzYWdlcyB0aGF0IHdlcmUKKyAgICAgICAgICAgIC8vIG5ldmVyIGFzc2VtYmxlZAorICAgICAgICAgICAgSXRlcmF0b3I8U21zQ2JDb25jYXRJbmZvPiBpdGVyID0gbVNtc0NiUGFnZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTbXNDYkNvbmNhdEluZm8gaW5mbyA9IGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICAgICAgaWYgKCFpbmZvLm1hdGNoZXNMb2NhdGlvbihwbG1uLCBsYWMsIGNpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gZGVjb2RpbmcgU01TIENCIHBkdSIsIGUpOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDZkZGIzMTIuLjE4ZWYxMjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC02NDMsOCArNjQzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlcnIgIT0gQ29tbWFuZEV4Y2VwdGlvbi5FcnJvci5PUF9OT1RfQUxMT1dFRF9CRUZPUkVfUkVHX05XICYmCi0gICAgICAgICAgICAgICAgICAgIGVyciAhPSBDb21tYW5kRXhjZXB0aW9uLkVycm9yLk9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcpIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQ29tbWFuZEV4Y2VwdGlvbi5FcnJvci5PUF9OT1RfQUxMT1dFRF9CRUZPUkVfUkVHX05XKSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKICAgICAgICAgICAgICAgICAgICAgICAgICJSSUwgaW1wbGVtZW50YXRpb24gaGFzIHJldHVybmVkIGFuIGVycm9yIHdoZXJlIGl0IG11c3Qgc3VjY2VlZCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgYXIuZXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YQppbmRleCAyMDZlNjJmLi5lOGQxMGY5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTUZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlci5qYXZhCkBAIC04MSw2ICs4MSw3IEBACiAgICAgICAgIGNhc2UgRUZfU1BOX0NQSFM6CiAgICAgICAgIGNhc2UgRUZfU1BOX1NIT1JUX0NQSFM6CiAgICAgICAgIGNhc2UgRUZfSU5GT19DUEhTOgorICAgICAgICBjYXNlIEVGX0NTUF9DUEhTOgogICAgICAgICAgICAgcmV0dXJuIE1GX1NJTSArIERGX0dTTTsKIAogICAgICAgICBjYXNlIEVGX1BCUjoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNUmVjb3Jkcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKaW5kZXggZTIxNDA2MS4uM2IxMzNkYSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKQEAgLTczLDYgKzczLDcgQEAKICAgICAgKiAgbUNwaHNJbmZvWzFdIGFuZCBtQ3Boc0luZm9bMl0gaXMgQ1BIUyBTZXJ2aWNlIFRhYmxlCiAgICAgICovCiAgICAgcHJpdmF0ZSBieXRlW10gbUNwaHNJbmZvID0gbnVsbDsKKyAgICBib29sZWFuIG1Dc3BQbG1uRW5hYmxlZCA9IHRydWU7CiAKICAgICBieXRlW10gZWZNV0lTID0gbnVsbDsKICAgICBieXRlW10gZWZDUEhTX01XSSA9bnVsbDsKQEAgLTkzLDYgKzk0LDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFNQTl9SVUxFX1NIT1dfUExNTiA9IDB4MDI7CiAKICAgICAvLyBGcm9tIFRTIDUxLjAxMSBFRltTUERJXSBzZWN0aW9uCisgICAgc3RhdGljIGZpbmFsIGludCBUQUdfU1BESSA9IDB4QTM7CiAgICAgc3RhdGljIGZpbmFsIGludCBUQUdfU1BESV9QTE1OX0xJU1QgPSAweDgwOwogCiAgICAgLy8gRnVsbCBOYW1lIElFSSBmcm9tIFRTIDI0LjAwOApAQCAtMTQwLDYgKzE0Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9NU0lTRE5fRE9ORSA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVGUkVTSCA9IDMxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ0ZJU19ET05FID0gMzI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DU1BfQ1BIU19ET05FID0gMzM7CiAKICAgICAvLyBMb29rdXAgdGFibGUgZm9yIGNhcnJpZXJzIGtub3duIHRvIHByb2R1Y2UgU0lNcyB3aGljaCBpbmNvcnJlY3RseSBpbmRpY2F0ZSBNTkMgbGVuZ3RoLgogCkBAIC01ODksNiArNTkyLDEzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVWRU5UX0dFVF9DUEhTX01BSUxCT1hfRE9ORToKICAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX01CRE5fRE9ORToKKyAgICAgICAgICAgICAgICAvL1Jlc2V0dGluZyB0aGUgdm9pY2UgbWFpbCBudW1iZXIgYW5kIHZvaWNlIG1haWwgdGFnIHRvIG51bGwKKyAgICAgICAgICAgICAgICAvL2FzIHRoZXNlIHNob3VsZCBiZSB1cGRhdGVkIGZyb20gdGhlIGRhdGEgcmVhZCBmcm9tIEVGX01CRE4uCisgICAgICAgICAgICAgICAgLy9JZiB0aGV5IGFyZSBub3QgcmVzZXQsIGluY2FzZSBvZiBpbnZhbGlkIGRhdGEvZXhjZXB0aW9uIHRoZXNlCisgICAgICAgICAgICAgICAgLy92YXJpYWJsZXMgYXJlIHJldGFpbmluZyB0aGVpciBwcmV2aW91cyB2YWx1ZXMgYW5kIGFyZQorICAgICAgICAgICAgICAgIC8vY2F1c2luZyBpbnZhbGlkIHZvaWNlIG1haWxib3ggaW5mbyBkaXNwbGF5IHRvIHVzZXIuCisgICAgICAgICAgICAgICAgdm9pY2VNYWlsTnVtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2b2ljZU1haWxUYWcgPSBudWxsOwogICAgICAgICAgICAgICAgIGlzUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KW1zZy5vYmo7CkBAIC0xMDM1LDYgKzEwNDUsMjIgQEAKICAgICAgICAgICAgICAgICAoKEdTTVBob25lKSBwaG9uZSkubm90aWZ5Q2FsbEZvcndhcmRpbmdJbmRpY2F0b3IoKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfQ1NQX0NQSFNfRE9ORToKKyAgICAgICAgICAgICAgICBpc1JlY29yZExvYWRSZXNwb25zZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCltc2cub2JqOworCisgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsIkV4Y2VwdGlvbiBpbiBmZXRjaGluZyBFRl9DU1AgZGF0YSAiICsgYXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9IChieXRlW10pYXIucmVzdWx0OworCisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywiRUZfQ1NQOiAiICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSk7CisgICAgICAgICAgICAgICAgaGFuZGxlRWZDc3BEYXRhKGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIH19Y2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjKSB7CiAgICAgICAgICAgICAvLyBJIGRvbid0IHdhbnQgdGhlc2UgZXhjZXB0aW9ucyB0byBiZSBmYXRhbAogICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkV4Y2VwdGlvbiBwYXJzaW5nIFNJTSByZWNvcmQiLCBleGMpOwpAQCAtMTA1OCw2ICsxMDg0LDEyIEBACiAgICAgICAgICAgICAgICAgbmV3IEFkblJlY29yZExvYWRlcihwaG9uZSkubG9hZEZyb21FRihFRl9NQUlMQk9YX0NQSFMsIEVGX0VYVDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAxLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9DUEhTX01BSUxCT1hfRE9ORSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFRl9DU1BfQ1BIUzoKKyAgICAgICAgICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIltDU1BdIFNJTSBSZWZyZXNoIGZvciBFRl9DU1BfQ1BIUyIpOworICAgICAgICAgICAgICAgIHBob25lLmdldEljY0ZpbGVIYW5kbGVyKCkubG9hZEVGVHJhbnNwYXJlbnQoRUZfQ1NQX0NQSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9DU1BfQ1BIU19ET05FKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGZldGNoIGFsbCByZWNvcmRzIGlmIHRoaXMgaXMgbm90IGEKICAgICAgICAgICAgICAgICAvLyB2b2ljZW1haWwgbnVtYmVyLgpAQCAtMTI4OCw2ICsxMzIwLDkgQEAKICAgICAgICAgaWNjRmgubG9hZEVGVHJhbnNwYXJlbnQoRUZfSU5GT19DUEhTLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9JTkZPX0NQSFNfRE9ORSkpOwogICAgICAgICByZWNvcmRzVG9Mb2FkKys7CiAKKyAgICAgICAgaWNjRmgubG9hZEVGVHJhbnNwYXJlbnQoRUZfQ1NQX0NQSFMsb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQ1NQX0NQSFNfRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKICAgICAgICAgLy8gWFhYIHNob3VsZCBzZWVrIGluc3RlYWQgb2YgZXhhbWluaW5nIHRoZW0gYWxsCiAgICAgICAgIGlmIChmYWxzZSkgeyAvLyBYWFgKICAgICAgICAgICAgIGljY0ZoLmxvYWRFRkxpbmVhckZpeGVkQWxsKEVGX1NNUywgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQUxMX1NNU19ET05FKSk7CkBAIC0xNDY3LDggKzE1MDIsMTIgQEAKIAogICAgICAgICBieXRlW10gcGxtbkVudHJpZXMgPSBudWxsOwogCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBUQUdfU1BESV9QTE1OX0xJU1QKICAgICAgICAgZm9yICggOyB0bHYuaXNWYWxpZE9iamVjdCgpIDsgdGx2Lm5leHRPYmplY3QoKSkgeworICAgICAgICAgICAgLy8gU2tpcCBTUERJIHRhZywgaWYgZXhpc3RhbnQKKyAgICAgICAgICAgIGlmICh0bHYuZ2V0VGFnKCkgPT0gVEFHX1NQREkpIHsKKyAgICAgICAgICAgICAgdGx2ID0gbmV3IFNpbVRsdih0bHYuZ2V0RGF0YSgpLCAwLCB0bHYuZ2V0RGF0YSgpLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgVEFHX1NQRElfUExNTl9MSVNUCiAgICAgICAgICAgICBpZiAodGx2LmdldFRhZygpID09IFRBR19TUERJX1BMTU5fTElTVCkgewogICAgICAgICAgICAgICAgIHBsbW5FbnRyaWVzID0gdGx2LmdldERhdGEoKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE1MDUsNCArMTU0NCw1MyBAQAogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW1NJTVJlY29yZHNdICIgKyBzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiAiUmVzdHJpY3Rpb24gb2YgbWVudSBvcHRpb25zIGZvciBtYW51YWwgUExNTiBzZWxlY3Rpb24iCisgICAgICogYml0IGlzIHNldCBvciBFRl9DU1AgZGF0YSBpcyB1bmF2YWlsYWJsZSwgcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NzcFBsbW5FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUNzcFBsbW5FbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEVGX0NTUCBkYXRhIGFuZCBjaGVjayBpZgorICAgICAqICJSZXN0cmljdGlvbiBvZiBtZW51IG9wdGlvbnMgZm9yIG1hbnVhbCBQTE1OIHNlbGVjdGlvbiIgaXMKKyAgICAgKiBFbmFibGVkL0Rpc2FibGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBFRl9DU1AgaGV4IGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVmQ3NwRGF0YShieXRlW10gZGF0YSkgeworICAgICAgICAvLyBBcyBwZXIgc3BlYyBDUEhTNF8yLldXNiwgQ1BIUyBCLjQuNy4xLCBFRl9DU1AgY29udGFpbnMgQ1BIUyBkZWZpbmVkCisgICAgICAgIC8vIDE4IGJ5dGVzIChpLmUgOSBzZXJ2aWNlIGdyb3VwcyBpbmZvKSBhbmQgYWRkaXRpb25hbCBkYXRhIHNwZWNpZmljIHRvCisgICAgICAgIC8vIG9wZXJhdG9yLiBUaGUgdmFsdWVBZGRlZFNlcnZpY2VzR3JvdXAgaXMgbm90IHBhcnQgb2Ygc3RhbmRhcmQKKyAgICAgICAgLy8gc2VydmljZXMuIFRoaXMgaXMgb3BlcmF0b3Igc3BlY2lmaWMgYW5kIGNhbiBiZSBwcm9ncmFtbWVkIGFueSB3aGVyZS4KKyAgICAgICAgLy8gTm9ybWFsbHkgdGhpcyBpcyBwcm9ncmFtbWVkIGFzIDEwdGggc2VydmljZSBhZnRlciB0aGUgc3RhbmRhcmQKKyAgICAgICAgLy8gc2VydmljZXMuCisgICAgICAgIGludCB1c2VkQ3NwR3JvdXBzID0gZGF0YS5sZW5ndGggLyAyOworICAgICAgICAvLyBUaGlzIGlzIHRoZSAiU2Vydml2ZSBHcm91cCBOdW1iZXIiIG9mICJWYWx1ZSBBZGRlZCBTZXJ2aWNlcyBHcm91cCIuCisgICAgICAgIGJ5dGUgdmFsdWVBZGRlZFNlcnZpY2VzR3JvdXAgPSAoYnl0ZSkweEMwOworCisgICAgICAgIG1Dc3BQbG1uRW5hYmxlZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlZENzcEdyb3VwczsgaSsrKSB7CisgICAgICAgICAgICAgaWYgKGRhdGFbMiAqIGldID09IHZhbHVlQWRkZWRTZXJ2aWNlc0dyb3VwKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJbQ1NQXSBmb3VuZCBWYWx1ZUFkZGVkU2VydmljZXNHcm91cCwgdmFsdWUgIgorICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFbKDIgKiBpKSArIDFdKTsKKyAgICAgICAgICAgICAgICAgaWYgKChkYXRhWygyICogaSkgKyAxXSAmIDB4ODApID09IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgIC8vIEJpdCA4IGlzIGZvcgorICAgICAgICAgICAgICAgICAgICAgLy8gIlJlc3RyaWN0aW9uIG9mIG1lbnUgb3B0aW9ucyBmb3IgbWFudWFsIFBMTU4gc2VsZWN0aW9uIi4KKyAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhdG9yIFNlbGVjdGlvbiBtZW51IHNob3VsZCBiZSBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgbUNzcFBsbW5FbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIG1Dc3BQbG1uRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmF0b3IgU2VsZWN0aW9uIG1lbnUgc2hvdWxkIGJlIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmF0b3IgU2VsZWN0aW9uIE1vZGUgc2hvdWxkIGJlIHNldCB0byBBdXRvbWF0aWMuCisgICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCJbQ1NQXSBTZXQgQXV0b21hdGljIE5ldHdvcmsgU2VsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICBwaG9uZS5zZXROZXR3b3JrU2VsZWN0aW9uTW9kZUF1dG9tYXRpYyhudWxsKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIltDU1BdIFZhbHVlIEFkZGVkIFNlcnZpY2UgR3JvdXAgKDB4QzApLCBub3QgZm91bmQhIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCA2N2VjYzc3Li5lNTU1OTZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtMTcsNyArMTcsOSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMzAsNyArMzIsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01hbmFnZXIuU1RBVFVTX09OX0lDQ19GUkVFOwogCkBAIC00NSw5ICs1MCwxNSBAQAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3VjY2VzczsKICAgICBwcml2YXRlIExpc3Q8U21zUmF3RGF0YT4gbVNtczsKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgSGFzaFNldDxTdHJpbmc+PiBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgSGFzaFNldDxTdHJpbmc+PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0xPQURfRE9ORSA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1VQREFURV9ET05FID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0JST0FEQ0FTVF9BQ1RJVkFUSU9OX0RPTkUgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQlJPQURDQVNUX0NPTkZJR19ET05FID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01TX0NCX0NPREVfU0NIRU1FX01JTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNU19DQl9DT0RFX1NDSEVNRV9NQVggPSAyNTU7CiAKICAgICBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzUsNiArODYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfU0VUX0JST0FEQ0FTVF9BQ1RJVkFUSU9OX0RPTkU6CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9TRVRfQlJPQURDQVNUX0NPTkZJR19ET05FOgorICAgICAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN1Y2Nlc3MgPSAoYXIuZXhjZXB0aW9uID09IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwpAQCAtMTkyLDYgKzIxMSwxMjYgQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlQ2VsbEJyb2FkY2FzdChpbnQgbWVzc2FnZUlkZW50aWZpZXIpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJlbmFibGVDZWxsQnJvYWRjYXN0Iik7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbVBob25lLmdldENvbnRleHQoKTsKKworICAgICAgICBjb250ZXh0LmVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIiwKKyAgICAgICAgICAgICAgICAiRW5hYmxpbmcgY2VsbCBicm9hZGNhc3QgU01TIik7CisKKyAgICAgICAgU3RyaW5nIGNsaWVudCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXROYW1lRm9yVWlkKAorICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBIYXNoU2V0PFN0cmluZz4gY2xpZW50cyA9IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZUlkZW50aWZpZXIpOworCisgICAgICAgIGlmIChjbGllbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbWVzc2FnZSBpZGVudGlmaWVyCisgICAgICAgICAgICBjbGllbnRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgbUNlbGxCcm9hZGNhc3RTdWJzY3JpcHRpb25zLnB1dChtZXNzYWdlSWRlbnRpZmllciwgY2xpZW50cyk7CisKKyAgICAgICAgICAgIGlmICghdXBkYXRlQ2VsbEJyb2FkY2FzdENvbmZpZygpKSB7CisgICAgICAgICAgICAgICAgbUNlbGxCcm9hZGNhc3RTdWJzY3JpcHRpb25zLnJlbW92ZShtZXNzYWdlSWRlbnRpZmllcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKKworICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgbG9nKCJBZGRlZCBjZWxsIGJyb2FkY2FzdCBzdWJzY3JpcHRpb24gZm9yIE1JRCAiICsgbWVzc2FnZUlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gY2xpZW50ICIgKyBjbGllbnQpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICBpZiAoREJHKSBsb2coImRpc2FibGVDZWxsQnJvYWRjYXN0Iik7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbVBob25lLmdldENvbnRleHQoKTsKKworICAgICAgICBjb250ZXh0LmVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIiwKKyAgICAgICAgICAgICAgICAiRGlzYWJsaW5nIGNlbGwgYnJvYWRjYXN0IFNNUyIpOworCisgICAgICAgIFN0cmluZyBjbGllbnQgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0TmFtZUZvclVpZCgKKyAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNsaWVudHMgPSBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2VJZGVudGlmaWVyKTsKKworICAgICAgICBpZiAoY2xpZW50cyAhPSBudWxsICYmIGNsaWVudHMucmVtb3ZlKGNsaWVudCkpIHsKKyAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgbG9nKCJSZW1vdmVkIGNlbGwgYnJvYWRjYXN0IHN1YnNjcmlwdGlvbiBmb3IgTUlEICIgKyBtZXNzYWdlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gY2xpZW50ICIgKyBjbGllbnQpOworCisgICAgICAgICAgICBpZiAoY2xpZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMucmVtb3ZlKG1lc3NhZ2VJZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVDZWxsQnJvYWRjYXN0Q29uZmlnKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ2VsbEJyb2FkY2FzdENvbmZpZygpIHsKKyAgICAgICAgU2V0PEludGVnZXI+IG1lc3NhZ2VJZGVudGlmaWVycyA9IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5rZXlTZXQoKTsKKworICAgICAgICBpZiAobWVzc2FnZUlkZW50aWZpZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFNtc0Jyb2FkY2FzdENvbmZpZ0luZm9bXSBjb25maWdzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNtc0Jyb2FkY2FzdENvbmZpZ0luZm9bbWVzc2FnZUlkZW50aWZpZXJzLnNpemUoKV07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaW50IG1lc3NhZ2VJZGVudGlmaWVyIDogbWVzc2FnZUlkZW50aWZpZXJzKSB7CisgICAgICAgICAgICAgICAgY29uZmlnc1tpKytdID0gbmV3IFNtc0Jyb2FkY2FzdENvbmZpZ0luZm8obWVzc2FnZUlkZW50aWZpZXIsIG1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01JTiwgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ3MpICYmIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKFNtc0Jyb2FkY2FzdENvbmZpZ0luZm9bXSBjb25maWdzKSB7CisgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICBsb2coIkNhbGxpbmcgc2V0R3NtQnJvYWRjYXN0Q29uZmlnIHdpdGggIiArIGNvbmZpZ3MubGVuZ3RoICsgIiBjb25maWd1cmF0aW9ucyIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NFVF9CUk9BRENBU1RfQ09ORklHX0RPTkUpOworCisgICAgICAgICAgICBtU3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgbVBob25lLm1DTS5zZXRHc21Ccm9hZGNhc3RDb25maWcoY29uZmlncywgcmVzcG9uc2UpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2coImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBzZXQgY2VsbCBicm9hZGNhc3QgY29uZmlnIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVN1Y2Nlc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKGJvb2xlYW4gYWN0aXZhdGUpIHsKKyAgICAgICAgaWYgKERCRykKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBzZXRDZWxsQnJvYWRjYXN0QWN0aXZhdGlvbigiICsgYWN0aXZhdGUgKyAiKSIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NFVF9CUk9BRENBU1RfQUNUSVZBVElPTl9ET05FKTsKKworICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QaG9uZS5tQ00uc2V0R3NtQnJvYWRjYXN0QWN0aXZhdGlvbihhY3RpdmF0ZSwgcmVzcG9uc2UpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2coImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBzZXQgY2VsbCBicm9hZGNhc3QgYWN0aXZhdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1TdWNjZXNzOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbU2ltU21zSW50ZXJmYWNlTWFuYWdlcl0gIiArIG1zZyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjdjZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbTsKKworcHVibGljIGNsYXNzIFNtc0NiSGVhZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRFVfSEVBREVSX0xFTkdUSCA9IDY7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdlb2dyYXBoaWNhbFNjb3BlOworCisgICAgcHVibGljIGZpbmFsIGludCBtZXNzYWdlQ29kZTsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgdXBkYXRlTnVtYmVyOworCisgICAgcHVibGljIGZpbmFsIGludCBtZXNzYWdlSWRlbnRpZmllcjsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZGF0YUNvZGluZ1NjaGVtZTsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgcGFnZUluZGV4OworCisgICAgcHVibGljIGZpbmFsIGludCBuck9mUGFnZXM7CisKKyAgICBwdWJsaWMgU21zQ2JIZWFkZXIoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwZHUgPT0gbnVsbCB8fCBwZHUubGVuZ3RoIDwgUERVX0hFQURFUl9MRU5HVEgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgUERVIik7CisgICAgICAgIH0KKworICAgICAgICBnZW9ncmFwaGljYWxTY29wZSA9IChwZHVbMF0gJiAweGMwKSA+PiA2OworICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzBdICYgMHgzZikgPDwgNCkgfCAoKHBkdVsxXSAmIDB4ZjApID4+IDQpOworICAgICAgICB1cGRhdGVOdW1iZXIgPSBwZHVbMV0gJiAweDBmOworICAgICAgICBtZXNzYWdlSWRlbnRpZmllciA9IChwZHVbMl0gPDwgOCkgfCBwZHVbM107CisgICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSBwZHVbNF07CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgcGFnZSBwYXJhbWV0ZXIKKyAgICAgICAgaW50IHBhZ2VJbmRleCA9IChwZHVbNV0gJiAweGYwKSA+PiA0OworICAgICAgICBpbnQgbnJPZlBhZ2VzID0gcGR1WzVdICYgMHgwZjsKKworICAgICAgICBpZiAocGFnZUluZGV4ID09IDAgfHwgbnJPZlBhZ2VzID09IDAgfHwgcGFnZUluZGV4ID4gbnJPZlBhZ2VzKSB7CisgICAgICAgICAgICBwYWdlSW5kZXggPSAxOworICAgICAgICAgICAgbnJPZlBhZ2VzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OworICAgICAgICB0aGlzLm5yT2ZQYWdlcyA9IG5yT2ZQYWdlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCmluZGV4IDUwZGQ0MDIuLmY0YzVlNmMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1SZWdpb25DYWNoZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKQEAgLTQ4LDYgKzQ5LDEyIEBACiBwdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNlewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJHU00iOwogCisgICAgLyoqCisgICAgICogVXNlZCB3aXRoIHRoZSBFTkNPRElOR18gY29uc3RhbnRzIGZyb20ge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2V9CisgICAgICogTm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgdGhlcmVmb3JlIG5vdCBpbiBvcmRlciB3aXRoIHRob3NlIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfS1NDNTYwMSA9IDQwMDA7CisKICAgICBwcml2YXRlIE1lc3NhZ2VDbGFzcyBtZXNzYWdlQ2xhc3M7CiAKICAgICAvKioKQEAgLTc4MSw2ICs3ODgsMjggQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogSW50ZXJwcmV0cyB0aGUgdXNlciBkYXRhIHBheWxvYWQgYXMgS1NDNTYwMSBjaGFyYWN0ZXJzLCBhbmQKKyAgICAgICAgICogZGVjb2RlcyB0aGVtIGludG8gYSBTdHJpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ5dGVDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1c2VyIGRhdGEgcGF5bG9hZAorICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGRlY29kZWQgY2hhcmFjdGVycworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhS1NDNTYwMShpbnQgYnl0ZUNvdW50KSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcocGR1LCBjdXIsIGJ5dGVDb3VudCwgIktTQzU2MDEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgcmV0dXJuIHNhbWUgYXMgRU5DT0RJTkdfVU5LTk9XTiBvbiBlcnJvci4KKyAgICAgICAgICAgICAgICByZXQgPSBudWxsOworICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJpbXBsYXVzaWJsZSBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiwgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXIgKz0gYnl0ZUNvdW50OworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCiAgICAgICAgIGJvb2xlYW4gbW9yZURhdGFQcmVzZW50KCkgewogICAgICAgICAgICAgcmV0dXJuIChwZHUubGVuZ3RoID4gY3VyKTsKICAgICAgICAgfQpAQCAtOTMwLDYgKzk1OSw4IEBACiAgICAgICAgIC8vIFRQLU1lc3NhZ2UtVHlwZS1JbmRpY2F0b3IKICAgICAgICAgLy8gOS4yLjMKICAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDM6IC8vR1NNIDAzLjQwIDkuMi4zLjE6IE1USSA9PSAzIGlzIFJlc2VydmVkLgorICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIHdheSBhcyBNVEkgPT0gMCAoRGVsaXZlcikKICAgICAgICAgICAgIHBhcnNlU21zRGVsaXZlcihwLCBmaXJzdEJ5dGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKQEAgLTExMDgsNiArMTEzOSwxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIjMgLSBVbnN1cHBvcnRlZCBTTVMgZGF0YSBjb2Rpbmcgc2NoZW1lICIKICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZmYpKTsKKyAgICAgICAgICAgIGlmIChTaW1SZWdpb25DYWNoZS5nZXRSZWdpb24oKSA9PSBTaW1SZWdpb25DYWNoZS5NQ0NfS09SRUFOKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIktvcmVhbiBTSU0sIHVzaW5nIEtTQzU2MDEgZm9yIGRlY29kaW5nLiIpOworICAgICAgICAgICAgICAgIGVuY29kaW5nVHlwZSA9IEVOQ09ESU5HX0tTQzU2MDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzZXQgYm90aCB0aGUgdXNlciBkYXRhIGFuZCB0aGUgdXNlciBkYXRhIGhlYWRlci4KQEAgLTExMjksNiArMTE2NCwxMCBAQAogICAgICAgICBjYXNlIEVOQ09ESU5HXzE2QklUOgogICAgICAgICAgICAgbWVzc2FnZUJvZHkgPSBwLmdldFVzZXJEYXRhVUNTMihjb3VudCk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVOQ09ESU5HX0tTQzU2MDE6CisgICAgICAgICAgICBtZXNzYWdlQm9keSA9IHAuZ2V0VXNlckRhdGFLU0M1NjAxKGNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihMT0dfVEFHLCAiU01TIG1lc3NhZ2UgYm9keSAocmF3KTogJyIgKyBtZXNzYWdlQm9keSArICInIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2NDU4ZmRhLi5lYzNkMjBhCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKICAgICBwcml2YXRlIEFycmF5TGlzdDxieXRlW10+IG1JYXBGaWxlUmVjb3JkOwogICAgIHByaXZhdGUgQXJyYXlMaXN0PGJ5dGVbXT4gbUVtYWlsRmlsZVJlY29yZDsKICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8U3RyaW5nPj4gbUVtYWlsc0ZvckFkblJlYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlZnJlc2hDYWNoZSA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1BCUl9MT0FEX0RPTkUgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9VU0lNX0FETl9MT0FEX0RPTkUgPSAyOwpAQCAtOTEsMTEgKzkyLDE5IEBACiAgICAgICAgIG1FbWFpbEZpbGVSZWNvcmQgPSBudWxsOwogICAgICAgICBtUGJyRmlsZSA9IG51bGw7CiAgICAgICAgIG1Jc1BiclByZXNlbnQgPSB0cnVlOworICAgICAgICBtUmVmcmVzaENhY2hlID0gZmFsc2U7CiAgICAgfQogCiAgICAgcHVibGljIEFycmF5TGlzdDxBZG5SZWNvcmQ+IGxvYWRFZkZpbGVzRnJvbVVzaW0oKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbVBob25lQm9va1JlY29yZHMuaXNFbXB0eSgpKSByZXR1cm4gbVBob25lQm9va1JlY29yZHM7CisgICAgICAgICAgICBpZiAoIW1QaG9uZUJvb2tSZWNvcmRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtUmVmcmVzaENhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaENhY2hlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtUGhvbmVCb29rUmVjb3JkczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCFtSXNQYnJQcmVzZW50KSByZXR1cm4gbnVsbDsKIAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFBCUiBmaWxlIGlzIHByZXNlbnQgaW4gdGhlIGNhY2hlLCBpZiBub3QgcmVhZCBpdApAQCAtMTE2LDYgKzEyNSwyMCBAQAogICAgICAgICByZXR1cm4gbVBob25lQm9va1JlY29yZHM7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hDYWNoZSgpIHsKKyAgICAgICAgaWYgKG1QYnJGaWxlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgbVBob25lQm9va1JlY29yZHMuY2xlYXIoKTsKKworICAgICAgICBpbnQgbnVtUmVjcyA9IG1QYnJGaWxlLm1GaWxlSWRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWNzOyBpKyspIHsKKyAgICAgICAgICAgIHJlYWRBZG5GaWxlQW5kV2FpdChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVDYWNoZSgpIHsKKyAgICAgICAgbVJlZnJlc2hDYWNoZSA9IHRydWU7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRQYnJGaWxlQW5kV2FpdCgpIHsKICAgICAgICAgbVBob25lLmdldEljY0ZpbGVIYW5kbGVyKCkubG9hZEVGTGluZWFyRml4ZWRBbGwoRUZfUEJSLCBvYnRhaW5NZXNzYWdlKEVWRU5UX1BCUl9MT0FEX0RPTkUpKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL3BhY2thZ2UuaHRtbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4NWI1Ny4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxIVE1MPgotPEJPRFk+Ci1Qcm92aWRlcyBjbGFzc2VzIGZvciBTSU0gVG9vbGtpdCBTZXJ2aWNlLgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDYxZTRmYi4uZTM3YWZkYQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICoge0BoaWRlfQpAQCAtMzgzLDggKzM4NCw4IEBACiAgICAgICAgIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgb3JpZ2luYWxOdW1iZXIpIHRocm93cyBTaXBFeGNlcHRpb24gewogICAgICAgICAgICAgU3RyaW5nIGNhbGxlZVNpcFVyaSA9IG9yaWdpbmFsTnVtYmVyOwogICAgICAgICAgICAgaWYgKCFjYWxsZWVTaXBVcmkuY29udGFpbnMoIkAiKSkgewotICAgICAgICAgICAgICAgIGNhbGxlZVNpcFVyaSA9IG1Qcm9maWxlLmdldFVyaVN0cmluZygpLnJlcGxhY2VGaXJzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9maWxlLmdldFVzZXJOYW1lKCkgKyAiQCIsCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlcGxhY2VTdHIgPSBQYXR0ZXJuLnF1b3RlKG1Qcm9maWxlLmdldFVzZXJOYW1lKCkgKyAiQCIpOworICAgICAgICAgICAgICAgIGNhbGxlZVNpcFVyaSA9IG1Qcm9maWxlLmdldFVyaVN0cmluZygpLnJlcGxhY2VGaXJzdChyZXBsYWNlU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVlU2lwVXJpICsgIkAiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKaW5kZXggZGU1OWI4MS4uNjdkZjUxMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQppbmRleCA4OGVhZWNkLi40YzdlYmNhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YQppbmRleCA4YTRhMjg1Li41NTExYzA5YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YQpAQCAtMTcwLDYgKzE3MCwxOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZ2ptIiwgYWRuLmdldEFscGhhVGFnKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIisxODg4NTU1MTIxMiwxMjM0NTY3OCIsIGFkbi5nZXROdW1iZXIoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGFkbi5pc0VtcHR5KCkpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRlc3QgdGhhdCBhIEFETiByZWNvcmQgd2l0aCBLU0M1NjAxIHdpbGwgZ2V0IGNvbnZlcnRlZCBjb3JyZWN0bHkKKyAgICAgICAgLy8gVGhpcyB0ZXN0IHdpbGwgb25seSBiZSBydW4gd2hlbiB1c2luZyBhIEtvcmVhbiBTSU0KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgIGFkbiA9IG5ldyBBZG5SZWNvcmQoSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygKKyAgICAgICAgICAgICAgICAgICIzMDMwMzEyQzIwQzhBQjQxQjFFNkZGRkZGRkZGRkZGRjA3ODExMDEwMzI1NDc2RjhGRkZGRkZGRkZGRkYiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMSwgXHVENjREQVx1QUUzOCIsIGFkbi5nZXRBbHBoYVRhZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMDEwMTIzNDU2NzgiLCBhZG4uZ2V0TnVtYmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRuLmlzRW1wdHkoKSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc0NiVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzNmVhMAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc0NiVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IGNhc2VzIGZvciBiYXNpYyBTbXNDYk1lc3NhZ2Ugb3BlcmF0aW9ucworICovCitwdWJsaWMgY2xhc3MgR3NtU21zQ2JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RHZW9ncmFwaGljYWxTY29wZVZhbHVlKGJ5dGVbXSBwZHUsIGJ5dGUgYiwgaW50IGV4cGVjdGVkR3MpIHsKKyAgICAgICAgcGR1WzBdID0gYjsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGdlb2dyYXBoaWNhbCBzY29wZSBkZWNvZGVkIiwgZXhwZWN0ZWRHcywgbXNnCisgICAgICAgICAgICAgICAgLmdldEdlb2dyYXBoaWNhbFNjb3BlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOdWxsUGR1KCkgeworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUobnVsbCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbCgiY3JlYXRlRnJvbVBkdShieXRlW10gd2l0aCBudWxsIHBkdSBzaG91bGQgcmV0dXJuIG51bGwiLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUb29TaG9ydFBkdSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IG5ldyBieXRlWzRdOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnROdWxsKCJjcmVhdGVGcm9tUGR1KGJ5dGVbXSB3aXRoIHRvbyBzaG9ydCBwZHUgc2hvdWxkIHJldHVybiBudWxsIiwgbXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworCisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURSk7CisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDQwLCBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERSk7CisgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweDgwLCBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREUpOworICAgICAgICBkb1Rlc3RHZW9ncmFwaGljYWxTY29wZVZhbHVlKHBkdSwgKGJ5dGUpMHhDMCwgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXQoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRGdWxsKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LCAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNCwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI0LCAoYnl0ZSkweEZCLCAoYnl0ZSkweDBDLCAoYnl0ZSkweDJBLCAoYnl0ZSkweEUzLCAoYnl0ZSkweEMzLCAoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4M0IsIChieXRlKTB4MEYsIChieXRlKTB4Q0EsIChieXRlKTB4Q0QsIChieXRlKTB4NDAsIChieXRlKTB4NjMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHhEMywgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhGMiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM5LCAoYnl0ZSkweDg4LCAoYnl0ZSkweEZELCAoYnl0ZSkweDc2LCAoYnl0ZSkweDlGLCAoYnl0ZSkweDU5LCAoYnl0ZSkweEEwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzYsIChieXRlKTB4MzksIChieXRlKTB4RUMsIChieXRlKTB4NEUsIChieXRlKTB4QkIsIChieXRlKTB4Q0YsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHhCQSwgKGJ5dGUpMHgyQywgKGJ5dGUpMHgyRiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEMiwgKGJ5dGUpMHg3MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDkwLCAoYnl0ZSkweEZCLCAoYnl0ZSkweDBELCAoYnl0ZSkweDgyLCAoYnl0ZSkweDg3LCAoYnl0ZSkweEM5LCAoYnl0ZSkweEU0LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjQsIChieXRlKTB4RkIsIChieXRlKTB4MUMsIChieXRlKTB4MDIKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIGJlaW5nIGV4YWN0bHkgOTMgY2hhcmFjdGVycyBsb25nLCAiICsKKyAgICAgICAgICAgICAgICAibWVhbmluZyB0aGVyZSBpcyBubyBwYWRkaW5nISIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRXaXRoTGFuZ3VhZ2UoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHg3NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLCAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJlcyIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdFdpdGhMYW5ndWFnZUluQm9keSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDczLAorICAgICAgICAgICAgICAgIChieXRlKTB4N0IsIChieXRlKTB4MjMsIChieXRlKTB4MDgsIChieXRlKTB4M0EsIChieXRlKTB4NEUsIChieXRlKTB4OUIsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MiwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHgxQywgKGJ5dGUpMHhBRSwgKGJ5dGUpMHhCMywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHhBMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDMwLCAoYnl0ZSkweDFCLCAoYnl0ZSkweDhFLCAoYnl0ZSkweDBFLCAoYnl0ZSkweDhCLCAoYnl0ZSkweENCLCAoYnl0ZSkweDc0LAorICAgICAgICAgICAgICAgIChieXRlKTB4NTAsIChieXRlKTB4QkIsIChieXRlKTB4M0MsIChieXRlKTB4OUYsIChieXRlKTB4ODcsIChieXRlKTB4Q0YsIChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHgzRCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNiwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDFELCAoYnl0ZSkweDNFLCAoYnl0ZSkweDk3LCAoYnl0ZSkweDQxLCAoYnl0ZSkweEYyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MzIsIChieXRlKTB4QkQsIChieXRlKTB4MkUsIChieXRlKTB4NzcsIChieXRlKTB4ODMsIChieXRlKTB4RTAsIChieXRlKTB4NjEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHhFRCwgKGJ5dGUpMHgzRSwgKGJ5dGUpMHgzNywgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSB3aXRoIGNhcnJpYWdlIHJldHVybiBwYWRkaW5nIiwKKyAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInN2IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk4Qml0KCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDQsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUsIChieXRlKTB4NDYsIChieXRlKTB4NDcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MiwgKGJ5dGUpMHg0MywgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NSwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4LWJpdCBtZXNzYWdlIGJvZHkgc2hvdWxkIGJlIGVtcHR5IiwgIiIsIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHlVY3MyKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDgsIChieXRlKTB4MTEsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDUzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NkQsIChieXRlKTB4MDAsIChieXRlKTB4NjUsIChieXRlKTB4MDAsIChieXRlKTB4NzMsIChieXRlKTB4MDAsIChieXRlKTB4NzMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZGLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzQsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MEQsIChieXRlKTB4MDAsIChieXRlKTB4MEQKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5VWNzMldpdGhMYW5ndWFnZUluQm9keSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDc4LAorICAgICAgICAgICAgICAgIChieXRlKTB4M0MsIChieXRlKTB4MDAsIChieXRlKTB4NDEsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZELCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzMsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjcsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjgsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NzIsIChieXRlKTB4MDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDBECisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJ4eCIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VJZGVudGlmaWVyKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LCAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhFRSwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNBLCAoYnl0ZSkweDFBLCAoYnl0ZSkweDM0LCAoYnl0ZSkweDBFLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjAsIChieXRlKTB4QjksIChieXRlKTB4MEMsIChieXRlKTB4OTIsIChieXRlKTB4OTcsIChieXRlKTB4RTksIChieXRlKTB4NzUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwRiwgKGJ5dGUpMHg5MywgKGJ5dGUpMHhDOSwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEY3LCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAKKyAgICAgICAgfTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBpZGVudGlmaWVyIGRlY29kZWQiLCAxMjM0NSwgbXNnLmdldE1lc3NhZ2VJZGVudGlmaWVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQ29kZSgpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsIChieXRlKTB4Q0IsIChieXRlKTB4RTYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLCAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjksIChieXRlKTB4M0MsIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LCAoYnl0ZSkweDc1LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsIChieXRlKTB4QzksIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY29kZSBkZWNvZGVkIiwgNjgyLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFVwZGF0ZU51bWJlcigpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsIChieXRlKTB4Q0IsIChieXRlKTB4RTYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLCAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjksIChieXRlKTB4M0MsIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQSwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LCAoYnl0ZSkweDc1LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsIChieXRlKTB4QzksIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCisgICAgICAgIH07CisKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHVwZGF0ZSBudW1iZXIgZGVjb2RlZCIsIDUsIG1zZy5nZXRVcGRhdGVOdW1iZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXJUZXN0LmphdmEKaW5kZXggOGE2NjYxNC4uZjU3OGE4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlclRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyVGVzdC5qYXZhCkBAIC0xMDIsNCArMTAyLDI1IEBACiAgICAgICAgc21zID0gU21zTWVzc2FnZS5jcmVhdGVGcm9tRWZSZWNvcmQoMSwgZGF0YSk7CiAgICAgICAgYXNzZXJ0Tm90TnVsbChzbXMuZ2V0TWVzc2FnZUJvZHkoKSk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWZSZWNvcmRLb3JlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFNpbVJlZ2lvbkNhY2hlLmdldFJlZ2lvbigpID09IFNpbVJlZ2lvbkNhY2hlLk1DQ19LT1JFQU4pIHsKKyAgICAgICAgICAgIFNtc01lc3NhZ2Ugc21zOworCisgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMTA4OTEyODAxMDA5OTAxMDI1OTA0MGJhMTEwMDAwMDAwMDBmMDAwOTUwMTMwOTE5MDA1NjMwMDhjNDE0MiIKKyAgICAgICAgICAgICAgICAgICAgICsgIjQzNDQ0NWIwYTFiM2FhYjRkOWI2ZjNiOGI2MzEzMjMzMzQzNTQxNDI0MzQ0NDViMGExYjNhYWI0ZDliNmYzIgorICAgICAgICAgICAgICAgICAgICAgKyAiYjhiNjMxMzIzMzM0MzU0MTQyNDM0NDQ1YjBhMWIzYWFiNGQ5YjZmM2I4YjYzMTMyMzMzNDM1NDE0MjQzNDQiCisgICAgICAgICAgICAgICAgICAgICArICI0NWIwYTFiM2FhYjRkOWI2ZjNiOGI2MzEzMjMzMzQzNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICsgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgKyAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmIjsKKworCisgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcyhzKTsKKworICAgICAgICAgICBzbXMgPSBTbXNNZXNzYWdlLmNyZWF0ZUZyb21FZlJlY29yZCgxLCBkYXRhKTsKKyAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzbXMuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgICAgICAgIGFzc2VydFRydWUoc21zLmdldE1lc3NhZ2VCb2R5KCkuc3RhcnRzV2l0aCgiQUJDREVcdUFDMDBcdUIwOThcdUIyRTRcdUI3N0NcdUI5QzgxMjM0NUFCQ0RFIikpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQppbmRleCBkYjM4ZWRlLi4wNTAyNjM2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpAQCAtODIsNiArODIsMzAgQEAKICAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjgyMDUwNTMwMkQ4MmQzMmQzMSIpOwogICAgICAgICAvLyBFeGFtcGxlIGZyb20gM0dQUCBUUyAxMS4xMSBWMTguMS4zLjAgYW5uZXggQgogICAgICAgICBhc3NlcnRFcXVhbHMoIi1cdTA1MzJcdTA1ODMtMSIsIEljY1V0aWxzLmFkblN0cmluZ0ZpZWxkVG9TdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBhZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoKQorICAgICAgICAgKiBUZXN0cyBlcXVhbCB0aGUgb25lcyBhYm92ZSwgYW5kIHdpbGwgb25seSBiZSBydW4gaWYgdGhlIFNJTSBpcyBOT1Qga29yZWFuLgorICAgICAgICAgKi8KKworICAgICAgICBpZiAoU2ltUmVnaW9uQ2FjaGUuZ2V0UmVnaW9uKCkgIT0gU2ltUmVnaW9uQ2FjaGUuTUNDX0tPUkVBTikgeworICAgICAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjAwNTY2ZjY5NjM2NTIwNGQ2MTY5NmMwNzkxODE1MDM2Nzc0MmYzZmZmZmZmZmZmZmZmIik7CisgICAgICAgICAgICAvLyBBZ2Fpbiwgc2tpcCBwcmVwZW5kZWQgMAorICAgICAgICAgICAgLy8gKHRoaXMgaXMgYW4gRUZbQUROXSByZWNvcmQpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlZvaWNlIE1haWwiLCBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoZGF0YSwgMSwgZGF0YS5sZW5ndGggLSAxNSkpOworCisgICAgICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiODA5NjczNTM5QTU3NjQwMDJGMDA0REZGRkZGRkZGRkYiKTsKKyAgICAgICAgICAgIC8vICh0aGlzIGlzIGZyb20gYW4gRUZbQUROXSByZWNvcmQpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlx1OTY3M1x1NTM5QVx1NTc2NC9NIiwgSWNjVXRpbHMuYWRuU3RyaW5nRmllbGRUb1N0cmluZ0tzYzU2MDFTdXBwb3J0KGRhdGEsIDAsIGRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI4MTBBMDE1NjZmZWM2MzY1MjA0ZGUwNjk2Y0ZGRkZGRiIpOworICAgICAgICAgICAgLy8gKHRoaXMgaXMgbWFkZSB1cCB0byB0ZXN0IHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIHJlYWwgb25lKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWb1x1MDBFQ2NlIE1cdTAwRTBpbCIsIEljY1V0aWxzLmFkblN0cmluZ0ZpZWxkVG9TdHJpbmdLc2M1NjAxU3VwcG9ydChkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiODIwNTA1MzAyRDgyZDMyZDMxIik7CisgICAgICAgICAgICAvLyBFeGFtcGxlIGZyb20gM0dQUCBUUyAxMS4xMSBWMTguMS4zLjAgYW5uZXggQgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItXHUwNTMyXHUwNTgzLTEiLCBJY2NVdGlscy5hZG5TdHJpbmdGaWVsZFRvU3RyaW5nS3NjNTYwMVN1cHBvcnQoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXAyMzBXc3BDb250ZW50VHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFiMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Xc3BUeXBlRGVjb2RlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gV0VMTF9LTk9XTl9QQVJBTUVURVJTCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwMCwgIiovKiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDEsICJ0ZXh0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDAyLCAidGV4dC9odG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwMywgInRleHQvcGxhaW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA0LCAidGV4dC94LWhkbWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA1LCAidGV4dC94LXR0bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA2LCAidGV4dC94LXZDYWxlbmRhciIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDcsICJ0ZXh0L3gtdkNhcmQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDA4LCAidGV4dC92bmQud2FwLndtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MDksICJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwQSwgInRleHQvdm5kLndhcC53dGEtZXZlbnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBCLCAibXVsdGlwYXJ0LyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBDLCAibXVsdGlwYXJ0L21peGVkIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgwRCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBFLCAibXVsdGlwYXJ0L2J5dGVyYW50ZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDBGLCAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxMCwgImFwcGxpY2F0aW9uLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDExLCAiYXBwbGljYXRpb24vamF2YS12bSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDEzLCAiYXBwbGljYXRpb24veC1oZG1sYyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTQsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDE1LCAiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAud3RhLWV2ZW50YyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTcsICJhcHBsaWNhdGlvbi92bmQud2FwLnVhcHJvZiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MTgsICJhcHBsaWNhdGlvbi92bmQud2FwLnd0bHMtY2EtY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDE5LCAiYXBwbGljYXRpb24vdm5kLndhcC53dGxzLXVzZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDFBLCAiYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDFCLCAiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MUMsICJpbWFnZS8qIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxRCwgImltYWdlL2dpZiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MUUsICJpbWFnZS9qcGVnIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgxRiwgImltYWdlL3RpZmYiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDIwLCAiaW1hZ2UvcG5nIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyMSwgImltYWdlL3ZuZC53YXAud2JtcCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjIsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC4qIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyMywgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0Lm1peGVkIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNCwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmZvcm0tZGF0YSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjUsICJhcHBsaWNhdGlvbi92bmQud2FwLm11bHRpcGFydC5ieXRlcmFuZ2VzIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNiwgImFwcGxpY2F0aW9uL3ZuZC53YXAubXVsdGlwYXJ0LmFsdGVybmF0aXZlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyNywgImFwcGxpY2F0aW9uL3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjgsICJ0ZXh0L3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MjksICJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQSwgImFwcGxpY2F0aW9uL3gteDk2OC1jcm9zcy1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQiwgImFwcGxpY2F0aW9uL3gteDk2OC1jYS1jZXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyQywgImFwcGxpY2F0aW9uL3gteDk2OC11c2VyLWNlcnQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDJELCAidGV4dC92bmQud2FwLnNpIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyRSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2ljIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgyRiwgInRleHQvdm5kLndhcC5zbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzAsICJhcHBsaWNhdGlvbi92bmQud2FwLnNsYyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzEsICJ0ZXh0L3ZuZC53YXAuY28iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDMyLCAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDMzLCAiYXBwbGljYXRpb24vdm5kLndhcC5tdWx0aXBhcnQucmVsYXRlZCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzQsICJhcHBsaWNhdGlvbi92bmQud2FwLnNpYSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzUsICJ0ZXh0L3ZuZC53YXAuY29ubmVjdGl2aXR5LXhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzYsICJhcHBsaWNhdGlvbi92bmQud2FwLmNvbm5lY3Rpdml0eS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4MzcsICJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzOCwgImFwcGxpY2F0aW9uL3ZuZC53YXAuaGFzaGVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzOSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuc2lnbmVkLWNlcnRpZmljYXRlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzQSwgImFwcGxpY2F0aW9uL3ZuZC53YXAuY2VydC1yZXNwb25zZSIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0IsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDNDLCAiYXBwbGljYXRpb24vd21sK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0QsICJ0ZXh0L2NzcyIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4M0UsICJhcHBsaWNhdGlvbi92bmQud2FwLm1tcy1tZXNzYWdlIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHgzRiwgImFwcGxpY2F0aW9uL3ZuZC53YXAucm9sbG92ZXItY2VydGlmaWNhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDQwLCAiYXBwbGljYXRpb24vdm5kLndhcC5sb2NjK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0MSwgImFwcGxpY2F0aW9uL3ZuZC53YXAubG9jK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NDIsICJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0MywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NCwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NSwgImFwcGxpY2F0aW9uL3ZuZC53YXAueGh0bWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NiwgImFwcGxpY2F0aW9uL3ZuZC53di5jc3AuY2lyIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0NywgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0OCwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLm1lc3NhZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDQ5LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEEsICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0QiwgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEMsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NEQsICJhcHBsaWNhdGlvbi92bmQud3YuY3NwK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0RSwgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZHMubm90aWZpY2F0aW9uIik7CisgICAgICAgIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5wdXQoMHg0RiwgImF1ZGlvLyoiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUwLCAidmlkZW8vKiIpOworICAgICAgICBXRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMucHV0KDB4NTEsICJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUyLCAiYXBwbGljYXRpb24vbWlrZXkiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDUzLCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2QiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLnB1dCgweDU0LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwMSwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwMiwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnNpZ25hbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjAzLCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnQtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNCwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNSwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNiwgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwNywgImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnByb3Zpc2lvbmluZy1zdGF0dXMtdXJpIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAyMDgsICJ4LXdhcC5tdWx0aXBhcnQvdm5kLnVwbGFuZXQuaGVhZGVyLXNldCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjA5LCAiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ljZS13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjBBLCAiYXBwbGljYXRpb24vdm5kLnBob25lY29tLm1tYy13YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMjBCLCAiYXBwbGljYXRpb24vdm5kLm5va2lhLnN5bmNzZXQrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDIwQywgImltYWdlL3gtdXAtd3BuZyIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzAwLCAiYXBwbGljYXRpb24vaW90YS5tbWMtd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwMSwgImFwcGxpY2F0aW9uL2lvdGEubW1jLXhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzAyLCAiYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwMywgImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwrd2J4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwNCwgInRleHQvdm5kLndhcC5lbW4reG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDUsICJ0ZXh0L2NhbGVuZGFyIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDYsICJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDcsICJhcHBsaWNhdGlvbi92bmQub21hZHMtZmlsZSt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwOCwgImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMDksICJ0ZXh0L2RpcmVjdG9yeTtwcm9maWxlPXZDYXJkIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMEEsICJhcHBsaWNhdGlvbi92bmQud2FwLmVtbit3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBCLCAiYXBwbGljYXRpb24vdm5kLm5va2lhLmlwZGMtcHVyY2hhc2UtcmVzcG9uc2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMwQywgImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5zY3JlZW4zK3htbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBELCAiYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLnNjcmVlbjMrZ3ppcCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBFLCAiYXBwbGljYXRpb24vdm5kLmNtY2Muc2V0dGluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzBGLCAiYXBwbGljYXRpb24vdm5kLmNtY2MuYm9tYmluZyt3YnhtbCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzEwLCAiYXBwbGljYXRpb24vdm5kLmRvY29tby5wZiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzExLCAiYXBwbGljYXRpb24vdm5kLmRvY29tby51YiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzEyLCAiYXBwbGljYXRpb24vdm5kLm9tYWxvYy1zdXBsLWluaXQiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxMywgImFwcGxpY2F0aW9uL3ZuZC5vbWEuZ3JvdXAtdXNhZ2UtbGlzdCt4bWwiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxNCwgImFwcGxpY2F0aW9uL29tYS1kaXJlY3RvcnkreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTUsICJhcHBsaWNhdGlvbi92bmQuZG9jb21vLnBmMiIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzE2LCAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucm9hcC10cmlnZ2VyK3dieG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTcsICJhcHBsaWNhdGlvbi92bmQuc2JtLm1pZDIiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9MT05HX01JTUVfVFlQRVMucHV0KDB4MDMxOCwgImFwcGxpY2F0aW9uL3ZuZC53bWYuYm9vdHN0cmFwIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMTksICJhcHBsaWNhdGlvbi92bmMuY21jYy5kY2QreG1sIik7CisgICAgICAgIFdFTExfS05PV05fTE9OR19NSU1FX1RZUEVTLnB1dCgweDAzMUEsICJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZCIpOworICAgICAgICBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5wdXQoMHgwMzFCLCAiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5wcm92aXNpb25pbmd0cmlnZ2VyIik7CisKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDAwLCAiUSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDEsICJDaGFyc2V0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMiwgIkxldmVsIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwMywgIlR5cGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA3LCAiRGlmZmVyZW5jZXMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDA4LCAiUGFkZGluZyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MDksICJUeXBlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgwRSwgIk1heC1BZ2UiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEwLCAiU2VjdXJlIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxMSwgIlNFQyIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTIsICJNQUMiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDEzLCAiQ3JlYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTQsICJNb2RpZmljYXRpb24tZGF0ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTUsICJSZWFkLWRhdGUiKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDE2LCAiU2l6ZSIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MTcsICJOYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOCwgIkZpbGVuYW1lIik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxOSwgIlN0YXJ0Iik7CisgICAgICAgIFdFTExfS05PV05fUEFSQU1FVEVSUy5wdXQoMHgxQSwgIlN0YXJ0LWluZm8iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFCLCAiQ29tbWVudCIpOworICAgICAgICBXRUxMX0tOT1dOX1BBUkFNRVRFUlMucHV0KDB4MUMsICJEb21haW4iKTsKKyAgICAgICAgV0VMTF9LTk9XTl9QQVJBTUVURVJTLnB1dCgweDFELCAiUGF0aCIpOworCisgICAgfQorCisgICAgZmluYWwgaW50IFdTUF9ERUZJTkVEX1NIT1JUX01JTUVfVFlQRV9DT1VOVCA9IDg1OworICAgIGZpbmFsIGludCBXU1BfREVGSU5FRF9MT05HX01JTUVfVFlQRV9DT1VOVCA9IDg1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBXU1BfU1RSSU5HX1RFUk1JTkFUT1IgPSAweDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgV1NQX1NIT1JUX0lOVEVHRVJfTUFTSyA9IChieXRlKSAweDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgV1NQX0xFTkdUSF9RVU9URSA9IDB4MUY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBXU1BfUVVPVEUgPSAweDIyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgTE9OR19NSU1FX1RZUEVfT01BX0RJUkVDVE9SWV9YTUwgPSAweDAzMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgTE9OR19NSU1FX1RZUEVfVU5BU1NJR05FRCA9IDB4MDUyQzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU0hPUlRfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFID0gMHgzRjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNIT1JUX01JTUVfVFlQRV9VTkFTU0lHTkVEID0gMHg2MDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfTUlNRV9UWVBFX1JPTExPVkVSX0NFUlRJRklDQVRFCisgICAgICAgICAgICA9ICJhcHBsaWNhdGlvbi92bmQud2FwLnJvbGxvdmVyLWNlcnRpZmljYXRlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFlQRURfUEFSQU1fUSA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFRF9QQVJBTV9ET01BSU4gPSAweDFDOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSQU1fVU5BU1NJR05FRCA9IDB4NDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJBTV9OT19WQUxVRSA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFRF9QQVJBTV9TRUMgPSAweDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFlQRURfUEFSQU1fTUFDID0gMHgxMjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFeHBlY3RlZE51bWJlck9mU2hvcnRNaW1lVHlwZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhXU1BfREVGSU5FRF9TSE9SVF9NSU1FX1RZUEVfQ09VTlQsIFdFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFeHBlY3RlZE51bWJlck9mTG9uZ01pbWVUeXBlcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFdTUF9ERUZJTkVEX0xPTkdfTUlNRV9UWVBFX0NPVU5ULCBXRUxMX0tOT1dOX0xPTkdfTUlNRV9UWVBFUy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWxsS25vd25TaG9ydEludGVnZXJNaW1lVHlwZVZhbHVlcygpIHsKKworICAgICAgICBmb3IgKGludCB2YWx1ZSA6IFdhcDIzMFdzcENvbnRlbnRUeXBlVGVzdC5XRUxMX0tOT1dOX1NIT1JUX01JTUVfVFlQRVMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIFdzcFR5cGVEZWNvZGVyIHVuaXQgPSBuZXcgV3NwVHlwZURlY29kZXIoCisgICAgICAgICAgICAgICAgICAgIEhleER1bXAudG9CeXRlQXJyYXkoKGJ5dGUpICh2YWx1ZSB8IFdTUF9TSE9SVF9JTlRFR0VSX01BU0spKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVuaXQuZGVjb2RlQ29udGVudFR5cGUoMCkpOworICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdW5pdC5nZXRWYWx1ZVN0cmluZygpOworICAgICAgICAgICAgaW50IHdlbGxLbm93blZhbHVlID0gKGludCkgdW5pdC5nZXRWYWx1ZTMyKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2FwMjMwV3NwQ29udGVudFR5cGVUZXN0LldFTExfS05PV05fU0hPUlRfTUlNRV9UWVBFUy5nZXQodmFsdWUpLCBtaW1lVHlwZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHdlbGxLbm93blZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bml0LmdldERlY29kZWREYXRhTGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdlbGxLbm93bkxvbmdJbnRlZ2VyTWltZVR5cGVWYWx1ZXMoKSB7CisgICAgICAgIGJ5dGUgaGVhZGVyTGVuZ3RoID0gMzsKKyAgICAgICAgYnl0ZSB0eXBlTGVuZ3RoID0gMjsKKyAgICAgICAgZm9yIChpbnQgdmFsdWUgOiBXYXAyMzBXc3BDb250ZW50VHlwZVRlc3QuV0VMTF9LTk9XTl9TSE9SVF9NSU1FX1RZUEVTLmtleVNldCgpKSB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgICAgIGRhdGFbMF0gPSBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBkYXRhWzFdID0gdHlwZUxlbmd0aDsKKyAgICAgICAgICAgIGRhdGFbMl0gPSAoYnl0ZSkgKHZhbHVlID4+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+cmV0YWlub2JqZWN0KChOUE9iamVjdCopb2JqKTsKLQotICAgICAgICAqdiA9IG9iajsKLSAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotfQotCi1OUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKLXsKLSAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZThjNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bnBhcGkuaD4KLSNpbmNsdWRlIDxucGZ1bmN0aW9ucy5oPgotI2luY2x1ZGUgPG5wcnVudGltZS5oPgotI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKLQotZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3Jlcy9kcmF3YWJsZS9icm93c2VyX3Rlc3RfcGx1Z2luLnBuZyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL3Jlcy9kcmF3YWJsZS9icm93c2VyX3Rlc3RfcGx1Z2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdjNzlkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9yZXMvZHJhd2FibGUvYnJvd3Nlcl90ZXN0X3BsdWdpbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmMDI2NzNjLi44MzMxZjBjIDEwMDY0NAotLS0gYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0LDYgKzI0LDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9DT05GSUdVUkFUSU9OIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfQVBOX1NFVFRJTkdTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQlJPQURDQVNUX1NUSUNLWSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogCiAgICAgPCEtLSBsb2NhdGlvbiB0ZXN0IHBlcm1pc3Npb25zIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04iLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSHR0cEhlYWRlclRlc3QuamF2YSBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSHR0cEhlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWRiYzNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9IdHRwSGVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb3JlOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkhlYWRlcnM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgSHR0cEhlYWRlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX01PRElGSUVEID0gIkxhc3QtTW9kaWZpZWQ6IEZyaSwgMTggSnVuIDIwMTAgMDk6NTY6NDcgR01UIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NPTlRST0xfTUFYX0FHRSA9ICJDYWNoZS1Db250cm9sOm1heC1hZ2U9MTUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ09OVFJPTF9QUklWQVRFID0gIkNhY2hlLUNvbnRyb2w6IHByaXZhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ09OVFJPTF9DT01QT1VORCA9ICJDYWNoZS1Db250cm9sOiBuby1jYWNoZSwgbWF4LWFnZT0yMDAwMDAiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ09OVFJPTF9DT01QT1VORDIgPSAiQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0yMDAwMDAsIG5vLWNhY2hlIjsKKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgY2FjaGUgY29udHJvbCBoZWFkZXIgc3VwcG9ydHMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBoZWFkZXIsCisgICAgICogYWNjb3JkaW5nIHRvIEhUVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBIVFRQIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoZSBmb2xsb3dpbmcgYWJvdXQgdGhlIGZpZWxkczoKKyAgICAgKiBNdWx0aXBsZSBtZXNzYWdlLWhlYWRlciBmaWVsZHMgd2l0aCB0aGUgc2FtZSBmaWVsZC1uYW1lIE1BWSBiZSBwcmVzZW50CisgICAgICogaW4gYSBtZXNzYWdlIGlmIGFuZCBvbmx5IGlmIHRoZSBlbnRpcmUgZmllbGQtdmFsdWUgZm9yIHRoYXQgaGVhZGVyIGZpZWxkCisgICAgICogaXMgZGVmaW5lZCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IFtpLmUuLCAjKHZhbHVlcyldLiBJdCBNVVNUIGJlCisgICAgICogcG9zc2libGUgdG8gY29tYmluZSB0aGUgbXVsdGlwbGUgaGVhZGVyIGZpZWxkcyBpbnRvIG9uZSAiZmllbGQtbmFtZToKKyAgICAgKiBmaWVsZC12YWx1ZSIgcGFpciwgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZSBtZXNzYWdlLCBieQorICAgICAqIGFwcGVuZGluZyBlYWNoIHN1YnNlcXVlbnQgZmllbGQtdmFsdWUgdG8gdGhlIGZpcnN0LCBlYWNoIHNlcGFyYXRlZCBieSBhCisgICAgICogY29tbWEuIFRoZSBvcmRlciBpbiB3aGljaCBoZWFkZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgZmllbGQtbmFtZSBhcmUKKyAgICAgKiByZWNlaXZlZCBpcyB0aGVyZWZvcmUgc2lnbmlmaWNhbnQgdG8gdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBjb21iaW5lZAorICAgICAqIGZpZWxkIHZhbHVlLCBhbmQgdGh1cyBhIHByb3h5IE1VU1QgTk9UIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgZmllbGQKKyAgICAgKiB2YWx1ZXMgd2hlbiBhIG1lc3NhZ2UgaXMgZm9yd2FyZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYWNoZUNvbnRyb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSGVhZGVycyBoID0gbmV3IEhlYWRlcnMoKTsKKyAgICAgICAgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoNjQpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoQ0FDSEVfQ09OVFJPTF9NQVhfQUdFKTsKKyAgICAgICAgaC5wYXJzZUhlYWRlcihidWZmZXIpOworCisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKExBU1RfTU9ESUZJRUQpOworICAgICAgICBoLnBhcnNlSGVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscygibWF4LWFnZT0xNSIsIGguZ2V0Q2FjaGVDb250cm9sKCkpOworCisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKENBQ0hFX0NPTlRST0xfUFJJVkFURSk7CisgICAgICAgIGgucGFyc2VIZWFkZXIoYnVmZmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXgtYWdlPTE1LHByaXZhdGUiLCBoLmdldENhY2hlQ29udHJvbCgpKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IHRoYXQgY2FjaGUgYmVoYXZlcyBjb3JyZWN0bHkgd2hlbiByZWNlaXZpbmcgYSBjb21wdW5kCisgICAgLy8gY2FjaGUtY29udHJvbCBzdGF0ZW1lbnQgY29udGFpbmluZyBuby1jYWNoZSBhbmQgbWF4LWFnZSBhcmd1bWVudC4KKyAgICAvLworICAgIC8vIElmIGEgY2FjaGUgY29udHJvbCBoZWFkZXIgY29udGFpbnMgYm90aCBhIG1heC1hZ2UgYXJ1bWVudCBhbmQKKyAgICAvLyBhIG5vLWNhY2hlIGFyZ3VtZW50IHRoZSBtYXgtYWdlIGFyZ3VtZW50IHNob3VsZCBiZSBpZ25vcmVkLgorICAgIC8vIFRoZSByZXNvdXJjZSBjYW4gYmUgY2FjaGVkLCBidXQgYSB2YWxpZGl0eSBjaGVjayBtdXN0IGJlIGRvbmUgb24KKyAgICAvLyBldmVyeSByZXF1ZXN0LiBUZXN0IGNhc2UgY2hlY2tzIHRoYXQgdGhlIGV4cGlyeSB0aW1lIGlzIDAgZm9yCisgICAgLy8gdGhpcyBpdGVtLCBzbyBpdGVtIHdpbGwgYmUgdmFsaWRhdGVkIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMuCisgICAgcHVibGljIHZvaWQgdGVzdENhY2hlQ29udHJvbE11bHRpcGxlQXJndW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGdldCBwcml2YXRlIG1ldGhvZCBDYWNoZU1hbmFnZXIucGFyc2VIZWFkZXJzKCkKKyAgICAgICAgTWV0aG9kIG0gPSBDYWNoZU1hbmFnZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInBhcnNlSGVhZGVycyIsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzcywgSGVhZGVycy5jbGFzcywgU3RyaW5nLmNsYXNzfSk7CisgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKKworICAgICAgICAvLyBjcmVhdGUgaW5kYXRhCisgICAgICAgIEhlYWRlcnMgaCA9IG5ldyBIZWFkZXJzKCk7CisgICAgICAgIENoYXJBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQ2hhckFycmF5QnVmZmVyKDY0KTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChDQUNIRV9DT05UUk9MX0NPTVBPVU5EKTsKKyAgICAgICAgaC5wYXJzZUhlYWRlcihidWZmZXIpOworCisgICAgICAgIENhY2hlUmVzdWx0IGMgPSAoQ2FjaGVSZXN1bHQpbS5pbnZva2UobnVsbCwgMjAwLCBoLCAidGV4dC9odG1sIik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBleHBpcmVzIGlzIHNldCB0byAwLCB0byBlbnN1cmUgdGhhdCBuby1jYWNoZSBoYXMgb3ZlcnJpZGRlbgorICAgICAgICAvLyB0aGUgbWF4LWFnZSBhcmd1bWVudAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYy5nZXRFeHBpcmVzKCkpOworCisgICAgICAgIC8vIGNoZWNrIHJldmVyc2Ugb3JkZXIKKyAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoQ0FDSEVfQ09OVFJPTF9DT01QT1VORDIpOworICAgICAgICBoLnBhcnNlSGVhZGVyKGJ1ZmZlcik7CisKKyAgICAgICAgYyA9IChDYWNoZVJlc3VsdCltLmludm9rZShudWxsLCAyMDAsIGgsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGMuZ2V0RXhwaXJlcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9jb3JlL1Byb3h5VGVzdC5qYXZhIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9Qcm94eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFjZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9Qcm94eVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCisvKioKKyAqIFByb3h5IHRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEh0dHBIb3N0IG1IdHRwSG9zdDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIG1IdHRwSG9zdCA9IG51bGw7CisgICAgICAgIFN0cmluZyBwcm94eUhvc3QgPSBQcm94eS5nZXRIb3N0KG1Db250ZXh0KTsKKyAgICAgICAgaW50IHByb3h5UG9ydCA9IFByb3h5LmdldFBvcnQobUNvbnRleHQpOworICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1IdHRwSG9zdCA9IG5ldyBIdHRwSG9zdChwcm94eUhvc3QsIHByb3h5UG9ydCwgImh0dHAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFkIHVybCBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBjYXVzZSBhbnkgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94eUdldFByZWZlcnJlZEh0dHBIb3N0X1VybEJhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJiYWQ6IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImJhZCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJiYWQ6XFwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiYmFkOi8vIyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICI6Ly8jIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3h5IChpZiBhdmFpbGFibGUpIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHVybCBwYXJhbWV0ZXIgaXMgbm90IGxvY2FsaG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlHZXRQcmVmZXJyZWRIdHRwSG9zdF9VcmxOb3RsTG9jYWxob3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vZXhhbXBsZS5jb20iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovL2V4YW1wbGUuY29tLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTkyLjE2OC4wLjEvIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobUh0dHBIb3N0LCBQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImZpbGU6Ly8vZm9vL2JhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJydHNwOi8vZXhhbXBsZS5jb20iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSHR0cEhvc3QsIFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAicnRzcDovL2V4YW1wbGUuY29tLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1IdHRwSG9zdCwgUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJqYXZhc2NyaXB0OmFsZXJ0KDEpIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIHByb3h5IHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHVybCBwYXJhbWV0ZXIgaXMgbG9jYWxob3N0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94eUdldFByZWZlcnJlZEh0dHBIb3N0X1VybExvY2FsaG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovL2xvY2FsaG9zdCIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly9sb2NhbGhvc3QvIikpOworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cDovL2xvY2FsaG9zdC9oZWouaHRtbCIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly8xMjcuMC4wLjEiKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTI3LjAuMC4xLyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly8xMjcuMC4wLjEvaGVqLmh0bWwiKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJodHRwOi8vMTI3LjAuMC4xOjgwLyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC8iKSk7CisgICAgICAgIGFzc2VydE51bGwoUHJveHkuZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsICJydHNwOi8vMTI3LjAuMC4xLyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm94eS5nZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgInJ0c3A6Ly9sb2NhbGhvc3QvIikpOworICAgICAgICBhc3NlcnROdWxsKFByb3h5LmdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCAiaHR0cHM6Ly9sb2NhbGhvc3QvIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlTGlzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVMaXN0LmphdmEKaW5kZXggZTc0MTE3Ny4uNzNkNzM2MyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVMaXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVMaXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVMaXN0IGV4dGVuZHMgTGlzdEFjdGl2aXR5CkBAIC0xNzksMTAgKzE4MCw5IEBACiAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2VsZWN0aW9uKG1Gb2N1c0luZGV4KTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFBhdGgoKQotICAgIHsKLSAgICAJbVBhdGggPSAiL3NkY2FyZC9hbmRyb2lkL2xheW91dF90ZXN0cyI7Ci0gICAgCW1CYXNlTGVuZ3RoID0gbVBhdGgubGVuZ3RoKCk7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBQYXRoKCkgeworICAgICAgICBtUGF0aCA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsgIi9hbmRyb2lkL2xheW91dF90ZXN0cyI7CisgICAgICAgIG1CYXNlTGVuZ3RoID0gbVBhdGgubGVuZ3RoKCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBtUGF0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCmluZGV4IDMyMmIwZDIuLjZjZmNlNDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2aWNlOwogCitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKQEAgLTMyLDExICszMywxNyBAQAogcHVibGljIGNsYXNzIEZzVXRpbHMgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJGc1V0aWxzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUFJFRklYID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfVEVTVFNfUFJFRklYID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy9zc2wvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTE9DQUxfVEVTVFNfUFJFRklYID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy9sb2NhbC8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRURJQV9URVNUU19QUkVGSVggPSAiL3NkY2FyZC9hbmRyb2lkL2xheW91dF90ZXN0cy9odHRwL3Rlc3RzL21lZGlhLyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1dNTF9URVNUU19QUkVGSVggPSAiL3NkY2FyZC9hbmRyb2lkL2xheW91dF90ZXN0cy9odHRwL3Rlc3RzL3dtbC8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfRElSID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUFJFRklYID0KKyAgICAgICAgRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2xheW91dF90ZXN0cy9odHRwL3Rlc3RzLyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQU19URVNUU19QUkVGSVggPQorICAgICAgICBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvc3NsLyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0xPQ0FMX1RFU1RTX1BSRUZJWCA9CisgICAgICAgIEVYVEVSTkFMX0RJUiArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy9sb2NhbC8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRURJQV9URVNUU19QUkVGSVggPQorICAgICAgICBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzL2h0dHAvdGVzdHMvbWVkaWEvIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfV01MX1RFU1RTX1BSRUZJWCA9CisgICAgICAgIEVYVEVSTkFMX0RJUiArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHMvaHR0cC90ZXN0cy93bWwvIjsKIAogICAgIHByaXZhdGUgRnNVdGlscygpIHsKICAgICAgICAgLy9ubyBjcmVhdGlvbiBvZiBpbnN0YW5jZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCmluZGV4IDA0MjE1OGEuLjljY2Y1NDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQpAQCAtMTgsMTIgKzE4LDEyIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5UZXN0U2hlbGxBY3Rpdml0eS5EdW1wRGF0YVR5cGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkFkYlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5Gb3J3YXJkU2VydmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5Gb3J3YXJkU2VydmljZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTkyLDEwICs5MiwxMSBAQAogCiAgICAgcHVibGljIE15VGVzdFJlY29yZGVyKGJvb2xlYW4gcmVzdW1lKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIHJlc3VsdHNQYXNzZWRGaWxlID0gbmV3IEZpbGUoIi9zZGNhcmQvbGF5b3V0X3Rlc3RzX3Bhc3NlZC50eHQiKTsKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0c0ZhaWxlZEZpbGUgPSBuZXcgRmlsZSgiL3NkY2FyZC9sYXlvdXRfdGVzdHNfZmFpbGVkLnR4dCIpOwotICAgICAgICAgICAgRmlsZSByZXN1bHRzSWdub3JlUmVzdWx0RmlsZSA9IG5ldyBGaWxlKCIvc2RjYXJkL2xheW91dF90ZXN0c19pZ25vcmVkLnR4dCIpOwotICAgICAgICAgICAgRmlsZSBub0V4cGVjdGVkUmVzdWx0RmlsZSA9IG5ldyBGaWxlKCIvc2RjYXJkL2xheW91dF90ZXN0c19ub250ZXh0LnR4dCIpOworICAgICAgICAgICAgRmlsZSBleHRlcm5hbERpciA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpOworICAgICAgICAgICAgRmlsZSByZXN1bHRzUGFzc2VkRmlsZSA9IG5ldyBGaWxlKGV4dGVybmFsRGlyLCAibGF5b3V0X3Rlc3RzX3Bhc3NlZC50eHQiKTsKKyAgICAgICAgICAgIEZpbGUgcmVzdWx0c0ZhaWxlZEZpbGUgPSBuZXcgRmlsZShleHRlcm5hbERpciwgImxheW91dF90ZXN0c19mYWlsZWQudHh0Iik7CisgICAgICAgICAgICBGaWxlIHJlc3VsdHNJZ25vcmVSZXN1bHRGaWxlID0gbmV3IEZpbGUoZXh0ZXJuYWxEaXIsICJsYXlvdXRfdGVzdHNfaWdub3JlZC50eHQiKTsKKyAgICAgICAgICAgIEZpbGUgbm9FeHBlY3RlZFJlc3VsdEZpbGUgPSBuZXcgRmlsZShleHRlcm5hbERpciwgImxheW91dF90ZXN0c19ub250ZXh0LnR4dCIpOwogCiAgICAgICAgICAgICBtQnVmZmVyZWRPdXRwdXRQYXNzZWRTdHJlYW0gPQogICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShyZXN1bHRzUGFzc2VkRmlsZSwgcmVzdW1lKSk7CkBAIC0xMjgsMTEgKzEyOSwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiTGF5b3V0VGVzdHMiOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUX0lOX01JTExJUyA9IDUwMDA7CiAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19ST09UID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHMvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19SRVNVTFRfRElSID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHNfcmVzdWx0cy8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9FWFBFQ1RFRF9SRVNVTFRfRElSID0gIi9zZGNhcmQvYW5kcm9pZC9leHBlY3RlZF9yZXN1bHRzLyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfTElTVF9GSUxFID0gIi9zZGNhcmQvYW5kcm9pZC9sYXlvdXRfdGVzdHNfbGlzdC50eHQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVEFUVVNfRklMRSA9ICIvc2RjYXJkL2FuZHJvaWQvcnVubmluZ190ZXN0LnR4dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9ESVIgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RFU1RTX1JPT1QgPSBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzLyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfUkVTVUxUX0RJUiA9IEVYVEVSTkFMX0RJUiArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHNfcmVzdWx0cy8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9FWFBFQ1RFRF9SRVNVTFRfRElSID0gRVhURVJOQUxfRElSICsgIi9hbmRyb2lkL2V4cGVjdGVkX3Jlc3VsdHMvIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19MSVNUX0ZJTEUgPSBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX2xpc3QudHh0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RBVFVTX0ZJTEUgPSBFWFRFUk5BTF9ESVIgKyAiL2FuZHJvaWQvcnVubmluZ190ZXN0LnR4dCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVEVTVFNfUkVTVUxUU19SRUZFUkVOQ0VfRklMRVNbXSA9IHsKICAgICAgICAgICAicmVzdWx0cy9sYXlvdXRfdGVzdHNfcGFzc2VkLnR4dCIsCiAgICAgICAgICAgInJlc3VsdHMvbGF5b3V0X3Rlc3RzX2ZhaWxlZC50eHQiLApkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xvYWRUZXN0c0F1dG9UZXN0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTG9hZFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCAyZWYzNDJmLi45MzUyZjM5IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTG9hZFRlc3RzQXV0b1Rlc3QuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTG9hZFRlc3RzQXV0b1Rlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTM1LDcgKzM2LDggQEAKIHB1YmxpYyBjbGFzcyBMb2FkVGVzdHNBdXRvVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFRlc3RTaGVsbEFjdGl2aXR5PiB7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIkxvYWRUZXN0IjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9BRF9URVNUX1JFU1VMVCA9ICIvc2RjYXJkL2xvYWRfdGVzdF9yZXN1bHQudHh0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9BRF9URVNUX1JFU1VMVCA9CisgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsgIi9sb2FkX3Rlc3RfcmVzdWx0LnR4dCI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfVEVTVF9SVU5ORVJfRklMRVNbXSA9IHsKICAgICAgICAgInJ1bl9wYWdlX2N5Y2xlci5weSIKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCmluZGV4IDgyNjcxZWIuLjljNGI1NzI1NiAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CkBAIC0yOCw3ICsyOSw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9TVEFSVCA9IDB4MDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExPR1RBRyA9ICJNZW51QWN0aXZpdHkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RFU1RTX0xJU1RfRklMRSA9ICIvc2RjYXJkL2FuZHJvaWQvbGF5b3V0X3Rlc3RzX2xpc3QudHh0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URVNUU19MSVNUX0ZJTEUgPQorICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArICIvYW5kcm9pZC9sYXlvdXRfdGVzdHNfbGlzdC50eHQiOwogCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1JlbGlhYmlsaXR5VGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1JlbGlhYmlsaXR5VGVzdC5qYXZhCmluZGV4IDliYzA5NjIuLmQxNDZmYzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9SZWxpYWJpbGl0eVRlc3QuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvUmVsaWFiaWxpdHlUZXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKQEAgLTM3LDEwICszOCwxNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJSZWxpYWJpbGl0eVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRSA9ICJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTElTVF9GSUxFID0gIi9zZGNhcmQvYW5kcm9pZC9yZWxpYWJpbGl0eV90ZXN0c19saXN0LnR4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RBVFVTX0ZJTEUgPSAiL3NkY2FyZC9hbmRyb2lkL3JlbGlhYmlsaXR5X3J1bm5pbmdfdGVzdC50eHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RJTUVPVVRfRklMRSA9ICIvc2RjYXJkL2FuZHJvaWQvcmVsaWFiaWxpdHlfdGltZW91dF90ZXN0LnR4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTE9BRF9USU1FX0ZJTEUgPSAiL3NkY2FyZC9hbmRyb2lkL3JlbGlhYmlsaXR5X2xvYWRfdGltZS50eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9ESVIgPQorICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xJU1RfRklMRSA9IEVYVEVSTkFMX0RJUiArCisgICAgICAgICIvYW5kcm9pZC9yZWxpYWJpbGl0eV90ZXN0c19saXN0LnR4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RBVFVTX0ZJTEUgPSBFWFRFUk5BTF9ESVIgKworICAgICAgICAiL2FuZHJvaWQvcmVsaWFiaWxpdHlfcnVubmluZ190ZXN0LnR4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVElNRU9VVF9GSUxFID0gRVhURVJOQUxfRElSICsKKyAgICAgICAgIi9hbmRyb2lkL3JlbGlhYmlsaXR5X3RpbWVvdXRfdGVzdC50eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xPQURfVElNRV9GSUxFID0gRVhURVJOQUxfRElSICsKKyAgICAgICAgIi9hbmRyb2lkL3JlbGlhYmlsaXR5X2xvYWRfdGltZS50eHQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RPTkUgPSAiI0RPTkUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMSUFCSUxJVFlfVEVTVF9SVU5ORVJfRklMRVNbXSA9IHsKICAgICAgICAgInJ1bl9yZWxpYWJpbGl0eV90ZXN0cy5weSIKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKaW5kZXggODFkNWIwOC4uNzQ3NTcxOSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xFcnJvcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTg2Miw3ICs4NjMsOCBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9JTUFHRSA9ICJTYXZlSW1hZ2UiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFXX1JVTlMgPSA1OwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV19USU1FX0xPRyA9ICIvc2RjYXJkL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERSQVdfVElNRV9MT0cgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICIvYW5kcm9pZC9wYWdlX2RyYXdfdGltZS50eHQiOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb247CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvZm9yd2FyZGVyL0ZvcndhcmRTZXJ2aWNlLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvZm9yd2FyZGVyL0ZvcndhcmRTZXJ2aWNlLmphdmEKaW5kZXggOGI3ZGU2ZS4uMjVkZDA0ZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9mb3J3YXJkZXIvRm9yd2FyZFNlcnZpY2UuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvZm9yd2FyZGVyL0ZvcndhcmRTZXJ2aWNlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogcHVibGljIGNsYXNzIEZvcndhcmRTZXJ2aWNlIHsKQEAgLTMzLDcgKzM0LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RFU1RfSE9TVCA9ICJhbmRyb2lkLWJyb3dzZXItdGVzdC5tdHYuY29ycC5nb29nbGUuY29tIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX0hPU1RfQ09ORiA9ICIvc2RjYXJkL2RydF9mb3J3YXJkX2hvc3QudHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9IT1NUX0NPTkYgPQorICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArICIvZHJ0X2ZvcndhcmRfaG9zdC50eHQiOwogCiAgICAgcHJpdmF0ZSBGb3J3YXJkU2VydmljZSgpIHsKICAgICAgICAgaW50IGFkZHIgPSBnZXRGb3J3YXJkSG9zdEFkZHIoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0xvY2F0aW9uVHJhY2tlci9zcmMvY29tL2FuZHJvaWQvbG9jYXRpb250cmFja2VyL1RyYWNrZXJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvTG9jYXRpb25UcmFja2VyL3NyYy9jb20vYW5kcm9pZC9sb2NhdGlvbnRyYWNrZXIvVHJhY2tlckFjdGl2aXR5LmphdmEKaW5kZXggOThkMGE1MC4uNGNmZGY2YyAxMDA2NDQKLS0tIGEvdGVzdHMvTG9jYXRpb25UcmFja2VyL3NyYy9jb20vYW5kcm9pZC9sb2NhdGlvbnRyYWNrZXIvVHJhY2tlckFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvTG9jYXRpb25UcmFja2VyL3NyYy9jb20vYW5kcm9pZC9sb2NhdGlvbnRyYWNrZXIvVHJhY2tlckFjdGl2aXR5LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKQEAgLTIxMCwxMiArMjExLDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoU3RyaW5nIGV4dCkgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCIvc2RjYXJkL2xvY2F0aW9udHJhY2tlciIpOworICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsgIi9sb2NhdGlvbnRyYWNrZXIiKTsKICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIGRpci5ta2RpcigpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiL3NkY2FyZC9sb2NhdGlvbnRyYWNrZXIvdHJhY2tpbmctIiArCi0gICAgICAgICAgICBEYXRlVXRpbHMuZ2V0Q3VycmVudFRpbWVzdGFtcCgpICsgIi4iICsgZXh0OworICAgICAgICByZXR1cm4gZGlyICsgIi90cmFja2luZy0iICsgRGF0ZVV0aWxzLmdldEN1cnJlbnRUaW1lc3RhbXAoKSArICIuIiArIGV4dDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbGF1bmNoU2V0dGluZ3MoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YSBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCmluZGV4IGNmY2U3YmQuLmI3OTNkNjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCkBAIC0xNiwyNCArMTYsMTkgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zdGF0dXNiYXJ0ZXN0OwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiAKIHB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25UZXN0TGlzdCBleHRlbmRzIFRlc3RBY3Rpdml0eQpAQCAtNzAsNyArNjUsOCBAQAogICAgICAgICAgICAgICAgIHBtLmdvVG9TbGVlcChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBuLnNvdW5kID0gVXJpLnBhcnNlKCJmaWxlOi8vL3NkY2FyZC92aXJ0dWFsLXZvaWQubXAzIik7CisgICAgICAgICAgICAgICAgbi5zb3VuZCA9IFVyaS5wYXJzZSgiZmlsZTovLyIgKyBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiL3ZpcnR1YWwtdm9pZC5tcDMiKTsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJuLnNvdW5kPSIgKyBuLnNvdW5kKTsKIAogICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwIGIvdG9vbHMvYWFwdC9BYXB0QXNzZXRzLmNwcAppbmRleCBlNGY0NDdlLi4yYjJlYzdiIDEwMDY0NAotLS0gYS90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQWFwdEFzc2V0cy5jcHAKQEAgLTY4NSwxMyArNjg1LDExIEBACiAgICAgaWYgKCpjICE9IDApIHJldHVybiBmYWxzZTsKICAgICBpZiAoYy12YWwgPT0gMCB8fCBjLXZhbCA+IDMpIHJldHVybiBmYWxzZTsKIAotICAgIGludCBkID0gYXRvaSh2YWwpOwotICAgIGlmIChkICE9IDApIHsKLSAgICAgICAgaWYgKG91dCkgb3V0LT5tbmMgPSBkOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob3V0KSB7CisgICAgICAgIG91dC0+bW5jID0gYXRvaSh2YWwpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvQnVuZGxlLmggYi90b29scy9hYXB0L0J1bmRsZS5oCmluZGV4IGM1YWE1NzMuLjE1NTcwZTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvQnVuZGxlLmgKKysrIGIvdG9vbHMvYWFwdC9CdW5kbGUuaApAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICAgIG1SQ2xhc3NEaXIoTlVMTCksIG1SZXNvdXJjZUludGVybWVkaWF0ZXNEaXIoTlVMTCksIG1NYW5pZmVzdE1pblNka1ZlcnNpb24oTlVMTCksCiAgICAgICAgICAgbU1pblNka1ZlcnNpb24oTlVMTCksIG1UYXJnZXRTZGtWZXJzaW9uKE5VTEwpLCBtTWF4U2RrVmVyc2lvbihOVUxMKSwKICAgICAgICAgICBtVmVyc2lvbkNvZGUoTlVMTCksIG1WZXJzaW9uTmFtZShOVUxMKSwgbUN1c3RvbVBhY2thZ2UoTlVMTCksCi0gICAgICAgICAgbU1heFJlc1ZlcnNpb24oTlVMTCksIG1EZWJ1Z01vZGUoZmFsc2UpLCBtUHJvZHVjdChOVUxMKSwKKyAgICAgICAgICBtTWF4UmVzVmVyc2lvbihOVUxMKSwgbURlYnVnTW9kZShmYWxzZSksIG1Ob25Db25zdGFudElkKGZhbHNlKSwgbVByb2R1Y3QoTlVMTCksCiAgICAgICAgICAgbUFyZ2MoMCksIG1Bcmd2KE5VTEwpCiAgICAgICAgIHt9CiAgICAgfkJ1bmRsZSh2b2lkKSB7fQpAQCAtMTM5LDYgKzEzOSw4IEBACiAgICAgdm9pZCBzZXRNYXhSZXNWZXJzaW9uKGNvbnN0IGNoYXIgKiB2YWwpIHsgbU1heFJlc1ZlcnNpb24gPSB2YWw7IH0KICAgICBib29sIGdldERlYnVnTW9kZSgpIHsgcmV0dXJuIG1EZWJ1Z01vZGU7IH0KICAgICB2b2lkIHNldERlYnVnTW9kZShib29sIHZhbCkgeyBtRGVidWdNb2RlID0gdmFsOyB9CisgICAgYm9vbCBnZXROb25Db25zdGFudElkKCkgeyByZXR1cm4gbU5vbkNvbnN0YW50SWQ7IH0KKyAgICB2b2lkIHNldE5vbkNvbnN0YW50SWQoYm9vbCB2YWwpIHsgbU5vbkNvbnN0YW50SWQgPSB2YWw7IH0KICAgICBjb25zdCBjaGFyKiBnZXRQcm9kdWN0KCkgY29uc3QgeyByZXR1cm4gbVByb2R1Y3Q7IH0KICAgICB2b2lkIHNldFByb2R1Y3QoY29uc3QgY2hhciAqIHZhbCkgeyBtUHJvZHVjdCA9IHZhbDsgfQogCkBAIC0yMzksNiArMjQxLDcgQEAKICAgICBjb25zdCBjaGFyKiBtQ3VzdG9tUGFja2FnZTsKICAgICBjb25zdCBjaGFyKiBtTWF4UmVzVmVyc2lvbjsKICAgICBib29sICAgICAgICBtRGVidWdNb2RlOworICAgIGJvb2wgICAgICAgIG1Ob25Db25zdGFudElkOwogICAgIGNvbnN0IGNoYXIqIG1Qcm9kdWN0OwogCiAgICAgLyogZmlsZSBzcGVjaWZpY2F0aW9uICovCmRpZmYgLS1naXQgYS90b29scy9hYXB0L01haW4uY3BwIGIvdG9vbHMvYWFwdC9NYWluLmNwcAppbmRleCA3MzliMDFmLi4yNjZhMDJmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L01haW4uY3BwCisrKyBiL3Rvb2xzL2FhcHQvTWFpbi5jcHAKQEAgLTE2MCw3ICsxNjAsMTEgQEAKICAgICAgICAgIiAgICAgICBwcm9kdWN0IHZhcmlhbnRzXG4iCiAgICAgICAgICIgICAtLXV0ZjE2XG4iCiAgICAgICAgICIgICAgICAgY2hhbmdlcyBkZWZhdWx0IGVuY29kaW5nIGZvciByZXNvdXJjZXMgdG8gVVRGLTE2LiAgT25seSB1c2VmdWwgd2hlbiBBUElcbiIKLSAgICAgICAgIiAgICAgICBsZXZlbCBpcyBzZXQgdG8gNyBvciBoaWdoZXIgd2hlcmUgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgVVRGLTguXG4iKTsKKyAgICAgICAgIiAgICAgICBsZXZlbCBpcyBzZXQgdG8gNyBvciBoaWdoZXIgd2hlcmUgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgVVRGLTguXG4iCisgICAgICAgICIgICAtLW5vbi1jb25zdGFudC1pZFxuIgorICAgICAgICAiICAgICAgIE1ha2UgdGhlIHJlc291cmNlcyBJRCBub24gY29uc3RhbnQuIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBhbiBSIGphdmEgY2xhc3NcbiIKKyAgICAgICAgIiAgICAgICB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpbmFsIHZhbHVlIGJ1dCBpcyB1c2VkIHRvIG1ha2UgcmV1c2FibGUgY29tcGlsZWRcbiIKKyAgICAgICAgIiAgICAgICBsaWJyYXJpZXMgdGhhdCBuZWVkIHRvIGFjY2VzcyByZXNvdXJjZXMuXG4iKTsKIH0KIAogLyoKQEAgLTQ5Nyw2ICs1MDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5zZXRQcm9kdWN0KGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGNwLCAiLW5vbi1jb25zdGFudC1pZCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnNldE5vbkNvbnN0YW50SWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogVW5rbm93biBvcHRpb24gJy0lcydcbiIsIGNwKTsKICAgICAgICAgICAgICAgICAgICAgd2FudFVzYWdlID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKaW5kZXggYzhiYTkwNC4uMGE0ZjI0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKQEAgLTE2NTUsNyArMTY1NSw4IEBACiAKIHN0YXRpYyBzdGF0dXNfdCB3cml0ZVN5bWJvbENsYXNzKAogICAgIEZJTEUqIGZwLCBjb25zdCBzcDxBYXB0QXNzZXRzPiYgYXNzZXRzLCBib29sIGluY2x1ZGVQcml2YXRlLAotICAgIGNvbnN0IHNwPEFhcHRTeW1ib2xzPiYgc3ltYm9scywgY29uc3QgU3RyaW5nOCYgY2xhc3NOYW1lLCBpbnQgaW5kZW50KQorICAgIGNvbnN0IHNwPEFhcHRTeW1ib2xzPiYgc3ltYm9scywgY29uc3QgU3RyaW5nOCYgY2xhc3NOYW1lLCBpbnQgaW5kZW50LAorICAgIGJvb2wgbm9uQ29uc3RhbnRJZCkKIHsKICAgICBmcHJpbnRmKGZwLCAiJXNwdWJsaWMgJXNmaW5hbCBjbGFzcyAlcyB7XG4iLAogICAgICAgICAgICAgZ2V0SW5kZW50U3BhY2UoaW5kZW50KSwKQEAgLTE2NjUsNiArMTY2NiwxMCBAQAogICAgIHNpemVfdCBpOwogICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogCisgICAgY29uc3QgY2hhciAqIGlkX2Zvcm1hdCA9IG5vbkNvbnN0YW50SWQgPworICAgICAgICAgICAgIiVzcHVibGljIHN0YXRpYyBpbnQgJXM9MHglMDh4O1xuIiA6CisgICAgICAgICAgICAiJXNwdWJsaWMgc3RhdGljIGZpbmFsIGludCAlcz0weCUwOHg7XG4iOworCiAgICAgc2l6ZV90IE4gPSBzeW1ib2xzLT5nZXRTeW1ib2xzKCkuc2l6ZSgpOwogICAgIGZvciAoaT0wOyBpPE47IGkrKykgewogICAgICAgICBjb25zdCBBYXB0U3ltYm9sRW50cnkmIHN5bSA9IHN5bWJvbHMtPmdldFN5bWJvbHMoKS52YWx1ZUF0KGkpOwpAQCAtMTcxNyw3ICsxNzIyLDcgQEAKICAgICAgICAgaWYgKGRlcHJlY2F0ZWQpIHsKICAgICAgICAgICAgIGZwcmludGYoZnAsICIlc0BEZXByZWNhdGVkXG4iLCBnZXRJbmRlbnRTcGFjZShpbmRlbnQpKTsKICAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGZwLCAiJXNwdWJsaWMgc3RhdGljIGZpbmFsIGludCAlcz0weCUwOHg7XG4iLAorICAgICAgICBmcHJpbnRmKGZwLCBpZF9mb3JtYXQsCiAgICAgICAgICAgICAgICAgZ2V0SW5kZW50U3BhY2UoaW5kZW50KSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KG5hbWUpLnN0cmluZygpLCAoaW50KXN5bS5pbnQzMlZhbCk7CiAgICAgfQpAQCAtMTc2OCw3ICsxNzczLDcgQEAKICAgICAgICAgaWYgKG5jbGFzc05hbWUgPT0gInN0eWxlYWJsZSIpIHsKICAgICAgICAgICAgIHN0eWxlYWJsZVN5bWJvbHMgPSBuc3ltYm9sczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IHdyaXRlU3ltYm9sQ2xhc3MoZnAsIGFzc2V0cywgaW5jbHVkZVByaXZhdGUsIG5zeW1ib2xzLCBuY2xhc3NOYW1lLCBpbmRlbnQpOworICAgICAgICAgICAgZXJyID0gd3JpdGVTeW1ib2xDbGFzcyhmcCwgYXNzZXRzLCBpbmNsdWRlUHJpdmF0ZSwgbnN5bWJvbHMsIG5jbGFzc05hbWUsIGluZGVudCwgbm9uQ29uc3RhbnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE4MzksNyArMTg0NCw3IEBACiAgICAgICAgICJcbiIKICAgICAgICAgInBhY2thZ2UgJXM7XG5cbiIsIHBhY2thZ2Uuc3RyaW5nKCkpOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IHdyaXRlU3ltYm9sQ2xhc3MoZnAsIGFzc2V0cywgaW5jbHVkZVByaXZhdGUsIHN5bWJvbHMsIGNsYXNzTmFtZSwgMCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHdyaXRlU3ltYm9sQ2xhc3MoZnAsIGFzc2V0cywgaW5jbHVkZVByaXZhdGUsIHN5bWJvbHMsIGNsYXNzTmFtZSwgMCwgYnVuZGxlLT5nZXROb25Db25zdGFudElkKCkpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAppbmRleCAyOTY0NGE2Li44MThjM2M2IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKQEAgLTEzMjIsNiArMTMyMiwyMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAxNihibG9jay5nZXRFbGVtZW50TmFtZSgmbGVuKSwgc3RyaW5nX2FycmF5MTYuc3RyaW5nKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXNlIHN0cmluZ3MgbmVlZCB2YWxpZCBmb3JtYXRzLgorICAgICAgICAgICAgICAgIC8vIChzaW1wbGlmaWVkIGZvcm0gb2Ygd2hhdCBzdHJpbmcxNiBkb2VzIGFib3ZlKQorICAgICAgICAgICAgICAgIHNpemVfdCBuID0gYmxvY2suZ2V0QXR0cmlidXRlQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYXR0ciA9IGJsb2NrLmdldEF0dHJpYnV0ZU5hbWUoaSwgJmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAxNihhdHRyLCB0cmFuc2xhdGFibGUxNi5zdHJpbmcoKSkgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcDE2KGF0dHIsIGZvcm1hdHRlZDE2LnN0cmluZygpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogdmFsdWUgPSBibG9jay5nZXRBdHRyaWJ1dGVTdHJpbmdWYWx1ZShpLCAmbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAxNih2YWx1ZSwgZmFsc2UxNi5zdHJpbmcoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cklzRm9ybWF0dGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjdXJUYWcgPSAmc3RyaW5nX2FycmF5MTY7CiAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGFycmF5MTY7CiAgICAgICAgICAgICAgICAgY3VyRm9ybWF0ID0gUmVzVGFibGVfbWFwOjpUWVBFX1JFRkVSRU5DRXxSZXNUYWJsZV9tYXA6OlRZUEVfU1RSSU5HOwpAQCAtMTcyNCwxMyArMTc0MCw2IEBACiAgICAgCiAgICAgLy8gSWYgYSBwYXJlbnQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIHNldCBpdC4KICAgICBpZiAoYmFnUGFyZW50LnNpemUoKSA+IDApIHsKLSAgICAgICAgU3RyaW5nMTYgY3VyUGFyID0gZS0+Z2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJQYXIuc2l6ZSgpID4gMCAmJiBjdXJQYXIgIT0gYmFnUGFyZW50KSB7Ci0gICAgICAgICAgICBzb3VyY2VQb3MuZXJyb3IoIkNvbmZsaWN0aW5nIHBhcmVudHMgc3BlY2lmaWVkLCB3YXMgJyVzJywgbm93ICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChlLT5nZXRQYXJlbnQoKSkuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChiYWdQYXJlbnQpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9CiAgICAgICAgIGUtPnNldFBhcmVudChiYWdQYXJlbnQpOwogICAgIH0KIApAQCAtMTc3OCwxMyArMTc4Nyw2IEBACiAKICAgICAvLyBJZiBhIHBhcmVudCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCwgc2V0IGl0LgogICAgIGlmIChiYWdQYXJlbnQuc2l6ZSgpID4gMCkgewotICAgICAgICBTdHJpbmcxNiBjdXJQYXIgPSBlLT5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKGN1clBhci5zaXplKCkgPiAwICYmIGN1clBhciAhPSBiYWdQYXJlbnQpIHsKLSAgICAgICAgICAgIHNvdXJjZVBvcy5lcnJvcigiQ29uZmxpY3RpbmcgcGFyZW50cyBzcGVjaWZpZWQsIHdhcyAnJXMnLCBub3cgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChlLT5nZXRQYXJlbnQoKSkuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYmFnUGFyZW50KS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgICAgICBlLT5zZXRQYXJlbnQoYmFnUGFyZW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCmluZGV4IDg1NTFiMGYuLmMwZDc0MjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcApAQCAtNDUxLDEzICs0NTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI9PzB4JXgiLCAoaW50KXZhbHVlLmRhdGEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZGF0YVR5cGUgPT0gUmVzX3ZhbHVlOjpUWVBFX1NUUklORykgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIj1cIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChibG9jay0+Z2V0QXR0cmlidXRlU3RyaW5nVmFsdWUoaSwgJmxlbikpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNUYWJsZTo6bm9ybWFsaXplRm9yT3V0cHV0KFN0cmluZzgoYmxvY2stPmdldEF0dHJpYnV0ZVN0cmluZ1ZhbHVlKGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI9KHR5cGUgMHgleCkweCV4IiwgKGludCl2YWx1ZS5kYXRhVHlwZSwgKGludCl2YWx1ZS5kYXRhKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhcjE2X3QqIHZhbCA9IGJsb2NrLT5nZXRBdHRyaWJ1dGVTdHJpbmdWYWx1ZShpLCAmbGVuKTsKICAgICAgICAgICAgICAgICBpZiAodmFsICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgKFJhdzogXCIlc1wiKSIsIFN0cmluZzgodmFsKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIChSYXc6IFwiJXNcIikiLCBSZXNUYWJsZTo6bm9ybWFsaXplRm9yT3V0cHV0KFN0cmluZzgodmFsKS5zdHJpbmcoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBIZWxwZXIuamF2YSBiL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcEhlbHBlci5qYXZhCmluZGV4IDUxODU0M2EuLmYyNGUzZmIgMTAwNjQ0Ci0tLSBhL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcEhlbHBlci5qYXZhCisrKyBiL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcEhlbHBlci5qYXZhCkBAIC0yNyw2ICsyNyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKIGltcG9ydCBqYXZheC5zaXAuQ2xpZW50VHJhbnNhY3Rpb247CiBpbXBvcnQgamF2YXguc2lwLkRpYWxvZzsKIGltcG9ydCBqYXZheC5zaXAuRGlhbG9nVGVybWluYXRlZEV2ZW50OwpAQCAtMjE1LDkgKzIxNywxMSBAQAogICAgICAgICAgICAgU3RyaW5nIHRhZykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBTaXBFeGNlcHRpb24gewogICAgICAgICBGcm9tSGVhZGVyIGZyb21IZWFkZXIgPSBjcmVhdGVGcm9tSGVhZGVyKHVzZXJQcm9maWxlLCB0YWcpOwogICAgICAgICBUb0hlYWRlciB0b0hlYWRlciA9IGNyZWF0ZVRvSGVhZGVyKHVzZXJQcm9maWxlKTsKKworICAgICAgICBTdHJpbmcgcmVwbGFjZVN0ciA9IFBhdHRlcm4ucXVvdGUodXNlclByb2ZpbGUuZ2V0VXNlck5hbWUoKSArICJAIik7CiAgICAgICAgIFNpcFVSSSByZXF1ZXN0VVJJID0gbUFkZHJlc3NGYWN0b3J5LmNyZWF0ZVNpcFVSSSgKLSAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZS5nZXRVcmlTdHJpbmcoKS5yZXBsYWNlRmlyc3QoCi0gICAgICAgICAgICAgICAgdXNlclByb2ZpbGUuZ2V0VXNlck5hbWUoKSArICJAIiwgIiIpKTsKKyAgICAgICAgICAgICAgICB1c2VyUHJvZmlsZS5nZXRVcmlTdHJpbmcoKS5yZXBsYWNlRmlyc3QocmVwbGFjZVN0ciwgIiIpKTsKKwogICAgICAgICBMaXN0PFZpYUhlYWRlcj4gdmlhSGVhZGVycyA9IGNyZWF0ZVZpYUhlYWRlcnMoKTsKICAgICAgICAgQ2FsbElkSGVhZGVyIGNhbGxJZEhlYWRlciA9IGNyZWF0ZUNhbGxJZEhlYWRlcigpOwogICAgICAgICBDU2VxSGVhZGVyIGNTZXFIZWFkZXIgPSBjcmVhdGVDU2VxSGVhZGVyKHJlcXVlc3RUeXBlKTsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAyN2U2YTcyLi5iZjJkMDMzIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCkBAIC0zMjIsNiArMzIyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOworICAgIHByaXZhdGUgUnVubmFibGUgbVJlbGVhc2VXYWtlTG9ja0NhbGxiYWNrOwogCiAgICAgLyoqCiAgICAgICogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGxhc3QgdG9sZCB0aGUgYmF0dGVyeSBzdGF0cyB3ZSBoYWQgc3RhcnRlZC4KQEAgLTI0NDksMTEgKzI0NTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5CTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gZ2V0UG93ZXJNb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UG93ZXJNb2RlQ29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCiAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7Cg==