ZGlmZiAtLWdpdCBhL2Fzc2V0cy9xcmRfaG9tZXBhZ2UvZW4vZGVmYXVsdF9wYWdlLmh0bWwgYi9hc3NldHMvcXJkX2hvbWVwYWdlL2VuL2RlZmF1bHRfcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzVkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NldHMvcXJkX2hvbWVwYWdlL2VuL2RlZmF1bHRfcGFnZS5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iIC8+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUdCMjMxMiI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIC5pdGVte3dpZHRoOjE3MHB4OyBoZWlnaHQ6NzBweDsgZm9udC1zaXplOjIycHh9CisgICAgICAgIC5pbWd7d2lkdGg6MThweDsgaGVpZ2h0OjE4cHg7fQorICAgICAgICA8L3N0eWxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keSB0b3BtYXJnaW49OTA+CisgICAgPHA+CisgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIENlbGxQYWRkaW5nPSI1IiB3aWR0aD0iMTAlIiBoZWlnaHQ9IjEwJSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48YnV0dG9uIGNsYXNzPSJpdGVtIiBvbkNsaWNrPSJkZWZhdWx0X2hvbWVwYWdlLmxvYWRCb29rbWFya3MoKSI+PGltZyBjbGFzcz0iaW1nIiBzcmM9Ii4uL2ltYWdlcy9ib29rbWFyay5wbmciPiZuYnNwJm5ic3BCb29rbWFyazwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48YnV0dG9uIGNsYXNzPSJpdGVtIiBvbkNsaWNrPSJkZWZhdWx0X2hvbWVwYWdlLmxvYWRIaXN0b3J5KCkiPjxpbWcgY2xhc3M9ImltZyIgc3JjPSIuLi9pbWFnZXMvaGlzdG9yeS5wbmciPiZuYnNwJm5ic3BIaXN0b3J5Jm5ic3AmbmJzcCZuYnNwJm5ic3A8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPC9wPgorICAgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NldHMvcXJkX2hvbWVwYWdlL2ltYWdlcy9ib29rbWFyay5wbmcgYi9hc3NldHMvcXJkX2hvbWVwYWdlL2ltYWdlcy9ib29rbWFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkYWI0NwotLS0gL2Rldi9udWxsCisrKyBiL2Fzc2V0cy9xcmRfaG9tZXBhZ2UvaW1hZ2VzL2Jvb2ttYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NldHMvcXJkX2hvbWVwYWdlL2ltYWdlcy9oaXN0b3J5LnBuZyBiL2Fzc2V0cy9xcmRfaG9tZXBhZ2UvaW1hZ2VzL2hpc3RvcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWFjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NldHMvcXJkX2hvbWVwYWdlL2ltYWdlcy9oaXN0b3J5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NldHMvcXJkX2hvbWVwYWdlL3poX2NuL2RlZmF1bHRfcGFnZS5odG1sIGIvYXNzZXRzL3FyZF9ob21lcGFnZS96aF9jbi9kZWZhdWx0X3BhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODMwNmUwCi0tLSAvZGV2L251bGwKKysrIGIvYXNzZXRzL3FyZF9ob21lcGFnZS96aF9jbi9kZWZhdWx0X3BhZ2UuaHRtbApAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIiAvPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1HQjIzMTIiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAuaXRlbXt3aWR0aDoxNzBweDsgaGVpZ2h0OjcwcHg7IGZvbnQtc2l6ZToyMnB4fQorICAgICAgICAuaW1ne3dpZHRoOjE4cHg7IGhlaWdodDoxOHB4O30KKyAgICAgICAgPC9zdHlsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHkgdG9wbWFyZ2luPTkwPgorICAgIDxwPgorICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBDZWxsUGFkZGluZz0iNSIgd2lkdGg9IjEwJSIgaGVpZ2h0PSIxMCUiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGJ1dHRvbiBjbGFzcz0iaXRlbSIgb25DbGljaz0iZGVmYXVsdF9ob21lcGFnZS5sb2FkQm9va21hcmtzKCkiPjxpbWcgY2xhc3M9ImltZyIgc3JjPSIuLi9pbWFnZXMvYm9va21hcmsucG5nIj4mbmJzcCZuYnNwyukmbmJzcCZuYnNwJm5ic3AmbmJzcCZuYnNwJm5ic3DHqTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48YnV0dG9uIGNsYXNzPSJpdGVtIiBvbkNsaWNrPSJkZWZhdWx0X2hvbWVwYWdlLmxvYWRIaXN0b3J5KCkiPjxpbWcgY2xhc3M9ImltZyIgc3JjPSIuLi9pbWFnZXMvaGlzdG9yeS5wbmciPiZuYnNwJm5ic3DA+sq3vMfCvDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb2d1YXJkLmZsYWdzIGIvcHJvZ3VhcmQuZmxhZ3MKaW5kZXggODg4YzIzOC4uM2E2ZGFlZiAxMDA2NDQKLS0tIGEvcHJvZ3VhcmQuZmxhZ3MKKysrIGIvcHJvZ3VhcmQuZmxhZ3MKQEAgLTEsMiArMSw2IEBACiAjIE1vc3Qgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBmcmFnbWVudHMgb25seSByZWZlcmVuY2VkIGZyb20gWE1MCiAta2VlcCBjbGFzcyBjb20uYW5kcm9pZC5icm93c2VyLnByZWZlcmVuY2VzLioKKy1rZWVwIGNsYXNzIGNvbS5hbmRyb2lkLmJyb3dzZXIuQnJvd3NlckFjdGl2aXR5eworICAgIHB1YmxpYyB2b2lkIGxvYWRCb29rbWFya3MoKTsKKyAgICBwdWJsaWMgdm9pZCBsb2FkSGlzdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvQnJvd3NlckFjdGl2aXR5LmphdmEgYi9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9Ccm93c2VyQWN0aXZpdHkuamF2YQppbmRleCA0MTY2YjExLi4zZWNkY2I0IDEwMDY0NAotLS0gYS9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9Ccm93c2VyQWN0aXZpdHkuamF2YQorKysgYi9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9Ccm93c2VyQWN0aXZpdHkuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwpAQCAtMzMsOCArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5KYXZhc2NyaXB0SW50ZXJmYWNlOwogCitpbXBvcnQgY29tLmFuZHJvaWQuYnJvd3Nlci5VSS5Db21ib1ZpZXdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJyb3dzZXIuc3R1Yi5OdWxsQ29udHJvbGxlcjsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCiBwdWJsaWMgY2xhc3MgQnJvd3NlckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewpAQCAtNTAsNiArNTQsNyBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gTE9HVl9FTkFCTEVEID0gQnJvd3Nlci5MT0dWX0VOQUJMRUQ7CiAKICAgICBwcml2YXRlIEFjdGl2aXR5Q29udHJvbGxlciBtQ29udHJvbGxlciA9IE51bGxDb250cm9sbGVyLklOU1RBTkNFOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CkBAIC0zMDQsNCArMzA5LDI5IEBACiAgICAgICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hHZW5lcmljTW90aW9uRXZlbnQoZXYpOwogICAgIH0KIAorICAgIC8vIGFkZCBmb3IgY2FycmllciBob21lcGFnZSBmZWF0dXJlCisgICAgQEphdmFzY3JpcHRJbnRlcmZhY2UKKyAgICBwdWJsaWMgdm9pZCBsb2FkQm9va21hcmtzKCkgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlciBpbnN0YW5jZW9mIENvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKChDb250cm9sbGVyKW1Db250cm9sbGVyKS5ib29rbWFya3NPckhpc3RvcnlQaWNrZXIoQ29tYm9WaWV3cy5Cb29rbWFya3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gYWRkIGZvciBjYXJyaWVyIGhvbWVwYWdlIGZlYXR1cmUKKyAgICBASmF2YXNjcmlwdEludGVyZmFjZQorICAgIHB1YmxpYyB2b2lkIGxvYWRIaXN0b3J5KCkgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlciBpbnN0YW5jZW9mIENvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKChDb250cm9sbGVyKW1Db250cm9sbGVyKS5ib29rbWFya3NPckhpc3RvcnlQaWNrZXIoQ29tYm9WaWV3cy5IaXN0b3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL0Jyb3dzZXJTZXR0aW5ncy5qYXZhIGIvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvQnJvd3NlclNldHRpbmdzLmphdmEKaW5kZXggOTVhZmE3MS4uYzM5MGFiNiAxMDA2NDQKLS0tIGEvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvQnJvd3NlclNldHRpbmdzLmphdmEKKysrIGIvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvQnJvd3NlclNldHRpbmdzLmphdmEKQEAgLTIyLDE0ICsyMiwxNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5PblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29va2llTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZTsKQEAgLTQ5LDkgKzUyLDExIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYnJvd3Nlci5zZWFyY2guU2VhcmNoRW5naW5lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJyb3dzZXIuc2VhcmNoLlNlYXJjaEVuZ2luZXM7CiAKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiAKIC8qKgpAQCAtMTI5LDYgKzEzNCw5IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0ZhY3RvcnlSZXNldFVybDsKIAorICAgIC8vIGFkZCBmb3IgY2FycmllciBmZWF0dXJlCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBzUmVzUGFja2FnZUN0eDsKKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQnJvd3NlclNldHRpbmdzKGNvbnRleHQpOwogICAgIH0KQEAgLTE0NCw2ICsxNTIsMTYgQEAKICAgICAgICAgbU1hbmFnZWRTZXR0aW5ncyA9IG5ldyBMaW5rZWRMaXN0PFdlYWtSZWZlcmVuY2U8V2ViU2V0dGluZ3M+PigpOwogICAgICAgICBtQ3VzdG9tVXNlckFnZW50cyA9IG5ldyBXZWFrSGFzaE1hcDxXZWJTZXR0aW5ncywgU3RyaW5nPigpOwogICAgICAgICBtQXV0b2ZpbGxIYW5kbGVyLmFzeW5jTG9hZEZyb21EYigpOworCisgICAgICAgIC8vIGFkZCBmb3IgY2FycmllciBmZWF0dXJlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzUmVzUGFja2FnZUN0eCA9IGNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJyb3dzZXIucmVzIiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkNPTlRFWFRfSUdOT1JFX1NFQ1VSSVRZKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJSZXNfVXBkYXRlIiwgIkNyZWF0ZSBSZXMgQXBrIEZhaWxlZCIpOworICAgICAgICB9CisKICAgICAgICAgQmFja2dyb3VuZEhhbmRsZXIuZXhlY3V0ZShtU2V0dXApOwogICAgIH0KIApAQCAtMjI1LDcgKzI0Myw2MCBAQAogICAgICAgICAgICAgICAgIG1QcmVmcy5lZGl0KCkucmVtb3ZlKFBSRUZfVEVYVF9TSVpFKS5hcHBseSgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzRmFjdG9yeVJlc2V0VXJsID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmhvbWVwYWdlX2Jhc2UpOworCisgICAgICAgICAgICAvLyBhZGQgZm9yIGNhcnJpZXIgaG9tZXBhZ2UgZmVhdHVyZQorICAgICAgICAgICAgU3RyaW5nIGJyb3dzZXJSZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5lbnYuYy5icm93c2VyLnJlc291cmNlIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGlmICgiY3UiLmVxdWFscyhicm93c2VyUmVzKSkgeworICAgICAgICAgICAgICAgIGludCByZXNJRCA9IHNSZXNQYWNrYWdlQ3R4LmdldFJlc291cmNlcygpLmdldElkZW50aWZpZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2VfYmFzZSIsICJzdHJpbmciLCAiY29tLmFuZHJvaWQuYnJvd3Nlci5yZXMiKTsKKyAgICAgICAgICAgICAgICBzRmFjdG9yeVJlc2V0VXJsID0gc1Jlc1BhY2thZ2VDdHguZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHJlc0lEKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImN0Ii5lcXVhbHMoYnJvd3NlclJlcykpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzSUQgPSBzUmVzUGFja2FnZUN0eC5nZXRSZXNvdXJjZXMoKS5nZXRJZGVudGlmaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlX2Jhc2UiLCAic3RyaW5nIiwgImNvbS5hbmRyb2lkLmJyb3dzZXIucmVzIik7CisgICAgICAgICAgICAgICAgc0ZhY3RvcnlSZXNldFVybCA9IHNSZXNQYWNrYWdlQ3R4LmdldFJlc291cmNlcygpLmdldFN0cmluZyhyZXNJRCk7CisKKyAgICAgICAgICAgICAgICBpbnQgcGF0aElEID0gc1Jlc1BhY2thZ2VDdHguZ2V0UmVzb3VyY2VzKCkuZ2V0SWRlbnRpZmllcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJob21lcGFnZV9wYXRoIiwgInN0cmluZyIsICJjb20uYW5kcm9pZC5icm93c2VyLnJlcyIpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc1Jlc1BhY2thZ2VDdHguZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHBhdGhJRCk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgiJXkiLCBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCIleiIsICdfJytsb2NhbGUuZ2V0Q291bnRyeSgpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQ291bnRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VMYW5ndWFnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IG1Db250ZXh0LmdldEFzc2V0cygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gYW0ub3BlbihwYXRoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICB1c2VDb3VudHJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBzUmVzUGFja2FnZUN0eC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcocGF0aElEKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgiJXkiLCBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgiJXoiLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGFtLm9wZW4ocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUxhbmd1YWdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXVzZUNvdW50cnkgJiYgIXVzZUxhbmd1YWdlKSB7CisgICAgICAgICAgICAgICAgICAgIHNGYWN0b3J5UmVzZXRVcmwgPSBzRmFjdG9yeVJlc2V0VXJsLnJlcGxhY2UoIiV5JXoiLCAiZW4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzRmFjdG9yeVJlc2V0VXJsID0gc0ZhY3RvcnlSZXNldFVybC5yZXBsYWNlKCIleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIHNGYWN0b3J5UmVzZXRVcmwgPSBzRmFjdG9yeVJlc2V0VXJsLnJlcGxhY2UoIiV6IiwgdXNlQ291bnRyeSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ18nICsgbG9jYWxlLmdldENvdW50cnkoKS50b0xvd2VyQ2FzZSgpIDogIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc0ZhY3RvcnlSZXNldFVybCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5ob21lcGFnZV9iYXNlKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNGYWN0b3J5UmVzZXRVcmwuaW5kZXhPZigie0NJRH0iKSAhPSAtMSkgewogICAgICAgICAgICAgICAgIHNGYWN0b3J5UmVzZXRVcmwgPSBzRmFjdG9yeVJlc2V0VXJsLnJlcGxhY2UoIntDSUR9IiwKICAgICAgICAgICAgICAgICAgICAgQnJvd3NlclByb3ZpZGVyLmdldENsaWVudElkKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpKSk7CmRpZmYgLS1naXQgYS9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9Ccm93c2VyV2ViVmlld0ZhY3RvcnkuamF2YSBiL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL0Jyb3dzZXJXZWJWaWV3RmFjdG9yeS5qYXZhCmluZGV4IDY2ZDllNzguLjQ0MWFjNmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL0Jyb3dzZXJXZWJWaWV3RmFjdG9yeS5qYXZhCisrKyBiL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL0Jyb3dzZXJXZWJWaWV3RmFjdG9yeS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKQEAgLTYxLDYgKzYyLDE1IEBACiAgICAgICAgICAgICAgICAgfHwgcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0ZBS0VUT1VDSF9NVUxUSVRPVUNIX0RJU1RJTkNUKTsKICAgICAgICAgdy5nZXRTZXR0aW5ncygpLnNldERpc3BsYXlab29tQ29udHJvbHMoIXN1cHBvcnRzTXVsdGlUb3VjaCk7CiAKKyAgICAgICAgLy8gYWRkIGZvciBjYXJyaWVyIGhvbWVwYWdlIGZlYXR1cmUKKyAgICAgICAgU3RyaW5nIGJyb3dzZXJSZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5lbnYuYy5icm93c2VyLnJlc291cmNlIiwgImRlZmF1bHQiKTsKKyAgICAgICAgaWYgKCJjdCIuZXF1YWxzKGJyb3dzZXJSZXMpKSB7CisgICAgICAgICAgICB3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICBpZiAobUNvbnRleHQgaW5zdGFuY2VvZiBCcm93c2VyQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICB3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2UobUNvbnRleHQsICJkZWZhdWx0X2hvbWVwYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBBZGQgdGhpcyBXZWJWaWV3IHRvIHRoZSBzZXR0aW5ncyBvYnNlcnZlciBsaXN0IGFuZCB1cGRhdGUgdGhlCiAgICAgICAgIC8vIHNldHRpbmdzCiAgICAgICAgIGZpbmFsIEJyb3dzZXJTZXR0aW5ncyBzID0gQnJvd3NlclNldHRpbmdzLmdldEluc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9UYWJDb250cm9sLmphdmEgYi9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9UYWJDb250cm9sLmphdmEKaW5kZXggMTUwZWNlMC4uMTBkZThhMSAxMDA2NDQKLS0tIGEvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvVGFiQ29udHJvbC5qYXZhCisrKyBiL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL1RhYkNvbnRyb2wuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5icm93c2VyOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKIApAQCAtNDA4LDYgKzQwOSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAvLyBzTmV4dElkIHRvIGJlIHNldCBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGFkZCBmb3IgY2FycmllciBob21lcGFnZSBmZWF0dXJlCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdlYnZpZXcgcmVzdG9yZSBzdWNjZXNzZnVsbHksIGFkZCBqYXZhc2NyaXB0IGludGVyZmFjZSBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBXZWJWaWV3IHZpZXcgPSB0LmdldFdlYlZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBicm93c2VyUmVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3QuZW52LmMuYnJvd3Nlci5yZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJjdCIuZXF1YWxzKGJyb3dzZXJSZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXIuZ2V0QWN0aXZpdHkoKSBpbnN0YW5jZW9mIEJyb3dzZXJBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtQ29udHJvbGxlci5nZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfaG9tZXBhZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHRhYk1hcC5wdXQoaWQsIHQpOwogICAgICAgICAgICAgICAgIC8vIE1lIG11c3Qgc2V0IHRoZSBjdXJyZW50IHRhYiBiZWZvcmUgcmVzdG9yaW5nIHRoZSBzdGF0ZQogICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgYWxsIHRoZSBjbGllbnQgY2xhc3NlcyBhcmUgc2V0LgpkaWZmIC0tZ2l0IGEvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvcHJvdmlkZXIvQnJvd3NlclByb3ZpZGVyMi5qYXZhIGIvc3JjL2NvbS9hbmRyb2lkL2Jyb3dzZXIvcHJvdmlkZXIvQnJvd3NlclByb3ZpZGVyMi5qYXZhCmluZGV4IDAxNGEzMmQuLjk1NzdhZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb20vYW5kcm9pZC9icm93c2VyL3Byb3ZpZGVyL0Jyb3dzZXJQcm92aWRlcjIuamF2YQorKysgYi9zcmMvY29tL2FuZHJvaWQvYnJvd3Nlci9wcm92aWRlci9Ccm93c2VyUHJvdmlkZXIyLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5QnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3Nlci5Cb29rbWFya0NvbHVtbnM7CkBAIC01Miw2ICs1Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuYnJvd3Nlci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJyb3dzZXIuVXJsVXRpbHM7CkBAIC02OCw2ICs3MCw4IEBACiAKIHB1YmxpYyBjbGFzcyBCcm93c2VyUHJvdmlkZXIyIGV4dGVuZHMgU1FMaXRlQ29udGVudFByb3ZpZGVyIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvd3NlclByb3ZpZGVyMiI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9HUk9VUF9CWSA9ICJncm91cEJ5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BTExPV19FTVBUWV9BQ0NPVU5UUyA9ICJhbGxvd0VtcHR5QWNjb3VudHMiOwogCkBAIC02NTEsNiArNjU1LDExIEBACiAgICAgICAgICAgICBkYi5pbnNlcnRPclRocm93KFRBQkxFX0JPT0tNQVJLUywgbnVsbCwgdmFsdWVzKTsKIAogICAgICAgICAgICAgYWRkRGVmYXVsdEJvb2ttYXJrcyhkYiwgRklYRURfSURfUk9PVCk7CisgICAgICAgICAgICAvLyBhZGQgZm9yIGNhcnJpZXIgYm9va21hcmsgZmVhdHVyZQorICAgICAgICAgICAgU3RyaW5nIGJyb3dzZXJSZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5lbnYuYy5icm93c2VyLnJlc291cmNlIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGlmICgiY3QiLmVxdWFscyhicm93c2VyUmVzKSkgeworICAgICAgICAgICAgICAgIGFkZERlZmF1bHRDYXJyaWVyQm9va21hcmtzKGRiLCBGSVhFRF9JRF9ST09UKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0Qm9va21hcmtzKFNRTGl0ZURhdGFiYXNlIGRiLCBsb25nIHBhcmVudElkKSB7CkBAIC03MTAsNiArNzE5LDkxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBhZGQgZm9yIGNhcnJpZXIgYm9va21hcmsgZmVhdHVyZQorICAgICAgICBwcml2YXRlIHZvaWQgYWRkRGVmYXVsdENhcnJpZXJCb29rbWFya3MoU1FMaXRlRGF0YWJhc2UgZGIsIGxvbmcgcGFyZW50SWQpIHsKKyAgICAgICAgICAgIENvbnRleHQgbVJlc1BhY2thZ2VDdHggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtUmVzUGFja2FnZUN0eCA9IGdldENvbnRleHQoKS5jcmVhdGVQYWNrYWdlQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJyb3dzZXIucmVzIiwKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05URVhUX0lHTk9SRV9TRUNVUklUWSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNyZWF0ZSBSZXMgQXBrIEZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZXNQYWNrYWdlQ3R4ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBib29rbWFya3MgPSBudWxsOworICAgICAgICAgICAgVHlwZWRBcnJheSBwcmVsb2FkcyA9IG51bGw7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gbVJlc1BhY2thZ2VDdHguZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpbnQgcmVzQm9va21hcmtzSUQgPSByZXMuZ2V0SWRlbnRpZmllcigiYm9va21hcmtzIiwgImFycmF5IiwgImNvbS5hbmRyb2lkLmJyb3dzZXIucmVzIik7CisgICAgICAgICAgICBpbnQgcmVzUHJlbG9hZHNJRCA9IHJlcy5nZXRJZGVudGlmaWVyKCJib29rbWFya19wcmVsb2FkcyIsICJhcnJheSIsCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5icm93c2VyLnJlcyIpOworICAgICAgICAgICAgaWYgKHJlc0Jvb2ttYXJrc0lEICE9IDAgJiYgcmVzUHJlbG9hZHNJRCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYm9va21hcmtzID0gcmVzLmdldFRleHRBcnJheShyZXNCb29rbWFya3NJRCk7CisgICAgICAgICAgICAgICAgcHJlbG9hZHMgPSByZXMub2J0YWluVHlwZWRBcnJheShyZXNQcmVsb2Fkc0lEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgRGVmYXVsdCBDYXJyaWVyIGJvb2ttYXJrcyBzaXplCisgICAgICAgICAgICBpbnQgc2l6ZSA9IGJvb2ttYXJrcy5sZW5ndGg7CisKKyAgICAgICAgICAgIC8vIGdvb2dsZVNpemUgdGhlIERlZmF1bHQgR29vZ2xlIGJvb2ttYXJrcyBzaXplLgorICAgICAgICAgICAgLy8gVGhlIERlZmF1bHQgQ2FycmllciBCb29rbWFya3Mgb3JpZ2luYWwgcG9zaXRpb24gbmVlZCBtb3ZlIHRvIGdvb2dsZVNpemUgaW5kZXguCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBnb29nbGVCb29rbWFya3MgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dEFycmF5KAorICAgICAgICAgICAgICAgICAgICBSLmFycmF5LmJvb2ttYXJrcyk7CisgICAgICAgICAgICBpbnQgZ29vZ2xlU2l6ZSA9IGdvb2dsZUJvb2ttYXJrcy5sZW5ndGg7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSBMb25nLnRvU3RyaW5nKHBhcmVudElkKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbm93ID0gTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpID0gaSArIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGJvb2ttYXJrRGVzdGluYXRpb24gPSByZXBsYWNlU3lzdGVtUHJvcGVydHlJblN0cmluZyhnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzW2kgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoIklOU0VSVCBJTlRPIGJvb2ttYXJrcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtzLlRJVExFICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtzLlVSTCArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrcy5JU19GT0xERVIgKyAiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrcy5QQVJFTlQgKyAiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrcy5QT1NJVElPTiArICIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtzLkRBVEVfQ1JFQVRFRCArCisgICAgICAgICAgICAgICAgICAgICAgICAiKSBWQUxVRVMgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIGJvb2ttYXJrc1tpXSArICInLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBib29rbWFya0Rlc3RpbmF0aW9uICsgIicsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCArICIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhnb29nbGVTaXplICsgaSkgKyAiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGZhdmljb25JZCA9IHByZWxvYWRzLmdldFJlc291cmNlSWQoaSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCB0aHVtYklkID0gcHJlbG9hZHMuZ2V0UmVzb3VyY2VJZChpICsgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB0aHVtYiA9IG51bGwsIGZhdmljb24gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWIgPSByZWFkUmF3KHJlcywgdGh1bWJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmF2aWNvbiA9IHJlYWRSYXcocmVzLCBmYXZpY29uSWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRodW1iICE9IG51bGwgfHwgZmF2aWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGltYWdlVmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmFsdWVzLnB1dChJbWFnZXMuVVJMLCBib29rbWFya0Rlc3RpbmF0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhdmljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmFsdWVzLnB1dChJbWFnZXMuRkFWSUNPTiwgZmF2aWNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVmFsdWVzLnB1dChJbWFnZXMuVEhVTUJOQUlMLCB0aHVtYik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkYi5pbnNlcnQoVEFCTEVfSU1BR0VTLCBJbWFnZXMuRkFWSUNPTiwgaW1hZ2VWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcHJlbG9hZHMucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSBieXRlW10gcmVhZFJhdyhSZXNvdXJjZXMgcmVzLCBpbnQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoaWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwo=