ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGJjNmNkYTMuLmNmZjg2M2IgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMzQzLDYgKzM0Myw3IEBACiAgICAgICAgICAgICAiaGFyZHdhcmUvaW50ZXJmYWNlcy9iaW9tZXRyaWNzL2ZpbmdlcnByaW50L2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMvZ3JhcGhpY3MvY29tbW9uL2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMva2V5bWFzdGVyL2FpZGwiLAorICAgICAgICAgICAgInN5c3RlbS9oYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2FpZGwiLAogICAgICAgICBdLAogICAgIH0sCiAgICAgZHhmbGFnczogWwpAQCAtNjMyLDYgKzYzMyw3IEBACiAgICAgICAgICAgICAiaGFyZHdhcmUvaW50ZXJmYWNlcy9iaW9tZXRyaWNzL2ZpbmdlcnByaW50L2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMvZ3JhcGhpY3MvY29tbW9uL2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMva2V5bWFzdGVyL2FpZGwiLAorICAgICAgICAgICAgInN5c3RlbS9oYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2FpZGwiLAogICAgICAgICBdLAogICAgIH0sCiAgICAgLy8gVGhlc2UgYXJlIGxpYnMgZnJvbSBmcmFtZXdvcmstaW50ZXJuYWwtdXRpbHMgdGhhdCBhcmUgcmVxdWlyZWQgKGkuZS4gYmVpbmcgcmVmZXJlbmNlZCkKZGlmZiAtLWdpdCBhL0FwaURvY3MuYnAgYi9BcGlEb2NzLmJwCmluZGV4IDkwYjY2MDMuLmE0NmVjY2UgMTAwNjQ0Ci0tLSBhL0FwaURvY3MuYnAKKysrIGIvQXBpRG9jcy5icApAQCAtNDIyLDI3ICs0MjIsMjYgQEAKICAgICAgICAgIiQobG9jYXRpb24gbWVyZ2VfemlwcykgJChvdXQpICQobG9jYXRpb24gOmRzLWRvY3MtamF2YXsuZG9jcy56aXB9KSAkKGdlbkRpcikvZHMtZG9jcy1rdC1tb3ZlZC56aXAiLAogfQogCi0vLyBEaXNhYmxlIGRvYyBnZW5lcmF0aW9uIHVudGlsIERvY2xhdmEgaXMgbWlncmF0ZWQgdG8gSkRLIDE3IChiLzI0MDQyMTU1NSkuCi0vLyBqYXZhX2dlbnJ1bGUgewotLy8gICAgIG5hbWU6ICJkcy1kb2NzLXN3aXRjaGVkIiwKLS8vICAgICB0b29sczogWwotLy8gICAgICAgICAic3dpdGNoZXI0IiwKLS8vICAgICAgICAgInNvb25nX3ppcCIsCi0vLyAgICAgXSwKLS8vICAgICBzcmNzOiBbCi0vLyAgICAgICAgICI6ZHMtZG9jcy1qYXZhey5kb2NzLnppcH0iLAotLy8gICAgICAgICAiOmRzLWRvY3Mta3R7LmRvY3MuemlwfSIsCi0vLyAgICAgXSwKLS8vICAgICBvdXQ6IFsiZHMtZG9jcy1zd2l0Y2hlZC56aXAiXSwKLS8vICAgICBkaXN0OiB7Ci0vLyAgICAgICAgIHRhcmdldHM6IFsiZG9jcyJdLAotLy8gICAgIH0sCi0vLyAgICAgY21kOiAidW56aXAgLXEgJChsb2NhdGlvbiA6ZHMtZG9jcy1qYXZhey5kb2NzLnppcH0pIC1kICQoZ2VuRGlyKSAmJiAiICsKLS8vICAgICAgICAgInVuemlwIC1xICQobG9jYXRpb24gOmRzLWRvY3Mta3R7LmRvY3MuemlwfSkgLWQgJChnZW5EaXIpL2VuL3JlZmVyZW5jZS9rb3RsaW4gJiYgIiArCi0vLyAgICAgICAgICJTV0lUQ0hFUj0kJChjZCAkJChkaXJuYW1lICQobG9jYXRpb24gc3dpdGNoZXI0KSkgJiYgcHdkKS8kJChiYXNlbmFtZSAkKGxvY2F0aW9uIHN3aXRjaGVyNCkpICYmICIgKwotLy8gICAgICAgICAiKGNkICQoZ2VuRGlyKS9lbi9yZWZlcmVuY2UgJiYgJCRTV0lUQ0hFUiAtLXdvcmsgcGxhdGZvcm0pID4gL2Rldi9udWxsICYmICIgKwotLy8gICAgICAgICAiJChsb2NhdGlvbiBzb29uZ196aXApIC1vICQob3V0KSAtQyAkKGdlbkRpcikgLUQgJChnZW5EaXIpIiwKLS8vIH0KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImRzLWRvY3Mtc3dpdGNoZWQiLAorICAgIHRvb2xzOiBbCisgICAgICAgICJzd2l0Y2hlcjQiLAorICAgICAgICAic29vbmdfemlwIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjpkcy1kb2NzLWphdmF7LmRvY3MuemlwfSIsCisgICAgICAgICI6ZHMtZG9jcy1rdHsuZG9jcy56aXB9IiwKKyAgICBdLAorICAgIG91dDogWyJkcy1kb2NzLXN3aXRjaGVkLnppcCJdLAorICAgIGRpc3Q6IHsKKyAgICAgICAgdGFyZ2V0czogWyJkb2NzIl0sCisgICAgfSwKKyAgICBjbWQ6ICJ1bnppcCAtcSAkKGxvY2F0aW9uIDpkcy1kb2NzLWphdmF7LmRvY3MuemlwfSkgLWQgJChnZW5EaXIpICYmICIgKworICAgICAgICAidW56aXAgLXEgJChsb2NhdGlvbiA6ZHMtZG9jcy1rdHsuZG9jcy56aXB9KSAtZCAkKGdlbkRpcikvZW4vcmVmZXJlbmNlL2tvdGxpbiAmJiAiICsKKyAgICAgICAgIlNXSVRDSEVSPSQkKGNkICQkKGRpcm5hbWUgJChsb2NhdGlvbiBzd2l0Y2hlcjQpKSAmJiBwd2QpLyQkKGJhc2VuYW1lICQobG9jYXRpb24gc3dpdGNoZXI0KSkgJiYgIiArCisgICAgICAgICIoY2QgJChnZW5EaXIpL2VuL3JlZmVyZW5jZSAmJiAkJFNXSVRDSEVSIC0td29yayBwbGF0Zm9ybSkgPiAvZGV2L251bGwgJiYgIiArCisgICAgICAgICIkKGxvY2F0aW9uIHNvb25nX3ppcCkgLW8gJChvdXQpIC1DICQoZ2VuRGlyKSAtRCAkKGdlbkRpcikiLAorfQogCiBkcm9pZGRvYyB7CiAgICAgbmFtZTogImRzLXN0YXRpYy1kb2NzIiwKZGlmZiAtLWdpdCBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlSWRsZUNvbnRyb2xsZXIuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlSWRsZUNvbnRyb2xsZXIuamF2YQppbmRleCAxZDkzZWIzLi4wNjUwY2UzIDEwMDY0NAotLS0gYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyLmphdmEKKysrIGIvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VJZGxlQ29udHJvbGxlci5qYXZhCkBAIC0xOTcwLDcgKzE5NzAsNyBAQAogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVTRVRfUFJFX0lETEVfVElNRU9VVF9GQUNUT1I6IHsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJlSWRsZUZhY3RvcigpOwotICAgICAgICAgICAgICAgICAgICBtYXliZURvSW1tZWRpYXRlTWFpbnRlbmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVEb0ltbWVkaWF0ZU1haW50ZW5hbmNlKCJpZGxlIGZhY3RvciIpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVQT1JUX1NUQVRJT05BUllfU1RBVFVTOiB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERldmljZUlkbGVJbnRlcm5hbC5TdGF0aW9uYXJ5TGlzdGVuZXIgbmV3TGlzdGVuZXIgPQpAQCAtMjYyNSw3ICsyNjI1LDcgQEAKIAogICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtb3N0UmVjZW50RGVsaXZlcnlPcHRpb25zID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogCiAgICAgICAgICAgICAgICAgbUlkbGVJbnRlbnQgPSBuZXcgSW50ZW50KFBvd2VyTWFuYWdlci5BQ1RJT05fREVWSUNFX0lETEVfTU9ERV9DSEFOR0VEKTsKQEAgLTM1MTcsMTEgKzM1MTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZG96ZSBhbGFybSB0byBhZnRlciB0aGUgdXBjb21pbmcgQWxhcm1DbG9jayBhbGFybS4KICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLmdldE5leHRXYWtlRnJvbUlkbGVUaW1lKCkgLSBtSW5qZWN0b3IuZ2V0RWxhcHNlZFJlYWx0aW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgYSBzbWFsbCBhbW91bnQgb2YgdGltZSBpbiBjYXNlIHNvbWV0aGluZyAoZWc6IGJhY2tncm91bmQgc2VydmljZSBmcm9tCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VudGx5IGNsb3NlZCBhcHApIG5lZWRzIHRvIGZpbmlzaCBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VULCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlTG9ja2VkKFNUQVRFX0lOQUNUSVZFLCAibm8gYWN0aXZpdHkiKTsKQEAgLTM1MzYsOSArMzUzNiw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGFsYXJtIHRvIGFmdGVyIHRoZSB1cGNvbWluZyBBbGFybUNsb2NrIGFsYXJtLgogICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuZ2V0TmV4dFdha2VGcm9tSWRsZVRpbWUoKSAtIG1JbmplY3Rvci5nZXRFbGFwc2VkUmVhbHRpbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWxheSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWxheSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChkZWxheSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKGRlbGF5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM3NTMsNyArMzc1Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFVzZUlkbGVUaW1lb3V0RmFjdG9yTG9ja2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAobG9uZykgKG1QcmVJZGxlRmFjdG9yICogZGVsYXkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKGRlbGF5LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChkZWxheSk7CiAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGVMb2NrZWQoU1RBVEVfSURMRV9QRU5ESU5HLCByZWFzb24pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFX1BFTkRJTkc6CkBAIC0zNzc5LDcgKzM3NzksNyBAQAogICAgICAgICAgICAgY2FzZSBTVEFURV9TRU5TSU5HOgogICAgICAgICAgICAgICAgIGNhbmNlbFNlbnNpbmdUaW1lb3V0QWxhcm1Mb2NrZWQoKTsKICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZUxvY2tlZChTVEFURV9MT0NBVElORywgcmVhc29uKTsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG1Db25zdGFudHMuTE9DQVRJTkdfVElNRU9VVCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobUNvbnN0YW50cy5MT0NBVElOR19USU1FT1VUKTsKICAgICAgICAgICAgICAgICBMb2NhdGlvbk1hbmFnZXIgbG9jYXRpb25NYW5hZ2VyID0gbUluamVjdG9yLmdldExvY2F0aW9uTWFuYWdlcigpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbk1hbmFnZXIgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbG9jYXRpb25NYW5hZ2VyLmdldFByb3ZpZGVyKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSKSAhPSBudWxsKSB7CkBAIC0zODE5LDcgKzM4MTksNyBAQAogICAgICAgICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gZ28gaW50byBJRExFIHN0YXRlLgogICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFX01BSU5URU5BTkNFOgogICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlTG9ja2VkKFNUQVRFX0lETEUsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtTmV4dElkbGVEZWxheSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtTmV4dElkbGVEZWxheSk7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiTW92ZWQgdG8gU1RBVEVfSURMRS4gTmV4dCBhbGFybSBpbiAiICsgbU5leHRJZGxlRGVsYXkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBtcy4iKTsKICAgICAgICAgICAgICAgICBtTmV4dElkbGVEZWxheSA9IChsb25nKShtTmV4dElkbGVEZWxheSAqIG1Db25zdGFudHMuSURMRV9GQUNUT1IpOwpAQCAtMzg0Miw3ICszODQyLDcgQEAKICAgICAgICAgICAgICAgICBtQWN0aXZlSWRsZU9wQ291bnQgPSAxOwogICAgICAgICAgICAgICAgIG1BY3RpdmVJZGxlV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlTG9ja2VkKFNUQVRFX0lETEVfTUFJTlRFTkFOQ0UsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtTmV4dElkbGVQZW5kaW5nRGVsYXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG1OZXh0SWRsZVBlbmRpbmdEZWxheSk7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiTW92ZWQgZnJvbSBTVEFURV9JRExFIHRvIFNUQVRFX0lETEVfTUFJTlRFTkFOQ0UuICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIk5leHQgYWxhcm0gaW4gIiArIG1OZXh0SWRsZVBlbmRpbmdEZWxheSArICIgbXMuIik7CiAgICAgICAgICAgICAgICAgbU1haW50ZW5hbmNlU3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CkBAIC00MDEzLDE5ICs0MDEzLDE4IEBACiAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlbGF5IC0gbmV3RGVsYXkpIDwgTUlOX1NUQVRFX1NURVBfQUxBUk1fQ0hBTkdFKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChuZXdEZWxheSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobmV3RGVsYXkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIG1heWJlRG9JbW1lZGlhdGVNYWludGVuYW5jZSgpIHsKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVEb0ltbWVkaWF0ZU1haW50ZW5hbmNlKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lETEUpIHsKICAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBtSWRsZVN0YXJ0VGltZTsKLSAgICAgICAgICAgICAgICAvKiBMZXQncyB0cmdnZXIgYSBpbW1lZGlhdGUgbWFpbnRlbmFuY2UsCi0gICAgICAgICAgICAgICAgICogaWYgaXQgaGFzIGJlZW4gaWRsZSBmb3IgYSBsb25nIHRpbWUgKi8KKyAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBtYWludGVuYW5jZSB3aW5kb3cgaWYgaXQgaGFzIGJlZW4gSURMRSBmb3IgbG9uZyBlbm91Z2guCiAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUNvbnN0YW50cy5JRExFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZCgwLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZXBJZGxlU3RhdGVMb2NrZWQocmVhc29uKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQwNDUsNyArNDA0NCw3IEBACiAgICAgdm9pZCBzZXRJZGxlU3RhcnRUaW1lRm9yVGVzdChsb25nIGlkbGVTdGFydFRpbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBtSWRsZVN0YXJ0VGltZSA9IGlkbGVTdGFydFRpbWU7Ci0gICAgICAgICAgICBtYXliZURvSW1tZWRpYXRlTWFpbnRlbmFuY2UoKTsKKyAgICAgICAgICAgIG1heWJlRG9JbW1lZGlhdGVNYWludGVuYW5jZSgidGVzdGluZyIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MjI0LDggKzQyMjMsOSBAQAogICAgIH0KIAogICAgIEBHdWFyZGVkQnkoInRoaXMiKQotICAgIHZvaWQgc2NoZWR1bGVBbGFybUxvY2tlZChsb25nIGRlbGF5LCBib29sZWFuIGlkbGVVbnRpbCkgewotICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJzY2hlZHVsZUFsYXJtTG9ja2VkKCIgKyBkZWxheSArICIsICIgKyBpZGxlVW50aWwgKyAiKSIpOworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHZvaWQgc2NoZWR1bGVBbGFybUxvY2tlZChsb25nIGRlbGF5KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInNjaGVkdWxlQWxhcm1Mb2NrZWQoIiArIGRlbGF5ICsgIiwgIiArIHN0YXRlVG9TdHJpbmcobVN0YXRlKSArICIpIik7CiAKICAgICAgICAgaWYgKG1Vc2VNb3Rpb25TZW5zb3IgJiYgbU1vdGlvblNlbnNvciA9PSBudWxsCiAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IFNUQVRFX1FVSUNLX0RPWkVfREVMQVkKQEAgLTQyNDEsNyArNDI0MSw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbU5leHRBbGFybVRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIGRlbGF5OwotICAgICAgICBpZiAoaWRsZVVudGlsKSB7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSURMRSkgewogICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXRJZGxlVW50aWwoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAogICAgICAgICAgICAgICAgICAgICBtTmV4dEFsYXJtVGltZSwgIkRldmljZUlkbGVDb250cm9sbGVyLmRlZXAiLCBtRGVlcEFsYXJtTGlzdGVuZXIsIG1IYW5kbGVyKTsKICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfTE9DQVRJTkcpIHsKZGlmZiAtLWdpdCBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhIGIvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbGFybS9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMTE1MWJiNy4uMjZjMGVlZiAxMDA2NDQKLS0tIGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbGFybS9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbGFybS9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTMwLDYgKzMwLDkgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLklOVEVSVkFMX0hPVVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlci5SVEM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlci5SVENfV0FLRVVQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuUEVSTUlTU0lPTl9HUkFOVEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuUElEX1VOS05PV047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JQcmVmbGlnaHQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9TWVNURU1fT05MWTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qb3dlckV4ZW1wdGlvbk1hbmFnZXIuUkVBU09OX0FMQVJNX01BTkFHRVJfQUxBUk1fQ0xPQ0s7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUG93ZXJFeGVtcHRpb25NYW5hZ2VyLlJFQVNPTl9ERU5JRUQ7CkBAIC04NywxMSArOTAsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlckludGVybmFsOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Vc2VyUGFja2FnZTsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlTdGF0c0ludGVybmFsOwpAQCAtMTgyLDcgKzE4Myw2IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKQEAgLTI2OSw3ICsyNjksOCBAQAogCiAgICAgLyoqCiAgICAgICogQSBtYXAgZnJvbSB1aWQgdG8gdGhlIGxhc3Qgb3AtbW9kZSB3ZSBoYXZlIHNlZW4gZm9yCi0gICAgICoge0BsaW5rIEFwcE9wc01hbmFnZXIjT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk19CisgICAgICoge0BsaW5rIEFwcE9wc01hbmFnZXIjT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk19LiBVc2VkIGZvciBldmFsdWF0aW5nIHBlcm1pc3Npb24gc3RhdGUgY2hhbmdlCisgICAgICogd2hlbiB0aGUgZGVueWxpc3QgY2hhbmdlcy4KICAgICAgKi8KICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCkBAIC0xOTQ4LDcgKzE5NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfVklTSUJMRV9UT19JTlNUQU5UX0FQUFMpOwogICAgICAgICAgICAgbVRpbWVUaWNrT3B0aW9ucyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCkKICAgICAgICAgICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogICAgICAgICAgICAgbVRpbWVUaWNrVHJpZ2dlciA9IG5ldyBJQWxhcm1MaXN0ZW5lci5TdHViKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjA5NywyMCArMjA5OCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTW9kZSA9PSBuZXdNb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd2VkQnlEZWZhdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZU5hbWUsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVuaWVkQnlEZWZhdWx0ID0gaXNTY2hlZHVsZUV4YWN0QWxhcm1EZW5pZWRCeURlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIFVzZXJIYW5kbGUuZ2V0VXNlcklkKHVpZCkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFkUGVybWlzc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT0gQXBwT3BzTWFuYWdlci5NT0RFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZFBlcm1pc3Npb24gPSAob2xkTW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRQZXJtaXNzaW9uID0gYWxsb3dlZEJ5RGVmYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1Blcm1pc3Npb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNb2RlICE9IEFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gKG5ld01vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZW5pZWRCeURlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvblN0YXRlID0gZ2V0Q29udGV4dCgpLmNoZWNrUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5TQ0hFRFVMRV9FWEFDVF9BTEFSTSwgUElEX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCkgPT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkUGVybWlzc2lvbiA9IChvbGRNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBlcm1pc3Npb25TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChvbGRNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSAobmV3TW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZXJtaXNzaW9uU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobmV3TW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfQUxMT1dFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gYWxsb3dlZEJ5RGVmYXVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dlZEJ5RGVmYXVsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtQ29uc3RhbnRzLkVYQUNUX0FMQVJNX0RFTllfTElTVC5jb250YWlucyhwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRQZXJtaXNzaW9uID0gKG9sZE1vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWxsb3dlZEJ5RGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChvbGRNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSAobmV3TW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhbGxvd2VkQnlEZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKG5ld01vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhZFBlcm1pc3Npb24gJiYgIWhhc1Blcm1pc3Npb24pIHsKQEAgLTI3NTQsNDEgKzI3NjYsMTMgQEAKIAogICAgIGJvb2xlYW4gaGFzVXNlRXhhY3RBbGFybUludGVybmFsKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgewogICAgICAgICByZXR1cm4gaXNVc2VFeGFjdEFsYXJtRW5hYmxlZChwYWNrYWdlTmFtZSwgVXNlckhhbmRsZS5nZXRVc2VySWQodWlkKSkKLSAgICAgICAgICAgICAgICAmJiAoUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlVTRV9FWEFDVF9BTEFSTSwgUGVybWlzc2lvbkNoZWNrZXIuUElEX1VOS05PV04sIHVpZCwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSkgPT0gUGVybWlzc2lvbkNoZWNrZXIuUEVSTUlTU0lPTl9HUkFOVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgU0NIRURVTEVfRVhBQ1RfQUxBUk0gaXMgYWxsb3dlZCBieSBkZWZhdWx0LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgewotICAgICAgICBpZiAoaXNTY2hlZHVsZUV4YWN0QWxhcm1EZW5pZWRCeURlZmF1bHQocGFja2FnZU5hbWUsIFVzZXJIYW5kbGUuZ2V0VXNlcklkKHVpZCkpKSB7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZXNzZW50aWFsbHkgbGlrZSBjaGFuZ2luZyB0aGUgcHJvdGVjdGlvbiBsZXZlbCBvZiB0aGUgcGVybWlzc2lvbiB0bwotICAgICAgICAgICAgLy8gKHByaXZpbGVnZWR8c2lnbmF0dXJlfHJvbGV8YXBwb3ApLCBidXQgaGF2ZSB0byBpbXBsZW1lbnQgdGhpcyBsb2dpYyB0byBtYWludGFpbgotICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eSBmb3Igb2xkZXIgYXBwcy4KLSAgICAgICAgICAgIGlmIChtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1BsYXRmb3JtU2lnbmVkKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1VpZFByaXZpbGVnZWQodWlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgbG9uZyB0b2tlbiA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gd2VsbGJlaW5nSG9sZGVycyA9IChtUm9sZU1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbVJvbGVNYW5hZ2VyLmdldFJvbGVIb2xkZXJzKFJvbGVNYW5hZ2VyLlJPTEVfU1lTVEVNX1dFTExCRUlORykKLSAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdlbGxiZWluZ0hvbGRlcnMuY29udGFpbnMocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFtQ29uc3RhbnRzLkVYQUNUX0FMQVJNX0RFTllfTElTVC5jb250YWlucyhwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgJiYgKGNoZWNrUGVybWlzc2lvbkZvclByZWZsaWdodChnZXRDb250ZXh0KCksIE1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX0VYQUNUX0FMQVJNLAorICAgICAgICAgICAgICAgIFBJRF9VTktOT1dOLCB1aWQsIHBhY2thZ2VOYW1lKSA9PSBQRVJNSVNTSU9OX0dSQU5URUQpOwogICAgIH0KIAogICAgIGJvb2xlYW4gaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWwoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdWlkKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBtU3RhdExvZ2dlci5nZXRUaW1lKCk7CiAKLSAgICAgICAgLy8gTm90IHVzaW5nIGdldFNjaGVkdWxlRXhhY3RBbGFybVN0YXRlIGFzIHRoaXMgY2FuIGF2b2lkIHNvbWUgY2FsbHMgdG8gQXBwT3BzU2VydmljZS4KICAgICAgICAgLy8gTm90IHVzaW5nICNtTGFzdE9wU2NoZWR1bGVFeGFjdEFsYXJtIGFzIGl0IG1heSBjb250YWluIHN0YWxlIHZhbHVlcy4KICAgICAgICAgLy8gTm8gbG9ja2luZyBuZWVkZWQgYXMgYWxsIGludGVybmFsIGNvbnRhaW5lcnMgYmVpbmcgcXVlcmllZCBhcmUgaW1tdXRhYmxlLgogICAgICAgICBmaW5hbCBib29sZWFuIGhhc1Blcm1pc3Npb247CkBAIC0yNzk2LDExICsyNzgwLDE2IEBACiAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXhhY3RBbGFybUNoYW5nZUVuYWJsZWQocGFja2FnZU5hbWUsIFVzZXJIYW5kbGUuZ2V0VXNlcklkKHVpZCkpKSB7CiAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTY2hlZHVsZUV4YWN0QWxhcm1EZW5pZWRCeURlZmF1bHQocGFja2FnZU5hbWUsIFVzZXJIYW5kbGUuZ2V0VXNlcklkKHVpZCkpKSB7CisgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gKGNoZWNrUGVybWlzc2lvbkZvclByZWZsaWdodChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uU0NIRURVTEVfRVhBQ1RfQUxBUk0sIFBJRF9VTktOT1dOLCB1aWQsIHBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgICAgICA9PSBQRVJNSVNTSU9OX0dSQU5URUQpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSBwZXJtaXNzaW9uIGNoZWNrIGZvciBvbGRlciBhcHBzLgogICAgICAgICAgICAgZmluYWwgaW50IG1vZGUgPSBtQXBwT3BzLmNoZWNrT3BOb1Rocm93KEFwcE9wc01hbmFnZXIuT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk0sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUpOwogICAgICAgICAgICAgaWYgKG1vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2VOYW1lLCB1aWQpOworICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSAhbUNvbnN0YW50cy5FWEFDVF9BTEFSTV9ERU5ZX0xJU1QuY29udGFpbnMocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gKG1vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOwogICAgICAgICAgICAgfQpAQCAtNDY4NSwxMCArNDY3NCw2IEBACiAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5uZXcgQ2xvY2tSZWNlaXZlcigpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgY29udGVudE9ic2VydmVyLCBVcmkgdXJpKSB7Ci0gICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmksIGZhbHNlLCBjb250ZW50T2JzZXJ2ZXIpOwotICAgICAgICB9Ci0KICAgICAgICAgdm9pZCByZWdpc3RlckRldmljZUNvbmZpZ0xpc3RlbmVyKERldmljZUNvbmZpZy5PblByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgICAgIERldmljZUNvbmZpZy5hZGRPblByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIoRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9BTEFSTV9NQU5BR0VSLAogICAgICAgICAgICAgICAgICAgICBBcHBTY2hlZHVsaW5nTW9kdWxlVGhyZWFkLmdldEV4ZWN1dG9yKCksIGxpc3RlbmVyKTsKZGlmZiAtLWdpdCBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNjaGVkdWxlclNlcnZpY2UuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNjaGVkdWxlclNlcnZpY2UuamF2YQppbmRleCAzY2M2N2U3Li4wNTZiNmI5IDEwMDY0NAotLS0gYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlLmphdmEKKysrIGIvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2NoZWR1bGVyU2VydmljZS5qYXZhCkBAIC00MjksNiArNDI5LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9wZXJ0aWVzQ2hhbmdlZChEZXZpY2VDb25maWcuUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICBib29sZWFuIGFwaVF1b3RhU2NoZWR1bGVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIGNvbmN1cnJlbmN5VXBkYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBwZXJzaXN0ZW5jZVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gcnVudGltZVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoaW50IGNvbnRyb2xsZXIgPSAwOyBjb250cm9sbGVyIDwgbUNvbnRyb2xsZXJzLnNpemUoKTsgY29udHJvbGxlcisrKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RhdGVDb250cm9sbGVyIHNjID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVyKTsKQEAgLTQ3OCwxOSArNDc5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUzoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX01JTl9HVUFSQU5URUVfTVM6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX1VJX0xJTUlUX01TOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1I6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZVVwZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN0YW50cy51cGRhdGVSdW50aW1lQ29uc3RhbnRzTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVVcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVM6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUEVSU0lTVF9JTl9TUExJVF9GSUxFUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3RhbnRzLnVwZGF0ZVBlcnNpc3RpbmdDb25zdGFudHNMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSm9icy5zZXRVc2VTcGxpdEZpbGVzKG1Db25zdGFudHMuUEVSU0lTVF9JTl9TUExJVF9GSUxFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZXJzaXN0ZW5jZVVwZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN0YW50cy51cGRhdGVQZXJzaXN0aW5nQ29uc3RhbnRzTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Kb2JzLnNldFVzZVNwbGl0RmlsZXMobUNvbnN0YW50cy5QRVJTSVNUX0lOX1NQTElUX0ZJTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2VVcGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoSm9iQ29uY3VycmVuY3lNYW5hZ2VyLkNPTkZJR19LRVlfUFJFRklYX0NPTkNVUlJFTkNZKQpAQCAtNTcyLDIwICs1NzcsMjAgQEAKICAgICAgICAgICAgICAgICAicnVudGltZV9mcmVlX3F1b3RhX21heF9saW1pdF9tcyI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fR1VBUkFOVEVFX01TID0gInJ1bnRpbWVfbWluX2d1YXJhbnRlZV9tcyI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TID0gInJ1bnRpbWVfbWluX2VqX2d1YXJhbnRlZV9tcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TID0KLSAgICAgICAgICAgICAgICAicnVudGltZV9taW5fdXNlcl9pbml0aWF0ZWRfZ3VhcmFudGVlX21zIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TID0KLSAgICAgICAgICAgICAgICAicnVudGltZV91c2VyX2luaXRpYXRlZF9saW1pdF9tcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwotICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0KLSAgICAgICAgICAgICAgICAicnVudGltZV9taW5fdXNlcl9pbml0aWF0ZWRfZGF0YV90cmFuc2Zlcl9ndWFyYW50ZWVfYnVmZmVyX2ZhY3RvciI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPQotICAgICAgICAgICAgICAgICJydW50aW1lX21pbl91c2VyX2luaXRpYXRlZF9kYXRhX3RyYW5zZmVyX2d1YXJhbnRlZV9tcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TID0KLSAgICAgICAgICAgICAgICAicnVudGltZV91c2VyX2luaXRpYXRlZF9kYXRhX3RyYW5zZmVyX2xpbWl0X21zIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMgPSAicnVudGltZV9taW5fdWlfZ3VhcmFudGVlX21zIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX1VJX0xJTUlUX01TID0gInJ1bnRpbWVfdWlfbGltaXRfbXMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IgPQorICAgICAgICAgICAgICAgICJydW50aW1lX21pbl91aV9kYXRhX3RyYW5zZmVyX2d1YXJhbnRlZV9idWZmZXJfZmFjdG9yIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyA9CisgICAgICAgICAgICAgICAgInJ1bnRpbWVfbWluX3VpX2RhdGFfdHJhbnNmZXJfZ3VhcmFudGVlX21zIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPQorICAgICAgICAgICAgICAgICJydW50aW1lX3VpX2RhdGFfdHJhbnNmZXJfbGltaXRfbXMiOwogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEVSU0lTVF9JTl9TUExJVF9GSUxFUyA9ICJwZXJzaXN0X2luX3NwbGl0X2ZpbGVzIjsKIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TID0KKyAgICAgICAgICAgICAgICAibWF4X251bV9wZXJzaXN0ZWRfam9iX3dvcmtfaXRlbXMiOworCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01JTl9SRUFEWV9OT05fQUNUSVZFX0pPQlNfQ09VTlQgPSA1OwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX05PTl9BQ1RJVkVfSk9CX0JBVENIX0RFTEFZX01TID0gMzEgKiBNSU5VVEVfSU5fTUlMTElTOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0hFQVZZX1VTRV9GQUNUT1IgPSAuOWY7CkBAIC02MTAsMTcgKzYxNSwxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX01JTl9HVUFSQU5URUVfTVMgPSAxMCAqIE1JTlVURV9JTl9NSUxMSVM7CiAgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX01JTl9FSl9HVUFSQU5URUVfTVMgPSAzICogTUlOVVRFX0lOX01JTExJUzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TID0KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TID0KICAgICAgICAgICAgICAgICBNYXRoLm1heCgxMCAqIE1JTlVURV9JTl9NSUxMSVMsIERFRkFVTFRfUlVOVElNRV9NSU5fR1VBUkFOVEVFX01TKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUyA9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfVUlfTElNSVRfTVMgPQogICAgICAgICAgICAgICAgIE1hdGgubWF4KDYwICogTUlOVVRFX0lOX01JTExJUywgREVGQVVMVF9SVU5USU1FX0ZSRUVfUVVPVEFfTUFYX0xJTUlUX01TKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdAotICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9IDEuMzVmOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoMTAgKiBNSU5VVEVfSU5fTUlMTElTLCBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUyk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9Ci0gICAgICAgICAgICAgICAgTWF0aC5taW4oTG9uZy5NQVhfVkFMVUUsIERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUyk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0KKyAgICAgICAgICAgICAgICAxLjM1ZjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPQorICAgICAgICAgICAgICAgIE1hdGgubWF4KDEwICogTUlOVVRFX0lOX01JTExJUywgREVGQVVMVF9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPQorICAgICAgICAgICAgICAgIE1hdGgubWluKExvbmcuTUFYX1ZBTFVFLCBERUZBVUxUX1JVTlRJTUVfVUlfTElNSVRfTVMpOwogICAgICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1BFUlNJU1RfSU5fU1BMSVRfRklMRVMgPSB0cnVlOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMgPSAxMDBfMDAwOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNaW5pbXVtICMgb2Ygbm9uLUFDVElWRSBqb2JzIGZvciB3aGljaCB0aGUgSk1TIHdpbGwgYmUgaGFwcHkgcnVubmluZyBzb21lIHdvcmsgZWFybHkuCkBAIC03MzEsMzMgKzczNywzMSBAQAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgd2UgdHJ5IHRvIGd1YXJhbnRlZSBub3JtYWwgdXNlci1pbml0aWF0ZWQgam9icyB3aWxsIHJ1biBmb3IuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMgPQotICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TOworICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMgPSBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUzsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2Ugd2lsbCBsZXQgYSB1c2VyLWluaXRpYXRlZCBqb2IgcnVuIGZvci4gVGhpcyB3aWxsIG9ubHkKICAgICAgICAgICogYXBwbHkgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGxpbWl0cyB0aGF0IGFwcGx5IHRvIHRoZSBzcGVjaWZpYyB1c2VyLWluaXRpYXRlZCBqb2IuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TID0gREVGQVVMVF9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TOworICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX1VJX0xJTUlUX01TID0gREVGQVVMVF9SVU5USU1FX1VJX0xJTUlUX01TOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIGZhY3RvciB0byBhcHBseSB0byBlc3RpbWF0ZWQgdHJhbnNmZXIgZHVyYXRpb25zIGZvciB1c2VyLWluaXRpYXRlZCBkYXRhIHRyYW5zZmVyIGpvYnMKICAgICAgICAgICogc28gdGhhdCB3ZSBnaXZlIHNvbWUgZXh0cmEgdGltZSBmb3IgdW5leHBlY3RlZCBzaXR1YXRpb25zLiBUaGlzIHdpbGwgYmUgYXQgbGVhc3QgMSBhbmQKICAgICAgICAgICogc28gY2FuIGp1c3QgYmUgbXVsdGlwbGllZCB3aXRoIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byBnZXQgdGhlIGZpbmFsIHZhbHVlLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGZsb2F0IFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IgPQotICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUjsKKyAgICAgICAgcHVibGljIGZsb2F0IFJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IgPQorICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUjsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgd2UgdHJ5IHRvIGd1YXJhbnRlZSB1c2VyLWluaXRpYXRlZCBkYXRhIHRyYW5zZmVyIGpvYnMKICAgICAgICAgICogd2lsbCBydW4gZm9yLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGxvbmcgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPQotICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVM7CisgICAgICAgIHB1YmxpYyBsb25nIFJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0KKyAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TOwogCiAgICAgICAgIC8qKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB3ZSB3aWxsIGxldCBhIHVzZXItaW5pdGlhdGVkIGRhdGEgdHJhbnNmZXIgam9iIHJ1biBmb3IuICovCi0gICAgICAgIHB1YmxpYyBsb25nIFJVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9Ci0gICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVM7CisgICAgICAgIHB1YmxpYyBsb25nIFJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9IERFRkFVTFRfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRvIHBlcnNpc3Qgam9icyBpbiBzcGxpdCBmaWxlcyAoYnkgVUlEKS4gSWYgZmFsc2UsIGFsbCBwZXJzaXN0ZWQgam9icyB3aWxsIGJlCkBAIC03NjYsNiArNzcwLDExIEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIFBFUlNJU1RfSU5fU1BMSVRfRklMRVMgPSBERUZBVUxUX1BFUlNJU1RfSU5fU1BMSVRfRklMRVM7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB7QGxpbmsgSm9iV29ya0l0ZW0gSm9iV29ya0l0ZW1zfSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgcGVyIGpvYi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMgPSBERUZBVUxUX01BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBJZiB0cnVlLCB1c2UgVEFSRSBwb2xpY3kgZm9yIGpvYiBsaW1pdGluZy4gSWYgZmFsc2UsIHVzZSBxdW90YXMuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBVU0VfVEFSRV9QT0xJQ1kgPSBFY29ub215TWFuYWdlci5ERUZBVUxUX0VOQUJMRV9QT0xJQ1lfSk9CX1NDSEVEVUxFUgpAQCAtODI3LDYgKzgzNiwxMCBAQAogICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGVyc2lzdGluZ0NvbnN0YW50c0xvY2tlZCgpIHsKICAgICAgICAgICAgIFBFUlNJU1RfSU5fU1BMSVRfRklMRVMgPSBEZXZpY2VDb25maWcuZ2V0Qm9vbGVhbihEZXZpY2VDb25maWcuTkFNRVNQQUNFX0pPQl9TQ0hFRFVMRVIsCiAgICAgICAgICAgICAgICAgICAgIEtFWV9QRVJTSVNUX0lOX1NQTElUX0ZJTEVTLCBERUZBVUxUX1BFUlNJU1RfSU5fU1BMSVRfRklMRVMpOworICAgICAgICAgICAgTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMgPSBEZXZpY2VDb25maWcuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuTkFNRVNQQUNFX0pPQl9TQ0hFRFVMRVIsCisgICAgICAgICAgICAgICAgICAgIEtFWV9NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUywKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUyk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJlZmV0Y2hDb25zdGFudHNMb2NrZWQoKSB7CkBAIC04NjIsMTEgKzg3NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuTkFNRVNQQUNFX0pPQl9TQ0hFRFVMRVIsCiAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX0ZSRUVfUVVPVEFfTUFYX0xJTUlUX01TLAogICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fR1VBUkFOVEVFX01TLCBLRVlfUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUywKLSAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMsCi0gICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKLSAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyk7CisgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SLAorICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9VSV9MSU1JVF9NUywKKyAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TKTsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG1pbiBydW50aW1lIGZvciByZWd1bGFyIGpvYnMgaXMgYXQgbGVhc3QgMTAgbWludXRlcy4KICAgICAgICAgICAgIFJVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUyA9IE1hdGgubWF4KDEwICogTUlOVVRFX0lOX01JTExJUywKQEAgLTg4MCwzNyArODkzLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0TG9uZyhLRVlfUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMpKTsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBtaW4gcnVudGltZSBpcyBhdCBsZWFzdCBhcyBsb25nIGFzIHJlZ3VsYXIgam9icy4KLSAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUyA9IE1hdGgubWF4KFJVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUywKKyAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUyA9IE1hdGgubWF4KFJVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUywKICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TLCBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUykpOwogICAgICAgICAgICAgLy8gTWF4IGxpbWl0IHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgbWluIGd1YXJhbnRlZSBBTkQgdGhlIGZyZWUgcXVvdGEuCi0gICAgICAgICAgICBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TID0gTWF0aC5tYXgoUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUywKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgUlVOVElNRV9VSV9MSU1JVF9NUyA9IE1hdGgubWF4KFJVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KFJVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldExvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX1VJX0xJTUlUX01TLCBERUZBVUxUX1JVTlRJTUVfVUlfTElNSVRfTVMpKSk7CiAgICAgICAgICAgICAvLyBUaGUgYnVmZmVyIGZhY3RvciBzaG91bGQgYmUgYXQgbGVhc3QgMSAoc28gd2UgZG9uJ3QgZGVjcmVhc2UgdGhlIHRpbWUpLgotICAgICAgICAgICAgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9IE1hdGgubWF4KDEsCisgICAgICAgICAgICBSVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0gTWF0aC5tYXgoMSwKICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IKICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbWluIHJ1bnRpbWUgaXMgYXQgbGVhc3QgYXMgbG9uZyBhcyBvdGhlciB1c2VyLWluaXRpYXRlZCBqb2JzLgotICAgICAgICAgICAgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPSBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPSBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TLAogICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldExvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUykpOwogICAgICAgICAgICAgLy8gVXNlci1pbml0aWF0ZWQgcmVxdWlyZXMgUlVOX1VTRVJfSU5JVElBVEVEX0pPQlMgcGVybWlzc2lvbiwgc28gdGhlIHVwcGVyIGxpbWl0IHdpbGwKICAgICAgICAgICAgIC8vIGJlIGhpZ2hlciB0aGFuIG90aGVyIGpvYnMuCiAgICAgICAgICAgICAvLyBNYXggbGltaXQgc2hvdWxkIGJlIHRoZSBtaW4gZ3VhcmFudGVlIGFuZCB0aGUgbWF4IG9mIG90aGVyIHVzZXItaW5pdGlhdGVkIGpvYnMuCi0gICAgICAgICAgICBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPSBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KFJVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMsCisgICAgICAgICAgICBSVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPSBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KFJVTlRJTUVfVUlfTElNSVRfTVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVRhcmVTZXR0aW5nc0xvY2tlZChARWNvbm9teU1hbmFnZXIuRW5hYmxlZE1vZGUgaW50IGVuYWJsZWRNb2RlKSB7CkBAIC05NTgsMTggKzk2OSwxOCBAQAogICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfTUlOX0VKX0dVQVJBTlRFRV9NUywgUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TKS5wcmludGxuKCk7CiAgICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUywgUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUykKICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oKTsKLSAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUykucHJpbnRsbigpOwotICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMsCi0gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMpLnByaW50bG4oKTsKLSAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SLAotICAgICAgICAgICAgICAgICAgICBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SKS5wcmludGxuKCk7Ci0gICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TKS5wcmludGxuKCk7Ci0gICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TLAotICAgICAgICAgICAgICAgICAgICBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMpLnByaW50bG4oKTsKKyAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMsIFJVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUykucHJpbnRsbigpOworICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfVUlfTElNSVRfTVMsIFJVTlRJTUVfVUlfTElNSVRfTVMpLnByaW50bG4oKTsKKyAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SLAorICAgICAgICAgICAgICAgICAgICBSVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TLAorICAgICAgICAgICAgICAgICAgICBSVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMpLnByaW50bG4oKTsKIAogICAgICAgICAgICAgcHcucHJpbnQoS0VZX1BFUlNJU1RfSU5fU1BMSVRfRklMRVMsIFBFUlNJU1RfSU5fU1BMSVRfRklMRVMpLnByaW50bG4oKTsKKyAgICAgICAgICAgIHB3LnByaW50KEtFWV9NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUywgTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMpCisgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCk7CiAKICAgICAgICAgICAgIHB3LnByaW50KFNldHRpbmdzLkdsb2JhbC5FTkFCTEVfVEFSRSwgVVNFX1RBUkVfUE9MSUNZKS5wcmludGxuKCk7CiAKQEAgLTEzNTMsNiArMTM2NCwyNSBAQAogICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogd2UgYXJlIGFkZGluZyB3b3JrIHRvIGFuIGV4aXN0aW5nIGpvYiwgYW5kIHRoZSBKb2JJbmZvIGlzIG5vdAogICAgICAgICAgICAgICAgIC8vIGNoYW5naW5nLiAgV2UgY2FuIGp1c3QgZGlyZWN0bHkgZW5xdWV1ZSB0aGlzIHdvcmsgaW4gdG8gdGhlIGpvYi4KICAgICAgICAgICAgICAgICBpZiAodG9DYW5jZWwuZ2V0Sm9iKCkuZXF1YWxzKGpvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT24gVCBhbmQgYmVsb3csIEpvYldvcmtJdGVtIGNvdW50IHdhcyB1bmxpbWl0ZWQgYnV0IHRoZXkgY291bGQgbm90IGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlZC4gTm93IGluIFUgYW5kIGFib3ZlLCB3ZSBhbGxvdyBwZXJzaXN0aW5nIHRoZW0uIEluIGJvdGggY2FzZXMsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgZGFuZ2VyIG9mIGFwcHMgYWRkaW5nIHRvbyBtYW55IEpvYldvcmtJdGVtcyBhbmQgY2F1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHRvIE9PTSBzaW5jZSB3ZSBrZWVwIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5LiBUaGUgcGVyc2lzdGluZyBkYW5nZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgZ3JlYXRlciBiZWNhdXNlIGl0IGNvdWxkIHRlY2huaWNhbGx5IGxlYWQgdG8gYSBib290IGxvb3AgaWYgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0cnlpbmcgdG8gbG9hZCBhbGwgdGhlIEpvYldvcmtJdGVtcyB0aGF0IGxlZCB0byB0aGUgaW5pdGlhbCBPT00uCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgZm9yIG5vdyAocGFydGx5IGZvciBhcHAgY29tcGF0aWJpbGl0eSksIHdlIHRhY2tsZSB0aGUgbGF0dGVyCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW1pdCB0aGUgbnVtYmVyIG9mIEpvYldvcmtJdGVtcyB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyBmb3J3YXJkLCB3ZSBzaG91bGQgbG9vayBpbnRvIHR3byB0aGluZ3M6CisgICAgICAgICAgICAgICAgICAgIC8vICAgMS4gTGltaXRpbmcgdGhlIG51bWJlciBvZiB1bnBlcnNpc3RlZCBKb2JXb3JrSXRlbXMKKyAgICAgICAgICAgICAgICAgICAgLy8gICAyLiBPZmZsb2FkaW5nIHNvbWUgc3RhdGUgdG8gZGlzayBzbyB3ZSBkb24ndCBrZWVwIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oMjczNzU4Mjc0KTogaW1wcm92ZSBKb2JTY2hlZHVsZXIncyByZXNpbGllbmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAodG9DYW5jZWwuZ2V0V29ya0NvdW50KCkgPj0gbUNvbnN0YW50cy5NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRvQ2FuY2VsLmlzUGVyc2lzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJUb28gbWFueSBKV0lzIGZvciB1aWQgIiArIHVJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBcHBzIG1heSBub3QgcGVyc2lzdCBtb3JlIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25zdGFudHMuTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEpvYldvcmtJdGVtcyBwZXIgam9iIik7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICB0b0NhbmNlbC5lbnF1ZXVlV29ya0xvY2tlZCh3b3JrKTsKICAgICAgICAgICAgICAgICAgICAgbUpvYnMudG91Y2hKb2IodG9DYW5jZWwpOwpAQCAtMTM5Nyw2ICsxNDI3LDI2IEBACiAgICAgICAgICAgICBqb2JTdGF0dXMucHJlcGFyZUxvY2tlZCgpOwogCiAgICAgICAgICAgICBpZiAodG9DYW5jZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE9uIFQgYW5kIGJlbG93LCBKb2JXb3JrSXRlbSBjb3VudCB3YXMgdW5saW1pdGVkIGJ1dCB0aGV5IGNvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlZC4gTm93IGluIFUgYW5kIGFib3ZlLCB3ZSBhbGxvdyBwZXJzaXN0aW5nIHRoZW0uIEluIGJvdGggY2FzZXMsCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBkYW5nZXIgb2YgYXBwcyBhZGRpbmcgdG9vIG1hbnkgSm9iV29ya0l0ZW1zIGFuZCBjYXVzaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB0byBPT00gc2luY2Ugd2Uga2VlcCBldmVyeXRoaW5nIGluIG1lbW9yeS4gVGhlIHBlcnNpc3RpbmcgZGFuZ2VyCisgICAgICAgICAgICAgICAgLy8gaXMgZ3JlYXRlciBiZWNhdXNlIGl0IGNvdWxkIHRlY2huaWNhbGx5IGxlYWQgdG8gYSBib290IGxvb3AgaWYgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRyeWluZyB0byBsb2FkIGFsbCB0aGUgSm9iV29ya0l0ZW1zIHRoYXQgbGVkIHRvIHRoZSBpbml0aWFsIE9PTS4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIGZvciBub3cgKHBhcnRseSBmb3IgYXBwIGNvbXBhdGliaWxpdHkpLCB3ZSB0YWNrbGUgdGhlIGxhdHRlcgorICAgICAgICAgICAgICAgIC8vIGFuZCBsaW1pdCB0aGUgbnVtYmVyIG9mIEpvYldvcmtJdGVtcyB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQuCisgICAgICAgICAgICAgICAgLy8gTW92aW5nIGZvcndhcmQsIHdlIHNob3VsZCBsb29rIGludG8gdHdvIHRoaW5nczoKKyAgICAgICAgICAgICAgICAvLyAgIDEuIExpbWl0aW5nIHRoZSBudW1iZXIgb2YgdW5wZXJzaXN0ZWQgSm9iV29ya0l0ZW1zCisgICAgICAgICAgICAgICAgLy8gICAyLiBPZmZsb2FkaW5nIHNvbWUgc3RhdGUgdG8gZGlzayBzbyB3ZSBkb24ndCBrZWVwIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgLy8gVE9ETygyNzM3NTgyNzQpOiBpbXByb3ZlIEpvYlNjaGVkdWxlcidzIHJlc2lsaWVuY2UgYW5kIG1lbW9yeSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgaWYgKHdvcmsgIT0gbnVsbCAmJiB0b0NhbmNlbC5pc1BlcnNpc3RlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0b0NhbmNlbC5nZXRXb3JrQ291bnQoKSA+PSBtQ29uc3RhbnRzLk1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJUb28gbWFueSBKV0lzIGZvciB1aWQgIiArIHVJZCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFwcHMgbWF5IG5vdCBwZXJzaXN0IG1vcmUgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29uc3RhbnRzLk1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEpvYldvcmtJdGVtcyBwZXIgam9iIik7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gSW1wbGljaXRseSByZXBsYWNlcyB0aGUgZXhpc3Rpbmcgam9iIHJlY29yZCB3aXRoIHRoZSBuZXcgaW5zdGFuY2UKICAgICAgICAgICAgICAgICBjYW5jZWxKb2JJbXBsTG9ja2VkKHRvQ2FuY2VsLCBqb2JTdGF0dXMsIEpvYlBhcmFtZXRlcnMuU1RPUF9SRUFTT05fQ0FOQ0VMTEVEX0JZX0FQUCwKICAgICAgICAgICAgICAgICAgICAgICAgIEpvYlBhcmFtZXRlcnMuSU5URVJOQUxfU1RPUF9SRUFTT05fQ0FOQ0VMRUQsICJqb2IgcmVzY2hlZHVsZWQgYnkgYXBwIik7CkBAIC0xNDM4LDcgKzE0ODgsOSBAQAogICAgICAgICAgICAgICAgICAgICAvKiBpc0RldmljZUlkbGUgKi8gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIC8qIGhhc0Nvbm5lY3Rpdml0eUNvbnN0cmFpbnRTYXRpc2ZpZWQgKi8gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIC8qIGhhc0NvbnRlbnRUcmlnZ2VyQ29uc3RyYWludFNhdGlzZmllZCAqLyBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIGpvYlN0YXR1cy5nZXRKb2IoKS5pc1VzZXJJbml0aWF0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgLyogaXNSdW5uaW5nQXNVc2VySW5pdGlhdGVkSm9iICovIGZhbHNlKTsKIAogICAgICAgICAgICAgLy8gSWYgdGhlIGpvYiBpcyBpbW1lZGlhdGVseSByZWFkeSB0byBydW4sIHRoZW4gd2UgY2FuIGp1c3QgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIC8vIHB1dCBpdCBpbiB0aGUgcGVuZGluZyBsaXN0IGFuZCB0cnkgdG8gc2NoZWR1bGUgaXQuICBUaGlzIGlzIGVzcGVjaWFsbHkKQEAgLTE4NTcsNyArMTkwOSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZC5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iSW5mby5DT05TVFJBSU5UX0ZMQUdfREVWSUNFX0lETEUpLAogICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYlN0YXR1cy5DT05TVFJBSU5UX0NPTk5FQ1RJVklUWSksCiAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZC5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iU3RhdHVzLkNPTlNUUkFJTlRfQ09OVEVOVF9UUklHR0VSKSwKLSAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZC5nZXRKb2IoKS5pc1VzZXJJbml0aWF0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgLyogaXNSdW5uaW5nQXNVc2VySW5pdGlhdGVkSm9iICovIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcmVwbGFjZW1lbnQsIGJyaW5nIGluIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgam9iCiAgICAgICAgIGlmIChpbmNvbWluZ0pvYiAhPSBudWxsKSB7CkBAIC0zMjU2LDE5ICszMzEwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aXZpdHlDb250cm9sbGVyLmdldEVzdGltYXRlZFRyYW5zZmVyVGltZU1zKGpvYik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlc3RpbWF0ZWRUcmFuc2ZlclRpbWVNcyA9PSBDb25uZWN0aXZpdHlDb250cm9sbGVyLlVOS05PV05fVElNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVM7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZ2l2ZSB0aGUgam9iIGF0IGxlYXN0IGFzIG11Y2ggdGltZSBhcyB3ZSB0aGluayB0aGUgdHJhbnNmZXIgd2lsbCB0YWtlLAogICAgICAgICAgICAgICAgICAgICAvLyBidXQgY2FwIGl0IGF0IHRoZSBtYXhpbXVtIGxpbWl0CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZmFjdG9yZWRUcmFuc2ZlclRpbWVNcyA9IChsb25nKSAoZXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1Db25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihtQ29uc3RhbnRzLlJVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihtQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChmYWN0b3JlZFRyYW5zZmVyVGltZU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TOwogICAgICAgICAgICAgfSBlbHNlIGlmIChqb2Iuc2hvdWxkVHJlYXRBc0V4cGVkaXRlZEpvYigpKSB7CiAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ3VhcmFudGVlIFJFU1RSSUNURUQgam9icyBtb3JlIHRoYW4gNSBtaW51dGVzLgogICAgICAgICAgICAgICAgIHJldHVybiBqb2IuZ2V0RWZmZWN0aXZlU3RhbmRieUJ1Y2tldCgpICE9IFJFU1RSSUNURURfSU5ERVgKQEAgLTMyODcsMTAgKzMzNDAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgY2hlY2tSdW5Vc2VySW5pdGlhdGVkSm9ic1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLmdldFNvdXJjZVVpZCgpLCBqb2IuZ2V0U291cmNlUGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICBpZiAoam9iLmdldEpvYigpLmdldFJlcXVpcmVkTmV0d29yaygpICE9IG51bGwgJiYgYWxsb3dMb25nZXJKb2IpIHsgLy8gVUkrRFQKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFsbG93TG9uZ2VySm9iKSB7IC8vIFVJIHdpdGggTFJKIHBlcm1pc3Npb24KLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TOworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLlJVTlRJTUVfVUlfTElNSVRfTVM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoam9iLnNob3VsZFRyZWF0QXNVc2VySW5pdGlhdGVkSm9iKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX0ZSRUVfUVVPVEFfTUFYX0xJTUlUX01TOwpkaWZmIC0tZ2l0IGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2VydmljZUNvbnRleHQuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNlcnZpY2VDb250ZXh0LmphdmEKaW5kZXggZTYwZWQ0YS4uNGMzMzlhYyAxMDA2NDQKLS0tIGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2VydmljZUNvbnRleHQuamF2YQorKysgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTZXJ2aWNlQ29udGV4dC5qYXZhCkBAIC00NjIsNyArNDYyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgam9iLmlzQ29uc3RyYWludFNhdGlzZmllZChKb2JJbmZvLkNPTlNUUkFJTlRfRkxBR19ERVZJQ0VfSURMRSksCiAgICAgICAgICAgICAgICAgICAgIGpvYi5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iU3RhdHVzLkNPTlNUUkFJTlRfQ09OTkVDVElWSVRZKSwKICAgICAgICAgICAgICAgICAgICAgam9iLmlzQ29uc3RyYWludFNhdGlzZmllZChKb2JTdGF0dXMuQ09OU1RSQUlOVF9DT05URU5UX1RSSUdHRVIpLAotICAgICAgICAgICAgICAgICAgICBtRXhlY3V0aW9uU3RhcnRUaW1lRWxhcHNlZCAtIGpvYi5lbnF1ZXVlVGltZSk7CisgICAgICAgICAgICAgICAgICAgIG1FeGVjdXRpb25TdGFydFRpbWVFbGFwc2VkIC0gam9iLmVucXVldWVUaW1lLAorICAgICAgICAgICAgICAgICAgICBqb2IuZ2V0Sm9iKCkuaXNVc2VySW5pdGlhdGVkKCksCisgICAgICAgICAgICAgICAgICAgIGpvYi5zaG91bGRUcmVhdEFzVXNlckluaXRpYXRlZEpvYigpKTsKICAgICAgICAgICAgIGlmIChUcmFjZS5pc1RhZ0VuYWJsZWQoVHJhY2UuVFJBQ0VfVEFHX1NZU1RFTV9TRVJWRVIpKSB7CiAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgSUQgdG8gZGlzdGluZ3Vpc2ggdHJhY2VzIHNpbmNlIHRoZXJlJ2xsIG9ubHkgYmUgb25lIGpvYgogICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcgcGVyIGNvbnRleHQuCkBAIC0xMzYxLDcgKzEzNjMsOSBAQAogICAgICAgICAgICAgICAgIGNvbXBsZXRlZEpvYi5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iSW5mby5DT05TVFJBSU5UX0ZMQUdfREVWSUNFX0lETEUpLAogICAgICAgICAgICAgICAgIGNvbXBsZXRlZEpvYi5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iU3RhdHVzLkNPTlNUUkFJTlRfQ09OTkVDVElWSVRZKSwKICAgICAgICAgICAgICAgICBjb21wbGV0ZWRKb2IuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYlN0YXR1cy5DT05TVFJBSU5UX0NPTlRFTlRfVFJJR0dFUiksCi0gICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRKb2IuZ2V0Sm9iKCkuaXNVc2VySW5pdGlhdGVkKCksCisgICAgICAgICAgICAgICAgY29tcGxldGVkSm9iLnN0YXJ0ZWRBc1VzZXJJbml0aWF0ZWRKb2IpOwogICAgICAgICBpZiAoVHJhY2UuaXNUYWdFbmFibGVkKFRyYWNlLlRSQUNFX1RBR19TWVNURU1fU0VSVkVSKSkgewogICAgICAgICAgICAgVHJhY2UuYXN5bmNUcmFjZUZvclRyYWNrRW5kKFRyYWNlLlRSQUNFX1RBR19TWVNURU1fU0VSVkVSLCAiSm9iU2NoZWR1bGVyIiwKICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSk7CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9jb250cm9sbGVycy9Kb2JTdGF0dXMuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL2NvbnRyb2xsZXJzL0pvYlN0YXR1cy5qYXZhCmluZGV4IDUzN2E2NzAuLjBjYzc3NTggMTAwNjQ0Ci0tLSBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL2NvbnRyb2xsZXJzL0pvYlN0YXR1cy5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL2NvbnRyb2xsZXJzL0pvYlN0YXR1cy5qYXZhCkBAIC04MTQsNiArODE0LDEzIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yge0BsaW5rIEpvYldvcmtJdGVtIEpvYldvcmtJdGVtc30gYXR0YWNoZWQgdG8gdGhpcyBqb2IuICovCisgICAgcHVibGljIGludCBnZXRXb3JrQ291bnQoKSB7CisgICAgICAgIGZpbmFsIGludCBwZW5kaW5nQ291bnQgPSBwZW5kaW5nV29yayA9PSBudWxsID8gMCA6IHBlbmRpbmdXb3JrLnNpemUoKTsKKyAgICAgICAgZmluYWwgaW50IGV4ZWN1dGluZ0NvdW50ID0gZXhlY3V0aW5nV29yayA9PSBudWxsID8gMCA6IGV4ZWN1dGluZ1dvcmsuc2l6ZSgpOworICAgICAgICByZXR1cm4gcGVuZGluZ0NvdW50ICsgZXhlY3V0aW5nQ291bnQ7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaGFzV29ya0xvY2tlZCgpIHsKICAgICAgICAgcmV0dXJuIChwZW5kaW5nV29yayAhPSBudWxsICYmIHBlbmRpbmdXb3JrLnNpemUoKSA+IDApIHx8IGhhc0V4ZWN1dGluZ1dvcmtMb2NrZWQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW5zdGFsbGVkUGFja2FnZUluZm8uamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnN0YWxsZWRQYWNrYWdlSW5mby5qYXZhCmluZGV4IDFmZjM4OWQuLmRmZmVkMGYgMTAwNjQ0Ci0tLSBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnN0YWxsZWRQYWNrYWdlSW5mby5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnN0YWxsZWRQYWNrYWdlSW5mby5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVzZXJJZEludDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlcjsKQEAgLTQxLDcgKzQyLDggQEAKICAgICBATnVsbGFibGUKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lOwogCi0gICAgSW5zdGFsbGVkUGFja2FnZUluZm8oQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBATm9uTnVsbCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgeworICAgIEluc3RhbGxlZFBhY2thZ2VJbmZvKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQFVzZXJJZEludCBpbnQgdXNlcklkLAorICAgICAgICAgICAgQE5vbk51bGwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgZmluYWwgQXBwbGljYXRpb25JbmZvIGFwcGxpY2F0aW9uSW5mbyA9IHBhY2thZ2VJbmZvLmFwcGxpY2F0aW9uSW5mbzsKICAgICAgICAgdWlkID0gYXBwbGljYXRpb25JbmZvID09IG51bGwgPyBOT19VSUQgOiBhcHBsaWNhdGlvbkluZm8udWlkOwogICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VJbmZvLnBhY2thZ2VOYW1lOwpAQCAtNTUsNyArNTcsOCBAQAogICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5mby51aWQsIHBhY2thZ2VOYW1lKTsKICAgICAgICAgSW5zdGFsbFNvdXJjZUluZm8gaW5zdGFsbFNvdXJjZUluZm8gPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbFNvdXJjZUluZm8gPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaW5zdGFsbFNvdXJjZUluZm8gPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVzZXJJZCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLgogICAgICAgICB9CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW50ZXJuYWxSZXNvdXJjZVNlcnZpY2UuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnRlcm5hbFJlc291cmNlU2VydmljZS5qYXZhCmluZGV4IGNhZjcyZTguLmZmYjJjMDMgMTAwNjQ0Ci0tLSBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnRlcm5hbFJlc291cmNlU2VydmljZS5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9JbnRlcm5hbFJlc291cmNlU2VydmljZS5qYXZhCkBAIC02MjUsNyArNjI1LDggQEAKICAgICAgICAgICAgIG1QYWNrYWdlVG9VaWRDYWNoZS5hZGQodXNlcklkLCBwa2dOYW1lLCB1aWQpOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIGlwbyA9IG5ldyBJbnN0YWxsZWRQYWNrYWdlSW5mbyhnZXRDb250ZXh0KCksIHBhY2thZ2VJbmZvKTsKKyAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIGlwbyA9IG5ldyBJbnN0YWxsZWRQYWNrYWdlSW5mbyhnZXRDb250ZXh0KCksIHVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZUluZm8pOwogICAgICAgICAgICAgZmluYWwgSW5zdGFsbGVkUGFja2FnZUluZm8gb2xkSXBvID0gbVBrZ0NhY2hlLmFkZCh1c2VySWQsIHBrZ05hbWUsIGlwbyk7CiAgICAgICAgICAgICBtYXliZVVwZGF0ZUluc3RhbGxlclN0YXR1c0xvY2tlZChvbGRJcG8sIGlwbyk7CiAgICAgICAgICAgICBtVWlkVG9QYWNrYWdlQ2FjaGUuYWRkKHVpZCwgcGtnTmFtZSk7CkBAIC02ODMsNyArNjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmdldEluc3RhbGxlZFBhY2thZ2VzQXNVc2VyKFBBQ0tBR0VfUVVFUllfRkxBR1MsIHVzZXJJZCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gcGtncy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIGlwbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCBwa2dzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCB1c2VySWQsIHBrZ3MuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICBmaW5hbCBJbnN0YWxsZWRQYWNrYWdlSW5mbyBvbGRJcG8gPSBtUGtnQ2FjaGUuYWRkKHVzZXJJZCwgaXBvLnBhY2thZ2VOYW1lLCBpcG8pOwogICAgICAgICAgICAgICAgIG1heWJlVXBkYXRlSW5zdGFsbGVyU3RhdHVzTG9ja2VkKG9sZElwbywgaXBvKTsKICAgICAgICAgICAgIH0KQEAgLTk2Myw3ICs5NjQsNyBAQAogICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuZ2V0SW5zdGFsbGVkUGFja2FnZXNBc1VzZXIoUEFDS0FHRV9RVUVSWV9GTEFHUywgdXNlcklkKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwa2dzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgSW5zdGFsbGVkUGFja2FnZUluZm8gaXBvID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnN0YWxsZWRQYWNrYWdlSW5mbyhnZXRDb250ZXh0KCksIHBrZ3MuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnN0YWxsZWRQYWNrYWdlSW5mbyhnZXRDb250ZXh0KCksIHVzZXJJZCwgcGtncy5nZXQoaSkpOwogICAgICAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIG9sZElwbyA9IG1Qa2dDYWNoZS5hZGQodXNlcklkLCBpcG8ucGFja2FnZU5hbWUsIGlwbyk7CiAgICAgICAgICAgICAgICAgbWF5YmVVcGRhdGVJbnN0YWxsZXJTdGF0dXNMb2NrZWQob2xkSXBvLCBpcG8pOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYXBpL2FwaS5nbyBiL2FwaS9hcGkuZ28KaW5kZXggMjVkOTcyOC4uOTg3NmFiYiAxMDA2NDQKLS0tIGEvYXBpL2FwaS5nbworKysgYi9hcGkvYXBpLmdvCkBAIC00MTgsNyArNDE4LDYgQEAKIC8vIGNvbWJpbmVkX2FwaXMgYnAyYnVpbGQgY29udmVydGVyCiBmdW5jIChhICpDb21iaW5lZEFwaXMpIENvbnZlcnRXaXRoQnAyYnVpbGQoY3R4IGFuZHJvaWQuVG9wRG93bk11dGF0b3JDb250ZXh0KSB7CiAJYmFzZVByZWZpeCA6PSAibm9uLXVwZGF0YWJsZSIKLQlzY29wZU5hbWVzIDo9IFtdc3RyaW5neyJwdWJsaWMiLCAic3lzdGVtIiwgIm1vZHVsZS1saWIiLCAic3lzdGVtLXNlcnZlciJ9CiAJc2NvcGVUb1N1ZmZpeCA6PSBtYXBbc3RyaW5nXXN0cmluZ3sKIAkJInB1YmxpYyI6ICAgICAgICAiLWN1cnJlbnQudHh0IiwKIAkJInN5c3RlbSI6ICAgICAgICAiLXN5c3RlbS1jdXJyZW50LnR4dCIsCkBAIC00MjYsOCArNDI1LDcgQEAKIAkJInN5c3RlbS1zZXJ2ZXIiOiAiLXN5c3RlbS1zZXJ2ZXItY3VycmVudC50eHQiLAogCX0KIAotCWZvciBfLCBzY29wZU5hbWUgOj0gcmFuZ2Ugc2NvcGVOYW1lc3sKLQkJc3VmZml4IDo9IHNjb3BlVG9TdWZmaXhbc2NvcGVOYW1lXQorCWZvciBzY29wZU5hbWUsIHN1ZmZpeCA6PSByYW5nZSBzY29wZVRvU3VmZml4ewogCQluYW1lIDo9IGEuTmFtZSgpICsgc3VmZml4CiAKIAkJdmFyIHNjb3BlIGJhemVsLlN0cmluZ0F0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvY29yZS9hcGkvY3VycmVudC50eHQgYi9jb3JlL2FwaS9jdXJyZW50LnR4dAppbmRleCBjMWM0NGYwLi4wMmRlMWNkIDEwMDY0NAotLS0gYS9jb3JlL2FwaS9jdXJyZW50LnR4dAorKysgYi9jb3JlL2FwaS9jdXJyZW50LnR4dApAQCAtMjI0LDYgKzIyNCw3IEBACiAgICAgZmllbGQgQERlcHJlY2F0ZWQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BQ1RJVklUWSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUEVSU0lTVEVOVF9BQ1RJVklUWSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVF9OT1RJRklDQVRJT05TID0gImFuZHJvaWQucGVybWlzc2lvbi5QT1NUX05PVElGSUNBVElPTlMiOwogICAgIGZpZWxkIEBEZXByZWNhdGVkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfT1VUR09JTkdfQ0FMTFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTID0gImFuZHJvaWQucGVybWlzc2lvbi5QUk9WSURFX1JFTU9URV9DUkVERU5USUFMUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfQUxMX1BBQ0tBR0VTID0gImFuZHJvaWQucGVybWlzc2lvbi5RVUVSWV9BTExfUEFDS0FHRVMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQVNTSVNUQU5UX0FQUF9TRUFSQ0hfREFUQSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9BU1NJU1RBTlRfQVBQX1NFQVJDSF9EQVRBIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0JBU0lDX1BIT05FX1NUQVRFID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0JBU0lDX1BIT05FX1NUQVRFIjsKQEAgLTExNDAzLDcgKzExNDA0LDcgQEAKICAgcHVibGljIGNsYXNzIFJlc3RyaWN0aW9uc01hbmFnZXIgewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuQnVuZGxlIGNvbnZlcnRSZXN0cmljdGlvbnNUb0J1bmRsZShqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25FbnRyeT4pOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVMb2NhbEFwcHJvdmFsSW50ZW50KCk7Ci0gICAgbWV0aG9kIEBEZXByZWNhdGVkIHB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9ucygpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnMoKTsKICAgICBtZXRob2QgQE5vbk51bGwgQFdvcmtlclRocmVhZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5CdW5kbGU+IGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW4oKTsKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbkVudHJ5PiBnZXRNYW5pZmVzdFJlc3RyaWN0aW9ucyhTdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBoYXNSZXN0cmljdGlvbnNQcm92aWRlcigpOwpAQCAtMjczNDUsNyArMjczNDYsOSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfU0hJRlRfU1RBVFVTX1VOQVZBSUxBQkxFID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9TSElGVF9TVEFUVVNfVU5LTk9XTiA9IDA7IC8vIDB4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfU0hJRlRfU1RBVFVTX1VOU1VQUE9SVEVEID0gMTsgLy8gMHgxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEEgPSAiYW5kcm9pZC5tZWRpYS50di5UdklucHV0TWFuYWdlci5yYXdfZGF0YSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEID0gImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIuc3RyZWFtX2lkIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVl9NRVNTQUdFX0tFWV9TVUJUWVBFID0gImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIuc3VidHlwZSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFZfTUVTU0FHRV9UWVBFX0NMT1NFRF9DQVBUSU9OID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFZfTUVTU0FHRV9UWVBFX09USEVSID0gMTAwMDsgLy8gMHgzZTgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLID0gMTsgLy8gMHgxCkBAIC0zMzg2NCw3ICszMzg2Nyw3IEBACiAKICAgcHVibGljIGNsYXNzIFVzZXJNYW5hZ2VyIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZVVzZXJDcmVhdGlvbkludGVudChATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSk7Ci0gICAgbWV0aG9kIEBEZXByZWNhdGVkIEBXb3JrZXJUaHJlYWQgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyk7CisgICAgbWV0aG9kIEBXb3JrZXJUaHJlYWQgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBsb25nIGdldFNlcmlhbE51bWJlckZvclVzZXIoYW5kcm9pZC5vcy5Vc2VySGFuZGxlKTsKICAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbnlPZj17ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfVVNFUlMiLCAiYW5kcm9pZC5wZXJtaXNzaW9uLkNSRUFURV9VU0VSUyJ9KSBwdWJsaWMgaW50IGdldFVzZXJDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBnZXRVc2VyQ3JlYXRpb25UaW1lKGFuZHJvaWQub3MuVXNlckhhbmRsZSk7CkBAIC00MDU5MSw3ICs0MDU5NCw3IEBACiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5DcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBhZGRDcmVhdGVFbnRyeShATm9uTnVsbCBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQ3JlYXRlRW50cnkpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlIGJ1aWxkKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5DcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBzZXRDcmVhdGVFbnRyaWVzKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5DcmVhdGVFbnRyeT4pOwotICAgIG1ldGhvZCBATm9uTnVsbCBAUmVxdWlyZXNQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMiKSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0UmVtb3RlQ3JlYXRlRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CisgICAgbWV0aG9kIEBOb25OdWxsIEBSZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTKSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0UmVtb3RlQ3JlYXRlRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQmVnaW5HZXRDcmVkZW50aWFsT3B0aW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTQwNjQwLDcgKzQwNjQzLDcgQEAKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldEFjdGlvbnMoQE5vbk51bGwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkFjdGlvbj4pOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luR2V0Q3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0QXV0aGVudGljYXRpb25BY3Rpb25zKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5BY3Rpb24+KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldENyZWRlbnRpYWxFbnRyaWVzKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5DcmVkZW50aWFsRW50cnk+KTsKLSAgICBtZXRob2QgQE5vbk51bGwgQFJlcXVpcmVzUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTIikgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldFJlbW90ZUNyZWRlbnRpYWxFbnRyeShATnVsbGFibGUgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLlJlbW90ZUVudHJ5KTsKKyAgICBtZXRob2QgQE5vbk51bGwgQFJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMpIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5HZXRDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBzZXRSZW1vdGVDcmVkZW50aWFsRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgQ2FsbGluZ0FwcEluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNDE1NTgsNyArNDE1NjEsNiBAQAogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWNvZ25pdGlvblNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLmFwcC5TZXJ2aWNlIHsKICAgICBjdG9yIHB1YmxpYyBSZWNvZ25pdGlvblNlcnZpY2UoKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhDb25jdXJyZW50U2Vzc2lvbnNDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5JQmluZGVyIG9uQmluZChhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25DYW5jZWwoYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TZXJ2aWNlLkNhbGxiYWNrKTsKQEAgLTQxNTY4LDcgKzQxNTcwLDcgQEAKICAgICBtZXRob2QgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25TdG9wTGlzdGVuaW5nKGFuZHJvaWQuc3BlZWNoLlJlY29nbml0aW9uU2VydmljZS5DYWxsYmFjayk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uVHJpZ2dlck1vZGVsRG93bmxvYWQoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uVHJpZ2dlck1vZGVsRG93bmxvYWQoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guTW9kZWxEb3dubG9hZExpc3RlbmVyKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgb25UcmlnZ2VyTW9kZWxEb3dubG9hZChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UsIEBOb25OdWxsIGFuZHJvaWQuc3BlZWNoLk1vZGVsRG93bmxvYWRMaXN0ZW5lcik7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSAiYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TZXJ2aWNlIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX01FVEFfREFUQSA9ICJhbmRyb2lkLnNwZWVjaCI7CiAgIH0KQEAgLTQxNjkzLDE4ICs0MTY5NSwxNyBAQAogICBwdWJsaWMgY2xhc3MgU3BlZWNoUmVjb2duaXplciB7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIGNhbmNlbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjaGVja1JlY29nbml0aW9uU3VwcG9ydChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TdXBwb3J0Q2FsbGJhY2spOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgQE1haW5UaHJlYWQgQE5vbk51bGwgcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5TcGVlY2hSZWNvZ25pemVyIGNyZWF0ZU9uRGV2aWNlU3BlZWNoUmVjb2duaXplcihATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2guU3BlZWNoUmVjb2duaXplciBjcmVhdGVTcGVlY2hSZWNvZ25pemVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgQE1haW5UaHJlYWQgcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5TcGVlY2hSZWNvZ25pemVyIGNyZWF0ZVNwZWVjaFJlY29nbml6ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGVzdHJveSgpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPbkRldmljZVJlY29nbml0aW9uQXZhaWxhYmxlKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXRpb25BdmFpbGFibGUoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IsIEBOb25OdWxsIGFuZHJvaWQuc3BlZWNoLk1vZGVsRG93bmxvYWRMaXN0ZW5lcik7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIHNldFJlY29nbml0aW9uTGlzdGVuZXIoYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25MaXN0ZW5lcik7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICAgIG1ldGhvZCBATWFpblRocmVhZCBwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHRyaWdnZXJNb2RlbERvd25sb2FkKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guTW9kZWxEb3dubG9hZExpc3RlbmVyKTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSURFTkNFX1NDT1JFUyA9ICJjb25maWRlbmNlX3Njb3JlcyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVURUNURURfTEFOR1VBR0UgPSAiZGV0ZWN0ZWRfbGFuZ3VhZ2UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0FVRElPID0gMzsgLy8gMHgzCmRpZmYgLS1naXQgYS9jb3JlL2FwaS9zeXN0ZW0tY3VycmVudC50eHQgYi9jb3JlL2FwaS9zeXN0ZW0tY3VycmVudC50eHQKaW5kZXggZDU3M2UzMy4uMGE4OTNmMCAxMDA2NDQKLS0tIGEvY29yZS9hcGkvc3lzdGVtLWN1cnJlbnQudHh0CisrKyBiL2NvcmUvYXBpL3N5c3RlbS1jdXJyZW50LnR4dApAQCAtMjU1LDcgKzI1NSw2IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STV9TSU1fQUNUSVZBVElPTiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUEVSRk9STV9TSU1fQUNUSVZBVElPTiI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9XRVJfU0FWRVIgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBPV0VSX1NBVkVSIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFX0RFRkFVTFRfRU5BQkxFRF9DUkVERU5USUFMX1NFUlZJQ0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfREVGQVVMVF9FTkFCTEVEX0NSRURFTlRJQUxfU0VSVklDRSI7Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFX1JFU09MVkVSX1JBTktFUl9TRVJWSUNFID0gImFuZHJvaWQucGVybWlzc2lvbi5QUk9WSURFX1JFU09MVkVSX1JBTktFUl9TRVJWSUNFIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFX1RSVVNUX0FHRU5UID0gImFuZHJvaWQucGVybWlzc2lvbi5QUk9WSURFX1RSVVNUX0FHRU5UIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSVNJT05fREVNT19ERVZJQ0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJU0lPTl9ERU1PX0RFVklDRSI7CkBAIC0xMDEzNSwxNiArMTAxMzQsMTggQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAgIG1ldGhvZCBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEV4dHJhcygpOworICAgIG1ldGhvZCBATnVsbGFibGUgcHVibGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgZ2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0luc3RhbnRUZXRoZXJFbmFibGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoQE5vbk51bGwgYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CiAgICAgZmllbGQgQE5vbk51bGwgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZT4gQ1JFQVRPUjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIHsKLSAgICBjdG9yIHB1YmxpYyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIoKTsKKyAgICBjdG9yIHB1YmxpYyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLlNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgYnVpbGQoKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIgc2V0RXh0cmFzKEBOb25OdWxsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIgc2V0SW5zdGFudFRldGhlckVuYWJsZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIHNldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgIH0KIAogfQpAQCAtMTI5OTQsMjAgKzEyOTk1LDIwIEBACiBwYWNrYWdlIGFuZHJvaWQuc2VydmljZS52b2ljZSB7CiAKICAgcHVibGljIGNsYXNzIEFsd2F5c09uSG90d29yZERldGVjdG9yIGltcGxlbWVudHMgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3RvciB7Ci0gICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVFbnJvbGxJbnRlbnQoKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZVJlRW5yb2xsSW50ZW50KCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVVbkVucm9sbEludGVudCgpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoaW50KSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZUVucm9sbEludGVudCgpOworICAgIG1ldGhvZCBATnVsbGFibGUgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgY3JlYXRlUmVFbnJvbGxJbnRlbnQoKTsKKyAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZVVuRW5yb2xsSW50ZW50KCk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFN1cHBvcnRlZEF1ZGlvQ2FwYWJpbGl0aWVzKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2RlcygpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBATnVsbGFibGUgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuTW9kZWxQYXJhbVJhbmdlIHF1ZXJ5UGFyYW1ldGVyKGludCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgaW50IHNldFBhcmFtZXRlcihpbnQsIGludCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKGludCwgQE5vbk51bGwgYnl0ZVtdKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oaW50KSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihATm9uTnVsbCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBATm9uTnVsbCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlU3RhdGUoQE51bGxhYmxlIGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGUsIEBOdWxsYWJsZSBhbmRyb2lkLm9zLlNoYXJlZE1lbW9yeSkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2RlcygpOworICAgIG1ldGhvZCBATnVsbGFibGUgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuTW9kZWxQYXJhbVJhbmdlIHF1ZXJ5UGFyYW1ldGVyKGludCk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgaW50IHNldFBhcmFtZXRlcihpbnQsIGludCk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKGludCwgQE5vbk51bGwgYnl0ZVtdKTsKKyAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oaW50KTsKKyAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihATm9uTnVsbCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBATm9uTnVsbCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKTsKKyAgICBtZXRob2QgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlU3RhdGUoQE51bGxhYmxlIGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGUsIEBOdWxsYWJsZSBhbmRyb2lkLm9zLlNoYXJlZE1lbW9yeSk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVESU9fQ0FQQUJJTElUWV9FQ0hPX0NBTkNFTExBVElPTiA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX0NBUEFCSUxJVFlfTk9JU0VfU1VQUFJFU1NJT04gPSAyOyAvLyAweDIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9QQVJBTV9USFJFU0hPTERfRkFDVE9SID0gMDsgLy8gMHgwCkBAIC0xMzE4NiwxMCArMTMxODcsMTAgQEAKIAogICBwdWJsaWMgaW50ZXJmYWNlIEhvdHdvcmREZXRlY3RvciB7CiAgICAgbWV0aG9kIHB1YmxpYyBkZWZhdWx0IHZvaWQgZGVzdHJveSgpOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKEBOb25OdWxsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IsIEBOb25OdWxsIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQsIEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKEBOb25OdWxsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IsIEBOb25OdWxsIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQsIEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSG90d29yZERldGVjdG9yLkNhbGxiYWNrIHsKQEAgLTEzMjAzLDkgKzEzMjA0LDYgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25SZWplY3RlZChATm9uTnVsbCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZFJlamVjdGVkUmVzdWx0KTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb24gewotICB9Ci0KICAgcHVibGljIGZpbmFsIGNsYXNzIEhvdHdvcmRSZWplY3RlZFJlc3VsdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENvbmZpZGVuY2VMZXZlbCgpOwpAQCAtMTMyNzMsOSArMTMyNzEsOSBAQAogCiAgIHB1YmxpYyBjbGFzcyBWaXN1YWxRdWVyeURldGVjdG9yIHsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGVzdHJveSgpOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPfSkgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPfSkgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmlzdWFsUXVlcnlEZXRlY3Rvci5DYWxsYmFjayB7CmRpZmYgLS1naXQgYS9jb3JlL2FwaS90ZXN0LWN1cnJlbnQudHh0IGIvY29yZS9hcGkvdGVzdC1jdXJyZW50LnR4dAppbmRleCAwMTIzY2M5Li40NDViOTU3IDEwMDY0NAotLS0gYS9jb3JlL2FwaS90ZXN0LWN1cnJlbnQudHh0CisrKyBiL2NvcmUvYXBpL3Rlc3QtY3VycmVudC50eHQKQEAgLTIwMjcsNyArMjAyNyw5IEBACiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczY0Qml0QWJpKFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2FibGUoKTsKICAgICBmaWVsZCBATnVsbGFibGUgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBTkRfRk9SX0FUVEVTVEFUSU9OOworICAgIGZpZWxkIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfRk9SX0FUVEVTVEFUSU9OOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTVVMQVRPUjsKKyAgICBmaWVsZCBATnVsbGFibGUgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTjsKICAgICBmaWVsZCBATnVsbGFibGUgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfRk9SX0FUVEVTVEFUSU9OOwogICAgIGZpZWxkIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZPUl9BVFRFU1RBVElPTjsKICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCA4NzY0M2IyLi4yNzUxYjU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtODQ5LDggKzg0OSwxMCBAQAogICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICBJbnRlbnQgaW50ZW50OwogICAgICAgICBib29sZWFuIHJlYmluZDsKKyAgICAgICAgbG9uZyBiaW5kU2VxOwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJCaW5kU2VydmljZURhdGF7dG9rZW49IiArIHRva2VuICsgIiBpbnRlbnQ9IiArIGludGVudCArICJ9IjsKKyAgICAgICAgICAgIHJldHVybiAiQmluZFNlcnZpY2VEYXRhe3Rva2VuPSIgKyB0b2tlbiArICIgaW50ZW50PSIgKyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRTZXE9IiArIGJpbmRTZXEgKyAifSI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMDcsMTIgKzExMDksMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlYmluZCwgaW50IHByb2Nlc3NTdGF0ZSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlLCBsb25nIGJpbmRTZXEpIHsKICAgICAgICAgICAgIHVwZGF0ZVByb2Nlc3NTdGF0ZShwcm9jZXNzU3RhdGUsIGZhbHNlKTsKICAgICAgICAgICAgIEJpbmRTZXJ2aWNlRGF0YSBzID0gbmV3IEJpbmRTZXJ2aWNlRGF0YSgpOwogICAgICAgICAgICAgcy50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgcy5pbnRlbnQgPSBpbnRlbnQ7CiAgICAgICAgICAgICBzLnJlYmluZCA9IHJlYmluZDsKKyAgICAgICAgICAgIHMuYmluZFNlcSA9IGJpbmRTZXE7CiAKICAgICAgICAgICAgIGlmIChERUJVR19TRVJWSUNFKQogICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJzY2hlZHVsZUJpbmRTZXJ2aWNlIHRva2VuPSIgKyB0b2tlbiArICIgaW50ZW50PSIgKyBpbnRlbnQgKyAiIHVpZD0iCkBAIC0xMTI0LDYgKzExMjcsNyBAQAogICAgICAgICAgICAgQmluZFNlcnZpY2VEYXRhIHMgPSBuZXcgQmluZFNlcnZpY2VEYXRhKCk7CiAgICAgICAgICAgICBzLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICBzLmludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIHMuYmluZFNlcSA9IC0xOwogCiAgICAgICAgICAgICBzZW5kTWVzc2FnZShILlVOQklORF9TRVJWSUNFLCBzKTsKICAgICAgICAgfQpAQCAtNjY1MywxMiArNjY1NywxMyBAQAogICAgICAgICAgICAgLy8gU2V0dXAgYSBsb2NhdGlvbiB0byBzdG9yZSBnZW5lcmF0ZWQvY29tcGlsZWQgZ3JhcGhpY3MgY29kZS4KICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgZGV2aWNlQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlRGV2aWNlUHJvdGVjdGVkU3RvcmFnZUNvbnRleHQoKTsKICAgICAgICAgICAgIGZpbmFsIEZpbGUgY29kZUNhY2hlRGlyID0gZGV2aWNlQ29udGV4dC5nZXRDb2RlQ2FjaGVEaXIoKTsKLSAgICAgICAgICAgIGlmIChjb2RlQ2FjaGVEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgRmlsZSBkZXZpY2VDYWNoZURpciA9IGRldmljZUNvbnRleHQuZ2V0Q2FjaGVEaXIoKTsKKyAgICAgICAgICAgIGlmIChjb2RlQ2FjaGVEaXIgIT0gbnVsbCAmJiBkZXZpY2VDYWNoZURpciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IFByb2Nlc3MubXlVaWQoKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFja2FnZXMgPSBnZXRQYWNrYWdlTWFuYWdlcigpLmdldFBhY2thZ2VzRm9yVWlkKHVpZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZVJlbmRlcmVyLnNldHVwRGlza0NhY2hlKGNvZGVDYWNoZURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZVJlbmRlcmVyLnNldHVwRGlza0NhY2hlKGRldmljZUNhY2hlRGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclNjcmlwdENhY2hlRGlyLnNldHVwRGlza0NhY2hlKGNvZGVDYWNoZURpcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyLmphdmEKaW5kZXggNjMwMWFkNy4uOTk5MDc1ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC0yNTYxLDcgKzI1NjEsNyBAQAogICAgIHB1YmxpYyBJbnN0YWxsU291cmNlSW5mbyBnZXRJbnN0YWxsU291cmNlSW5mbyhTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBOYW1lTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBJbnN0YWxsU291cmNlSW5mbyBpbnN0YWxsU291cmNlSW5mbzsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluc3RhbGxTb3VyY2VJbmZvID0gbVBNLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGluc3RhbGxTb3VyY2VJbmZvID0gbVBNLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lLCBnZXRVc2VySWQoKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuYWlkbAppbmRleCA0Zjc3MjAzLi42YjVmNmIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5haWRsCkBAIC05NSw3ICs5NSw3IEBACiAgICAgdm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5kKCk7CiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwKLSAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQsIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlKTsKKyAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQsIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlLCBsb25nIGJpbmRTZXEpOwogICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgdm9pZCBzY2hlZHVsZVVuYmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwKICAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlci5qYXZhCmluZGV4IDBlZjhlOTIuLjA5NDUwZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9LZXlndWFyZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvS2V5Z3VhcmRNYW5hZ2VyLmphdmEKQEAgLTE1NSw2ICsxNTUsMTQgQEAKICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5leHRyYS5SRU1PVEVfTE9DS1NDUkVFTl9WQUxJREFUSU9OX1NFU1NJT04iOwogCiAgICAgLyoqCisgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCBjcmVkZW50aWFsIGNvbmZpcm1hdGlvbiBhY3Rpdml0eSBzaG91bGQgYmUgYSB0YXNrIG92ZXJsYXkuCisgICAgICoge0BsaW5rICNBQ1RJT05fQ09ORklSTV9ERVZJQ0VfQ1JFREVOVElBTF9XSVRIX1VTRVJ9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRk9SQ0VfVEFTS19PVkVSTEFZID0KKyAgICAgICAgICAgICJhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIuRk9SQ0VfVEFTS19PVkVSTEFZIjsKKworICAgIC8qKgogICAgICAqIFJlc3VsdCBjb2RlIHJldHVybmVkIGJ5IHRoZSBhY3Rpdml0eSBzdGFydGVkIGJ5CiAgICAgICoge0BsaW5rICNjcmVhdGVDb25maXJtRmFjdG9yeVJlc2V0Q3JlZGVudGlhbEludGVudH0gb3IKICAgICAgKiB7QGxpbmsgI2NyZWF0ZUNvbmZpcm1EZXZpY2VDcmVkZW50aWFsRm9yUmVtb3RlVmFsaWRhdGlvbkludGVudH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQppbmRleCA0NDBlZTIwLi5lNzhmYjE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCkBAIC04NjU3LDEzICs4NjU3LDEzIEBACiAgICAgICAgICAgICAgKiB3aGVyZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHRoZSBNSU1FIHR5cGUsIHRoZSBvcmlnaW5hbCB0ZXh0IHByb3ZpZGVkIGluIHRoZQogICAgICAgICAgICAgICogY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLgogICAgICAgICAgICAgICogQHBhcmFtIGRhdGFNaW1lVHlwZSBUaGUgTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50LiBTZWUKLSAgICAgICAgICAgICAqIDxhIGhyZWY9IntAZG9jUm9vdH1ub3RpZmljYXRpb25zL21lc3NhZ2luZy5odG1sIj4gZm9yIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBNSU1FCi0gICAgICAgICAgICAgKiB0eXBlcyBvbiBBbmRyb2lkIGFuZCBBbmRyb2lkIFdlYXIuCisgICAgICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5JbWFnZURlY29kZXIjaXNNaW1lVHlwZVN1cHBvcnRlZChTdHJpbmcpfSBmb3IgYSBsaXN0IG9mCisgICAgICAgICAgICAgKiBzdXBwb3J0ZWQgaW1hZ2UgTUlNRSB0eXBlcy4KICAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhVXJpIFRoZSB1cmkgY29udGFpbmluZyB0aGUgY29udGVudCB3aG9zZSB0eXBlIGlzIGdpdmVuIGJ5IHRoZSBNSU1FIHR5cGUuCiAgICAgICAgICAgICAgKiA8cCBjbGFzcz0ibm90ZSI+CisgICAgICAgICAgICAgKiBOb3RpZmljYXRpb24gTGlzdGVuZXJzIGluY2x1ZGluZyB0aGUgU3lzdGVtIFVJIG5lZWQgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlCisgICAgICAgICAgICAgKiBkYXRhIHRoZSBVcmkgcG9pbnRzIHRvLiBUaGUgcmVjb21tZW5kZWQgd2F5cyB0byBkbyB0aGlzIGFyZToKICAgICAgICAgICAgICAqIDxvbD4KLSAgICAgICAgICAgICAqICAgPGxpPk5vdGlmaWNhdGlvbiBMaXN0ZW5lcnMgaW5jbHVkaW5nIHRoZSBTeXN0ZW0gVUkgbmVlZCBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgICAgICAqICAgICAgIGRhdGEgdGhlIFVyaSBwb2ludHMgdG8uIFRoZSByZWNvbW1lbmRlZCB3YXlzIHRvIGRvIHRoaXMgYXJlOjwvbGk+CiAgICAgICAgICAgICAgKiAgIDxsaT5TdG9yZSB0aGUgZGF0YSBpbiB5b3VyIG93biBDb250ZW50UHJvdmlkZXIsIG1ha2luZyBzdXJlIHRoYXQgb3RoZXIgYXBwcyBoYXZlCiAgICAgICAgICAgICAgKiAgICAgICB0aGUgY29ycmVjdCBwZXJtaXNzaW9uIHRvIGFjY2VzcyB5b3VyIHByb3ZpZGVyLiBUaGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3IKICAgICAgICAgICAgICAqICAgICAgIHByb3ZpZGluZyBhY2Nlc3MgaXMgdG8gdXNlIHBlci1VUkkgcGVybWlzc2lvbnMgd2hpY2ggYXJlIHRlbXBvcmFyeSBhbmQgb25seQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09XTkVSUyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9PV05FUlMKaW5kZXggZTcyYjE0MS4uZjdkMmFmYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09XTkVSUworKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvT1dORVJTCkBAIC01NCw2ICs1NCw5IEBACiBwZXItZmlsZSBCcm9hZGNhc3QqID0gZmlsZTovQlJPQURDQVNUU19PV05FUlMKIHBlci1maWxlIFJlY2VpdmVySW5mbyogPSBmaWxlOi9CUk9BRENBU1RTX09XTkVSUwogCisjIEtleWd1YXJkTWFuYWdlcgorcGVyLWZpbGUgS2V5Z3VhcmRNYW5hZ2VyLmphdmEgPSBmaWxlOi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2tzZXR0aW5ncy9PV05FUlMKKwogIyBMb2NhbGVNYW5hZ2VyCiBwZXItZmlsZSAqTG9jYWxlKiA9IGZpbGU6L3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYWxlcy9PV05FUlMKIApAQCAtOTQsNyArOTcsNSBAQAogcGVyLWZpbGUgQ29uZmlndXJhdGlvbkNvbnRyb2xsZXIuamF2YSA9IGZpbGU6L3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vT1dORVJTCiBwZXItZmlsZSAqU2NyZWVuQ2FwdHVyZSogPSBmaWxlOi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL09XTkVSUwogCi0jIFRPRE8oYi8xNzQ5MzIxNzQpOiBkZXRlcm1pbmUgdGhlIG93bmVyc2hpcCBvZiBLZXlndWFyZE1hbmFnZXIuamF2YQotCiAjIFp5Z290ZQogcGVyLWZpbGUgKlp5Z290ZSogPSBmaWxlOi9aWUdPVEVfT1dORVJTCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dpbmRvd0NvbmZpZ3VyYXRpb24uamF2YQppbmRleCAzOWQ3N2M0Li41Yjk1NTAzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9XaW5kb3dDb25maWd1cmF0aW9uLmphdmEKQEAgLTg3NSwxNSArODc1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHZpc2libGUgd2luZG93cyBiZWxvbmdpbmcgdG8gYXBwcyB3aXRoIHRoaXMgd2luZG93IGNvbmZpZ3VyYXRpb24gc2hvdWxkCi0gICAgICogYmUga2VwdCBvbiBzY3JlZW4gd2hlbiB0aGUgYXBwIGlzIGtpbGxlZCBkdWUgdG8gc29tZXRoaW5nIGxpa2UgdGhlIGxvdyBtZW1vcnkga2lsbGVyLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4ga2VlcFZpc2libGVEZWFkQXBwV2luZG93T25TY3JlZW4oKSB7Ci0gICAgICAgIHJldHVybiBtV2luZG93aW5nTW9kZSAhPSBXSU5ET1dJTkdfTU9ERV9QSU5ORUQ7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiYWNrZHJvcCBvbiB0aGUgY2xpZW50IHNpZGUgc2hvdWxkIG1hdGNoIHRoZSBmcmFtZSBvZiB0aGUgd2luZG93LgogICAgICAqIFJldHVybnMgZmFsc2UsIGlmIHRoZSBiYWNrZHJvcCBzaG91bGQgYmUgZnVsbHNjcmVlbi4KICAgICAgKiBAaGlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKaW5kZXggODVkYWYxNS4uNjY3ZWM3ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCkBAIC01OTIwLDkgKzU5MjAsOCBAQAogCiAgICAgLyoqCiAgICAgICogT3B0aW9uYWwgYXJndW1lbnQgdG8gYmUgdXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX0NIT09TRVJ9LgotICAgICAqIEEge0BsaW5rIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnR9IHRvIGJlIHNlbnQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBtb2RpZnkgdGhlIGNvbnRlbnQgdGhhdAotICAgICAqIHRoZXkncmUgc2hhcmluZy4gVGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyB0aGUgdXNlciB0byByZXR1cm4gdG8gdGhlIHNvdXJjZSBhcHAgdG8sIGZvcgotICAgICAqIGV4YW1wbGUsIHNlbGVjdCBkaWZmZXJlbnQgbWVkaWEuCisgICAgICogQSB7QGxpbmsgQ2hvb3NlckFjdGlvbn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gbW9kaWZ5IHdoYXQgaXMgYmVpbmcgc2hhcmVkIGluIHNvbWUgd2F5LiBUaGlzCisgICAgICogbWF5IGJlIGludGVncmF0ZWQgaW50byB0aGUgY29udGVudCBwcmV2aWV3IG9uIHNoYXJlc2hlZXRzIHRoYXQgaGF2ZSBhIHByZXZpZXcgVUkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQ0hPT1NFUl9NT0RJRllfU0hBUkVfQUNUSU9OID0KICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5leHRyYS5DSE9PU0VSX01PRElGWV9TSEFSRV9BQ1RJT04iOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9SZXN0cmljdGlvbnNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Jlc3RyaWN0aW9uc01hbmFnZXIuamF2YQppbmRleCA4MTE1MjkyLi40NGE4NGU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Jlc3RyaWN0aW9uc01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Jlc3RyaWN0aW9uc01hbmFnZXIuamF2YQpAQCAtNDI3LDExICs0MjcsMTIgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiByZXN0cmljdGlvbnMgYXMgYSBCdW5kbGUuIFJldHVybnMgbnVsbCBpZiB0aGVyZQogICAgICAqIGFyZSBubyByZXN0cmljdGlvbnMuCiAgICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgotICAgICAqIFN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sIGl0IGlzCi0gICAgICogcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFnZW50cyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0Ci0gICAgICogcmVzdHJpY3Rpb25zLiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IGRldmljZSBwb2xpY3kgY29udHJvbGxlcnMKLSAgICAgKiAoRFBDcykKKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgdmVyc2lvbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LAorICAgICAqIGl0IGlzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSBtYW5hZ2luZyBhcHBzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKKyAgICAgKiByZXN0cmljdGlvbnMsIGUuZy4gYSBEZXZpY2UgUG9saWN5IENvbnRyb2xsZXIgKERQQykgYW5kIGEgU3VwZXJ2aXNpb24gYWRtaW4uCisgICAgICogVGhpcyBBUEkgd2lsbCBvbmx5IHJldHVybiB0aGUgcmVzdHJpY3Rpb25zIHNldCBieSB0aGUgRFBDcy4gVG8gcmV0cmlldmUgcmVzdHJpY3Rpb25zCisgICAgICogc2V0IGJ5IGFsbCBtYW5hZ2luZyBhcHBzLCB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlJlc3RyaWN0aW9uc01hbmFnZXIjZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNQZXJBZG1pbn0gaW5zdGVhZC4KICAgICAgKgogICAgICAqIEBzZWUgRGV2aWNlUG9saWN5TWFuYWdlcgogICAgICAqLwpAQCAtNDUzLDggKzQ1NCw4IEBACiAgICAgICogc3RhYmxlIGJldHdlZW4gbXVsdGlwbGUgY2FsbHMuCiAgICAgICoKICAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgdmVyc2lvbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LAotICAgICAqIGl0IGlzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSBtYW5hZ2luZyBhZ2VudHMgb24gdGhlIGRldmljZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHNldAotICAgICAqIHJlc3RyaWN0aW9ucywgZS5nLiBhbiBFbnRlcnByaXNlIERQQyBhbmQgYSBTdXBlcnZpc2lvbiBhZG1pbi4KKyAgICAgKiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgbXVsdGlwbGUgbWFuYWdpbmcgYXBwcyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0CisgICAgICogcmVzdHJpY3Rpb25zLCBlLmcuIGFuIEVudGVycHJpc2UgRGV2aWNlIFBvbGljeSBDb250cm9sbGVyIChEUEMpIGFuZCBhIFN1cGVydmlzaW9uIGFkbWluLgogICAgICAqCiAgICAgICogPHA+RWFjaCB7QGxpbmsgQnVuZGxlfSBjb25zaXN0cyBvZiBrZXktdmFsdWUgcGFpcnMsIGFzIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLAogICAgICAqIHdoZXJlIHRoZSB0eXBlcyBvZiB2YWx1ZXMgbWF5IGJlOgpAQCAtNDcxLDYgKzQ3Miw3IEBACiAgICAgICogcGFja2FnZS4gUmV0dXJucyBhbiBlbXB0eSB7QGxpbmsgTGlzdH0gaWYgdGhlcmUgYXJlIG5vIHNhdmVkIHJlc3RyaWN0aW9ucy4KICAgICAgKgogICAgICAqIEBzZWUgVXNlck1hbmFnZXIjS0VZX1JFU1RSSUNUSU9OU19QRU5ESU5HCisgICAgICogQHNlZSBEZXZpY2VQb2xpY3lNYW5hZ2VyCiAgICAgICovCiAgICAgQFdvcmtlclRocmVhZAogICAgIEBVc2VySGFuZGxlQXdhcmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlci5haWRsCmluZGV4IDEzMmI5YWYuLjQxMDk5NGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXIuYWlkbApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICBTdHJpbmcgZ2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoaW4gU3RyaW5nIHBhY2thZ2VOYW1lKTsKIAotICAgIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKGluIFN0cmluZyBwYWNrYWdlTmFtZSk7CisgICAgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oaW4gU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdXNlcklkKTsKIAogICAgIHZvaWQgcmVzZXRBcHBsaWNhdGlvblByZWZlcmVuY2VzKGludCB1c2VySWQpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0luY3JlbWVudGFsU3RhdGVzSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JbmNyZW1lbnRhbFN0YXRlc0luZm8uamF2YQppbmRleCAwMzkzZDM0Yi4uZjE1YWZkZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JbmNyZW1lbnRhbFN0YXRlc0luZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0luY3JlbWVudGFsU3RhdGVzSW5mby5qYXZhCkBAIC0yNywxNCArMjcsMTggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTG9hZGluZzsKICAgICBwcml2YXRlIGZsb2F0IG1Qcm9ncmVzczsKIAotICAgIHB1YmxpYyBJbmNyZW1lbnRhbFN0YXRlc0luZm8oYm9vbGVhbiBpc0xvYWRpbmcsIGZsb2F0IHByb2dyZXNzKSB7CisgICAgcHJpdmF0ZSBsb25nIG1Mb2FkaW5nQ29tcGxldGVkVGltZTsKKworICAgIHB1YmxpYyBJbmNyZW1lbnRhbFN0YXRlc0luZm8oYm9vbGVhbiBpc0xvYWRpbmcsIGZsb2F0IHByb2dyZXNzLCBsb25nIGxvYWRpbmdDb21wbGV0ZWRUaW1lKSB7CiAgICAgICAgIG1Jc0xvYWRpbmcgPSBpc0xvYWRpbmc7CiAgICAgICAgIG1Qcm9ncmVzcyA9IHByb2dyZXNzOworICAgICAgICBtTG9hZGluZ0NvbXBsZXRlZFRpbWUgPSBsb2FkaW5nQ29tcGxldGVkVGltZTsKICAgICB9CiAKICAgICBwcml2YXRlIEluY3JlbWVudGFsU3RhdGVzSW5mbyhQYXJjZWwgc291cmNlKSB7CiAgICAgICAgIG1Jc0xvYWRpbmcgPSBzb3VyY2UucmVhZEJvb2xlYW4oKTsKICAgICAgICAgbVByb2dyZXNzID0gc291cmNlLnJlYWRGbG9hdCgpOworICAgICAgICBtTG9hZGluZ0NvbXBsZXRlZFRpbWUgPSBzb3VyY2UucmVhZExvbmcoKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7CkBAIC00NSw2ICs0OSwxMCBAQAogICAgICAgICByZXR1cm4gbVByb2dyZXNzOwogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIGdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCkgeworICAgICAgICByZXR1cm4gbUxvYWRpbmdDb21wbGV0ZWRUaW1lOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC01NCw2ICs2Miw3IEBACiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGRlc3Qud3JpdGVCb29sZWFuKG1Jc0xvYWRpbmcpOwogICAgICAgICBkZXN0LndyaXRlRmxvYXQobVByb2dyZXNzKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUxvYWRpbmdDb21wbGV0ZWRUaW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBDcmVhdG9yPEluY3JlbWVudGFsU3RhdGVzSW5mbz4gQ1JFQVRPUiA9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKaW5kZXggMzI4YjBhZS4uYjljNjcxYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQpAQCAtODY2Niw3ICs4NjY2LDcgQEAKICAgICAgKiByZXF1ZXN0aW5nIGl0cyBvd24gaW5zdGFsbCBpbmZvcm1hdGlvbiBhbmQgaXMgbm90IGFuIGluc3RhbnQgYXBwLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHF1ZXJ5Ci0gICAgICogQHRocm93cyBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBpcyBub3QgaW5zdGFsbGVkCisgICAgICogQHRocm93cyBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCiAgICAgICovCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvQ3JlZGVudGlhbERlc2NyaXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9DcmVkZW50aWFsRGVzY3JpcHRpb24uamF2YQppbmRleCBiZjM0YzFjLi5hMjNkN2U0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9DcmVkZW50aWFsRGVzY3JpcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9DcmVkZW50aWFsRGVzY3JpcHRpb24uamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UeXBlOwogCiAgICAgLyoqCi0gICAgICogVGhlIGZsYXR0ZW5lZCBKU09OIHN0cmluZyB0aGF0IHdpbGwgYmUgbWF0Y2hlZCB3aXRoIHJlcXVlc3RzLgorICAgICAqIEZsYXR0ZW5lZCBzZW1pY29sb24gc2VwYXJhdGVkIGtleXMgb2YgSlNPTiB2YWx1ZXMgdG8gbWF0Y2ggd2l0aCByZXF1ZXN0cy4KICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GbGF0dGVuZWRSZXF1ZXN0U3RyaW5nOwpAQCAtNTcsNyArNTcsOCBAQAogICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgQ3JlZGVudGlhbERlc2NyaXB0aW9ufS4KICAgICAgKgogICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBjcmVkZW50aWFsIHJldHVybmVkLgotICAgICAqIEBwYXJhbSBmbGF0dGVuZWRSZXF1ZXN0U3RyaW5nIGZsYXR0ZW5lZCBKU09OIHN0cmluZyB0aGF0IHdpbGwgYmUgbWF0Y2hlZCB3aXRoIHJlcXVlc3RzLgorICAgICAqIEBwYXJhbSBmbGF0dGVuZWRSZXF1ZXN0U3RyaW5nIGZsYXR0ZW5lZCBzZW1pY29sb24gc2VwYXJhdGVkIGtleXMgb2YgSlNPTiB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1hdGNoIHdpdGggcmVxdWVzdHMuCiAgICAgICogQHBhcmFtIGNyZWRlbnRpYWxFbnRyaWVzIGEgbGlzdCBvZiB7QGxpbmsgQ3JlZGVudGlhbEVudHJ5fXMgdGhhdCBhcmUgdG8gYmUgc2hvd24gb24gdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQgc2VsZWN0b3IgaWYgYSBjcmVkZW50aWFsIG1hdGNoZXMgd2l0aCB0aGlzIGRlc2NyaXB0aW9uLgogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFYWNoIGVudHJ5IGNvbnRhaW5zIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCB3aXRoaW4gYW4KQEAgLTE1MSw0ICsxNTIsMjkgQEAKICAgICBwdWJsaWMgTGlzdDxDcmVkZW50aWFsRW50cnk+IGdldENyZWRlbnRpYWxFbnRyaWVzKCkgewogICAgICAgICByZXR1cm4gbUNyZWRlbnRpYWxFbnRyaWVzOwogICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBDcmVkZW50aWFsRGVzY3JpcHRpb24jbVR5cGV9IGFuZAorICAgICAqIHtAbGluayBDcmVkZW50aWFsRGVzY3JpcHRpb24jbUZsYXR0ZW5lZFJlcXVlc3RTdHJpbmd9IGFyZSBlbm91Z2ggZm9yIGhhc2hpbmcuIENvbnN0cnVjdG9yCisgICAgICogZW5mb3JjZXMge0BsaW5rIENyZWRlbnRpYWxFbnRyeX0gdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFuZAorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5zbGljZS5TbGljZX0gY29udGFpbmVkIGJ5IHRoZSBlbnRyeSBjYW4gbm90IGJlIGhhc2hlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1UeXBlLCBtRmxhdHRlbmVkUmVxdWVzdFN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIENyZWRlbnRpYWxEZXNjcmlwdGlvbiNtVHlwZX0gYW5kCisgICAgICoge0BsaW5rIENyZWRlbnRpYWxEZXNjcmlwdGlvbiNtRmxhdHRlbmVkUmVxdWVzdFN0cmluZ30gYXJlIGVub3VnaCBmb3IgZXF1YWxpdHkgY2hlY2suCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ3JlZGVudGlhbERlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIENyZWRlbnRpYWxEZXNjcmlwdGlvbiBvdGhlciA9IChDcmVkZW50aWFsRGVzY3JpcHRpb24pIG9iajsKKyAgICAgICAgcmV0dXJuIG1UeXBlLmVxdWFscyhvdGhlci5tVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtRmxhdHRlbmVkUmVxdWVzdFN0cmluZy5lcXVhbHMob3RoZXIubUZsYXR0ZW5lZFJlcXVlc3RTdHJpbmcpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCmluZGV4IDMzNDE4MDAuLjVlNTIzYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQpAQCAtNTEzLDYgKzUxMywxOSBAQAogICAgICAqIFRoaXMgbWV0aG9kIGV4ZWN1dGVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgYWxsIGNoYW5nZXMKICAgICAgKiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcm9sbGVkIGJhY2suCiAgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIDxlbT5JbXBvcnRhbnQ6PC9lbT4gWW91IHNob3VsZCBOT1QgbW9kaWZ5IGFuIGV4aXN0aW5nIG1pZ3JhdGlvbiBzdGVwIGZyb20gdmVyc2lvbiBYIHRvIFgrMQorICAgICAqIG9uY2UgYSBidWlsZCBoYXMgYmVlbiByZWxlYXNlZCBjb250YWluaW5nIHRoYXQgbWlncmF0aW9uIHN0ZXAuICBJZiBhIG1pZ3JhdGlvbiBzdGVwIGhhcyBhbgorICAgICAqIGVycm9yIGFuZCBpdCBydW5zIG9uIGEgZGV2aWNlLCB0aGUgc3RlcCB3aWxsIE5PVCByZS1ydW4gaXRzZWxmIGluIHRoZSBmdXR1cmUgaWYgYSBmaXggaXMgbWFkZQorICAgICAqIHRvIHRoZSBtaWdyYXRpb24gc3RlcC48L3A+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBtaWdyYXRpb24gc3RlcCByZW5hbWVzIGEgZGF0YWJhc2UgY29sdW1uIGZyb20ge0Bjb2RlIGZvb30gdG8KKyAgICAgKiB7QGNvZGUgYmFyfSB3aGVuIHRoZSBuYW1lIHNob3VsZCBoYXZlIGJlZW4ge0Bjb2RlIGJhen0uICBJZiB0aGF0IG1pZ3JhdGlvbiBzdGVwIGlzIHJlbGVhc2VkCisgICAgICogaW4gYSBidWlsZCBhbmQgcnVucyBvbiBhIHVzZXIncyBkZXZpY2UsIHRoZSBjb2x1bW4gd2lsbCBiZSByZW5hbWVkIHRvIHtAY29kZSBiYXJ9LiAgSWYgdGhlCisgICAgICogZGV2ZWxvcGVyIHN1YnNlcXVlbnRseSBlZGl0cyB0aGlzIHNhbWUgbWlncmF0aW9uIHN0ZXAgdG8gY2hhbmdlIHRoZSBuYW1lIHRvIHtAY29kZSBiYXp9IGFzCisgICAgICogaW50ZW5kZWQsIHRoZSB1c2VyIGRldmljZXMgd2hpY2ggaGF2ZSBhbHJlYWR5IHJ1biB0aGlzIHN0ZXAgd2lsbCBzdGlsbCBoYXZlIHRoZSBuYW1lCisgICAgICoge0Bjb2RlIGJhcn0uICBJbnN0ZWFkLCBhIE5FVyBtaWdyYXRpb24gc3RlcCBzaG91bGQgYmUgY3JlYXRlZCB0byBjb3JyZWN0IHRoZSBlcnJvciBhbmQgcmVuYW1lCisgICAgICoge0Bjb2RlIGJhcn0gdG8ge0Bjb2RlIGJhen0sIGVuc3VyaW5nIHRoZSBlcnJvciBpcyBjb3JyZWN0ZWQgb24gZGV2aWNlcyB3aGljaCBoYXZlIGFscmVhZHkgcnVuCisgICAgICogdGhlIG1pZ3JhdGlvbiBzdGVwIHdpdGggdGhlIGVycm9yLjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIG9sZFZlcnNpb24gVGhlIG9sZCBkYXRhYmFzZSB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmFTZXNzaW9uU3RhdHMuamF2YQppbmRleCBjZjIwNDU5Li43OWE1NTFhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmFTZXNzaW9uU3RhdHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmFTZXNzaW9uU3RhdHMuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogICAgIHByaXZhdGUgaW50IG1BcGlMZXZlbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTmRrOwogICAgIHByaXZhdGUgaW50IG1MYXRlbmN5TXM7CisgICAgcHJpdmF0ZSBsb25nIG1Mb2dJZDsKICAgICBwcml2YXRlIGludCBtU2Vzc2lvblR5cGU7CiAgICAgcHJpdmF0ZSBpbnQgbUludGVybmFsUmVjb25maWd1cmU7CiAgICAgcHJpdmF0ZSBsb25nIG1SZXF1ZXN0Q291bnQ7CkBAIC03MCw2ICs3MSw3IEBACiAgICAgICAgIG1BcGlMZXZlbCA9IC0xOwogICAgICAgICBtSXNOZGsgPSBmYWxzZTsKICAgICAgICAgbUxhdGVuY3lNcyA9IC0xOworICAgICAgICBtTG9nSWQgPSAwOwogICAgICAgICBtTWF4UHJldmlld0ZwcyA9IDA7CiAgICAgICAgIG1TZXNzaW9uVHlwZSA9IC0xOwogICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSA9IC0xOwpAQCAtODIsNyArODQsNyBAQAogCiAgICAgcHVibGljIENhbWVyYVNlc3Npb25TdGF0cyhTdHJpbmcgY2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBuZXdDYW1lcmFTdGF0ZSwKICAgICAgICAgICAgIFN0cmluZyBjbGllbnROYW1lLCBpbnQgYXBpTGV2ZWwsIGJvb2xlYW4gaXNOZGssIGludCBjcmVhdGlvbkR1cmF0aW9uLAotICAgICAgICAgICAgZmxvYXQgbWF4UHJldmlld0ZwcywgaW50IHNlc3Npb25UeXBlLCBpbnQgaW50ZXJuYWxSZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgZmxvYXQgbWF4UHJldmlld0ZwcywgaW50IHNlc3Npb25UeXBlLCBpbnQgaW50ZXJuYWxSZWNvbmZpZ3VyZSwgbG9uZyBsb2dJZCkgewogICAgICAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKICAgICAgICAgbUZhY2luZyA9IGZhY2luZzsKICAgICAgICAgbU5ld0NhbWVyYVN0YXRlID0gbmV3Q2FtZXJhU3RhdGU7CkBAIC05MCw2ICs5Miw3IEBACiAgICAgICAgIG1BcGlMZXZlbCA9IGFwaUxldmVsOwogICAgICAgICBtSXNOZGsgPSBpc05kazsKICAgICAgICAgbUxhdGVuY3lNcyA9IGNyZWF0aW9uRHVyYXRpb247CisgICAgICAgIG1Mb2dJZCA9IGxvZ0lkOwogICAgICAgICBtTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgICAgIG1TZXNzaW9uVHlwZSA9IHNlc3Npb25UeXBlOwogICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSA9IGludGVybmFsUmVjb25maWd1cmU7CkBAIC0xMjcsNiArMTMwLDcgQEAKICAgICAgICAgZGVzdC53cml0ZUludChtQXBpTGV2ZWwpOwogICAgICAgICBkZXN0LndyaXRlQm9vbGVhbihtSXNOZGspOwogICAgICAgICBkZXN0LndyaXRlSW50KG1MYXRlbmN5TXMpOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtTG9nSWQpOwogICAgICAgICBkZXN0LndyaXRlRmxvYXQobU1heFByZXZpZXdGcHMpOwogICAgICAgICBkZXN0LndyaXRlSW50KG1TZXNzaW9uVHlwZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUludGVybmFsUmVjb25maWd1cmUpOwpAQCAtMTQ2LDYgKzE1MCw3IEBACiAgICAgICAgIG1BcGlMZXZlbCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgbUlzTmRrID0gaW4ucmVhZEJvb2xlYW4oKTsKICAgICAgICAgbUxhdGVuY3lNcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUxvZ0lkID0gaW4ucmVhZExvbmcoKTsKICAgICAgICAgbU1heFByZXZpZXdGcHMgPSBpbi5yZWFkRmxvYXQoKTsKICAgICAgICAgbVNlc3Npb25UeXBlID0gaW4ucmVhZEludCgpOwogICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSA9IGluLnJlYWRJbnQoKTsKQEAgLTE4OSw2ICsxOTQsMTAgQEAKICAgICAgICAgcmV0dXJuIG1MYXRlbmN5TXM7CiAgICAgfQogCisgICAgcHVibGljIGxvbmcgZ2V0TG9nSWQoKSB7CisgICAgICAgIHJldHVybiBtTG9nSWQ7CisgICAgfQorCiAgICAgcHVibGljIGZsb2F0IGdldE1heFByZXZpZXdGcHMoKSB7CiAgICAgICAgIHJldHVybiBtTWF4UHJldmlld0ZwczsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuamF2YQppbmRleCBiOWIzMTBmLi5jOTVkMDgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmphdmEKQEAgLTQxMjMsNyArNDEyMyw4IEBACiAgICAgICogY291bnRlcnBhcnRzLgogICAgICAqIFRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGZvciBkZXZpY2VzIHdoaWNoIGFkdmVydGlzZSB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX08L3A+CiAgICAgICogPHA+PGI+VW5pdHM8L2I+OiBQaXhlbCBjb29yZGluYXRlcyBvbiB0aGUgaW1hZ2Ugc2Vuc29yPC9wPgogICAgICAqIDxwPjxiPk9wdGlvbmFsPC9iPiAtIFRoZSB2YWx1ZSBmb3IgdGhpcyBrZXkgbWF5IGJlIHtAY29kZSBudWxsfSBvbiBzb21lIGRldmljZXMuPC9wPgogICAgICAqCkBAIC00MTQ4LDcgKzQxNDksOCBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uCiAgICAgICogVGhpcyBrZXkgd2lsbCBvbmx5IGJlIHByZXNlbnQgZm9yIGRldmljZXMgd2hpY2ggYWR2ZXJ0aXNlIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHkuPC9wPgorICAgICAqIGNhcGFiaWxpdHkgb3IgZGV2aWNlcyB3aGVyZSB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fTwvcD4KICAgICAgKiA8cD48Yj5Vbml0czwvYj46IFBpeGVsczwvcD4KICAgICAgKiA8cD48Yj5PcHRpb25hbDwvYj4gLSBUaGUgdmFsdWUgZm9yIHRoaXMga2V5IG1heSBiZSB7QGNvZGUgbnVsbH0gb24gc29tZSBkZXZpY2VzLjwvcD4KICAgICAgKgpAQCAtNDE3Miw3ICs0MTc0LDggQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LgogICAgICAqIFRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGZvciBkZXZpY2VzIHdoaWNoIGFkdmVydGlzZSB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX08L3A+CiAgICAgICogPHA+PGI+VW5pdHM8L2I+OiBQaXhlbCBjb29yZGluYXRlcyBvbiB0aGUgaW1hZ2Ugc2Vuc29yPC9wPgogICAgICAqIDxwPjxiPk9wdGlvbmFsPC9iPiAtIFRoZSB2YWx1ZSBmb3IgdGhpcyBrZXkgbWF5IGJlIHtAY29kZSBudWxsfSBvbiBzb21lIGRldmljZXMuPC9wPgogICAgICAqCkBAIC00MTkyLDE0ICs0MTk1LDI5IEBACiAgICAgICogdG8gaW1wcm92ZSB2YXJpb3VzIGFzcGVjdHMgb2YgaW1hZ2luZyBzdWNoIGFzIG5vaXNlIHJlZHVjdGlvbiwgbG93IGxpZ2h0CiAgICAgICogcGVyZm9ybWFuY2UgZXRjLiBUaGVzZSBncm91cHMgY2FuIGJlIG9mIHZhcmlvdXMgc2l6ZXMgc3VjaCBhcyAyWDIgKHF1YWQgYmF5ZXIpLAogICAgICAqIDNYMyAobm9uYS1iYXllcikuIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiB0aGUgcGl4ZWxzIGdyb3VwZWQgdW5kZXIKLSAgICAgKiB0aGUgc2FtZSBjb2xvciBmaWx0ZXIuPC9wPgotICAgICAqIDxwPlRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgaWYgUkVNT1NBSUNfUkVQUk9DRVNTSU5HIGlzIG5vdCBzdXBwb3J0ZWQsIHNpbmNlIFJBVyBpbWFnZXMKLSAgICAgKiB3aWxsIGhhdmUgYSByZWd1bGFyIGJheWVyIHBhdHRlcm4uPC9wPgotICAgICAqIDxwPlRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIHNlbnNvcnMgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiB0aGUgc2FtZSBjb2xvciBmaWx0ZXIuCisgICAgICogSW4gY2FzZSB0aGUgZGV2aWNlIGhhcyB0aGUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQorICAgICAqIGNhcGFiaWxpdHkgOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgaWYgUkVNT1NBSUNfUkVQUk9DRVNTSU5HIGlzIG5vdCBzdXBwb3J0ZWQsIHNpbmNlIFJBVworICAgICAqICAgaW1hZ2VzIHdpbGwgaGF2ZSBhIHJlZ3VsYXIgYmF5ZXIgcGF0dGVybi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+SW4gY2FzZSB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgdGhlCisgICAgICoge0BsaW5rIENhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KKyAgICAgKiBjYXBhYmlsaXR5IDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGlzIGtleSB3aWxsIGJlIHByZXNlbnQgaWYKKyAgICAgKiAgIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiAgIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX0sIHNpbmNlIFJBVworICAgICAqICAgaW1hZ2VzIG1heSBub3QgbmVjZXNzYXJpbHkgaGF2ZSBhIHJlZ3VsYXIgYmF5ZXIgcGF0dGVybiB3aGVuCisgICAgICogICB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19IGlzIHNldCB0bworICAgICAqICAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogPHA+PGI+VW5pdHM8L2I+OiBQaXhlbHM8L3A+CiAgICAgICogPHA+PGI+T3B0aW9uYWw8L2I+IC0gVGhlIHZhbHVlIGZvciB0aGlzIGtleSBtYXkgYmUge0Bjb2RlIG51bGx9IG9uIHNvbWUgZGV2aWNlcy48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFCiAgICAgICovCiAgICAgQFB1YmxpY0tleQogICAgIEBOb25OdWxsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5qYXZhCmluZGV4IDcyMmRkMDguLmU2YjMwNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5qYXZhCkBAIC0xMjUsNiArMTI1LDIzIEBACiAgICAgICAgICAgICAiY2FtZXJhLmVuYWJsZV9sYW5kc2NhcGVfdG9fcG9ydHJhaXQiOwogCiAgICAgLyoqCisgICAgICogRW5hYmxlIHBoeXNpY2FsIGNhbWVyYSBhdmFpbGFiaWxpdHkgY2FsbGJhY2tzIHdoZW4gdGhlIGxvZ2ljYWwgY2FtZXJhIGlzIHVuYXZhaWxhYmxlCisgICAgICoKKyAgICAgKiA8cD5QcmV2aW91c2x5IG9uY2UgYSBsb2dpY2FsIGNhbWVyYSBiZWNvbWVzIHVuYXZhaWxhYmxlLCBubyB7QGxpbmsKKyAgICAgKiAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0gb3Ige0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IHdpbGwgYmUgY2FsbGVkIHVudGlsCisgICAgICogdGhlIGxvZ2ljYWwgY2FtZXJhIGJlY29tZXMgYXZhaWxhYmxlIGFnYWluLiBUaGUgcmVzdWx0cyBpbiB0aGUgYXBwIG9wZW5pbmcgdGhlIGxvZ2ljYWwKKyAgICAgKiBjYW1lcmEgbm90IGFibGUgdG8gcmVjZWl2ZSBwaHlzaWNhbCBjYW1lcmEgYXZhaWxhYmlsaXR5IGNoYW5nZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5XaXRoIHRoaXMgY2hhbmdlLCB0aGUge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfSBhbmQge0BsaW5rCisgICAgICogI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gY2FuIHN0aWxsIGJlIGNhbGxlZCB3aGlsZSB0aGUgbG9naWNhbCBjYW1lcmEgaXMgdW5hdmFpbGFibGUuCisgICAgICogPC9wPgorICAgICAqLworICAgIEBDaGFuZ2VJZAorICAgIEBFbmFibGVkU2luY2UodGFyZ2V0U2RrVmVyc2lvbiA9IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5VUFNJREVfRE9XTl9DQUtFKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5BQkxFX1BIWVNJQ0FMX0NBTUVSQV9DQUxMQkFDS19GT1JfVU5BVkFJTEFCTEVfTE9HSUNBTF9DQU1FUkEgPQorICAgICAgICAgICAgMjQ0MzU4NTA2TDsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIENhbWVyYU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CkBAIC0xMTk0LDYgKzEyMTEsMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwaHlzaWNhbENhbGxiYWNrc0FyZUVuYWJsZWRGb3JVbmF2YWlsYWJsZUNhbWVyYSgpIHsKKyAgICAgICAgcmV0dXJuIENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKAorICAgICAgICAgICAgICAgIEVOQUJMRV9QSFlTSUNBTF9DQU1FUkFfQ0FMTEJBQ0tfRk9SX1VOQVZBSUxBQkxFX0xPR0lDQUxfQ0FNRVJBKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBIGNhbGxiYWNrIGZvciBjYW1lcmEgZGV2aWNlcyBiZWNvbWluZyBhdmFpbGFibGUgb3IgdW5hdmFpbGFibGUgdG8gb3Blbi4KICAgICAgKgogICAgICAqIDxwPkNhbWVyYXMgYmVjb21lIGF2YWlsYWJsZSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBpbiB1c2UsIG9yIHdoZW4gYSBuZXcKQEAgLTEyNzAsOSArMTI5NSwxMCBAQAogICAgICAgICAgKiB0byBiZWdpbiB3aXRoLCB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gbWF5IGJlIGludm9rZWQgYWZ0ZXIKICAgICAgICAgICoge0BsaW5rICNvbkNhbWVyYUF2YWlsYWJsZX0uPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiA8cD5MaW1pdGF0aW9uOiBPcGVuaW5nIGEgbG9naWNhbCBjYW1lcmEgZGlzYWJsZXMgdGhlIHtAbGluayAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0KLSAgICAgICAgICogYW5kIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBjYWxsYmFja3MgZm9yIGl0cyBwaHlzaWNhbCBjYW1lcmFzLiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogaWYgYXBwIEEgb3BlbnMgdGhlIGNhbWVyYSBkZXZpY2U6PC9wPgorICAgICAgICAgKiA8cD5JZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyN0YXJnZXRTZGtWZXJzaW9uIHRhcmdldFNka1ZlcnNpb259CisgICAgICAgICAqICZsdDsge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwgb3BlbmluZyBhIGxvZ2ljYWwgY2FtZXJhCisgICAgICAgICAqIGRpc2FibGVzIHRoZSB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFBdmFpbGFibGV9IGFuZCB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0KKyAgICAgICAgICogY2FsbGJhY2tzIGZvciBpdHMgcGh5c2ljYWwgY2FtZXJhcy4gRm9yIGV4YW1wbGUsIGlmIGFwcCBBIG9wZW5zIHRoZSBjYW1lcmEgZGV2aWNlOjwvcD4KICAgICAgICAgICoKICAgICAgICAgICogPHVsPgogICAgICAgICAgKgpAQCAtMTI4NCw2ICsxMzEwLDMzIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqCisgICAgICAgICAqIDxwPklmIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvI3RhcmdldFNka1ZlcnNpb24gdGFyZ2V0U2RrVmVyc2lvbn0KKyAgICAgICAgICogJmdlOyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9OjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKgorICAgICAgICAgKiA8bGk+QSBwaHlzaWNhbCBjYW1lcmEgc3RhdHVzIGNoYW5nZSB3aWxsIHRyaWdnZXIge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfQorICAgICAgICAgKiBvciB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gZXZlbiBhZnRlciB0aGUgbG9naWNhbCBjYW1lcmEgYmVjb21lcworICAgICAgICAgKiB1bmF2YWlsYWJsZS4gQSB7QGxpbmsgI29uQ2FtZXJhVW5hdmFpbGFibGV9IGNhbGwgZm9yIGEgbG9naWNhbCBjYW1lcmEgZG9lc24ndCByZXNldCB0aGUKKyAgICAgICAgICogcGh5c2ljYWwgY2FtZXJhcycgYXZhaWxhYmlsaXR5IHN0YXR1cy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gb3BlbmluZworICAgICAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIHRvIGtub3cgd2hpY2ggcGh5c2ljYWwgY2FtZXJhIGJlY29tZXMgdW5hdmFpbGFibGUgb3IgYXZhaWxhYmxlCisgICAgICAgICAqIHRvIHVzZS48L2xpPgorICAgICAgICAgKgorICAgICAgICAgKiA8bGk+U2ltaWxhciB0byB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1RJUkFNSVNVIEFuZHJvaWQgMTN9IGFuZCBlYXJsaWVyLAorICAgICAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyB7QGxpbmsgI29uQ2FtZXJhQXZhaWxhYmxlfSBjYWxsYmFjayBpbXBsaWVzIGFsbCBvZiBpdHMgcGh5c2ljYWwKKyAgICAgICAgICogY2FtZXJhcycgc3RhdHVzIGJlY29tZSBhdmFpbGFibGUuIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSB3aWxsIGJlIGNhbGxlZAorICAgICAgICAgKiBmb3IgYW55IHVuYXZhaWxhYmxlIHBoeXNpY2FsIGNhbWVyYXMgdXBvbiB0aGUgbG9naWNhbCBjYW1lcmEgYmVjb21pbmcgYXZhaWxhYmxlLjwvbGk+CisgICAgICAgICAqCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPkdpdmVuIHRoZSBwaXBlbGluZSBuYXR1cmUgb2YgdGhlIGNhbWVyYSBjYXB0dXJlIHRocm91Z2gge0BsaW5rCisgICAgICAgICAqIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdH0sIHRoZXJlIG1heSBiZSBmcmFtZSBkcm9wcyBpZiB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICogcmVxdWVzdHMgaW1hZ2VzIGZyb20gYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBhbmQgdGhhdCBwaHlzaWNhbCBjYW1lcmEKKyAgICAgICAgICogYmVjb21lcyB1bmF2YWlsYWJsZS4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdG9wIHJlcXVlc3RpbmcgZGlyZWN0bHkgZnJvbSBhbiB1bmF2YWlsYWJsZQorICAgICAgICAgKiBwaHlzaWNhbCBjYW1lcmEgYXMgc29vbiBhcyB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gaXMgcmVjZWl2ZWQsIGFuZCBhbHNvIGJlCisgICAgICAgICAqIHJlYWR5IHRvIHJvYnVzdGx5IGhhbmRsZSBmcmFtZSBkcm9wIGVycm9ycyBmb3IgcmVxdWVzdHMgdGFyZ2V0aW5nIHBoeXNpY2FsIGNhbWVyYXMsCisgICAgICAgICAqIHNpbmNlIHRob3NlIGVycm9ycyBtYXkgYXJyaXZlIGJlZm9yZSB0aGUgdW5hdmFpbGFiaWxpdHkgY2FsbGJhY2suPC9wPgorICAgICAgICAgKgogICAgICAgICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gY2FtZXJhSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KQEAgLTEzMDYsOSArMTM1OSwxMCBAQAogICAgICAgICAgKiBjYW1lcmFzIG9mIGl0cyBwYXJlbnQgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHdoZW4ge0BsaW5rICNvbkNhbWVyYVVuYXZhaWxhYmxlfSBmb3IKICAgICAgICAgICogdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGlzIGludm9rZWQuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiA8cD5MaW1pdGF0aW9uOiBPcGVuaW5nIGEgbG9naWNhbCBjYW1lcmEgZGlzYWJsZXMgdGhlIHtAbGluayAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0KLSAgICAgICAgICogYW5kIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBjYWxsYmFja3MgZm9yIGl0cyBwaHlzaWNhbCBjYW1lcmFzLiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogaWYgYXBwIEEgb3BlbnMgdGhlIGNhbWVyYSBkZXZpY2U6PC9wPgorICAgICAgICAgKiA8cD5JZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyN0YXJnZXRTZGtWZXJzaW9uIHRhcmdldFNka1ZlcnNpb259CisgICAgICAgICAqICZsdDsge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwgb3BlbmluZyBhIGxvZ2ljYWwgY2FtZXJhCisgICAgICAgICAqIGRpc2FibGVzIHRoZSB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFBdmFpbGFibGV9IGFuZCB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0KKyAgICAgICAgICogY2FsbGJhY2tzIGZvciBpdHMgcGh5c2ljYWwgY2FtZXJhcy4gRm9yIGV4YW1wbGUsIGlmIGFwcCBBIG9wZW5zIHRoZSBjYW1lcmEgZGV2aWNlOjwvcD4KICAgICAgICAgICoKICAgICAgICAgICogPHVsPgogICAgICAgICAgKgpAQCAtMTMyMCw2ICsxMzc0LDMzIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqCisgICAgICAgICAqIDxwPklmIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvI3RhcmdldFNka1ZlcnNpb24gdGFyZ2V0U2RrVmVyc2lvbn0KKyAgICAgICAgICogJmdlOyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9OjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKgorICAgICAgICAgKiA8bGk+QSBwaHlzaWNhbCBjYW1lcmEgc3RhdHVzIGNoYW5nZSB3aWxsIHRyaWdnZXIge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfQorICAgICAgICAgKiBvciB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gZXZlbiBhZnRlciB0aGUgbG9naWNhbCBjYW1lcmEgYmVjb21lcworICAgICAgICAgKiB1bmF2YWlsYWJsZS4gQSB7QGxpbmsgI29uQ2FtZXJhVW5hdmFpbGFibGV9IGNhbGwgZm9yIGEgbG9naWNhbCBjYW1lcmEgZG9lc24ndCByZXNldCB0aGUKKyAgICAgICAgICogcGh5c2ljYWwgY2FtZXJhcycgYXZhaWxhYmlsaXR5IHN0YXR1cy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gb3BlbmluZworICAgICAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIHRvIGtub3cgd2hpY2ggcGh5c2ljYWwgY2FtZXJhIGJlY29tZXMgdW5hdmFpbGFibGUgb3IgYXZhaWxhYmxlCisgICAgICAgICAqIHRvIHVzZS48L2xpPgorICAgICAgICAgKgorICAgICAgICAgKiA8bGk+U2ltaWxhciB0byB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1RJUkFNSVNVIEFuZHJvaWQgMTN9IGFuZCBlYXJsaWVyLAorICAgICAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyB7QGxpbmsgI29uQ2FtZXJhQXZhaWxhYmxlfSBjYWxsYmFjayBpbXBsaWVzIGFsbCBvZiBpdHMgcGh5c2ljYWwKKyAgICAgICAgICogY2FtZXJhcycgc3RhdHVzIGJlY29tZSBhdmFpbGFibGUuIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSB3aWxsIGJlIGNhbGxlZAorICAgICAgICAgKiBmb3IgYW55IHVuYXZhaWxhYmxlIHBoeXNpY2FsIGNhbWVyYXMgdXBvbiB0aGUgbG9naWNhbCBjYW1lcmEgYmVjb21pbmcgYXZhaWxhYmxlLjwvbGk+CisgICAgICAgICAqCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPkdpdmVuIHRoZSBwaXBlbGluZSBuYXR1cmUgb2YgdGhlIGNhbWVyYSBjYXB0dXJlIHRocm91Z2gge0BsaW5rCisgICAgICAgICAqIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdH0sIHRoZXJlIG1heSBiZSBmcmFtZSBkcm9wcyBpZiB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICogcmVxdWVzdHMgaW1hZ2VzIGZyb20gYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBhbmQgdGhhdCBwaHlzaWNhbCBjYW1lcmEKKyAgICAgICAgICogYmVjb21lcyB1bmF2YWlsYWJsZS4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdG9wIHJlcXVlc3RpbmcgZGlyZWN0bHkgZnJvbSBhbiB1bmF2YWlsYWJsZQorICAgICAgICAgKiBwaHlzaWNhbCBjYW1lcmEgYXMgc29vbiBhcyB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gaXMgcmVjZWl2ZWQsIGFuZCBhbHNvIGJlCisgICAgICAgICAqIHJlYWR5IHRvIHJvYnVzdGx5IGhhbmRsZSBmcmFtZSBkcm9wIGVycm9ycyBmb3IgcmVxdWVzdHMgdGFyZ2V0aW5nIHBoeXNpY2FsIGNhbWVyYXMsCisgICAgICAgICAqIHNpbmNlIHRob3NlIGVycm9ycyBtYXkgYXJyaXZlIGJlZm9yZSB0aGUgdW5hdmFpbGFiaWxpdHkgY2FsbGJhY2suPC9wPgorICAgICAgICAgKgogICAgICAgICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gY2FtZXJhSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KQEAgLTIyODMsNyArMjM2NCw4IEBACiAgICAgICAgICAgICAgICAgcG9zdFNpbmdsZVVwZGF0ZShjYWxsYmFjaywgZXhlY3V0b3IsIGlkLCBudWxsIC8qcGh5c2ljYWxJZCovLCBzdGF0dXMpOwogCiAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgTk9UX1BSRVNFTlQgc3RhdGUgZm9yIHVuYXZhaWxhYmxlIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgICAgICAgICBpZiAoaXNBdmFpbGFibGUoc3RhdHVzKSAmJiBtVW5hdmFpbGFibGVQaHlzaWNhbERldmljZXMuY29udGFpbnNLZXkoaWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKChpc0F2YWlsYWJsZShzdGF0dXMpIHx8IHBoeXNpY2FsQ2FsbGJhY2tzQXJlRW5hYmxlZEZvclVuYXZhaWxhYmxlQ2FtZXJhKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVW5hdmFpbGFibGVQaHlzaWNhbERldmljZXMuY29udGFpbnNLZXkoaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHVuYXZhaWxhYmxlSWRzID0gbVVuYXZhaWxhYmxlUGh5c2ljYWxEZXZpY2VzLmdldChpZCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHVuYXZhaWxhYmxlSWQgOiB1bmF2YWlsYWJsZUlkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFNpbmdsZVVwZGF0ZShjYWxsYmFjaywgZXhlY3V0b3IsIGlkLCB1bmF2YWlsYWJsZUlkLApAQCAtMjQxNiw3ICsyNDk4LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghaXNBdmFpbGFibGUobURldmljZVN0YXR1cy5nZXQoaWQpKSkgeworICAgICAgICAgICAgaWYgKCFwaHlzaWNhbENhbGxiYWNrc0FyZUVuYWJsZWRGb3JVbmF2YWlsYWJsZUNhbWVyYSgpCisgICAgICAgICAgICAgICAgICAgICYmICFpc0F2YWlsYWJsZShtRGV2aWNlU3RhdHVzLmdldChpZCkpKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJDYW1lcmEgJXMgaXMgbm90IGF2YWlsYWJsZS4gSWdub3JlIHBoeXNpY2FsIGNhbWVyYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJzdGF0dXMgY2hhbmdlIGNhbGxiYWNrKHMpIiwgaWQpKTsKICAgICAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmphdmEKaW5kZXggNzA1YWZjNS4uZWQyYTE5OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuamF2YQpAQCAtMzY0NSwxNyArMzY0NSwxMyBAQAogICAgIC8vCiAKICAgICAvKioKLSAgICAgKiA8cD5UaGlzIGlzIHRoZSBkZWZhdWx0IHNlbnNvciBwaXhlbCBtb2RlLiBUaGlzIGlzIHRoZSBvbmx5IHNlbnNvciBwaXhlbCBtb2RlCi0gICAgICogc3VwcG9ydGVkIHVubGVzcyBhIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcwotICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfS48L3A+CisgICAgICogPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBzZW5zb3IgcGl4ZWwgbW9kZS48L3A+CiAgICAgICogQHNlZSBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgPSAwOwogCiAgICAgLyoqCi0gICAgICogPHA+VGhpcyBzZW5zb3IgcGl4ZWwgbW9kZSBpcyBvZmZlcmVkIGJ5IGRldmljZXMgd2l0aCBjYXBhYmlsaXR5Ci0gICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9LgotICAgICAqIEluIHRoaXMgbW9kZSwgc2Vuc29ycyB0eXBpY2FsbHkgZG8gbm90IGJpbiBwaXhlbHMsIGFzIGEgcmVzdWx0IGNhbiBvZmZlciBsYXJnZXIKKyAgICAgKiA8cD5JbiB0aGlzIG1vZGUsIHNlbnNvcnMgdHlwaWNhbGx5IGRvIG5vdCBiaW4gcGl4ZWxzLCBhcyBhIHJlc3VsdCBjYW4gb2ZmZXIgbGFyZ2VyCiAgICAgICogaW1hZ2Ugc2l6ZXMuPC9wPgogICAgICAqIEBzZWUgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUKICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuamF2YQppbmRleCAzODFjODdkLi45Mjk4NjhiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5qYXZhCkBAIC0xNDMwLDcgKzE0MzAsOSBAQAogICAgICAqIG1vZGUuPC9wPgogICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHksCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX0KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IG11c3QgYmUgdXNlZCBhcyB0aGUKICAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX0gaXMgc2V0IHRvCkBAIC0xNjYwLDcgKzE2NjIsMTAgQEAKICAgICAgKiBtb2RlLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LCB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX0sCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLwogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSBtdXN0IGJlIHVzZWQgYXMgdGhlCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9IGlzIHNldCB0bwogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uPC9wPgpAQCAtMTg4Miw3ICsxODg3LDEwIEBACiAgICAgICogbW9kZS48L3A+CiAgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSwge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLworICAgICAqIGNhcGFiaWxpdHkgb3IgZGV2aWNlcyB3aGVyZQorICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19LAorICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LjwvcD4KQEAgLTMxNjksNyArMzE3Nyw5IEBACiAgICAgICoge0BsaW5rIENhcHR1cmVSZXF1ZXN0I0NPTlRST0xfWk9PTV9SQVRJTyBhbmRyb2lkLmNvbnRyb2wuem9vbVJhdGlvfSBmb3IgZGV0YWlscy48L3A+CiAgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSwge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLworICAgICAqIGNhcGFiaWxpdHkgb3IgZGV2aWNlcyB3aGVyZSB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fTwvcD4KKyAgICAgKiA8cD57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IG11c3QgYmUgdXNlZCBhcyB0aGUKICAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX0gaXMgc2V0IHRvCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS48L3A+CkBAIC0zNTE3LDEzICszNTI3LDEwIEBACiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIH0gbW9kZS4KICAgICAgKiBXaGVuIG9wZXJhdGluZyBpbgogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCB9IG1vZGUsIHNlbnNvcnMKLSAgICAgKiB3aXRoIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHkgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gcGl4ZWwgYmlubmluZyBpbiBvcmRlciB0byBpbXByb3ZlIGxvdyBsaWdodAorICAgICAqIHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHBpeGVsIGJpbm5pbmcgaW4gb3JkZXIgdG8gaW1wcm92ZSBsb3cgbGlnaHQKICAgICAgKiBwZXJmb3JtYW5jZSwgbm9pc2UgcmVkdWN0aW9uIGV0Yy4gSG93ZXZlciwgaW4KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9Ci0gICAgICogbW9kZSAoc3VwcG9ydGVkIG9ubHkKLSAgICAgKiBieSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBzZW5zb3JzKSwgc2Vuc29ycyB0eXBpY2FsbHkgb3BlcmF0ZSBpbiB1bmJpbm5lZCBtb2RlIGFsbG93aW5nIGZvciBhIGxhcmdlciBpbWFnZSBzaXplLgorICAgICAqIG1vZGUsIHNlbnNvcnMgdHlwaWNhbGx5IG9wZXJhdGUgaW4gdW5iaW5uZWQgbW9kZSBhbGxvd2luZyBmb3IgYSBsYXJnZXIgaW1hZ2Ugc2l6ZS4KICAgICAgKiBUaGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBpbgogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0KICAgICAgKiBtb2RlIGFyZSBhbHNvIGRpZmZlcmVudCBmcm9tIHRob3NlIG9mCkBAIC0zNTM3LDcgKzM1NDQsMzIgQEAKICAgICAgKiA8Y29kZT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVAgYW5kcm9pZC5zY2FsZXIuc3RyZWFtQ29uZmlndXJhdGlvbk1hcH08L2NvZGU+CiAgICAgICogbXVzdCBub3QgYmUgbWl4ZWQgaW4gdGhlIHNhbWUgQ2FwdHVyZVJlcXVlc3QuIEluIG90aGVyIHdvcmRzLCB0aGVzZSBvdXRwdXRzIGFyZQogICAgICAqIGV4Y2x1c2l2ZSB0byBlYWNoIG90aGVyLgotICAgICAqIFRoaXMga2V5IGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0IGZvciByZXByb2Nlc3MgcmVxdWVzdHMuPC9wPgorICAgICAqIFRoaXMga2V5IGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0IGZvciByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICogVGhpcyBrZXkgd2lsbCBiZSBiZSBwcmVzZW50IG9uIGRldmljZXMgc3VwcG9ydGluZyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KKyAgICAgKiBjYXBhYmlsaXR5LiBJdCBtYXkgYWxzbyBiZSBwcmVzZW50IG9uIGRldmljZXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIGFmb3JlbWVudGlvbmVkCisgICAgICogY2FwYWJpbGl0eS4gSW4gdGhhdCBjYXNlOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIDxwPlRoZSBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyBsaXN0ZWQgaW4KKyAgICAgKiAgIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLm1hbmRhdG9yeU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29tYmluYXRpb25zIH0KKyAgICAgKiAgIHdvdWxkIG5vdCBhcHBseS48L3A+CisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogPHA+VGhlIGJheWVyIHBhdHRlcm4gb2Yge0Bjb2RlIFJBV30gc3RyZWFtcyB3aGVuCisgICAgICogICB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9CisgICAgICogICBpcyBzZWxlY3RlZCB3aWxsIGJlIHRoZSBvbmUgbGlzdGVkIGluIHtAbGluayBhbmRyb2lkLnNlbnNvci5pbmZvLmJpbm5pbmdGYWN0b3IgfS48L3A+CisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogPHA+VGhlIGZvbGxvd2luZyBrZXlzIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQ6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwTWF4aW11bVJlc29sdXRpb259PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucGl4ZWxBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIDxwPjxiPlBvc3NpYmxlIHZhbHVlczo8L2I+PC9wPgogICAgICAqIDx1bD4KICAgICAgKiAgIDxsaT57QGxpbmsgI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgREVGQVVMVH08L2xpPgpAQCAtMzU0OCw2ICszNTgwLDkgQEAKICAgICAgKgogICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVAKICAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQX01BWElNVU1fUkVTT0xVVElPTgorICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgorICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCiAgICAgICogQHNlZSAjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVAogICAgICAqIEBzZWUgI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVzdWx0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXN1bHQuamF2YQppbmRleCA2MzVlNzljLi5hNDI5ZjMwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXN1bHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXN1bHQuamF2YQpAQCAtODQ5LDcgKzg0OSw5IEBACiAgICAgICogbW9kZS48L3A+CiAgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSwKKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fQogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KQEAgLTEzMjksNyArMTMzMSwxMCBAQAogICAgICAqIG1vZGUuPC9wPgogICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHksIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fSwKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IG11c3QgYmUgdXNlZCBhcyB0aGUKICAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX0gaXMgc2V0IHRvCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS48L3A+CkBAIC0xOTYyLDcgKzE5NjcsMTAgQEAKICAgICAgKiBtb2RlLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LCB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX0sCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLwogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSBtdXN0IGJlIHVzZWQgYXMgdGhlCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9IGlzIHNldCB0bwogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uPC9wPgpAQCAtMzgzMSw3ICszODM5LDkgQEAKICAgICAgKiB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjQ09OVFJPTF9aT09NX1JBVElPIGFuZHJvaWQuY29udHJvbC56b29tUmF0aW99IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LCB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19PC9wPgorICAgICAqIDxwPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LjwvcD4KQEAgLTQ0NDIsMTMgKzQ0NTIsMTAgQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgfSBtb2RlLgogICAgICAqIFdoZW4gb3BlcmF0aW5nIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIH0gbW9kZSwgc2Vuc29ycwotICAgICAqIHdpdGgge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSBwaXhlbCBiaW5uaW5nIGluIG9yZGVyIHRvIGltcHJvdmUgbG93IGxpZ2h0CisgICAgICogd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gcGl4ZWwgYmlubmluZyBpbiBvcmRlciB0byBpbXByb3ZlIGxvdyBsaWdodAogICAgICAqIHBlcmZvcm1hbmNlLCBub2lzZSByZWR1Y3Rpb24gZXRjLiBIb3dldmVyLCBpbgogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0KLSAgICAgKiBtb2RlIChzdXBwb3J0ZWQgb25seQotICAgICAqIGJ5IHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIHNlbnNvcnMpLCBzZW5zb3JzIHR5cGljYWxseSBvcGVyYXRlIGluIHVuYmlubmVkIG1vZGUgYWxsb3dpbmcgZm9yIGEgbGFyZ2VyIGltYWdlIHNpemUuCisgICAgICogbW9kZSwgc2Vuc29ycyB0eXBpY2FsbHkgb3BlcmF0ZSBpbiB1bmJpbm5lZCBtb2RlIGFsbG93aW5nIGZvciBhIGxhcmdlciBpbWFnZSBzaXplLgogICAgICAqIFRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfQogICAgICAqIG1vZGUgYXJlIGFsc28gZGlmZmVyZW50IGZyb20gdGhvc2Ugb2YKQEAgLTQ0NjIsNyArNDQ2OSwzMiBAQAogICAgICAqIDxjb2RlPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCBhbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwfTwvY29kZT4KICAgICAgKiBtdXN0IG5vdCBiZSBtaXhlZCBpbiB0aGUgc2FtZSBDYXB0dXJlUmVxdWVzdC4gSW4gb3RoZXIgd29yZHMsIHRoZXNlIG91dHB1dHMgYXJlCiAgICAgICogZXhjbHVzaXZlIHRvIGVhY2ggb3RoZXIuCi0gICAgICogVGhpcyBrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgZm9yIHJlcHJvY2VzcyByZXF1ZXN0cy48L3A+CisgICAgICogVGhpcyBrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgZm9yIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgKiBUaGlzIGtleSB3aWxsIGJlIGJlIHByZXNlbnQgb24gZGV2aWNlcyBzdXBwb3J0aW5nIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQorICAgICAqIGNhcGFiaWxpdHkuIEl0IG1heSBhbHNvIGJlIHByZXNlbnQgb24gZGV2aWNlcyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgYWZvcmVtZW50aW9uZWQKKyAgICAgKiBjYXBhYmlsaXR5LiBJbiB0aGF0IGNhc2U6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogPHA+VGhlIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIGxpc3RlZCBpbgorICAgICAqICAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MubWFuZGF0b3J5TWF4aW11bVJlc29sdXRpb25TdHJlYW1Db21iaW5hdGlvbnMgfQorICAgICAqICAgd291bGQgbm90IGFwcGx5LjwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiA8cD5UaGUgYmF5ZXIgcGF0dGVybiBvZiB7QGNvZGUgUkFXfSBzdHJlYW1zIHdoZW4KKyAgICAgKiAgIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0KKyAgICAgKiAgIGlzIHNlbGVjdGVkIHdpbGwgYmUgdGhlIG9uZSBsaXN0ZWQgaW4ge0BsaW5rIGFuZHJvaWQuc2Vuc29yLmluZm8uYmlubmluZ0ZhY3RvciB9LjwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiA8cD5UaGUgZm9sbG93aW5nIGtleXMgd2lsbCBhbHdheXMgYmUgcHJlc2VudDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVBfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXBNYXhpbXVtUmVzb2x1dGlvbn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogPHA+PGI+UG9zc2libGUgdmFsdWVzOjwvYj48L3A+CiAgICAgICogPHVsPgogICAgICAqICAgPGxpPntAbGluayAjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCBERUZBVUxUfTwvbGk+CkBAIC00NDczLDYgKzQ1MDUsOSBAQAogICAgICAqCiAgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUAogICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVBfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KICAgICAgKiBAc2VlICNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUCiAgICAgICogQHNlZSAjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2ltcGwvQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbkltcGwuamF2YQppbmRleCBkYjgzZTYyLi4yZmE4Yjg3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2ltcGwvQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEKQEAgLTEwMSwxNSArMTAxLDE1IEBACiAKIAogICAgIC8vIExvY2sgdG8gc3luY2hyb25pemUgY3Jvc3MtdGhyZWFkIGFjY2VzcyB0byBkZXZpY2UgcHVibGljIGludGVyZmFjZQotICAgIGZpbmFsIE9iamVjdCBtSW50ZXJmYWNlTG9jayA9IG5ldyBPYmplY3QoKTsgLy8gYWNjZXNzIGZyb20gdGhpcyBjbGFzcyBhbmQgU2Vzc2lvbiBvbmx5IQorICAgIGZpbmFsIE9iamVjdCBtSW50ZXJmYWNlTG9jazsKIAogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBKQogICAgIHB1YmxpYyBzdGF0aWMgQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbCBjcmVhdGVDYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb24oCi0gICAgICAgICAgICBATm9uTnVsbCBDYW1lcmFEZXZpY2UgY2FtZXJhRGV2aWNlLCBATm9uTnVsbCBDb250ZXh0IGN0eCwKLSAgICAgICAgICAgIEBOb25OdWxsIEV4dGVuc2lvblNlc3Npb25Db25maWd1cmF0aW9uIGNvbmZpZywgaW50IHNlc3Npb25JZCkKKyAgICAgICAgICAgIEBOb25OdWxsIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYURldmljZUltcGwgY2FtZXJhRGV2aWNlLAorICAgICAgICAgICAgQE5vbk51bGwgQ29udGV4dCBjdHgsIEBOb25OdWxsIEV4dGVuc2lvblNlc3Npb25Db25maWd1cmF0aW9uIGNvbmZpZywgaW50IHNlc3Npb25JZCkKICAgICAgICAgICAgIHRocm93cyBDYW1lcmFBY2Nlc3NFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgY2xpZW50SWQgPSBDYW1lcmFFeHRlbnNpb25DaGFyYWN0ZXJpc3RpY3MucmVnaXN0ZXJDbGllbnQoY3R4KTsKICAgICAgICAgaWYgKGNsaWVudElkIDwgMCkgewpAQCAtMjA5LDcgKzIwOSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBDYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb25JbXBsKGxvbmcgZXh0ZW5zaW9uQ2xpZW50SWQsCi0gICAgICAgICAgICBATm9uTnVsbCBJQWR2YW5jZWRFeHRlbmRlckltcGwgZXh0ZW5kZXIsIEBOb25OdWxsIENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsCisgICAgICAgICAgICBATm9uTnVsbCBJQWR2YW5jZWRFeHRlbmRlckltcGwgZXh0ZW5kZXIsCisgICAgICAgICAgICBATm9uTnVsbCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFEZXZpY2VJbXBsIGNhbWVyYURldmljZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdXJmYWNlIHJlcGVhdGluZ1JlcXVlc3RTdXJmYWNlLCBATnVsbGFibGUgU3VyZmFjZSBidXJzdENhcHR1cmVTdXJmYWNlLAogICAgICAgICAgICAgQE51bGxhYmxlIFN1cmZhY2UgcG9zdHZpZXdTdXJmYWNlLAogICAgICAgICAgICAgQE5vbk51bGwgQ2FtZXJhRXh0ZW5zaW9uU2Vzc2lvbi5TdGF0ZUNhbGxiYWNrIGNhbGxiYWNrLCBATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvciwKQEAgLTIyOCw2ICsyMjksNyBAQAogICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgbUluaXRpYWxpemVIYW5kbGVyID0gbmV3IEluaXRpYWxpemVTZXNzaW9uSGFuZGxlcigpOwogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBtSW50ZXJmYWNlTG9jayA9IGNhbWVyYURldmljZS5tSW50ZXJmYWNlTG9jazsKICAgICB9CiAKICAgICAvKioKQEAgLTU5OSwxMyArNjAxLDE0IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJlZChATm9uTnVsbCBDYW1lcmFDYXB0dXJlU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnRlcmZhY2VMb2NrKSB7CiAgICAgICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDYW1lcmFFeHRlbnNpb25DaGFyYWN0ZXJpc3RpY3MuaW5pdGlhbGl6ZVNlc3Npb24obUluaXRpYWxpemVIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzZXNzaW9uISBFeHRlbnNpb24gc2VydmljZSBkb2VzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgcmVzcG9uZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2FtZXJhRXh0ZW5zaW9uQ2hhcmFjdGVyaXN0aWNzLmluaXRpYWxpemVTZXNzaW9uKG1Jbml0aWFsaXplSGFuZGxlcik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbml0aWFsaXplIHNlc3Npb24hIEV4dGVuc2lvbiBzZXJ2aWNlIGRvZXMiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHJlc3BvbmQhIik7CisgICAgICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTYxMyw0NiArNjE2LDU2IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBJbml0aWFsaXplU2Vzc2lvbkhhbmRsZXIgZXh0ZW5kcyBJSW5pdGlhbGl6ZVNlc3Npb25DYWxsYmFjay5TdHViIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcygpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gdHJ1ZTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUludGVyZmFjZUxvY2spIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25Qcm9jZXNzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25Qcm9jZXNzb3Iub25DYXB0dXJlU2Vzc2lvblN0YXJ0KG1SZXF1ZXN0UHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGYWlsZWQgdG8gc3RhcnQgY2FwdHVyZSBzZXNzaW9uLCBzZXNzaW9uIHJlbGVhc2VkIGJlZm9yZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBzdGFydCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJmYWNlTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25Qcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblByb2Nlc3Nvci5vbkNhcHR1cmVTZXNzaW9uU3RhcnQobVJlcXVlc3RQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZhaWxlZCB0byBzdGFydCBjYXB0dXJlIHNlc3Npb24sIHNlc3Npb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbGVhc2VkIGJlZm9yZSBleHRlbnNpb24gc3RhcnQhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IGNhcHR1cmUgc2Vzc2lvbiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXh0ZW5zaW9uIHNlcnZpY2UgZG9lcyBub3QgcmVzcG9uZCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBjYXB0dXJlIHNlc3Npb24sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbnNpb24gc2VydmljZSBkb2VzIG5vdCByZXNwb25kISIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IG1DYWxsYmFja3Mub25Db25maWd1cmVkKENhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbkltcGwudGhpcykpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBtQ2FsbGJhY2tzLm9uQ29uZmlndXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbkltcGwudGhpcykpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZSgpIHsKLSAgICAgICAgICAgIG1DYXB0dXJlU2Vzc2lvbi5jbG9zZSgpOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJveHkgc2VydmljZSBzZXNzaW9uISIKLSAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRyeWluZyB0byBjb25maWd1cmUgbXVsdGlwbGUgIgotICAgICAgICAgICAgICAgICAgICArICJjb25jdXJyZW50IGV4dGVuc2lvbiBzZXNzaW9ucyEiKTsKLSAgICAgICAgICAgIG5vdGlmeUNvbmZpZ3VyYXRpb25GYWlsdXJlKCk7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlU2Vzc2lvbi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbml0aWFsaXplIHByb3h5IHNlcnZpY2Ugc2Vzc2lvbiEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRyeWluZyB0byBjb25maWd1cmUgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbmN1cnJlbnQgZXh0ZW5zaW9uIHNlc3Npb25zISIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2ltcGwvQ2FtZXJhRXh0ZW5zaW9uU2Vzc2lvbkltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhCmluZGV4IGMyYjM2NTYuLjljODc4YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsUmVwZWF0aW5nUmVxdWVzdEVuYWJsZWQgPSB0cnVlOwogCiAgICAgLy8gTG9jayB0byBzeW5jaHJvbml6ZSBjcm9zcy10aHJlYWQgYWNjZXNzIHRvIGRldmljZSBwdWJsaWMgaW50ZXJmYWNlCi0gICAgZmluYWwgT2JqZWN0IG1JbnRlcmZhY2VMb2NrID0gbmV3IE9iamVjdCgpOyAvLyBhY2Nlc3MgZnJvbSB0aGlzIGNsYXNzIGFuZCBTZXNzaW9uIG9ubHkhCisgICAgZmluYWwgT2JqZWN0IG1JbnRlcmZhY2VMb2NrOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5hdGl2ZUdldFN1cmZhY2VGb3JtYXQoU3VyZmFjZSBzdXJmYWNlKSB7CiAgICAgICAgIHJldHVybiBTdXJmYWNlVXRpbHMuZ2V0U3VyZmFjZUZvcm1hdChzdXJmYWNlKTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSkKICAgICBwdWJsaWMgc3RhdGljIENhbWVyYUV4dGVuc2lvblNlc3Npb25JbXBsIGNyZWF0ZUNhbWVyYUV4dGVuc2lvblNlc3Npb24oCi0gICAgICAgICAgICBATm9uTnVsbCBDYW1lcmFEZXZpY2UgY2FtZXJhRGV2aWNlLAorICAgICAgICAgICAgQE5vbk51bGwgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmltcGwuQ2FtZXJhRGV2aWNlSW1wbCBjYW1lcmFEZXZpY2UsCiAgICAgICAgICAgICBATm9uTnVsbCBDb250ZXh0IGN0eCwKICAgICAgICAgICAgIEBOb25OdWxsIEV4dGVuc2lvblNlc3Npb25Db25maWd1cmF0aW9uIGNvbmZpZywKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgICAgICAgIEBOb25OdWxsIElQcmV2aWV3RXh0ZW5kZXJJbXBsIHByZXZpZXdFeHRlbmRlciwKICAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8U2l6ZT4gcHJldmlld1NpemVzLAogICAgICAgICAgICAgbG9uZyBleHRlbnNpb25DbGllbnRJZCwKLSAgICAgICAgICAgIEBOb25OdWxsIENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsCisgICAgICAgICAgICBATm9uTnVsbCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFEZXZpY2VJbXBsIGNhbWVyYURldmljZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdXJmYWNlIHJlcGVhdGluZ1JlcXVlc3RTdXJmYWNlLAogICAgICAgICAgICAgQE51bGxhYmxlIFN1cmZhY2UgYnVyc3RDYXB0dXJlU3VyZmFjZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdXJmYWNlIHBvc3R2aWV3U3VyZmFjZSwKQEAgLTI3OSw2ICsyNzksNyBAQAogICAgICAgICBtU3VwcG9ydGVkUmVxdWVzdEtleXMgPSByZXF1ZXN0S2V5czsKICAgICAgICAgbVN1cHBvcnRlZFJlc3VsdEtleXMgPSByZXN1bHRLZXlzOwogICAgICAgICBtQ2FwdHVyZVJlc3VsdHNTdXBwb3J0ZWQgPSAhcmVzdWx0S2V5cy5pc0VtcHR5KCk7CisgICAgICAgIG1JbnRlcmZhY2VMb2NrID0gY2FtZXJhRGV2aWNlLm1JbnRlcmZhY2VMb2NrOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplUmVwZWF0aW5nUmVxdWVzdFBpcGVsaW5lKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC05NjksNDYgKzk3MCw1NiBAQAogICAgIHByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZVNlc3Npb25IYW5kbGVyIGV4dGVuZHMgSUluaXRpYWxpemVTZXNzaW9uQ2FsbGJhY2suU3R1YiB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoKSB7Ci0gICAgICAgICAgICBib29sZWFuIHN0YXR1cyA9IHRydWU7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8Q2FwdHVyZVN0YWdlSW1wbD4gaW5pdGlhbFJlcXVlc3RMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZUluaXRpYWxSZXF1ZXN0TGlzdCgpOwotICAgICAgICAgICAgaWYgKCFpbml0aWFsUmVxdWVzdExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbENhcHR1cmVSZXF1ZXN0KGluaXRpYWxSZXF1ZXN0TGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5pdGlhbFJlcXVlc3RIYW5kbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcGVhdGluZ1JlcXVlc3RJbWFnZUNhbGxiYWNrKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaW5pdGlhbCBjYXB0dXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3QhIik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmVwZWF0aW5nUmVxdWVzdChtUHJldmlld0V4dGVuZGVyLmdldENhcHR1cmVTdGFnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcmV2aWV3UmVxdWVzdEhhbmRsZXIobnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0SW1hZ2VDYWxsYmFjaykpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiB8IFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgcmVwZWF0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3QhIik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8Q2FwdHVyZVN0YWdlSW1wbD4gaW5pdGlhbFJlcXVlc3RMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlSW5pdGlhbFJlcXVlc3RMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbFJlcXVlc3RMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2FwdHVyZVJlcXVlc3QoaW5pdGlhbFJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluaXRpYWxSZXF1ZXN0SGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcGVhdGluZ1JlcXVlc3RJbWFnZUNhbGxiYWNrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaW5pdGlhbCBjYXB0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVxdWVzdCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVwZWF0aW5nUmVxdWVzdChtUHJldmlld0V4dGVuZGVyLmdldENhcHR1cmVTdGFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByZXZpZXdSZXF1ZXN0SGFuZGxlcihudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVwZWF0aW5nUmVxdWVzdEltYWdlQ2FsbGJhY2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiB8IFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGludGVybmFsIHJlcGVhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3QhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIXN0YXR1cykgewotICAgICAgICAgICAgICAgIG5vdGlmeUNvbmZpZ3VyYXRpb25GYWlsdXJlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKCkgewotICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm94eSBzZXJ2aWNlIHNlc3Npb24hIgotICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImNvbmN1cnJlbnQgZXh0ZW5zaW9uIHNlc3Npb25zISIpOwotICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbml0aWFsaXplIHByb3h5IHNlcnZpY2Ugc2Vzc2lvbiEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRyeWluZyB0byBjb25maWd1cmUgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbmN1cnJlbnQgZXh0ZW5zaW9uIHNlc3Npb25zISIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2ltcGwvQ2FtZXJhTWV0YWRhdGFOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFNZXRhZGF0YU5hdGl2ZS5qYXZhCmluZGV4IDYzMWRmMDEuLjk3NDNjMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFNZXRhZGF0YU5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFNZXRhZGF0YU5hdGl2ZS5qYXZhCkBAIC0xNjE4LDE1ICsxNjE4LDIwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJlYW1Db25maWd1cmF0aW9uTWFwIGdldFN0cmVhbUNvbmZpZ3VyYXRpb25NYXBNYXhpbXVtUmVzb2x1dGlvbigpIHsKLSAgICAgICAgaWYgKCFpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbltdIGNvbmZpZ3VyYXRpb25zID0gZ2V0QmFzZSgKICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OKTsKICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbkR1cmF0aW9uW10gbWluRnJhbWVEdXJhdGlvbnMgPSBnZXRCYXNlKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OKTsKICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbkR1cmF0aW9uW10gc3RhbGxEdXJhdGlvbnMgPSBnZXRCYXNlKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04pOworICAgICAgICAvLyBJZiB0aGUgYXQgbGVhc3QgdGhlc2Uga2V5cyBoYXZlbid0IGJlZW4gYWR2ZXJ0aXNlZCwgdGhlcmUgY2Fubm90IGJlIGEgbWVhbmluZ2Z1bCBtYXgKKyAgICAgICAgLy8gcmVzb2x1dGlvbiBTdHJlYW1Db25maWd1cmF0aW9uTWFwCisgICAgICAgIGlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgbWluRnJhbWVEdXJhdGlvbnMgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIHN0YWxsRHVyYXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbltdIGRlcHRoQ29uZmlndXJhdGlvbnMgPSBnZXRCYXNlKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTik7CiAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25EdXJhdGlvbltdIGRlcHRoTWluRnJhbWVEdXJhdGlvbnMgPSBnZXRCYXNlKApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQppbmRleCA4YTQwZDAwLi5hYTU1ZTU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VOU09SX0FDQ1VSQUNZX0NIQU5HRUQgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VOU09SX0NIQU5HRUQgPSAyOwogCi0gICAgcHJpdmF0ZSBJbnB1dE1hbmFnZXIgbUlucHV0TWFuYWdlcjsKKyAgICBwcml2YXRlIElucHV0TWFuYWdlckdsb2JhbCBtR2xvYmFsOwogCiAgICAgLy8gc2Vuc29yIG1hcCBmcm9tIGRldmljZSBpZCB0byBzZW5zb3IgbGlzdAogICAgIEBHdWFyZGVkQnkoIm1JbnB1dFNlbnNvckxvY2siKQpAQCAtNzAsMTUgKzcwLDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyVGhyZWFkIG1TZW5zb3JUaHJlYWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1TZW5zb3JIYW5kbGVyOwogCi0gICAgcHVibGljIElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihJbnB1dE1hbmFnZXIgaW5wdXRNYW5hZ2VyKSB7Ci0gICAgICAgIG1JbnB1dE1hbmFnZXIgPSBpbnB1dE1hbmFnZXI7CisgICAgcHVibGljIElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihJbnB1dE1hbmFnZXJHbG9iYWwgaW5wdXRNYW5hZ2VyR2xvYmFsKSB7CisgICAgICAgIG1HbG9iYWwgPSBpbnB1dE1hbmFnZXJHbG9iYWw7CiAKICAgICAgICAgbVNlbnNvclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZW5zb3JUaHJlYWQiKTsKICAgICAgICAgbVNlbnNvclRocmVhZC5zdGFydCgpOwogICAgICAgICBtU2Vuc29ySGFuZGxlciA9IG5ldyBIYW5kbGVyKG1TZW5zb3JUaHJlYWQuZ2V0TG9vcGVyKCkpOwogCiAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UgbGlzdGVuZXIKLSAgICAgICAgbUlucHV0TWFuYWdlci5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIodGhpcywgbVNlbnNvckhhbmRsZXIpOworICAgICAgICBtR2xvYmFsLnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcih0aGlzLCBtU2Vuc29ySGFuZGxlcik7CiAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbnNvciBsaXN0CiAgICAgICAgIGluaXRpYWxpemVTZW5zb3JzKCk7CiAgICAgfQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGlucHV0RGV2aWNlID0gSW5wdXREZXZpY2UuZ2V0RGV2aWNlKGRldmljZUlkKTsKICAgICAgICAgaWYgKGlucHV0RGV2aWNlICE9IG51bGwgJiYgaW5wdXREZXZpY2UuaGFzU2Vuc29yKCkpIHsKICAgICAgICAgICAgIGZpbmFsIElucHV0U2Vuc29ySW5mb1tdIHNlbnNvckluZm9zID0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgbUdsb2JhbC5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKICAgICAgICAgICAgIHBvcHVsYXRlU2Vuc29yc0ZvcklucHV0RGV2aWNlTG9ja2VkKGRldmljZUlkLCBzZW5zb3JJbmZvcyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlbnNvcnMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0U2Vuc29yTG9jaykgewogICAgICAgICAgICAgbVNlbnNvcnMuY2xlYXIoKTsKLSAgICAgICAgICAgIGludFtdIGRldmljZUlkcyA9IG1JbnB1dE1hbmFnZXIuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgICAgIGludFtdIGRldmljZUlkcyA9IG1HbG9iYWwuZ2V0SW5wdXREZXZpY2VJZHMoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlSWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRldmljZUlkID0gZGV2aWNlSWRzW2ldOwogICAgICAgICAgICAgICAgIHVwZGF0ZUlucHV0RGV2aWNlU2Vuc29ySW5mb0xvY2tlZChkZXZpY2VJZCk7CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoZSBzZW5zb3I6IiArIHNlbnNvcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtSW5wdXRNYW5hZ2VyLmVuYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yLmdldFR5cGUoKSwgZGVsYXlVcywKKyAgICAgICAgICAgICAgICBpZiAoIW1HbG9iYWwuZW5hYmxlU2Vuc29yKGRldmljZUlkLCBzZW5zb3IuZ2V0VHlwZSgpLCBkZWxheVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBlbmFibGUgdGhlIHNlbnNvcjoiICsgc2Vuc29yKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgSW5wdXRNYW5hZ2VyU2VydmljZSBzZW5zb3IgbGlzdGVuZXIgaWYgbm90IHlldC4KICAgICAgICAgICAgIGlmIChtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1JbnB1dFNlcnZpY2VTZW5zb3JMaXN0ZW5lciA9IG5ldyBJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1JbnB1dE1hbmFnZXIucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtR2xvYmFsLnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyKSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHJlZ2lzdGVyaW5nIHRoZSBzZW5zb3IgbGlzdGVuZXIiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWYgbm8gZGVsZWdhdGlvbiByZW1haW5zLCB1bnJlZ2lzdGVyIHRoZSBsaXN0ZW5lciB0byBpbnB1dCBzZXJ2aWNlCiAgICAgICAgICAgICBpZiAobUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyICE9IG51bGwgJiYgbUlucHV0U2Vuc29yRXZlbnRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnVucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1HbG9iYWwudW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKG1JbnB1dFNlcnZpY2VTZW5zb3JMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgbUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZvciBlYWNoIHNlbnNvciB0eXBlIGNoZWNrIGlmIGl0IGlzIHN0aWxsIGluIHVzZSBieSBvdGhlciBsaXN0ZW5lcnMuCkBAIC01MzksNyArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZGV2aWNlICIgKyBkZXZpY2VJZCArICIgc2Vuc29yICIgKyBzZW5zb3JUeXBlICsgIiBkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIG1HbG9iYWwuZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NTMsNyArNTUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoU2Vuc29yIHNlbnNvciA6IG1JbnB1dFNlbnNvckV2ZW50TGlzdGVuZXJzLmdldChpZHgpLmdldFNlbnNvcnMoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXZpY2VJZCA9IHNlbnNvci5nZXRJZCgpOwotICAgICAgICAgICAgICAgIGlmICghbUlucHV0TWFuYWdlci5mbHVzaFNlbnNvcihkZXZpY2VJZCwgc2Vuc29yLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1HbG9iYWwuZmx1c2hTZW5zb3IoZGV2aWNlSWQsIHNlbnNvci5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlci5qYXZhCmluZGV4IDQ5MDU4OWYuLjA1NGFlMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlci5qYXZhCkBAIC00NCw4ICs0NCw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSVZpYnJhdG9yU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm9zLklucHV0RXZlbnRJbmplY3Rpb25TeW5jOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKQEAgLTUzLDcgKzUxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3JNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKQEAgLTY2LDkgKzYzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU29tZUFyZ3M7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwpAQCAtODgsMTAgKzgzLDYgQEAKICAgICAvLyBUbyBlbmFibGUgdGhlc2UgbG9ncywgcnVuOiAnYWRiIHNoZWxsIHNldHByb3AgbG9nLnRhZy5JbnB1dE1hbmFnZXIgREVCVUcnIChyZXF1aXJlcyByZXN0YXJ0KQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFVklDRV9BRERFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfUkVNT1ZFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfQ0hBTkdFRCA9IDM7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBJbnB1dE1hbmFnZXIgc0luc3RhbmNlOwogCiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UobWF4VGFyZ2V0U2RrID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QLCB0cmFja2luZ0J1ZyA9IDExNTYwOTAyMykKQEAgLTExMiwzMyArMTAzLDYgQEAKICAgICBATnVsbGFibGUKICAgICBwcml2YXRlIEJvb2xlYW4gbUlzU3R5bHVzUG9pbnRlckljb25FbmFibGVkID0gbnVsbDsKIAotICAgIC8vIEd1YXJkZWQgYnkgbUlucHV0RGV2aWNlc0xvY2sKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtSW5wdXREZXZpY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIFNwYXJzZUFycmF5PElucHV0RGV2aWNlPiBtSW5wdXREZXZpY2VzOwotICAgIHByaXZhdGUgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyIG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlPiBtSW5wdXREZXZpY2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIC8vIEd1YXJkZWQgYnkgbVRhYmxldE1vZGVMb2NrCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVRhYmxldE1vZGVMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCi0gICAgcHJpdmF0ZSBUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIG1UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlPiBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyczsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1CYXR0ZXJ5TGlzdGVuZXJzTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICAvLyBNYXBzIGEgZGV2aWNlSWQgd2hvc2UgYmF0dGVyeSBpcyBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkIHRvIGFuIGVudHJ5IGNvbnRhaW5pbmcgdGhlCi0gICAgLy8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgZm9yIHRoYXQgZGV2aWNlLgotICAgIEBHdWFyZGVkQnkoIm1CYXR0ZXJ5TGlzdGVuZXJzTG9jayIpCi0gICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycz4gbUJhdHRlcnlMaXN0ZW5lcnM7Ci0gICAgQEd1YXJkZWRCeSgibUJhdHRlcnlMaXN0ZW5lcnNMb2NrIikKLSAgICBwcml2YXRlIElJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgQEd1YXJkZWRCeSgibUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGU+IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyczsKLSAgICBAR3VhcmRlZEJ5KCJtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2siKQotICAgIHByaXZhdGUgSUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIElucHV0RGV2aWNlU2Vuc29yTWFuYWdlciBtSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyOwogICAgIC8qKgogICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IFF1ZXJ5IGF2YWlsYWJsZSBrZXlib2FyZCBsYXlvdXRzLgogICAgICAqIDxwPgpAQCAtNDAzLDI3ICszNjcsNyBAQAogICAgICAqLwogICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBJbnB1dERldmljZSBnZXRJbnB1dERldmljZShpbnQgaWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKLQotICAgICAgICAgICAgaW50IGluZGV4ID0gbUlucHV0RGV2aWNlcy5pbmRleE9mS2V5KGlkKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZSA9IG1JbS5nZXRJbnB1dERldmljZShpZCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbnB1dERldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpbmRleCwgaW5wdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5nZXRJbnB1dERldmljZShpZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzMsMzQgKzM3Nyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXREZXZpY2UgZ2V0SW5wdXREZXZpY2VCeURlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKLQotICAgICAgICAgICAgaW50IG51bURldmljZXMgPSBtSW5wdXREZXZpY2VzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGV2aWNlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gbUlucHV0RGV2aWNlcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGV2aWNlID0gbUltLmdldElucHV0RGV2aWNlKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnNldFZhbHVlQXQoaSwgaW5wdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5lcXVhbHMoaW5wdXREZXZpY2UuZ2V0RGVzY3JpcHRvcigpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXREZXZpY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZ2V0SW5wdXREZXZpY2VCeURlc2NyaXB0b3IoZGVzY3JpcHRvcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NjgsMTYgKzM4NSw3IEBACiAgICAgICogQHJldHVybiBUaGUgaW5wdXQgZGV2aWNlIGlkcy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0SW5wdXREZXZpY2VJZHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlc0xvY2spIHsKLSAgICAgICAgICAgIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnB1dERldmljZXMuc2l6ZSgpOwotICAgICAgICAgICAgZmluYWwgaW50W10gaWRzID0gbmV3IGludFtjb3VudF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZHNbaV0gPSBtSW5wdXREZXZpY2VzLmtleUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlkczsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5nZXRJbnB1dERldmljZUlkcygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQ3LDE3ICs0NTUsNyBAQAogICAgICAqIEBzZWUgI3VucmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyKElucHV0RGV2aWNlTGlzdGVuZXIgbGlzdGVuZXIsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRJbnB1dERldmljZUxpc3RlbmVyTG9ja2VkKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuYWRkKG5ldyBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUobGlzdGVuZXIsIGhhbmRsZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcihsaXN0ZW5lciwgaGFuZGxlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NjgsMjggKzQ2Niw3IEBACiAgICAgICogQHNlZSAjcmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIoSW5wdXREZXZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZElucHV0RGV2aWNlTGlzdGVuZXJMb2NrZWQobGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUgZCA9IG1JbnB1dERldmljZUxpc3RlbmVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGQucmVtb3ZlQ2FsbGJhY2tzQW5kTWVzc2FnZXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlTGlzdGVuZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kSW5wdXREZXZpY2VMaXN0ZW5lckxvY2tlZChJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpKS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1HbG9iYWwudW5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE4LDIwICs0OTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKAogICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1UYWJsZXRNb2RlTG9jaykgewotICAgICAgICAgICAgaWYgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplVGFibGV0TW9kZUxpc3RlbmVyTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaWR4ID0gZmluZE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGQgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUobGlzdGVuZXIsIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLmFkZChkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLnJlZ2lzdGVyT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBoYW5kbGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY0MSwzNyArNTA1LDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIoT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtVGFibGV0TW9kZUxvY2spIHsKLSAgICAgICAgICAgIGludCBpZHggPSBmaW5kT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyTG9ja2VkKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGQgPSBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUoaWR4KTsKLSAgICAgICAgICAgICAgICBkLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYWJsZXRNb2RlTGlzdGVuZXJMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIFRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUltLnJlZ2lzdGVyVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBtVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJMb2NrZWQoT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICAgICAgaWYgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLmdldChpKS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1HbG9iYWwudW5yZWdpc3Rlck9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzg5LDExICsxMjIzLDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFNlbnNvckluZm9bXSBnZXRTZW5zb3JMaXN0KGludCBkZXZpY2VJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1JbS5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldFNlbnNvckxpc3QoZGV2aWNlSWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQwMywxMiArMTIzMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlU2Vuc29yKGludCBkZXZpY2VJZCwgaW50IHNlbnNvclR5cGUsIGludCBzYW1wbGluZ1BlcmlvZFVzLAogICAgICAgICAgICAgaW50IG1heEJhdGNoUmVwb3J0TGF0ZW5jeVVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLmVuYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSwgc2FtcGxpbmdQZXJpb2RVcywKLSAgICAgICAgICAgICAgICAgICAgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZW5hYmxlU2Vuc29yKGRldmljZUlkLCBzZW5zb3JUeXBlLCBzYW1wbGluZ1BlcmlvZFVzLAorICAgICAgICAgICAgICAgIG1heEJhdGNoUmVwb3J0TGF0ZW5jeVVzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0MTcsMTEgKzEyNDMsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzYWJsZVNlbnNvcihpbnQgZGV2aWNlSWQsIGludCBzZW5zb3JUeXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0uZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLmRpc2FibGVTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQzMCwxMSArMTI1Miw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBmbHVzaFNlbnNvcihpbnQgZGV2aWNlSWQsIGludCBzZW5zb3JUeXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLmZsdXNoU2Vuc29yKGRldmljZUlkLCBzZW5zb3JUeXBlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtR2xvYmFsLmZsdXNoU2Vuc29yKGRldmljZUlkLCBzZW5zb3JUeXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0NDMsMTEgKzEyNjEsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihJSW5wdXRTZW5zb3JFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDU2LDExICsxMjcwLDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihJSW5wdXRTZW5zb3JFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0udW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9CisgICAgICAgIG1HbG9iYWwudW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NDMsMTMzICsxMzUzLDcgQEAKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBwdWJsaWMgSG9zdFVzaVZlcnNpb24gZ2V0SG9zdFVzaVZlcnNpb24oQE5vbk51bGwgRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGlzcGxheSwgImRpc3BsYXkgc2hvdWxkIG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWxpZCBVU0kgdmVyc2lvbiByZXBvcnRlZCBieSBhbnkgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAvLyB0aGUgZGlzcGxheS4KLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2UgZGV2aWNlID0gZ2V0SW5wdXREZXZpY2UobUlucHV0RGV2aWNlcy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5nZXRBc3NvY2lhdGVkRGlzcGxheUlkKCkgPT0gZGlzcGxheS5nZXREaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmdldEhvc3RVc2lWZXJzaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5nZXRIb3N0VXNpVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGlucHV0IGRldmljZXMgdGhhdCByZXBvcnQgYSB2YWxpZCBVU0kgdmVyc2lvbiwgc2VlIGlmIHRoZXJlIGlzIGEgY29uZmlnCi0gICAgICAgIC8vIHRoYXQgc3BlY2lmaWVzIHRoZSBVU0kgdmVyc2lvbiBmb3IgdGhlIGRpc3BsYXkuIFRoaXMgaXMgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBVU0kKLSAgICAgICAgLy8gaW5wdXQgZGV2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGJ5IHRoZSBrZXJuZWwvZHJpdmVyIGFsbCB0aGUgdGltZS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0uZ2V0SG9zdFVzaVZlcnNpb25Gcm9tRGlzcGxheUNvbmZpZyhkaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpIHsKLSAgICAgICAgaWYgKG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtSW0ucmVnaXN0ZXJJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXREZXZpY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludFtdIGlkczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWRzID0gbUltLmdldElucHV0RGV2aWNlSWRzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSW5wdXREZXZpY2VzID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGlkIDogaWRzKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoaWQsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VzQ2hhbmdlZChpbnRbXSBkZXZpY2VJZEFuZEdlbmVyYXRpb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpbnB1dCBkZXZpY2VzIGNoYW5nZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbUlucHV0RGV2aWNlcy5zaXplKCk7IC0taSA+IDA7ICkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXZpY2VJZCA9IG1JbnB1dERldmljZXMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb250YWluc0RldmljZUlkKGRldmljZUlkQW5kR2VuZXJhdGlvbiwgZGV2aWNlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIHJlbW92ZWQ6ICIgKyBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lucHV0RGV2aWNlTGlzdGVuZXJzTG9ja2VkKE1TR19ERVZJQ0VfUkVNT1ZFRCwgZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VJZEFuZEdlbmVyYXRpb24ubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGV2aWNlSWQgPSBkZXZpY2VJZEFuZEdlbmVyYXRpb25baV07Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUlucHV0RGV2aWNlcy5pbmRleE9mS2V5KGRldmljZUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBnZW5lcmF0aW9uID0gZGV2aWNlSWRBbmRHZW5lcmF0aW9uW2kgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0R2VuZXJhdGlvbigpICE9IGdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGNoYW5nZWQ6ICIgKyBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpbmRleCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lucHV0RGV2aWNlTGlzdGVuZXJzTG9ja2VkKE1TR19ERVZJQ0VfQ0hBTkdFRCwgZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgYWRkZWQ6ICIgKyBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlSWQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoTVNHX0RFVklDRV9BRERFRCwgZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoaW50IHdoYXQsIGludCBkZXZpY2VJZCkgewotICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgewotICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlIGxpc3RlbmVyID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnNlbmRNZXNzYWdlKGxpc3RlbmVyLm9idGFpbk1lc3NhZ2Uod2hhdCwgZGV2aWNlSWQsIDApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNEZXZpY2VJZChpbnRbXSBkZXZpY2VJZEFuZEdlbmVyYXRpb24sIGludCBkZXZpY2VJZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUlkQW5kR2VuZXJhdGlvbi5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgaWYgKGRldmljZUlkQW5kR2VuZXJhdGlvbltpXSA9PSBkZXZpY2VJZCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBvblRhYmxldE1vZGVDaGFuZ2VkKGxvbmcgd2hlbk5hbm9zLCBib29sZWFuIGluVGFibGV0TW9kZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHRhYmxldCBtb2RlIGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyAid2hlbk5hbm9zPSIgKyB3aGVuTmFub3MgKyAiLCBpblRhYmxldE1vZGU9IiArIGluVGFibGV0TW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtVGFibGV0TW9kZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbmRUYWJsZXRNb2RlQ2hhbmdlZCh3aGVuTmFub3MsIGluVGFibGV0TW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZ2V0SG9zdFVzaVZlcnNpb24oZGlzcGxheSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzk1LDEwICsxNDc5LDcgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBTZW5zb3JNYW5hZ2VyIGdldElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihpbnQgZGV2aWNlSWQpIHsKLSAgICAgICAgaWYgKG1JbnB1dERldmljZVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0RGV2aWNlU2Vuc29yTWFuYWdlciA9IG5ldyBJbnB1dERldmljZVNlbnNvck1hbmFnZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbnB1dERldmljZVNlbnNvck1hbmFnZXIuZ2V0U2Vuc29yTWFuYWdlcihkZXZpY2VJZCk7CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODA4LDE1ICsxNDg5LDcgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBCYXR0ZXJ5U3RhdGUgZ2V0SW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUoaW50IGRldmljZUlkLCBib29sZWFuIGhhc0JhdHRlcnkpIHsKLSAgICAgICAgaWYgKCFoYXNCYXR0ZXJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsQmF0dGVyeVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSA9IG1JbS5nZXRCYXR0ZXJ5U3RhdGUoZGV2aWNlSWQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEJhdHRlcnlTdGF0ZShzdGF0ZS5pc1ByZXNlbnQsIHN0YXRlLnN0YXR1cywgc3RhdGUuY2FwYWNpdHkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZ2V0SW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUoZGV2aWNlSWQsIGhhc0JhdHRlcnkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk1Miw0OSArMTYyNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoaW50IGRldmljZUlkLCBATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvciwKICAgICAgICAgICAgIEBOb25OdWxsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IsICJleGVjdXRvciBzaG91bGQgbm90IGJlIG51bGwiKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUJhdHRlcnlMaXN0ZW5lcnNMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgPSBuZXcgTG9jYWxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnMgbGlzdGVuZXJzRm9yRGV2aWNlID0gbUJhdHRlcnlMaXN0ZW5lcnMuZ2V0KGRldmljZUlkKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZXZpY2VJZCBpcyBjdXJyZW50bHkgbm90IGJlaW5nIG1vbml0b3JlZCBmb3IgYmF0dGVyeSBjaGFuZ2VzLgotICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGRldmljZS4KLSAgICAgICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UgPSBuZXcgUmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpc3RlbmVycy5wdXQoZGV2aWNlSWQsIGxpc3RlbmVyc0ZvckRldmljZSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUltLnJlZ2lzdGVyQmF0dGVyeUxpc3RlbmVyKGRldmljZUlkLCBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZXZpY2VJZCBpcyBhbHJlYWR5IGJlaW5nIG1vbml0b3JlZCBmb3IgYmF0dGVyeSBjaGFuZ2VzLgotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1EZWxlZ2F0ZXMgPSBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZWxlZ2F0ZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciByZWdpc3RlcmVkTGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc0ZvckRldmljZS5tRGVsZWdhdGVzLmdldChpKS5tTGlzdGVuZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhsaXN0ZW5lciwgcmVnaXN0ZXJlZExpc3RlbmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYW4gSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgdGhhdCBoYXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciBkZXZpY2VJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlKGxpc3RlbmVyLCBleGVjdXRvcik7Ci0gICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlcy5hZGQoZGVsZWdhdGUpOwotCi0gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIGxpc3RlbmVyIGltbWVkaWF0ZWx5IGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUgbGF0ZXN0IGJhdHRlcnkgc3RhdGUuCi0gICAgICAgICAgICBpZiAobGlzdGVuZXJzRm9yRGV2aWNlLm1JbnB1dERldmljZUJhdHRlcnlTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVsZWdhdGUubm90aWZ5QmF0dGVyeVN0YXRlQ2hhbmdlZChsaXN0ZW5lcnNGb3JEZXZpY2UubUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLmFkZElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGRldmljZUlkLCBleGVjdXRvciwgbGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjAwNCw0NCArMTYzNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoaW50IGRldmljZUlkLAogICAgICAgICAgICAgQE5vbk51bGwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUJhdHRlcnlMaXN0ZW5lcnNMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGxpc3RlbmVyc0ZvckRldmljZSA9IG1CYXR0ZXJ5TGlzdGVuZXJzLmdldChkZXZpY2VJZCk7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJzRm9yRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgbm90IGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlPiBkZWxlZ2F0ZXMgPQotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlczsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLnNpemUoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMobGlzdGVuZXIsIGRlbGVnYXRlcy5nZXQoaSkubUxpc3RlbmVyKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSBiYXR0ZXJ5IGxpc3RlbmVycyBmb3IgdGhpcyBkZXZpY2VJZC4gU3RvcCBtb25pdG9yaW5nIHRoaXMgZGV2aWNlLgotICAgICAgICAgICAgbUJhdHRlcnlMaXN0ZW5lcnMucmVtb3ZlKGRldmljZUlkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUltLnVucmVnaXN0ZXJCYXR0ZXJ5TGlzdGVuZXIoZGV2aWNlSWQsIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQmF0dGVyeUxpc3RlbmVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBtb3JlIGRldmljZXMgYmVpbmcgbW9uaXRvcmVkLCBzbyB0aGUgcmVnaXN0ZXJlZAotICAgICAgICAgICAgICAgIC8vIElJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSB0aGUgc2VydmVyLgotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1HbG9iYWwucmVtb3ZlSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoZGV2aWNlSWQsIGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNjcsMzAgKzE2NjEsNyBAQAogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5NT05JVE9SX0tFWUJPQVJEX0JBQ0tMSUdIVCkKICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCiAgICAgICAgICAgICBATm9uTnVsbCBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvciwgImV4ZWN1dG9yIHNob3VsZCBub3QgYmUgbnVsbCIpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGxpc3RlbmVyLCAibGlzdGVuZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2spIHsKLSAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgPSBuZXcgTG9jYWxLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW0ucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5nZXQoaSkubUxpc3RlbmVyID09IGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUgZGVsZWdhdGUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckRlbGVnYXRlKGxpc3RlbmVyLCBleGVjdXRvcik7Ci0gICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuYWRkKGRlbGVnYXRlKTsKLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihleGVjdXRvciwgbGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwMywyMyArMTY3NCw3IEBACiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLk1PTklUT1JfS0VZQk9BUkRfQkFDS0xJR0hUKQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKAogICAgICAgICAgICAgQE5vbk51bGwgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGxpc3RlbmVyLCAibGlzdGVuZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2spIHsKLSAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5yZW1vdmVJZigoZGVsZWdhdGUpIC0+IGRlbGVnYXRlLm1MaXN0ZW5lciA9PSBsaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbS51bnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLnVucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNDksNyArMTcwNCw3IEBACiAgICAgcHVibGljIGludGVyZmFjZSBJbnB1dERldmljZUxpc3RlbmVyIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENhbGxlZCB3aGVuZXZlciBhbiBpbnB1dCBkZXZpY2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN5c3RlbS4KLSAgICAgICAgICogVXNlIHtAbGluayBJbnB1dE1hbmFnZXIjZ2V0SW5wdXREZXZpY2V9IHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UuCisgICAgICAgICAqIFVzZSB7QGxpbmsgSW5wdXRNYW5hZ2VyR2xvYmFsI2dldElucHV0RGV2aWNlfSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIGlkIG9mIHRoZSBpbnB1dCBkZXZpY2UgdGhhdCB3YXMgYWRkZWQuCiAgICAgICAgICAqLwpAQCAtMjE3MiwzNyArMTcyNyw2IEBACiAgICAgICAgIHZvaWQgb25JbnB1dERldmljZUNoYW5nZWQoaW50IGRldmljZUlkKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIElucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciBleHRlbmRzIElJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIuU3R1YiB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0RGV2aWNlc0NoYW5nZWQoaW50W10gZGV2aWNlSWRBbmRHZW5lcmF0aW9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIElucHV0TWFuYWdlci50aGlzLm9uSW5wdXREZXZpY2VzQ2hhbmdlZChkZXZpY2VJZEFuZEdlbmVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJbnB1dERldmljZUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgICAgICBwdWJsaWMgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlKElucHV0RGV2aWNlTGlzdGVuZXIgbGlzdGVuZXIsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlciAhPSBudWxsID8gaGFuZGxlci5nZXRMb29wZXIoKSA6IExvb3Blci5teUxvb3BlcigpKTsKLSAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERVZJQ0VfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbklucHV0RGV2aWNlQWRkZWQobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERVZJQ0VfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uSW5wdXREZXZpY2VSZW1vdmVkKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVWSUNFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbklucHV0RGV2aWNlQ2hhbmdlZChtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIGludGVyZmFjZSBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgewogICAgICAgICAvKioKQEAgLTIyMzUsMTcwICsxNzU5LDQgQEAKICAgICAgICAgdm9pZCBvbktleWJvYXJkQmFja2xpZ2h0Q2hhbmdlZCgKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlSWQsIEBOb25OdWxsIEtleWJvYXJkQmFja2xpZ2h0U3RhdGUgc3RhdGUsIGJvb2xlYW4gaXNUcmlnZ2VyZWRCeUtleVByZXNzKTsKICAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBJVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lci5TdHViIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7Ci0gICAgICAgICAgICBJbnB1dE1hbmFnZXIudGhpcy5vblRhYmxldE1vZGVDaGFuZ2VkKHdoZW5OYW5vcywgaW5UYWJsZXRNb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEFCTEVUX01PREVfQ0hBTkdFRCA9IDA7Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlKAotICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyICE9IG51bGwgPyBoYW5kbGVyLmdldExvb3BlcigpIDogTG9vcGVyLm15TG9vcGVyKCkpOwotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7Ci0gICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7Ci0gICAgICAgICAgICBhcmdzLmFyZ2kxID0gKGludCkgd2hlbk5hbm9zOwotICAgICAgICAgICAgYXJncy5hcmdpMiA9IChpbnQpICh3aGVuTmFub3MgPj4gMzIpOwotICAgICAgICAgICAgYXJncy5hcmcxID0gaW5UYWJsZXRNb2RlOwotICAgICAgICAgICAgb2J0YWluTWVzc2FnZShNU0dfVEFCTEVUX01PREVfQ0hBTkdFRCwgYXJncykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19UQUJMRVRfTU9ERV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IChTb21lQXJncykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICBsb25nIHdoZW5OYW5vcyA9IChhcmdzLmFyZ2kxICYgMHhGRkZGRkZGRkwpIHwgKChsb25nKSBhcmdzLmFyZ2kyIDw8IDMyKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGluVGFibGV0TW9kZSA9IChib29sZWFuKSBhcmdzLmFyZzE7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGFibGV0TW9kZUNoYW5nZWQod2hlbk5hbm9zLCBpblRhYmxldE1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGFuZHJvaWQuaGFyZHdhcmUuQmF0dGVyeVN0YXRlIGludGVyZmFjZSB1c2VkIHRvIHJlcG9ydCB0aGUgYmF0dGVyeQotICAgIC8vIHN0YXRlIHZpYSB0aGUgSW5wdXREZXZpY2UjZ2V0QmF0dGVyeVN0YXRlKCkgYW5kIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGludGVyZmFjZXMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTG9jYWxCYXR0ZXJ5U3RhdGUgZXh0ZW5kcyBCYXR0ZXJ5U3RhdGUgewotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzUHJlc2VudDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0YXR1czsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtQ2FwYWNpdHk7Ci0KLSAgICAgICAgTG9jYWxCYXR0ZXJ5U3RhdGUoKSB7Ci0gICAgICAgICAgICB0aGlzKGZhbHNlIC8qaXNQcmVzZW50Ki8sIEJhdHRlcnlTdGF0ZS5TVEFUVVNfVU5LTk9XTiwgRmxvYXQuTmFOIC8qY2FwYWNpdHkqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2NhbEJhdHRlcnlTdGF0ZShib29sZWFuIGlzUHJlc2VudCwgaW50IHN0YXR1cywgZmxvYXQgY2FwYWNpdHkpIHsKLSAgICAgICAgICAgIG1Jc1ByZXNlbnQgPSBpc1ByZXNlbnQ7Ci0gICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICAgICAgbUNhcGFjaXR5ID0gY2FwYWNpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1ByZXNlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0Q2FwYWNpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhcGFjaXR5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnMgewotICAgICAgICBmaW5hbCBMaXN0PElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGU+IG1EZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIG1JbnB1dERldmljZUJhdHRlcnlTdGF0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlIHsKLSAgICAgICAgZmluYWwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbUxpc3RlbmVyOwotICAgICAgICBmaW5hbCBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZShJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBsaXN0ZW5lciwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUJhdHRlcnlTdGF0ZUNoYW5nZWQoSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25CYXR0ZXJ5U3RhdGVDaGFuZ2VkKHN0YXRlLmRldmljZUlkLCBzdGF0ZS51cGRhdGVUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbEJhdHRlcnlTdGF0ZShzdGF0ZS5pc1ByZXNlbnQsIHN0YXRlLnN0YXR1cywgc3RhdGUuY2FwYWNpdHkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIExvY2FsSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBJSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIuU3R1YiB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJhdHRlcnlTdGF0ZUNoYW5nZWQoSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1CYXR0ZXJ5TGlzdGVuZXJzTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtQmF0dGVyeUxpc3RlbmVycyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnMgZW50cnkgPSBtQmF0dGVyeUxpc3RlbmVycy5nZXQoc3RhdGUuZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBlbnRyeS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtRGVsZWdhdGVzID0gZW50cnkubURlbGVnYXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZWxlZ2F0ZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBlbnRyeS5tRGVsZWdhdGVzLmdldChpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub3RpZnlCYXR0ZXJ5U3RhdGVDaGFuZ2VkKGVudHJ5Lm1JbnB1dERldmljZUJhdHRlcnlTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBpbnRlcmZhY2UgdXNlZCB0byByZXBvcnQKLSAgICAvLyB0aGUga2V5Ym9hcmQgYmFja2xpZ2h0IHN0YXRlIHZpYSB0aGUgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBpbnRlcmZhY2VzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBleHRlbmRzIEtleWJvYXJkQmFja2xpZ2h0U3RhdGUgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1CcmlnaHRuZXNzTGV2ZWw7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhCcmlnaHRuZXNzTGV2ZWw7Ci0KLSAgICAgICAgTG9jYWxLZXlib2FyZEJhY2tsaWdodFN0YXRlKGludCBicmlnaHRuZXNzTGV2ZWwsIGludCBtYXhCcmlnaHRuZXNzTGV2ZWwpIHsKLSAgICAgICAgICAgIG1CcmlnaHRuZXNzTGV2ZWwgPSBicmlnaHRuZXNzTGV2ZWw7Ci0gICAgICAgICAgICBtTWF4QnJpZ2h0bmVzc0xldmVsID0gbWF4QnJpZ2h0bmVzc0xldmVsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnJpZ2h0bmVzc0xldmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CcmlnaHRuZXNzTGV2ZWw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhCcmlnaHRuZXNzTGV2ZWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1heEJyaWdodG5lc3NMZXZlbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZSB7Ci0gICAgICAgIGZpbmFsIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbUxpc3RlbmVyOwotICAgICAgICBmaW5hbCBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckRlbGVnYXRlKEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIG1FeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBub3RpZnlLZXlib2FyZEJhY2tsaWdodENoYW5nZShpbnQgZGV2aWNlSWQsIElLZXlib2FyZEJhY2tsaWdodFN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmlnZ2VyZWRCeUtleVByZXNzKSB7Ci0gICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25LZXlib2FyZEJhY2tsaWdodENoYW5nZWQoZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZShzdGF0ZS5icmlnaHRuZXNzTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tYXhCcmlnaHRuZXNzTGV2ZWwpLCBpc1RyaWdnZXJlZEJ5S2V5UHJlc3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTG9jYWxLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGV4dGVuZHMgSUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIuU3R1YiB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQnJpZ2h0bmVzc0NoYW5nZWQoaW50IGRldmljZUlkLCBJS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcykgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5nZXQoaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm90aWZ5S2V5Ym9hcmRCYWNrbGlnaHRDaGFuZ2UoZGV2aWNlSWQsIHN0YXRlLCBpc1RyaWdnZXJlZEJ5S2V5UHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlckdsb2JhbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXRNYW5hZ2VyR2xvYmFsLmphdmEKaW5kZXggODJkZGRmYy4uNTI0ZDgyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXRNYW5hZ2VyR2xvYmFsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXRNYW5hZ2VyR2xvYmFsLmphdmEKQEAgLTE2LDE4ICsxNiw3NCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQ7CiAKK2ltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQmF0dGVyeVN0YXRlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlci5JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlci5JbnB1dERldmljZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyLktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXIuT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlNvbWVBcmdzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIAogLyoqCiAgKiBNYW5hZ2VzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgaW5wdXQgbWFuYWdlciBzZXJ2aWNlIG9uIGJlaGFsZiBvZgotICogYW4gYXBwbGljYXRpb24gcHJvY2Vzcy4gIFlvdSdyZSBwcm9iYWJseSBsb29raW5nIGZvciB7QGxpbmsgSW5wdXRNYW5hZ2VyfS4KKyAqIGFuIGFwcGxpY2F0aW9uIHByb2Nlc3MuIFlvdSdyZSBwcm9iYWJseSBsb29raW5nIGZvciB7QGxpbmsgSW5wdXRNYW5hZ2VyfS4KICAqCiAgKiBAaGlkZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRNYW5hZ2VyR2xvYmFsIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIklucHV0TWFuYWdlckdsb2JhbCI7CisgICAgLy8gVG8gZW5hYmxlIHRoZXNlIGxvZ3MsIHJ1bjogJ2FkYiBzaGVsbCBzZXRwcm9wIGxvZy50YWcuSW5wdXRNYW5hZ2VyR2xvYmFsIERFQlVHJworICAgIC8vIChyZXF1aXJlcyByZXN0YXJ0KQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBAR3VhcmRlZEJ5KCJtSW5wdXREZXZpY2VMaXN0ZW5lcnMiKQorICAgIEBOdWxsYWJsZSBwcml2YXRlIFNwYXJzZUFycmF5PElucHV0RGV2aWNlPiBtSW5wdXREZXZpY2VzOworICAgIEBHdWFyZGVkQnkoIm1JbnB1dERldmljZUxpc3RlbmVycyIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyIG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXI7CisgICAgQEd1YXJkZWRCeSgibUlucHV0RGV2aWNlTGlzdGVuZXJzIikKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGU+IG1JbnB1dERldmljZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQEd1YXJkZWRCeSgibU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMiKQorICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlPiBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1CYXR0ZXJ5TGlzdGVuZXJzTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAvLyBNYXBzIGEgZGV2aWNlSWQgd2hvc2UgYmF0dGVyeSBpcyBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkIHRvIGFuIGVudHJ5IGNvbnRhaW5pbmcgdGhlCisgICAgLy8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgZm9yIHRoYXQgZGV2aWNlLgorICAgIEBHdWFyZGVkQnkoIm1CYXR0ZXJ5TGlzdGVuZXJzTG9jayIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgU3BhcnNlQXJyYXk8UmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnM+IG1CYXR0ZXJ5TGlzdGVuZXJzOworICAgIEBHdWFyZGVkQnkoIm1CYXR0ZXJ5TGlzdGVuZXJzTG9jayIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgSUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBAR3VhcmRlZEJ5KCJtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2siKQorICAgIEBOdWxsYWJsZSBwcml2YXRlIEFycmF5TGlzdDxLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGU+IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyczsKKyAgICBAR3VhcmRlZEJ5KCJtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2siKQorICAgIEBOdWxsYWJsZSBwcml2YXRlIElLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyOworCisgICAgQE51bGxhYmxlIHByaXZhdGUgSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyIG1JbnB1dERldmljZVNlbnNvck1hbmFnZXI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBJbnB1dE1hbmFnZXJHbG9iYWwgc0luc3RhbmNlOwogCkBAIC03OSw0ICsxMzUsNzcyIEBACiAgICAgICAgICAgICBzSW5zdGFuY2UgPSBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZ2V0SW5wdXREZXZpY2UoaW50KQorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBJbnB1dERldmljZSBnZXRJbnB1dERldmljZShpbnQgaWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IG1JbnB1dERldmljZXMuaW5kZXhPZktleShpZCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0RGV2aWNlIGlucHV0RGV2aWNlID0gbUlucHV0RGV2aWNlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbnB1dERldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXZpY2UgPSBtSW0uZ2V0SW5wdXREZXZpY2UoaWQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnNldFZhbHVlQXQoaW5kZXgsIGlucHV0RGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR3VhcmRlZEJ5KCJtSW5wdXREZXZpY2VMaXN0ZW5lcnMiKQorICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyCisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IElucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtSW0ucmVnaXN0ZXJJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGlkczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWRzID0gbUltLmdldElucHV0RGV2aWNlSWRzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSW5wdXREZXZpY2VzID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGlkIDogaWRzKSB7CisgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoaWQsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBJSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyLlN0dWIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dERldmljZXNDaGFuZ2VkKGludFtdIGRldmljZUlkQW5kR2VuZXJhdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnB1dE1hbmFnZXJHbG9iYWwudGhpcy5vbklucHV0RGV2aWNlc0NoYW5nZWQoZGV2aWNlSWRBbmRHZW5lcmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlc0NoYW5nZWQoaW50W10gZGV2aWNlSWRBbmRHZW5lcmF0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgaW5wdXQgZGV2aWNlcyBjaGFuZ2VkLiIpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtSW5wdXREZXZpY2VzLnNpemUoKTsgLS1pID4gMDsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGRldmljZUlkID0gbUlucHV0RGV2aWNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRGV2aWNlSWQoZGV2aWNlSWRBbmRHZW5lcmF0aW9uLCBkZXZpY2VJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgcmVtb3ZlZDogIiArIGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlLk1TR19ERVZJQ0VfUkVNT1ZFRCwgZGV2aWNlSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VJZEFuZEdlbmVyYXRpb24ubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGV2aWNlSWQgPSBkZXZpY2VJZEFuZEdlbmVyYXRpb25baV07CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUlucHV0RGV2aWNlcy5pbmRleE9mS2V5KGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBnZW5lcmF0aW9uID0gZGV2aWNlSWRBbmRHZW5lcmF0aW9uW2kgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0R2VuZXJhdGlvbigpICE9IGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGNoYW5nZWQ6ICIgKyBkZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpbmRleCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lucHV0RGV2aWNlTGlzdGVuZXJzTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlLk1TR19ERVZJQ0VfQ0hBTkdFRCwgZGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgYWRkZWQ6ICIgKyBkZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlSWQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlLk1TR19ERVZJQ0VfQURERUQsIGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIGZpbmFsIElucHV0RGV2aWNlTGlzdGVuZXIgbUxpc3RlbmVyOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfQURERUQgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfUkVNT1ZFRCA9IDI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFVklDRV9DSEFOR0VEID0gMzsKKworICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUoSW5wdXREZXZpY2VMaXN0ZW5lciBsaXN0ZW5lciwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyICE9IG51bGwgPyBoYW5kbGVyLmdldExvb3BlcigpIDogTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFVklDRV9BRERFRDoKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uSW5wdXREZXZpY2VBZGRlZChtc2cuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFVklDRV9SRU1PVkVEOgorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25JbnB1dERldmljZVJlbW92ZWQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ERVZJQ0VfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uSW5wdXREZXZpY2VDaGFuZ2VkKG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zRGV2aWNlSWQoaW50W10gZGV2aWNlSWRBbmRHZW5lcmF0aW9uLCBpbnQgZGV2aWNlSWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VJZEFuZEdlbmVyYXRpb24ubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJZEFuZEdlbmVyYXRpb25baV0gPT0gZGV2aWNlSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEd1YXJkZWRCeSgibUlucHV0RGV2aWNlTGlzdGVuZXJzIikKKyAgICBwcml2YXRlIHZvaWQgc2VuZE1lc3NhZ2VUb0lucHV0RGV2aWNlTGlzdGVuZXJzTG9ja2VkKGludCB3aGF0LCBpbnQgZGV2aWNlSWQpIHsKKyAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1JbnB1dERldmljZUxpc3RlbmVycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyBpKyspIHsKKyAgICAgICAgICAgIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZSBsaXN0ZW5lciA9IG1JbnB1dERldmljZUxpc3RlbmVycy5nZXQoaSk7CisgICAgICAgICAgICBsaXN0ZW5lci5zZW5kTWVzc2FnZShsaXN0ZW5lci5vYnRhaW5NZXNzYWdlKHdoYXQsIGRldmljZUlkLCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNyZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcihJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZElucHV0RGV2aWNlTGlzdGVuZXJMb2NrZWQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIG1JbnB1dERldmljZUxpc3RlbmVycy5hZGQobmV3IElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgaGFuZGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjdW5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyKElucHV0RGV2aWNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kSW5wdXREZXZpY2VMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZSBkID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgZC5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VMaXN0ZW5lcnMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBHdWFyZGVkQnkoIm1JbnB1dERldmljZUxpc3RlbmVycyIpCisgICAgcHJpdmF0ZSBpbnQgZmluZElucHV0RGV2aWNlTGlzdGVuZXJMb2NrZWQoSW5wdXREZXZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1JbnB1dERldmljZUxpc3RlbmVycy5nZXQoaSkubUxpc3RlbmVyID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI2dldElucHV0RGV2aWNlSWRzCisgICAgICovCisgICAgcHVibGljIGludFtdIGdldElucHV0RGV2aWNlSWRzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZUxpc3RlbmVycykgeworICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUlucHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBpZHMgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlkc1tpXSA9IG1JbnB1dERldmljZXMua2V5QXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaWRzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZ2V0SW5wdXREZXZpY2VCeURlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBJbnB1dERldmljZSBnZXRJbnB1dERldmljZUJ5RGVzY3JpcHRvcihTdHJpbmcgZGVzY3JpcHRvcikgeworICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZUxpc3RlbmVycykgeworICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKKworICAgICAgICAgICAgaW50IG51bURldmljZXMgPSBtSW5wdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gbUlucHV0RGV2aWNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGV2aWNlID0gbUltLmdldElucHV0RGV2aWNlKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dERldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnNldFZhbHVlQXQoaSwgaW5wdXREZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5lcXVhbHMoaW5wdXREZXZpY2UuZ2V0RGVzY3JpcHRvcigpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXREZXZpY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRIb3N0VXNpVmVyc2lvbgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIEhvc3RVc2lWZXJzaW9uIGdldEhvc3RVc2lWZXJzaW9uKEBOb25OdWxsIERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGRpc3BsYXksICJkaXNwbGF5IHNob3VsZCBub3QgYmUgbnVsbCIpOworCisgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3QgdmFsaWQgVVNJIHZlcnNpb24gcmVwb3J0ZWQgYnkgYW55IGlucHV0IGRldmljZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8gdGhlIGRpc3BsYXkuCisgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1JbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBnZXRJbnB1dERldmljZShtSW5wdXREZXZpY2VzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmdldEFzc29jaWF0ZWREaXNwbGF5SWQoKSA9PSBkaXNwbGF5LmdldERpc3BsYXlJZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0SG9zdFVzaVZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmdldEhvc3RVc2lWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaW5wdXQgZGV2aWNlcyB0aGF0IHJlcG9ydCBhIHZhbGlkIFVTSSB2ZXJzaW9uLCBzZWUgaWYgdGhlcmUgaXMgYSBjb25maWcKKyAgICAgICAgLy8gdGhhdCBzcGVjaWZpZXMgdGhlIFVTSSB2ZXJzaW9uIGZvciB0aGUgZGlzcGxheS4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFVTSQorICAgICAgICAvLyBpbnB1dCBkZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgYnkgdGhlIGtlcm5lbC9kcml2ZXIgYWxsIHRoZSB0aW1lLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5nZXRIb3N0VXNpVmVyc2lvbkZyb21EaXNwbGF5Q29uZmlnKGRpc3BsYXkuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgdGFibGV0IG1vZGUgY2hhbmdlZDogIgorICAgICAgICAgICAgICAgICAgICArICJ3aGVuTmFub3M9IiArIHdoZW5OYW5vcyArICIsIGluVGFibGV0TW9kZT0iICsgaW5UYWJsZXRNb2RlKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgeworICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZW5kVGFibGV0TW9kZUNoYW5nZWQod2hlbk5hbm9zLCBpblRhYmxldE1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGV4dGVuZHMgSVRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIuU3R1YiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblRhYmxldE1vZGVDaGFuZ2VkKGxvbmcgd2hlbk5hbm9zLCBib29sZWFuIGluVGFibGV0TW9kZSkgeworICAgICAgICAgICAgSW5wdXRNYW5hZ2VyR2xvYmFsLnRoaXMub25UYWJsZXRNb2RlQ2hhbmdlZCh3aGVuTmFub3MsIGluVGFibGV0TW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RBQkxFVF9NT0RFX0NIQU5HRUQgPSAwOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlKAorICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyICE9IG51bGwgPyBoYW5kbGVyLmdldExvb3BlcigpIDogTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBhcmdzLmFyZ2kxID0gKGludCkgd2hlbk5hbm9zOworICAgICAgICAgICAgYXJncy5hcmdpMiA9IChpbnQpICh3aGVuTmFub3MgPj4gMzIpOworICAgICAgICAgICAgYXJncy5hcmcxID0gaW5UYWJsZXRNb2RlOworICAgICAgICAgICAgb2J0YWluTWVzc2FnZShNU0dfVEFCTEVUX01PREVfQ0hBTkdFRCwgYXJncykuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19UQUJMRVRfTU9ERV9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IChTb21lQXJncykgbXNnLm9iajsKKyAgICAgICAgICAgICAgICBsb25nIHdoZW5OYW5vcyA9IChhcmdzLmFyZ2kxICYgMHhGRkZGRkZGRkwpIHwgKChsb25nKSBhcmdzLmFyZ2kyIDw8IDMyKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluVGFibGV0TW9kZSA9IChib29sZWFuKSBhcmdzLmFyZzE7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGFibGV0TW9kZUNoYW5nZWQod2hlbk5hbm9zLCBpblRhYmxldE1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjcmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyKElucHV0RGV2aWNlTGlzdGVuZXIsIEhhbmRsZXIpCisgICAgICovCisgICAgdm9pZCByZWdpc3Rlck9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcigKKyAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplVGFibGV0TW9kZUxpc3RlbmVyTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaWR4ID0gZmluZE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICAgICAgICAgIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlKGxpc3RlbmVyLCBoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5hZGQoZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciN1bnJlZ2lzdGVyT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXJPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIoT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgaW50IGlkeCA9IGZpbmRPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJMb2NrZWQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgZCA9IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShpZHgpOworICAgICAgICAgICAgICAgIGQucmVtb3ZlQ2FsbGJhY2tzQW5kTWVzc2FnZXMobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR3VhcmRlZEJ5KCJtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycyIpCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYWJsZXRNb2RlTGlzdGVuZXJMb2NrZWQoKSB7CisgICAgICAgIGZpbmFsIFRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUltLnJlZ2lzdGVyVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBHdWFyZGVkQnkoIm1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzIikKKyAgICBwcml2YXRlIGludCBmaW5kT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyTG9ja2VkKE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBmaW5hbCBpbnQgbiA9IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5nZXQoaSkubUxpc3RlbmVyID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIHsKKyAgICAgICAgZmluYWwgTGlzdDxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlPiBtRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBtSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZSB7CisgICAgICAgIGZpbmFsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgZmluYWwgRXhlY3V0b3IgbUV4ZWN1dG9yOworCisgICAgICAgIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGUoSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIG1FeGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBub3RpZnlCYXR0ZXJ5U3RhdGVDaGFuZ2VkKElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQmF0dGVyeVN0YXRlQ2hhbmdlZChzdGF0ZS5kZXZpY2VJZCwgc3RhdGUudXBkYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxCYXR0ZXJ5U3RhdGUoc3RhdGUuaXNQcmVzZW50LCBzdGF0ZS5zdGF0dXMsIHN0YXRlLmNhcGFjaXR5KSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjYWRkSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoaW50LCBFeGVjdXRvciwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIpCisgICAgICovCisgICAgdm9pZCBhZGRJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcihpbnQgZGV2aWNlSWQsIEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgICAgICAgICAgQE5vbk51bGwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvciwgImV4ZWN1dG9yIHNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGxpc3RlbmVyLCAibGlzdGVuZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtQmF0dGVyeUxpc3RlbmVyc0xvY2spIHsKKyAgICAgICAgICAgIGlmIChtQmF0dGVyeUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlMaXN0ZW5lcnMgPSBuZXcgU3BhcnNlQXJyYXk8PigpOworICAgICAgICAgICAgICAgIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciA9IG5ldyBMb2NhbElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycyBsaXN0ZW5lcnNGb3JEZXZpY2UgPSBtQmF0dGVyeUxpc3RlbmVycy5nZXQoZGV2aWNlSWQpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyc0ZvckRldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGRldmljZUlkIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgbW9uaXRvcmVkIGZvciBiYXR0ZXJ5IGNoYW5nZXMuCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgbW9uaXRvcmluZyB0aGUgZGV2aWNlLgorICAgICAgICAgICAgICAgIGxpc3RlbmVyc0ZvckRldmljZSA9IG5ldyBSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycygpOworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzLnB1dChkZXZpY2VJZCwgbGlzdGVuZXJzRm9yRGV2aWNlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW0ucmVnaXN0ZXJCYXR0ZXJ5TGlzdGVuZXIoZGV2aWNlSWQsIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGRldmljZUlkIGlzIGFscmVhZHkgYmVpbmcgbW9uaXRvcmVkIGZvciBiYXR0ZXJ5IGNoYW5nZXMuCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bURlbGVnYXRlcyA9IGxpc3RlbmVyc0ZvckRldmljZS5tRGVsZWdhdGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURlbGVnYXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIHJlZ2lzdGVyZWRMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXMuZ2V0KGkpLm1MaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGxpc3RlbmVyLCByZWdpc3RlcmVkTGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byByZWdpc3RlciBhbiBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciB0aGF0IGhhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yIGRldmljZUlkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlIGRlbGVnYXRlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGUobGlzdGVuZXIsIGV4ZWN1dG9yKTsKKyAgICAgICAgICAgIGxpc3RlbmVyc0ZvckRldmljZS5tRGVsZWdhdGVzLmFkZChkZWxlZ2F0ZSk7CisKKyAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgbGlzdGVuZXIgaW1tZWRpYXRlbHkgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBsYXRlc3QgYmF0dGVyeSBzdGF0ZS4KKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JEZXZpY2UubUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5ub3RpZnlCYXR0ZXJ5U3RhdGVDaGFuZ2VkKGxpc3RlbmVyc0ZvckRldmljZS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjcmVtb3ZlSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoaW50LCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcikKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGludCBkZXZpY2VJZCwKKyAgICAgICAgICAgIEBOb25OdWxsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1CYXR0ZXJ5TGlzdGVuZXJzTG9jaykgeworICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycyBsaXN0ZW5lcnNGb3JEZXZpY2UgPSBtQmF0dGVyeUxpc3RlbmVycy5nZXQoZGV2aWNlSWQpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyc0ZvckRldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGRldmljZUlkIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZT4gZGVsZWdhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5zaXplKCk7KSB7CisgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGxpc3RlbmVyLCBkZWxlZ2F0ZXMuZ2V0KGkpLm1MaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGVsZWdhdGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG1vcmUgYmF0dGVyeSBsaXN0ZW5lcnMgZm9yIHRoaXMgZGV2aWNlSWQuIFN0b3AgbW9uaXRvcmluZyB0aGlzIGRldmljZS4KKyAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzLnJlbW92ZShkZXZpY2VJZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1JbS51bnJlZ2lzdGVyQmF0dGVyeUxpc3RlbmVyKGRldmljZUlkLCBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSBkZXZpY2VzIGJlaW5nIG1vbml0b3JlZCwgc28gdGhlIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAvLyBJSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRyb3BwZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICAgICAgICBtQmF0dGVyeUxpc3RlbmVycyA9IG51bGw7CisgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTG9jYWxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBleHRlbmRzIElJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lci5TdHViIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQmF0dGVyeVN0YXRlQ2hhbmdlZChJSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUJhdHRlcnlMaXN0ZW5lcnNMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGlzdGVuZXJzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycyBlbnRyeSA9IG1CYXR0ZXJ5TGlzdGVuZXJzLmdldChzdGF0ZS5kZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgIGVudHJ5Lm1JbnB1dERldmljZUJhdHRlcnlTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1EZWxlZ2F0ZXMgPSBlbnRyeS5tRGVsZWdhdGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURlbGVnYXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1EZWxlZ2F0ZXMuZ2V0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vdGlmeUJhdHRlcnlTdGF0ZUNoYW5nZWQoZW50cnkubUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRJbnB1dERldmljZUJhdHRlcnlTdGF0ZShpbnQsIGJvb2xlYW4pCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBCYXR0ZXJ5U3RhdGUgZ2V0SW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUoaW50IGRldmljZUlkLCBib29sZWFuIGhhc0JhdHRlcnkpIHsKKyAgICAgICAgaWYgKCFoYXNCYXR0ZXJ5KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsQmF0dGVyeVN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSA9IG1JbS5nZXRCYXR0ZXJ5U3RhdGUoZGV2aWNlSWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEJhdHRlcnlTdGF0ZShzdGF0ZS5pc1ByZXNlbnQsIHN0YXRlLnN0YXR1cywgc3RhdGUuY2FwYWNpdHkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYW5kcm9pZC5oYXJkd2FyZS5CYXR0ZXJ5U3RhdGUgaW50ZXJmYWNlIHVzZWQgdG8gcmVwb3J0IHRoZSBiYXR0ZXJ5CisgICAgLy8gc3RhdGUgdmlhIHRoZSBJbnB1dERldmljZSNnZXRCYXR0ZXJ5U3RhdGUoKSBhbmQgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgaW50ZXJmYWNlcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2NhbEJhdHRlcnlTdGF0ZSBleHRlbmRzIEJhdHRlcnlTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNQcmVzZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtU3RhdHVzOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1DYXBhY2l0eTsKKworICAgICAgICBMb2NhbEJhdHRlcnlTdGF0ZSgpIHsKKyAgICAgICAgICAgIHRoaXMoZmFsc2UgLyppc1ByZXNlbnQqLywgQmF0dGVyeVN0YXRlLlNUQVRVU19VTktOT1dOLCBGbG9hdC5OYU4gLypjYXBhY2l0eSovKTsKKyAgICAgICAgfQorCisgICAgICAgIExvY2FsQmF0dGVyeVN0YXRlKGJvb2xlYW4gaXNQcmVzZW50LCBpbnQgc3RhdHVzLCBmbG9hdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgbUlzUHJlc2VudCA9IGlzUHJlc2VudDsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtQ2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzUHJlc2VudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRDYXBhY2l0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FwYWNpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUgeworICAgICAgICBmaW5hbCBJbnB1dE1hbmFnZXIuS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgICAgIGZpbmFsIEV4ZWN1dG9yIG1FeGVjdXRvcjsKKworICAgICAgICBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUoS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBsaXN0ZW5lciwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5vdGlmeUtleWJvYXJkQmFja2xpZ2h0Q2hhbmdlKGludCBkZXZpY2VJZCwgSUtleWJvYXJkQmFja2xpZ2h0U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyaWdnZXJlZEJ5S2V5UHJlc3MpIHsKKyAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbktleWJvYXJkQmFja2xpZ2h0Q2hhbmdlZChkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxLZXlib2FyZEJhY2tsaWdodFN0YXRlKHN0YXRlLmJyaWdodG5lc3NMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1heEJyaWdodG5lc3NMZXZlbCksIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMb2NhbEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgZXh0ZW5kcyBJS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lci5TdHViIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25CcmlnaHRuZXNzQ2hhbmdlZChpbnQgZGV2aWNlSWQsIElLZXlib2FyZEJhY2tsaWdodFN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmlnZ2VyZWRCeUtleVByZXNzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLmdldChpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub3RpZnlLZXlib2FyZEJhY2tsaWdodENoYW5nZShkZXZpY2VJZCwgc3RhdGUsIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBpbnRlcmZhY2UgdXNlZCB0byByZXBvcnQKKyAgICAvLyB0aGUga2V5Ym9hcmQgYmFja2xpZ2h0IHN0YXRlIHZpYSB0aGUgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBpbnRlcmZhY2VzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBleHRlbmRzIEtleWJvYXJkQmFja2xpZ2h0U3RhdGUgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1CcmlnaHRuZXNzTGV2ZWw7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhCcmlnaHRuZXNzTGV2ZWw7CisKKyAgICAgICAgTG9jYWxLZXlib2FyZEJhY2tsaWdodFN0YXRlKGludCBicmlnaHRuZXNzTGV2ZWwsIGludCBtYXhCcmlnaHRuZXNzTGV2ZWwpIHsKKyAgICAgICAgICAgIG1CcmlnaHRuZXNzTGV2ZWwgPSBicmlnaHRuZXNzTGV2ZWw7CisgICAgICAgICAgICBtTWF4QnJpZ2h0bmVzc0xldmVsID0gbWF4QnJpZ2h0bmVzc0xldmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QnJpZ2h0bmVzc0xldmVsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1CcmlnaHRuZXNzTGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRNYXhCcmlnaHRuZXNzTGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1heEJyaWdodG5lc3NMZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3JlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihFeGVjdXRvciwgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uTU9OSVRPUl9LRVlCT0FSRF9CQUNLTElHSFQpCisgICAgdm9pZCByZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICBATm9uTnVsbCBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvciwgImV4ZWN1dG9yIHNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGxpc3RlbmVyLCAibGlzdGVuZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgPSBuZXcgTG9jYWxLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW0ucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5nZXQoaSkubUxpc3RlbmVyID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUgZGVsZWdhdGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckRlbGVnYXRlKGxpc3RlbmVyLCBleGVjdXRvcik7CisgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuYWRkKGRlbGVnYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3VucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIpCisgICAgICovCisgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLk1PTklUT1JfS0VZQk9BUkRfQkFDS0xJR0hUKQorICAgIHZvaWQgdW5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoCisgICAgICAgICAgICBATm9uTnVsbCBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLnJlbW92ZUlmKChkZWxlZ2F0ZSkgLT4gZGVsZWdhdGUubUxpc3RlbmVyID09IGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUltLnVucmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycyA9IG51bGw7CisgICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZ2V0SW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyKGludCkKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIFNlbnNvck1hbmFnZXIgZ2V0SW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyKGludCBkZXZpY2VJZCkgeworICAgICAgICBpZiAobUlucHV0RGV2aWNlU2Vuc29yTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyID0gbmV3IElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlU2Vuc29yTWFuYWdlci5nZXRTZW5zb3JNYW5hZ2VyKGRldmljZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRTZW5zb3JMaXN0KGludCkKKyAgICAgKi8KKyAgICBJbnB1dFNlbnNvckluZm9bXSBnZXRTZW5zb3JMaXN0KGludCBkZXZpY2VJZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZW5hYmxlU2Vuc29yKGludCwgaW50LCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBib29sZWFuIGVuYWJsZVNlbnNvcihpbnQgZGV2aWNlSWQsIGludCBzZW5zb3JUeXBlLCBpbnQgc2FtcGxpbmdQZXJpb2RVcywKKyAgICAgICAgICAgIGludCBtYXhCYXRjaFJlcG9ydExhdGVuY3lVcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5lbmFibGVTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUsIHNhbXBsaW5nUGVyaW9kVXMsCisgICAgICAgICAgICAgICAgICAgIG1heEJhdGNoUmVwb3J0TGF0ZW5jeVVzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZGlzYWJsZVNlbnNvcihpbnQsIGludCkKKyAgICAgKi8KKyAgICB2b2lkIGRpc2FibGVTZW5zb3IoaW50IGRldmljZUlkLCBpbnQgc2Vuc29yVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUltLmRpc2FibGVTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNmbHVzaFNlbnNvcihpbnQsIGludCkKKyAgICAgKi8KKyAgICBib29sZWFuIGZsdXNoU2Vuc29yKGludCBkZXZpY2VJZCwgaW50IHNlbnNvclR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtSW0uZmx1c2hTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNyZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIpCisgICAgICovCisgICAgYm9vbGVhbiByZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtSW0ucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3VucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihJSW5wdXRTZW5zb3JFdmVudExpc3RlbmVyKQorICAgICAqLworICAgIHZvaWQgdW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1JbS51bnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQppbmRleCA5Njg5YmUyLi4yNDQ2MzJhIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKQEAgLTY0LDE3ICs2NCwyNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBwcm9kdWN0IG5hbWUgZm9yIGF0dGVzdGF0aW9uLiBJbiBub24tZGVmYXVsdCBidWlsZHMgKGxpa2UgdGhlIEFPU1AgYnVpbGQpIHRoZSB2YWx1ZSBvZgogICAgICAqIHRoZSAnUFJPRFVDVCcgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAotICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBuYW1lLCBpdCdzIHJ1bm5pbmcgb24uCisgICAgICogYW5kIEtleW1pbnQgYXR0ZXN0YXRpb24gd291bGQgc3RpbGwgYXR0ZXN0IHRvIHRoZSBwcm9kdWN0IG5hbWUgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgQFRlc3RBcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZPUl9BVFRFU1RBVElPTiA9Ci0gICAgICAgICAgICBnZXRTdHJpbmcoInJvLnByb2R1Y3QubmFtZV9mb3JfYXR0ZXN0YXRpb24iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZPUl9BVFRFU1RBVElPTiA9IGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoIm5hbWUiKTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgaW5kdXN0cmlhbCBkZXNpZ24uICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFID0gZ2V0U3RyaW5nKCJyby5wcm9kdWN0LmRldmljZSIpOwogCisgICAgLyoqCisgICAgICogVGhlIGRldmljZSBuYW1lIGZvciBhdHRlc3RhdGlvbi4gSW4gbm9uLWRlZmF1bHQgYnVpbGRzIChsaWtlIHRoZSBBT1NQIGJ1aWxkKSB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgJ0RFVklDRScgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAorICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgZGV2aWNlIG5hbWUgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgQFRlc3RBcGkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfRk9SX0FUVEVTVEFUSU9OID0KKyAgICAgICAgICAgIGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoImRldmljZSIpOworCiAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGJvYXJkLCBsaWtlICJnb2xkZmlzaCIuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9BUkQgPSBnZXRTdHJpbmcoInJvLnByb2R1Y3QuYm9hcmQiKTsKIApAQCAtOTcsMTkgKzEwNywyOSBAQAogICAgIC8qKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBwcm9kdWN0L2hhcmR3YXJlLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9IGdldFN0cmluZygicm8ucHJvZHVjdC5tYW51ZmFjdHVyZXIiKTsKIAorICAgIC8qKgorICAgICAqIFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBmb3IgYXR0ZXN0YXRpb24uIEluIG5vbi1kZWZhdWx0IGJ1aWxkcyAobGlrZSB0aGUgQU9TUCBidWlsZCkgdGhlIHZhbHVlCisgICAgICogb2YgdGhlICdNQU5VRkFDVFVSRVInIHN5c3RlbSBwcm9wZXJ0eSBtYXkgYmUgZGlmZmVyZW50IHRvIHRoZSBvbmUgcHJvdmlzaW9uZWQgdG8gS2V5TWludCwKKyAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIG1hbnVmYWN0dXJlciB3aGljaCB3YXMgcHJvdmlzaW9uZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBAVGVzdEFwaQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04gPQorICAgICAgICAgICAgZ2V0VmVuZG9yRGV2aWNlSWRQcm9wZXJ0eSgibWFudWZhY3R1cmVyIik7CisKICAgICAvKiogVGhlIGNvbnN1bWVyLXZpc2libGUgYnJhbmQgd2l0aCB3aGljaCB0aGUgcHJvZHVjdC9oYXJkd2FyZSB3aWxsIGJlIGFzc29jaWF0ZWQsIGlmIGFueS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORCA9IGdldFN0cmluZygicm8ucHJvZHVjdC5icmFuZCIpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHByb2R1Y3QgYnJhbmQgZm9yIGF0dGVzdGF0aW9uLiBJbiBub24tZGVmYXVsdCBidWlsZHMgKGxpa2UgdGhlIEFPU1AgYnVpbGQpIHRoZSB2YWx1ZSBvZgogICAgICAqIHRoZSAnQlJBTkQnIHN5c3RlbSBwcm9wZXJ0eSBtYXkgYmUgZGlmZmVyZW50IHRvIHRoZSBvbmUgcHJvdmlzaW9uZWQgdG8gS2V5TWludCwKLSAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIHByb2R1Y3QgYnJhbmQsIGl0J3MgcnVubmluZyBvbi4KKyAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIHByb2R1Y3QgYnJhbmQgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgQFRlc3RBcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORF9GT1JfQVRURVNUQVRJT04gPQotICAgICAgICAgICAgICAgIGdldFN0cmluZygicm8ucHJvZHVjdC5icmFuZF9mb3JfYXR0ZXN0YXRpb24iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORF9GT1JfQVRURVNUQVRJT04gPSBnZXRWZW5kb3JEZXZpY2VJZFByb3BlcnR5KCJicmFuZCIpOwogCiAgICAgLyoqIFRoZSBlbmQtdXNlci12aXNpYmxlIG5hbWUgZm9yIHRoZSBlbmQgcHJvZHVjdC4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9IGdldFN0cmluZygicm8ucHJvZHVjdC5tb2RlbCIpOwpAQCAtMTE3LDEzICsxMzcsMTIgQEAKICAgICAvKioKICAgICAgKiBUaGUgcHJvZHVjdCBtb2RlbCBmb3IgYXR0ZXN0YXRpb24uIEluIG5vbi1kZWZhdWx0IGJ1aWxkcyAobGlrZSB0aGUgQU9TUCBidWlsZCkgdGhlIHZhbHVlIG9mCiAgICAgICogdGhlICdNT0RFTCcgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAotICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBtb2RlbCwgaXQncyBydW5uaW5nIG9uLgorICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBtb2RlbCB3aGljaCB3YXMgcHJvdmlzaW9uZWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBAVGVzdEFwaQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0ZPUl9BVFRFU1RBVElPTiA9Ci0gICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0ZPUl9BVFRFU1RBVElPTiA9IGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoIm1vZGVsIik7CiAKICAgICAvKiogVGhlIG1hbnVmYWN0dXJlciBvZiB0aGUgZGV2aWNlJ3MgcHJpbWFyeSBzeXN0ZW0tb24tY2hpcC4gKi8KICAgICBATm9uTnVsbApAQCAtMTUyNyw2ICsxNTQ2LDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgcHJvcGVydHkpIHsKICAgICAgICAgcmV0dXJuIFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5LCBVTktOT1dOKTsKICAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIGF0dGVzdGF0aW9uIHNwZWNpZmljIHByb2VydGllcy4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgbW9kZWwsIG5hbWUsIGJyYW5kLCBkZXZpY2Ugb3IgbWFudWZhY3R1cmVyLgorICAgICAqIEByZXR1cm4gcHJvcGVydHkgdmFsdWUgb3IgVU5LTk9XTgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWZW5kb3JEZXZpY2VJZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBTdHJpbmcgYXR0ZXN0UHJvcCA9IGdldFN0cmluZygKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZm9ybWF0U2ltcGxlKCJyby5wcm9kdWN0LiVzX2Zvcl9hdHRlc3RhdGlvbiIsIHByb3BlcnR5KSk7CisgICAgICAgIHJldHVybiBhdHRlc3RQcm9wLmVxdWFscyhVTktOT1dOKQorICAgICAgICAgICAgICAgID8gZ2V0U3RyaW5nKFRleHRVdGlscy5mb3JtYXRTaW1wbGUoInJvLnByb2R1Y3QudmVuZG9yLiVzIiwgcHJvcGVydHkpKSA6IFVOS05PV047CisgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0U3RyaW5nTGlzdChTdHJpbmcgcHJvcGVydHksIFN0cmluZyBzZXBhcmF0b3IpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHkpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvVXNlck1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1VzZXJNYW5hZ2VyLmphdmEKaW5kZXggMjkwZjkyOS4uODZlNjc4ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvVXNlck1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Vc2VyTWFuYWdlci5qYXZhCkBAIC01NjAxLDE2ICs1NjAxLDE1IEBACiAgICAgICoKICAgICAgKiBAc2VlICNLRVlfUkVTVFJJQ1RJT05TX1BFTkRJTkcKICAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFVzZQorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCisgICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFwcHMgb24gdGhlIGRldmljZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHNldAorICAgICAqIHJlc3RyaWN0aW9ucywgZS5nLiBhbiBFbnRlcnByaXNlIERldmljZSBQb2xpY3kgQ29udHJvbGxlciAoRFBDKSBhbmQgYSBTdXBlcnZpc2lvbiBhZG1pbi4KKyAgICAgKiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IHRoZSBEUENzLiBUbyByZXRyaWV2ZSByZXN0cmljdGlvbnMKKyAgICAgKiBzZXQgYnkgYWxsIG1hbmFnaW5nIGFwcHMsIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgotICAgICAqIFN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sIGl0IGlzCi0gICAgICogcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFnZW50cyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0Ci0gICAgICogcmVzdHJpY3Rpb25zLiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IGRldmljZSBwb2xpY3kgY29udHJvbGxlcnMKLSAgICAgKiAoRFBDcykKICAgICAgKgogICAgICAqIEBzZWUgRGV2aWNlUG9saWN5TWFuYWdlcgogICAgICAqLwotICAgIEBEZXByZWNhdGVkCiAgICAgQFdvcmtlclRocmVhZAogICAgIEBVc2VySGFuZGxlQXdhcmUoZW5hYmxlZFNpbmNlVGFyZ2V0U2RrVmVyc2lvbiA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuVElSQU1JU1UpCiAgICAgcHVibGljIEJ1bmRsZSBnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9ucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKQEAgLTU2MjMsMTIgKzU2MjIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2UKKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgdmVyc2lvbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LAorICAgICAqIGl0IGlzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSBtYW5hZ2luZyBhcHBzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKKyAgICAgKiByZXN0cmljdGlvbnMsIGUuZy4gYW4gRW50ZXJwcmlzZSBEZXZpY2UgUG9saWN5IENvbnRyb2xsZXIgKERQQykgYW5kIGEgU3VwZXJ2aXNpb24gYWRtaW4uCisgICAgICogVGhpcyBBUEkgd2lsbCBvbmx5IHRvIHJldHVybiB0aGUgcmVzdHJpY3Rpb25zIHNldCBieSB0aGUgRFBDcy4gVG8gcmV0cmlldmUgcmVzdHJpY3Rpb25zCisgICAgICogc2V0IGJ5IGFsbCBtYW5hZ2luZyBhcHBzLCB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlJlc3RyaWN0aW9uc01hbmFnZXIjZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNQZXJBZG1pbn0gaW5zdGVhZC4KICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlcHJlY2F0ZWQKICAgICBAV29ya2VyVGhyZWFkCiAgICAgcHVibGljIEJ1bmRsZSBnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9ucyhTdHJpbmcgcGFja2FnZU5hbWUsIFVzZXJIYW5kbGUgdXNlcikgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKaW5kZXggMDdkMjY1Yi4uMTI3YzdhMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC05NTQxLDYgKzk1NDEsMTQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSRUVOU0FWRVJfQ09NUExJQ0FUSU9OU19FTkFCTEVEID0KICAgICAgICAgICAgICAgICAic2NyZWVuc2F2ZXJfY29tcGxpY2F0aW9uc19lbmFibGVkIjsKIAorICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBob21lIGNvbnRyb2xzIGFyZSBlbmFibGVkIHRvIGJlIHNob3duIG92ZXIgdGhlIHNjcmVlbnNhdmVyIGJ5IHRoZSB1c2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSRUVOU0FWRVJfSE9NRV9DT05UUk9MU19FTkFCTEVEID0KKyAgICAgICAgICAgICAgICAic2NyZWVuc2F2ZXJfaG9tZV9jb250cm9sc19lbmFibGVkIjsKKwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBEZWZhdWx0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBoYXMgbm90IHlldCBzdGFydGVkIHRoZSBkb2NrIHNldHVwIGZsb3cuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL2RyZWFtcy9EcmVhbVNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtU2VydmljZS5qYXZhCmluZGV4IGNlOGFmODMuLmQwZjM4MjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtU2VydmljZS5qYXZhCkBAIC0xMzYyLDYgKzEzNjIsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoIUFjdGl2aXR5VGFza01hbmFnZXIuZ2V0U2VydmljZSgpLnN0YXJ0RHJlYW1BY3Rpdml0eShpKSkgewogICAgICAgICAgICAgICAgICAgICBkZXRhY2goKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncobVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBTZWN1cml0eUV4Y2VwdGlvbiB0cnlpbmcgdG8gc3RhcnQgRHJlYW1BY3Rpdml0eS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWJvcnRpbmcgZHJlYW0gc3RhcnQuIik7CisgICAgICAgICAgICAgICAgZGV0YWNoKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53KG1UYWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBhY3Rpdml0eSB0YXNrIG1hbmFnZXIgdG8gc3RhcnQgZHJlYW0gYWN0aXZpdHkiKTsKICAgICAgICAgICAgICAgICBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL0Fic3RyYWN0RGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWJzdHJhY3REZXRlY3Rvci5qYXZhCmluZGV4IDY0NGEyYmYuLjBmM2U4ZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWJzdHJhY3REZXRlY3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWJzdHJhY3REZXRlY3Rvci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwotaW1wb3J0IGFuZHJvaWQuYXBwLmNvbXBhdC5Db21wYXRDaGFuZ2VzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5wZXJtaXNzaW9uLklkZW50aXR5OwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwpAQCAtMTAwLDcgKzk5LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKAogICAgICAgICAgICAgQE5vbk51bGwgUGFyY2VsRmlsZURlc2NyaXB0b3IgYXVkaW9TdHJlYW0sCiAgICAgICAgICAgICBATm9uTnVsbCBBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3JlY29nbml6ZUhvdHdvcmQiKTsKICAgICAgICAgfQpAQCAtMTMyLDE4ICsxMzEsMTMgQEAKICAgICAgKiBAcGFyYW0gc2hhcmVkTWVtb3J5IFRoZSB1bnJlc3RyaWN0ZWQgZGF0YSBibG9iIHRvIHByb3ZpZGUgdG8gdGhlCiAgICAgICogICAgICAgIHtAbGluayBWaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2V9IGFuZCB7QGxpbmsgSG90d29yZERldGVjdGlvblNlcnZpY2V9LiBVc2UgdGhpcyB0bwogICAgICAqICAgICAgICAgcHJvdmlkZSB0aGUgaG90d29yZCBtb2RlbHMgZGF0YSBvciBvdGhlciBzdWNoIGRhdGEgdG8gdGhlIHRydXN0ZWQgcHJvY2Vzcy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YKLSAgICAgKiAgICAgICAgIEFuZHJvaWQgVGlyYW1pc3Ugb3IgYWJvdmUgYW5kIGF0dGVtcHRzIHRvIHN0YXJ0IGEgcmVjb2duaXRpb24gd2hlbiB0aGUgZGV0ZWN0b3IgaXMKLSAgICAgKiAgICAgICAgIG5vdCBhYmxlIGJhc2VkIG9uIHRoZSBzdGF0ZS4gQmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIHVwZGF0ZXMgdmlhIGFuIGFzeW5jaHJvbm91cwotICAgICAqICAgICAgICAgY2FsbGJhY2sgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgZGV0ZWN0b3IgY2FuIGNoYW5nZSB3aXRob3V0IGNhbGxlcidzIGtub3dsZWRnZSwgYQotICAgICAqICAgICAgICAgY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMge0BsaW5rIEhvdHdvcmREZXRlY3Rvcn0gd2Fzbid0IHNwZWNpZmllZCB0byB1c2UgYQogICAgICAqICAgICAgICAge0BsaW5rIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlfSBvciB7QGxpbmsgVmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlfSB3aGVuIGl0IHdhcwogICAgICAqICAgICAgICAgY3JlYXRlZC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgQE51bGxhYmxlIFNoYXJlZE1lbW9yeSBzaGFyZWRNZW1vcnkpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlU3RhdGUoKSIpOwogICAgICAgICB9CkBAIC0xOTksMTMgKzE5Myw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCB0aHJvd0lmRGV0ZWN0b3JJc05vTG9uZ2VyQWN0aXZlKCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJvd0lmRGV0ZWN0b3JJc05vTG9uZ2VyQWN0aXZlKCkgewogICAgICAgICBpZiAoIW1Jc0RldGVjdG9yQWN0aXZlLmdldCgpKSB7CiAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byB1c2UgYSBkZXN0cm95ZWQgZGV0ZWN0b3Igd2hpY2ggaXMgbm8gbG9uZ2VyIGFjdGl2ZSIpOwotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gdXNlIGEgZGVzdHJveWVkIGRldGVjdG9yIHdoaWNoIGlzIG5vIGxvbmdlciBhY3RpdmUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHVzZSBhIGRlc3Ryb3llZCBkZXRlY3RvciB3aGljaCBpcyBubyBsb25nZXIgYWN0aXZlIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuamF2YQppbmRleCAyODMwZmI3Li5mZmExNWYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL0Fsd2F5c09uSG90d29yZERldGVjdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BbHdheXNPbkhvdHdvcmREZXRlY3Rvci5qYXZhCkBAIC04MjcsMjggKzgyNywxOSBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCB0aGlzIEFsd2F5c09uSG90d29yZERldGVjdG9yIHdhc24ndCBzcGVjaWZpZWQgdG8gdXNlIGEKLSAgICAgKiAgICAgICAgIHtAbGluayBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZX0gd2hlbiBpdCB3YXMgY3JlYXRlZC4gSW4gYWRkaXRpb24sIHRoZSBleGNlcHRpb24gY2FuCi0gICAgICogICAgICAgICBiZSB0aHJvd24gaWYgdGhpcyBBbHdheXNPbkhvdHdvcmREZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmCi0gICAgICogICAgICAgICB0aGlzIEFsd2F5c09uSG90d29yZERldGVjdG9yIHdhc24ndCBzcGVjaWZpZWQgdG8gdXNlIGEKLSAgICAgKiAgICAgICAgIHtAbGluayBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZX0gd2hlbiBpdCB3YXMgY3JlYXRlZC4gSW4gYWRkaXRpb24sIHRoZSBleGNlcHRpb24gY2FuCi0gICAgICogICAgICAgICBiZSB0aHJvd24gaWYgdGhpcyBBbHdheXNPbkhvdHdvcmREZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3Igd2Fzbid0IHNwZWNpZmllZCB0byB1c2UgYQorICAgICAqIHtAbGluayBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZX0gd2hlbiBpdCB3YXMgY3JlYXRlZC4gSW4gYWRkaXRpb24sIGlmIHRoaXMKKyAgICAgKiBBbHdheXNPbkhvdHdvcmREZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zLAotICAgICAgICAgICAgQE51bGxhYmxlIFNoYXJlZE1lbW9yeSBzaGFyZWRNZW1vcnkpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBpZiAoIW1TdXBwb3J0U2FuZGJveGVkRGV0ZWN0aW9uU2VydmljZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlU3RhdGUgY2FsbGVkLCBidXQgaXQgZG9lc24ndCBzdXBwb3J0IGhvdHdvcmQgZGV0ZWN0aW9uIHNlcnZpY2UiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZVN0YXRlIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlU3RhdGUgY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKICAgICAgICAgICAgIH0KQEAgLTg2OSwxNyArODYwLDE2IEBACiAgICAgQFRlc3RBcGkKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZUF2YWlsYWJpbGl0eShpbnQgYXZhaWxhYmlsaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1BdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHk7CisgICAgICAgICAgICBtSXNBdmFpbGFiaWxpdHlPdmVycmlkZGVuQnlUZXN0QXBpID0gdHJ1ZTsKICAgICAgICAgICAgIC8vIEVOUk9MTEVEIHN0YXRlIHJlcXVpcmVzIHRoZXJlIHRvIGJlIG1ldGFkYXRhIGFib3V0IHRoZSBzb3VuZCBtb2RlbCBzbyBhIGZha2Ugb25lCiAgICAgICAgICAgICAvLyBpcyBjcmVhdGVkLgotICAgICAgICAgICAgaWYgKG1LZXlwaHJhc2VNZXRhZGF0YSA9PSBudWxsICYmIGF2YWlsYWJpbGl0eSA9PSBTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUQpIHsKKyAgICAgICAgICAgIGlmIChtS2V5cGhyYXNlTWV0YWRhdGEgPT0gbnVsbCAmJiBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRCkgewogICAgICAgICAgICAgICAgIFNldDxMb2NhbGU+IGZha2VTdXBwb3J0ZWRMb2NhbGVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgICAgIGZha2VTdXBwb3J0ZWRMb2NhbGVzLmFkZChtTG9jYWxlKTsKICAgICAgICAgICAgICAgICBtS2V5cGhyYXNlTWV0YWRhdGEgPSBuZXcgS2V5cGhyYXNlTWV0YWRhdGEoMSwgbVRleHQsIGZha2VTdXBwb3J0ZWRMb2NhbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuUkVDT0dOSVRJT05fTU9ERV9WT0lDRV9UUklHR0VSKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKLSAgICAgICAgICAgIG1Jc0F2YWlsYWJpbGl0eU92ZXJyaWRkZW5CeVRlc3RBcGkgPSB0cnVlOwogICAgICAgICAgICAgbm90aWZ5U3RhdGVDaGFuZ2VkTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC05MzUsMjMgKzkyNSwxNCBAQAogICAgICAqIEBzZWUgI1JFQ09HTklUSU9OX01PREVfVVNFUl9JREVOVElGSUNBVElPTgogICAgICAqIEBzZWUgI1JFQ09HTklUSU9OX01PREVfVk9JQ0VfVFJJR0dFUgogICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUuIEJlY2F1c2UgdGhlIGNhbGxlciByZWNlaXZlcyBhdmFpbGFiaWxpdHkgdXBkYXRlcyB2aWEgYW4gYXN5bmNocm9ub3VzCi0gICAgICogICAgICAgICBjYWxsYmFjaywgaXQgbWF5IGJlIGR1ZSB0byB0aGUgYXZhaWxhYmlsaXR5IGNoYW5naW5nIHdoaWxlIHRoaXMgY2FsbCBpcyBwZXJmb3JtZWQuCi0gICAgICogICAgICAgICAtIFRocm93cyBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KLSAgICAgKiAgICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQotICAgICAqICAgICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgQW5kcm9pZCBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8KLSAgICAgKiAgICAgICAgIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQW5kcm9pZCBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlcgotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcwotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGtleXBocmFzZSBpdHNlbGYgaXNuJ3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCisgICAgICogICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwotICAgIHB1YmxpYyBAUmVjb2duaXRpb25Nb2RlcwotICAgIGludCBnZXRTdXBwb3J0ZWRSZWNvZ25pdGlvbk1vZGVzKCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQFJlY29nbml0aW9uTW9kZXMgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMoKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJnZXRTdXBwb3J0ZWRSZWNvZ25pdGlvbk1vZGVzKCkiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXNMb2NrZWQoKTsKQEAgLTk1OSwyMiArOTQwLDE0IEBACiAgICAgfQogCiAgICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXNMb2NrZWQoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHByaXZhdGUgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXNMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKCJnZXRTdXBwb3J0ZWRSZWNvZ25pdGlvbk1vZGVzIGNhbGxlZCBvbiBhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2RlcyBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVGhpcyBtZXRob2Qgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBjYW4gYWN0dWFsbHkgc3VwcG9ydCBhIHJlY29nbml0aW9uLgogICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSAhPSBTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUQgfHwgbUtleXBocmFzZU1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigiR2V0dGluZyBzdXBwb3J0ZWQgcmVjb2duaXRpb24gbW9kZXMgZm9yIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRoZSBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiR2V0dGluZyBzdXBwb3J0ZWQgcmVjb2duaXRpb24gbW9kZXMgZm9yIHRoZSBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CkBAIC0xMDI5LDMwICsxMDAyLDE1IEBACiAgICAgICogICAgICAgICAgICAgc3RhcnRSZWNvZ25pdGlvbiByZXF1ZXN0LiBUaGlzIGRhdGEgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgICAgKiAgICAgICAgICAgICB3aGVuIHN0YXJ0aW5nIHRoZSBvcGFxdWUgc291bmQgbW9kZWwuCiAgICAgICogQHJldHVybiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FsbCBzdWNjZWVkZWQgb3Igbm90LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCBhdHRlbXB0cyB0byBzdGFydCBhIHJlY29nbml0aW9uIHdoZW4gdGhlIGRldGVjdG9yIGlzIG5vdCBhYmxlIGJhc2VkIG9uCi0gICAgICogICAgICAgICB0aGUgYXZhaWxhYmlsaXR5IHN0YXRlLiBUaGlzIGNhbiBiZSB0aHJvd24gZXZlbiBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gY2hlY2tlZCBiZWZvcmUKLSAgICAgKiAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIGF2YWlsYWJpbGl0eSB1cGRhdGVzIHZpYSBhbgotICAgICAqICAgICAgICAgYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBpdCBtYXkgYmUgZHVlIHRvIHRoZSBhdmFpbGFiaWxpdHkgY2hhbmdpbmcgd2hpbGUgdGhpcyBjYWxsIGlzCi0gICAgICogICAgICAgICBwZXJmb3JtZWQuCi0gICAgICogICAgICAgICAtIFRocm93cyBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLgotICAgICAqICAgICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KLSAgICAgKiAgICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiAgICAgICAgIC0gQWxzbyB0aHJvd3MgaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCi0gICAgICogICAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKLSAgICAgKiAgICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIEFuZHJvaWQgaWYgdGhlIHJlY29nbml0aW9uIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbiB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvCi0gICAgICogICAgICAgICBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFuZHJvaWQgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtSRUNPUkRfQVVESU8sIENBUFRVUkVfQVVESU9fSE9UV09SRH0pCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihAUmVjb2duaXRpb25GbGFncyBpbnQgcmVjb2duaXRpb25GbGFncywgQE5vbk51bGwgYnl0ZVtdIGRhdGEpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oQFJlY29nbml0aW9uRmxhZ3MgaW50IHJlY29nbml0aW9uRmxhZ3MsIEBOb25OdWxsIGJ5dGVbXSBkYXRhKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIHJldHVybiBzdGFydFJlY29nbml0aW9uTG9ja2VkKHJlY29nbml0aW9uRmxhZ3MsIGRhdGEpCiAgICAgICAgICAgICAgICAgICAgID09IFNUQVRVU19PSzsKQEAgLTEwNjksMzAgKzEwMjcsMTUgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByZWNvZ25pdGlvbkZsYWdzIFRoZSBmbGFncyB0byBjb250cm9sIHRoZSByZWNvZ25pdGlvbiBwcm9wZXJ0aWVzLgogICAgICAqIEByZXR1cm4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGwgc3VjY2VlZGVkIG9yIG5vdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RhcnQgYSByZWNvZ25pdGlvbiB3aGVuIHRoZSBkZXRlY3RvciBpcyBub3QgYWJsZSBiYXNlZCBvbgotICAgICAqICAgICAgICAgdGhlIGF2YWlsYWJpbGl0eSBzdGF0ZS4gVGhpcyBjYW4gYmUgdGhyb3duIGV2ZW4gaWYgdGhlIHN0YXRlIGhhcyBiZWVuIGNoZWNrZWQgYmVmb3JlCi0gICAgICogICAgICAgICBjYWxsaW5nIHRoaXMgbWV0aG9kIGJlY2F1c2UgdGhlIGNhbGxlciByZWNlaXZlcyBhdmFpbGFiaWxpdHkgdXBkYXRlcyB2aWEgYW4KLSAgICAgKiAgICAgICAgIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgaXQgbWF5IGJlIGR1ZSB0byB0aGUgYXZhaWxhYmlsaXR5IGNoYW5naW5nIHdoaWxlIHRoaXMgY2FsbCBpcwotICAgICAqICAgICAgICAgcGVyZm9ybWVkLgotICAgICAqICAgICAgICAgLSBUaHJvd3MgaWYgdGhlIHJlY29nbml0aW9uIGlzbid0IHN1cHBvcnRlZC4KLSAgICAgKiAgICAgICAgICAgQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCi0gICAgICogICAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogICAgICAgICAtIEFsc28gdGhyb3dzIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgotICAgICAqICAgICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCi0gICAgICogICAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYQotICAgICAqICAgICAgICAgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcwotICAgICAqICAgICAgICAgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmIHRoZQotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtSRUNPUkRfQVVESU8sIENBUFRVUkVfQVVESU9fSE9UV09SRH0pCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihAUmVjb2duaXRpb25GbGFncyBpbnQgcmVjb2duaXRpb25GbGFncykKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihAUmVjb2duaXRpb25GbGFncyBpbnQgcmVjb2duaXRpb25GbGFncykgewogICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAic3RhcnRSZWNvZ25pdGlvbigiICsgcmVjb2duaXRpb25GbGFncyArICIpIik7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIHJldHVybiBzdGFydFJlY29nbml0aW9uTG9ja2VkKHJlY29nbml0aW9uRmxhZ3MsIG51bGwgLyogZGF0YSAqLykgPT0gU1RBVFVTX09LOwpAQCAtMTEwNiw4ICsxMDQ5LDcgQEAKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb2duaXRpb24oMCk7CiAgICAgfQogCkBAIC0xMTE3LDQ0ICsxMDU5LDI4IEBACiAgICAgICogU2V0dGluZ3MuU2VjdXJlLlZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYWxsIHN1Y2NlZWRlZCBvciBub3QuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mCi0gICAgICogICAgICAgICBBUEkgbGV2ZWwgMzMgb3IgYWJvdmUgYW5kIGF0dGVtcHRzIHRvIHN0b3AgYSByZWNvZ25pdGlvbiB3aGVuIHRoZSBkZXRlY3RvciBpcwotICAgICAqICAgICAgICAgbm90IGFibGUgYmFzZWQgb24gdGhlIHN0YXRlLiBUaGlzIGNhbiBiZSB0aHJvd24gZXZlbiBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gY2hlY2tlZAotICAgICAqICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIGF2YWlsYWJpbGl0eSB1cGRhdGVzIHZpYSBhbgotICAgICAqICAgICAgICAgYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBpdCBtYXkgYmUgZHVlIHRvIHRoZSBhdmFpbGFiaWxpdHkgY2hhbmdpbmcgd2hpbGUgdGhpcyBjYWxsIGlzCi0gICAgICogICAgICAgICBwZXJmb3JtZWQuCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgaWYgdGhlIHJlY29nbml0aW9uIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEKLSAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbiB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMKLSAgICAgKiAgICAgICAgIGV4Y2VwdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZiB0aGUKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCisgICAgICogICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwogICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIFJlcXVpcmVzUGVybWlzc2lvbiBzaW5jZSBpdCBpc24ndCBhY3R1YWxseSBlbmZvcmNlZC4gQWxzbyBmaXggdGhlIGphdmFkb2MKICAgICAvLyBhYm91dCBwZXJtaXNzaW9ucyBlbmZvcmNlbWVudCAod2hlbiBpdCB0aHJvd3MgdnMgd2hlbiBpdCBqdXN0IHJldHVybnMgZmFsc2UpIGZvciBvdGhlcgogICAgIC8vIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgInN0b3BSZWNvZ25pdGlvbigpIik7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3BSZWNvZ25pdGlvbiBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgInN0b3BSZWNvZ25pdGlvbiBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gc3RhcnQvc3RvcCBhIHJlY29nbml0aW9uLgogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgIT0gU1RBVEVfS0VZUEhSQVNFX0VOUk9MTEVEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjb2duaXRpb24gZm9yIHRoZSBnaXZlbiBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjb2duaXRpb24gZm9yIHRoZSBnaXZlbiBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgfQpAQCAtMTE3OSwyOCArMTEwNSwxOCBAQAogICAgICAqICAgICAgICAgLSB7QGxpbmsgU291bmRUcmlnZ2VyI1NUQVRVU19CQURfVkFMVUV9IGludmFsaWQgaW5wdXQgcGFyYW1ldGVyCiAgICAgICogICAgICAgICAtIHtAbGluayBTb3VuZFRyaWdnZXIjU1RBVFVTX0lOVkFMSURfT1BFUkFUSU9OfSBpZiB0aGUgY2FsbCBpcyBvdXQgb2Ygc2VxdWVuY2Ugb3IKICAgICAgKiAgICAgICAgICAgaWYgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSEFMCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yCi0gICAgICogICAgICAgICBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yCi0gICAgICogICAgICAgICBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYgdGhlCi0gICAgICogICAgICAgICBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7UkVDT1JEX0FVRElPLCBDQVBUVVJFX0FVRElPX0hPVFdPUkR9KQotICAgIHB1YmxpYyBpbnQgc2V0UGFyYW1ldGVyKEBNb2RlbFBhcmFtcyBpbnQgbW9kZWxQYXJhbSwgaW50IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHNldFBhcmFtZXRlcihATW9kZWxQYXJhbXMgaW50IG1vZGVsUGFyYW0sIGludCB2YWx1ZSkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAic2V0UGFyYW1ldGVyKCIgKyBtb2RlbFBhcmFtICsgIiwgIiArIHZhbHVlICsgIikiKTsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgInNldFBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICAgICAgfQpAQCAtMTIyMSwyNyArMTEzNywxOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1vZGVsUGFyYW0gICB7QGxpbmsgTW9kZWxQYXJhbXN9CiAgICAgICogQHJldHVybiB2YWx1ZSBvZiBwYXJhbWV0ZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZgotICAgICAqICAgICAgICAgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtSRUNPUkRfQVVESU8sIENBUFRVUkVfQVVESU9fSE9UV09SRH0pCi0gICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoQE1vZGVsUGFyYW1zIGludCBtb2RlbFBhcmFtKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyKEBNb2RlbFBhcmFtcyBpbnQgbW9kZWxQYXJhbSkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZ2V0UGFyYW1ldGVyKCIgKyBtb2RlbFBhcmFtICsgIikiKTsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgImdldFBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICAgICAgfQpAQCAtMTI1OSwyOSArMTE2NiwxOSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1vZGVsUGFyYW0ge0BsaW5rIE1vZGVsUGFyYW1zfQogICAgICAqIEByZXR1cm4gc3VwcG9ydGVkIHJhbmdlIG9mIHBhcmFtZXRlciwgbnVsbCBpZiBub3Qgc3VwcG9ydGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yCi0gICAgICogICAgICAgICBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yCi0gICAgICogICAgICAgICBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYKLSAgICAgKiAgICAgICAgIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7UkVDT1JEX0FVRElPLCBDQVBUVVJFX0FVRElPX0hPVFdPUkR9KQogICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBNb2RlbFBhcmFtUmFuZ2UgcXVlcnlQYXJhbWV0ZXIoQE1vZGVsUGFyYW1zIGludCBtb2RlbFBhcmFtKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgTW9kZWxQYXJhbVJhbmdlIHF1ZXJ5UGFyYW1ldGVyKEBNb2RlbFBhcmFtcyBpbnQgbW9kZWxQYXJhbSkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicXVlcnlQYXJhbWV0ZXIoIiArIG1vZGVsUGFyYW0gKyAiKSIpOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVlcnlQYXJhbWV0ZXIgY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJxdWVyeVBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICAgICAgfQpAQCAtMTI5OCwyNSArMTE5NSwxNSBAQAogICAgICAqIG90aGVyd2lzZSB7QGxpbmsgI2NyZWF0ZVJlRW5yb2xsSW50ZW50KCl9IHNob3VsZCBiZSBwcmVmZXJyZWQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBJbnRlbnR9IHRvIHN0YXJ0IGVucm9sbG1lbnQgZm9yIHRoZSBnaXZlbiBrZXlwaHJhc2UuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUuCi0gICAgICogICAgICAgICAtIFRocm93biBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzCi0gICAgICogICAgICAgICAgIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgotICAgICAqICAgICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqICAgICAgICAgLSBUaHJvd24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yCi0gICAgICogICAgICAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgICAgaGFzIGJlZW4gc2h1dCBkb3duLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbiB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvCi0gICAgICogICAgICAgICBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZiB0aGUKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuCi0gICAgICogICAgICAgICBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuCi0gICAgICogICAgICAgICBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQE51bGxhYmxlCi0gICAgcHVibGljIEludGVudCBjcmVhdGVFbnJvbGxJbnRlbnQoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBJbnRlbnQgY3JlYXRlRW5yb2xsSW50ZW50KCkgewogICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiY3JlYXRlRW5yb2xsSW50ZW50Iik7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIHJldHVybiBnZXRNYW5hZ2VJbnRlbnRMb2NrZWQoS2V5cGhyYXNlRW5yb2xsbWVudEluZm8uTUFOQUdFX0FDVElPTl9FTlJPTEwpOwpAQCAtMTMzMCwyNSArMTIxNywxNSBAQAogICAgICAqIGkuZS4ge0BsaW5rICNTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUR9LCBvdGhlcndpc2UgaW52b2tpbmcgdGhpcyBtYXkgcmVzdWx0IGluIGFuIGVycm9yLgogICAgICAqCiAgICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50fSB0byBzdGFydCB1bi1lbnJvbGxtZW50IGZvciB0aGUgZ2l2ZW4ga2V5cGhyYXNlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlLgotICAgICAqICAgICAgICAgLSBUaHJvd24gaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcwotICAgICAqICAgICAgICAgICBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KLSAgICAgKiAgICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiAgICAgICAgIC0gVGhyb3duIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvcgotICAgICAqICAgICAgICAgICBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yCi0gICAgICogICAgICAgICAgIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24ge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0bwotICAgICAqICAgICAgICAgYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYgdGhlCi0gICAgICogICAgICAgICBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbgotICAgICAqICAgICAgICAgaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbgotICAgICAqICAgICAgICAgc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCisgICAgICogICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwogICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBJbnRlbnQgY3JlYXRlVW5FbnJvbGxJbnRlbnQoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBJbnRlbnQgY3JlYXRlVW5FbnJvbGxJbnRlbnQoKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJjcmVhdGVVbkVucm9sbEludGVudCIpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0TWFuYWdlSW50ZW50TG9ja2VkKEtleXBocmFzZUVucm9sbG1lbnRJbmZvLk1BTkFHRV9BQ1RJT05fVU5fRU5ST0xMKTsKQEAgLTEzNjIsMjUgKzEyMzksMTUgQEAKICAgICAgKiBpLmUuIHtAbGluayAjU1RBVEVfS0VZUEhSQVNFX0VOUk9MTEVEfSwgb3RoZXJ3aXNlIGludm9raW5nIHRoaXMgbWF5IHJlc3VsdCBpbiBhbiBlcnJvci4KICAgICAgKgogICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudH0gdG8gc3RhcnQgcmUtZW5yb2xsbWVudCBmb3IgdGhlIGdpdmVuIGtleXBocmFzZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZS4KLSAgICAgKiAgICAgICAgIC0gVGhyb3duIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMKLSAgICAgKiAgICAgICAgICAgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCi0gICAgICogICAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogICAgICAgICAtIFRocm93biBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgICAgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvcgotICAgICAqICAgICAgICAgICBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8KLSAgICAgKiAgICAgICAgIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmIHRoZQotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgorICAgICAqICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KKyAgICAgKiAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KICAgICAgKi8KICAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgSW50ZW50IGNyZWF0ZVJlRW5yb2xsSW50ZW50KCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgSW50ZW50IGNyZWF0ZVJlRW5yb2xsSW50ZW50KCkgewogICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiY3JlYXRlUmVFbnJvbGxJbnRlbnQiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIGdldE1hbmFnZUludGVudExvY2tlZChLZXlwaHJhc2VFbnJvbGxtZW50SW5mby5NQU5BR0VfQUNUSU9OX1JFX0VOUk9MTCk7CkBAIC0xMzg4LDI0ICsxMjU1LDE1IEBACiAgICAgfQogCiAgICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IGdldE1hbmFnZUludGVudExvY2tlZChAS2V5cGhyYXNlRW5yb2xsbWVudEluZm8uTWFuYWdlQWN0aW9ucyBpbnQgYWN0aW9uKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIEludGVudCBnZXRNYW5hZ2VJbnRlbnRMb2NrZWQoQEtleXBocmFzZUVucm9sbG1lbnRJbmZvLk1hbmFnZUFjdGlvbnMgaW50IGFjdGlvbikgewogICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSA9PSBTVEFURV9JTlZBTElEIHx8IG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJnZXRNYW5hZ2VJbnRlbnQgY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgImdldE1hbmFnZUludGVudCBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOworICAgICAgICAgICAgICAgICAgICAiZ2V0TWFuYWdlSW50ZW50IGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGlmIHdlIGNhbiBhY3R1YWxseSBzdXBwb3J0IGEgcmVjb2duaXRpb24uCiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ICE9IFNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRAogICAgICAgICAgICAgICAgICYmIG1BdmFpbGFiaWxpdHkgIT0gU1RBVEVfS0VZUEhSQVNFX1VORU5ST0xMRUQpIHsKLSAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYW5hZ2luZyB0aGUgZ2l2ZW4ga2V5cGhyYXNlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1hbmFnaW5nIHRoZSBnaXZlbiBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CkBAIC0xNDg5LDI3ICsxMzQ3LDE5IEBACiAKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCiAgICAgcHJpdmF0ZSBpbnQgc3RhcnRSZWNvZ25pdGlvbkxvY2tlZChpbnQgcmVjb2duaXRpb25GbGFncywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBieXRlW10gZGF0YSkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEBOdWxsYWJsZSBieXRlW10gZGF0YSkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAic3RhcnRSZWNvZ25pdGlvbigiCiAgICAgICAgICAgICAgICAgICAgICsgcmVjb2duaXRpb25GbGFncwogICAgICAgICAgICAgICAgICAgICArICIsICIgKyBBcnJheXMudG9TdHJpbmcoZGF0YSkgKyAiKSIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0UmVjb2duaXRpb24gY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJzdGFydFJlY29nbml0aW9uIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gc3RhcnQvc3RvcCBhIHJlY29nbml0aW9uLgogICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSAhPSBTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUQpIHsKLSAgICAgICAgICAgIGlmIChDb21wYXRDaGFuZ2VzLmlzQ2hhbmdlRW5hYmxlZChIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJSZWNvZ25pdGlvbiBmb3IgdGhlIGdpdmVuIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJSZWNvZ25pdGlvbiBmb3IgdGhlIGdpdmVuIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvSG90d29yZERldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL0hvdHdvcmREZXRlY3Rvci5qYXZhCmluZGV4IDkzZmNlYzEuLjBjOGZkNDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvSG90d29yZERldGVjdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Ib3R3b3JkRGV0ZWN0b3IuamF2YQpAQCAtMjMsMTQgKzIzLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb247CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKLWltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLkNoYW5nZUlkOwotaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uRW5hYmxlZFNpbmNlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogCkBAIC00NCwyMyArNDAsNiBAQAogcHVibGljIGludGVyZmFjZSBIb3R3b3JkRGV0ZWN0b3IgewogCiAgICAgLyoqCi0gICAgICogUHJpb3IgdG8gQVBJIGxldmVsIDMzLCBBUEkgY2FsbHMgb2Yge0BsaW5rIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3J9IGNvdWxkCi0gICAgICogcmV0dXJuIGJvdGgge0BsaW5rIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb259IG9yCi0gICAgICoge0BsaW5rIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gZGVwZW5kaW5nIG9uIHRoZSBkZXRlY3RvcidzIHVuZGVybHlpbmcgc3RhdGUuCi0gICAgICogVGhpcyBsZWFkIHRvIGNvbmZ1c2luZyBiZWhhdmlvciBhcyB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgZGV0ZWN0b3IgY2FuIGJlIG1vZGlmaWVkCi0gICAgICogd2l0aG91dCB0aGUga25vd2xlZGdlIG9mIHRoZSBjYWxsZXIgdmlhIHN5c3RlbSBzZXJ2aWNlIGxheWVyIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIGNoYW5nZSBJRCwgd2hlbiBlbmFibGVkLCBjaGFuZ2VzIHRoZSBBUEkgY2FsbHMgdG8gb25seSB0aHJvdyBjaGVja2VkIGV4Y2VwdGlvbgotICAgICAqIHtAbGluayBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9ufSB3aGVuIGNoZWNraW5nCi0gICAgICogYWdhaW5zdCBzdGF0ZSBpbmZvcm1hdGlvbiBtb2RpZmllZCBieSBib3RoIHRoZSBjYWxsZXIgYW5kIHRoZSBzeXN0ZW0gc2VydmljZXMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIEBDaGFuZ2VJZAotICAgIEBFbmFibGVkU2luY2UodGFyZ2V0U2RrVmVyc2lvbiA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuVElSQU1JU1UpCi0gICAgbG9uZyBIT1RXT1JEX0RFVEVDVE9SX1RIUk9XX0NIRUNLRURfRVhDRVBUSU9OID0gMjI2MzU1MTEyTDsKLQotICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGF0IGl0IGlzIGEgbm9uLXRydXN0ZWQgaG90d29yZCBkZXRlY3Rvci4KICAgICAgKgogICAgICAqIEBoaWRlCkBAIC0xMDksMjYgKzg4LDE2IEBACiAgICAgICogQ2FsbGluZyB0aGlzIGFnYWluIHdoaWxlIHJlY29nbml0aW9uIGlzIGFjdGl2ZSBkb2VzIG5vdGhpbmcuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdCB0byBzdGFydCByZWNvZ25pdGlvbiBzdWNjZWVkZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RhcnQgYSByZWNvZ25pdGlvbiB3aGVuIHRoZSBkZXRlY3RvciBpcyBub3QgYWJsZSBiYXNlZCBvbgotICAgICAqICAgICAgICAgdGhlIHN0YXRlLiBUaGlzIGNhbiBiZSB0aHJvd24gZXZlbiBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzCi0gICAgICogICAgICAgICBtZXRob2QgYmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIHVwZGF0ZXMgdmlhIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYW5kIHRoZQotICAgICAqICAgICAgICAgc3RhdGUgb2YgdGhlIGRldGVjdG9yIGNhbiBjaGFuZ2UgY29uY3VycmVudGx5IHRvIHRoZSBjYWxsZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKLSAgICBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247CisgICAgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCk7CiAKICAgICAvKioKICAgICAgKiBTdG9wcyBzYW5kYm94ZWQgZGV0ZWN0aW9uIHJlY29nbml0aW9uLgogICAgICAqCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlcXVlc3QgdG8gc3RvcCByZWNvZ25pdGlvbiBzdWNjZWVkZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RvcCBhIHJlY29nbml0aW9uIHdoZW4gdGhlIGRldGVjdG9yIGlzIG5vdCBhYmxlIGJhc2VkIG9uCi0gICAgICogICAgICAgICB0aGUgc3RhdGUuIFRoaXMgY2FuIGJlIHRocm93biBldmVuIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiBjaGVja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAgICAgKiAgICAgICAgIG1ldGhvZCBiZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgdXBkYXRlcyB2aWEgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBhbmQgdGhlCi0gICAgICogICAgICAgICBzdGF0ZSBvZiB0aGUgZGV0ZWN0b3IgY2FuIGNoYW5nZSBjb25jdXJyZW50bHkgdG8gdGhlIGNhbGxlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwotICAgIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOworICAgIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCk7CiAKICAgICAvKioKICAgICAgKiBTdGFydHMgaG90d29yZCByZWNvZ25pdGlvbiBvbiBhdWRpbyBjb21pbmcgZnJvbSBhbiBleHRlcm5hbCBjb25uZWN0ZWQgbWljcm9waG9uZS4KQEAgLTE0MiwxNiArMTExLDExIEBACiAgICAgICogICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBkb2VzIG5vdCBhbGxvdyBhbnkgcmVtb3RhYmxlIG9iamVjdHMgb3Igb3RoZXIgY29udGVudHMgdGhhdCBjYW4gYmUKICAgICAgKiAgICAgICAgIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBvdGhlciBwcm9jZXNzZXMuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlcXVlc3QgdG8gc3RhcnQgcmVjb2duaXRpb24gc3VjY2VlZGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUgYW5kIGF0dGVtcHRzIHRvIHN0YXJ0IGEgcmVjb2duaXRpb24gd2hlbiB0aGUgZGV0ZWN0b3IgaXMgbm90IGFibGUgYmFzZWQgb24KLSAgICAgKiAgICAgICAgIHRoZSBzdGF0ZS4gVGhpcyBjYW4gYmUgdGhyb3duIGV2ZW4gaWYgdGhlIHN0YXRlIGhhcyBiZWVuIGNoZWNrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcwotICAgICAqICAgICAgICAgbWV0aG9kIGJlY2F1c2UgdGhlIGNhbGxlciByZWNlaXZlcyB1cGRhdGVzIHZpYSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGFuZCB0aGUKLSAgICAgKiAgICAgICAgIHN0YXRlIG9mIHRoZSBkZXRlY3RvciBjYW4gY2hhbmdlIGNvbmN1cnJlbnRseSB0byB0aGUgY2FsbGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKAogICAgICAgICAgICAgQE5vbk51bGwgUGFyY2VsRmlsZURlc2NyaXB0b3IgYXVkaW9TdHJlYW0sCiAgICAgICAgICAgICBATm9uTnVsbCBBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247CisgICAgICAgICAgICBATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucyk7CiAKICAgICAvKioKICAgICAgKiBTZXQgY29uZmlndXJhdGlvbiBhbmQgcGFzcyByZWFkLW9ubHkgZGF0YSB0byBzYW5kYm94ZWQgZGV0ZWN0aW9uIHNlcnZpY2UuCkBAIC0xNjEsMTcgKzEyNSwxMCBAQAogICAgICAqIGNvbW11bmljYXRlIHdpdGggb3RoZXIgcHJvY2Vzc2VzLgogICAgICAqIEBwYXJhbSBzaGFyZWRNZW1vcnkgVGhlIHVucmVzdHJpY3RlZCBkYXRhIGJsb2IgdG8gcHJvdmlkZSB0byBzYW5kYm94ZWQgZGV0ZWN0aW9uIHNlcnZpY2VzLgogICAgICAqIFVzZSB0aGlzIHRvIHByb3ZpZGUgbW9kZWwgZGF0YSBvciBvdGhlciBzdWNoIGRhdGEgdG8gdGhlIHRydXN0ZWQgcHJvY2Vzcy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZSBhbmQgdGhlIGRldGVjdG9yIGlzIG5vdCBhYmxlIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUKLSAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgc3RhdGUuIFRoaXMgY2FuIGJlIHRocm93biBldmVuIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiBjaGVja2VkIGJlZm9yZQotICAgICAqICAgICAgICAgY2FsbGluZyB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgdXBkYXRlcyB2aWEgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLAotICAgICAqICAgICAgICAgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgZGV0ZWN0b3IgY2FuIGNoYW5nZSBjb25jdXJyZW50bHkgdG8gdGhlIGNhbGxlciBjYWxsaW5nIHRoaXMKLSAgICAgKiAgICAgICAgIG1ldGhvZC4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIEhvdHdvcmREZXRlY3RvciB3YXNuJ3Qgc3BlY2lmaWVkIHRvIHVzZSBhCiAgICAgICogICAgICAgICBzYW5kYm94ZWQgZGV0ZWN0aW9uIHNlcnZpY2Ugd2hlbiBpdCB3YXMgY3JlYXRlZC4KICAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zLCBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zLCBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSk7CiAKICAgICAvKioKICAgICAgKiBJbnZhbGlkYXRlcyB0aGlzIGRldGVjdG9yIHNvIHRoYXQgYW55IGZ1dHVyZSBjYWxscyB0byB0aGlzIHJlc3VsdApAQCAtMjk4LDE0ICsyNTUsNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBvbkhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlUmVzdGFydGVkKCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIEhvdHdvcmREZXRlY3Rvcn0gc3BlY2lmaWMgZXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBkZXRlY3RvcgotICAgICAqIGlzIGludmFsaWQgZm9yIHRoZSBnaXZlbiBhY3Rpb24uCi0gICAgICovCi0gICAgY2xhc3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkRXhjZXB0aW9uIHsKLSAgICAgICAgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Tb2Z0d2FyZUhvdHdvcmREZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Tb2Z0d2FyZUhvdHdvcmREZXRlY3Rvci5qYXZhCmluZGV4IDc2N2ZlMzcuLjc3OTAwZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvU29mdHdhcmVIb3R3b3JkRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL1NvZnR3YXJlSG90d29yZERldGVjdG9yLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oUkVDT1JEX0FVRElPKQogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgU2xvZy5pKFRBRywgIiNzdGFydFJlY29nbml0aW9uIik7CiAgICAgICAgIH0KQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIC8qKiBUT0RPOiBzdG9wUmVjb2duaXRpb24gKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKFJFQ09SRF9BVURJTykKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3N0b3BSZWNvZ25pdGlvbiIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL1Zpc3VhbFF1ZXJ5RGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvVmlzdWFsUXVlcnlEZXRlY3Rvci5qYXZhCmluZGV4IDdkYzA2ODcuLmQ3YmYwNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvVmlzdWFsUXVlcnlEZXRlY3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvVmlzdWFsUXVlcnlEZXRlY3Rvci5qYXZhCkBAIC04NCw4ICs4NCw3IEBACiAgICAgICogQHNlZSBIb3R3b3JkRGV0ZWN0b3IjdXBkYXRlU3RhdGUoUGVyc2lzdGFibGVCdW5kbGUsIFNoYXJlZE1lbW9yeSkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KSB0aHJvd3MKLSAgICAgICAgICAgIEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSkgewogICAgICAgICBtSW5pdGlhbGl6YXRpb25EZWxlZ2F0ZS51cGRhdGVTdGF0ZShvcHRpb25zLCBzaGFyZWRNZW1vcnkpOwogICAgIH0KIApAQCAtMTA0LDcgKzEwMyw3IEBACiAgICAgICogQHNlZSBIb3R3b3JkRGV0ZWN0b3Ijc3RhcnRSZWNvZ25pdGlvbigpCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtDQU1FUkEsIFJFQ09SRF9BVURJT30pCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBIb3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgU2xvZy5pKFRBRywgIiNzdGFydFJlY29nbml0aW9uIik7CiAgICAgICAgIH0KQEAgLTEyOCw3ICsxMjcsNyBAQAogICAgICAqIEBzZWUgSG90d29yZERldGVjdG9yI3N0b3BSZWNvZ25pdGlvbigpCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtDQU1FUkEsIFJFQ09SRF9BVURJT30pCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgewogICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICIjc3RvcFJlY29nbml0aW9uIik7CiAgICAgICAgIH0KQEAgLTIzNiwxMyArMjM1LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgewogICAgICAgICAgICAgdGhyb3dJZkRldGVjdG9ySXNOb0xvbmdlckFjdGl2ZSgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB7CiAgICAgICAgICAgICB0aHJvd0lmRGV0ZWN0b3JJc05vTG9uZ2VyQWN0aXZlKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjUxLDcgKzI1MCw3IEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oCiAgICAgICAgICAgICAgICAgQE5vbk51bGwgUGFyY2VsRmlsZURlc2NyaXB0b3IgYXVkaW9TdHJlYW0sCiAgICAgICAgICAgICAgICAgQE5vbk51bGwgQXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgICAgIC8vTm8tb3AsIG5vdCBzdXBwb3J0ZWQgYnkgVmlzdWFsUXVlcnlEZXRlY3RvciBhcyBpdCBzaG91bGQgYmUgdHJ1c3RlZC4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL0lSZWNvZ25pdGlvblNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9JUmVjb2duaXRpb25TZXJ2aWNlLmFpZGwKaW5kZXggMzEzNGRjZC4uMTE0OGZlMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL0lSZWNvZ25pdGlvblNlcnZpY2UuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvSVJlY29nbml0aW9uU2VydmljZS5haWRsCkBAIC03OCwyMyArNzgsMTAgQEAKICAgICAgKiBpbmZvcm1hdGlvbiBzZWUge0BsaW5rICNjaGVja1JlY29nbml0aW9uU3VwcG9ydH0sICB7QGxpbmsgI3N0YXJ0TGlzdGVuaW5nfSBhbmQKICAgICAgKiB7QGxpbmsgUmVjb2duaXplckludGVudH0uCiAgICAgICoKLSAgICAgKiBQcm9ncmVzcyBjYW4gYmUgbW9uaXRvcmQgYnkgY2FsbGluZyB7QGxpbmsgI3NldE1vZGVsRG93bmxvYWRMaXN0ZW5lcn0gYmVmb3JlIGEgdHJpZ2dlci4KKyAgICAgKiBQcm9ncmVzcyB1cGRhdGVzIGNhbiBiZSByZWNlaXZlZCB2aWEge0BsaW5rICNJTW9kZWxEb3dubG9hZExpc3RlbmVyfS4KICAgICAgKi8KLSAgICB2b2lkIHRyaWdnZXJNb2RlbERvd25sb2FkKGluIEludGVudCByZWNvZ25pemVySW50ZW50LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGxpc3RlbmVyIHRvIHJlY2VpdmVkIGRvd25sb2FkIHByb2dyZXNzIHVwZGF0ZXMuIENsaWVudHMgc3RpbGwgaGF2ZSB0byBjYWxsCi0gICAgICoge0BsaW5rICN0cmlnZ2VyTW9kZWxEb3dubG9hZH0gdG8gdHJpZ2dlciBhIG1vZGVsIGRvd25sb2FkLgotICAgICAqLwotICAgIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgIGluIEludGVudCByZWNvZ25pemVySW50ZW50LAogICAgICAgICBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgaW4gSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGxpc3RlbmVyIGZvciBtb2RlbCBkb3dubG9hZCBldmVudHMgYXR0YWNoZWQgdG8gYSByZWNvZ25pdGlvbkludGVudCBpZiBhbnkuCi0gICAgICovCi0gICAgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgaW4gSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9Nb2RlbERvd25sb2FkTGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9Nb2RlbERvd25sb2FkTGlzdGVuZXIuamF2YQppbmRleCA2YzI0Mzk5Li5hNThlYzkwYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL01vZGVsRG93bmxvYWRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9Nb2RlbERvd25sb2FkTGlzdGVuZXIuamF2YQpAQCAtMjIsMjAgKzIyLDI3IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTW9kZWxEb3dubG9hZExpc3RlbmVyIHsKICAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gd2hlbiB0aGVyZSdzIGFuIHVwZGF0ZSBvbiB0aGUgZG93bmxvYWQgcHJvZ3Jlc3MuCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9IG9ubHkgaWYgdGhlIGRvd25sb2FkIGhhcyBzdGFydGVkIGFmdGVyIHRoZSByZXF1ZXN0LgogICAgICAqCi0gICAgICogPHA+UmVjb2duaXRpb25TZXJ2aWNlIHdpbGwgY2FsbCB0aGlzIHplcm8gb3IgbW9yZSB0aW1lcyBkdXJpbmcgdGhlIGRvd25sb2FkLjwvcD4KKyAgICAgKiA8cD4gVGhlIG51bWJlciBvZiBjYWxscyB0byB0aGlzIG1ldGhvZCB2YXJpZXMgZGVwZW5kaW5nIG9mIHRoZSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfQorICAgICAqIGltcGxlbWVudGF0aW9uLiBJZiB0aGUgZG93bmxvYWQgZmluaXNoZWQgcXVpY2tseSBlbm91Z2gsIHtAbGluayAjb25TdWNjZXNzKCl9IG1heSBiZSBjYWxsZWQKKyAgICAgKiBkaXJlY3RseS4gSW4gb3RoZXIgY2FzZXMsIHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcyBkdXJpbmcgdGhlIGRvd25sb2FkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBsZXRlZFBlcmNlbnQgdGhlIHBlcmNlbnRhZ2Ugb2YgZG93bmxvYWQgdGhhdCBpcyBjb21wbGV0ZWQKICAgICAgKi8KICAgICB2b2lkIG9uUHJvZ3Jlc3MoaW50IGNvbXBsZXRlZFBlcmNlbnQpOwogCiAgICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gY29tcGxldGVkIHRoZSBkb3dubG9hZCBhbmQgaXQgY2FuIG5vdyBiZSB1c2VkIHRvCi0gICAgICogc2F0aXNmeSByZWNvZ25pdGlvbiByZXF1ZXN0cy4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQ6CisgICAgICogPGxpPiBpZiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBhdmFpbGFibGU7CisgICAgICogPGxpPiBpZiB0aGUge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gaGFzIHN0YXJ0ZWQgYW5kIGNvbXBsZXRlZCB0aGUgZG93bmxvYWQuCisgICAgICoKKyAgICAgKiA8cD4gT25jZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBtb2RlbCBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gc2F0aXNmeSByZWNvZ25pdGlvbiByZXF1ZXN0cy4KICAgICAgKi8KICAgICB2b2lkIG9uU3VjY2VzcygpOwogCiAgICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gc2NoZWR1bGVkIHRoZSBkb3dubG9hZCBidXQgd29uJ3Qgc2F0aXNmeSBpdAorICAgICAqIENhbGxlZCB3aGVuIHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9IHNjaGVkdWxlZCB0aGUgZG93bmxvYWQsIGJ1dCB3b24ndCBzYXRpc2Z5IGl0CiAgICAgICogaW1tZWRpYXRlbHkuIFRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciB1cGRhdGVzIG9uIHRoaXMgbGlzdGVuZXIuCiAgICAgICovCiAgICAgdm9pZCBvblNjaGVkdWxlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1JlY29nbml0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1JlY29nbml0aW9uU2VydmljZS5qYXZhCmluZGV4IDRlY2VjOGYuLjk2NTZmMzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9SZWNvZ25pdGlvblNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvUmVjb2duaXRpb25TZXJ2aWNlLmphdmEKQEAgLTM2LDkgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5mdW5jdGlvbi5wb29sZWQuUG9vbGVkTGFtYmRhOwogCkBAIC05MywxMCArOTEsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UUklHR0VSX01PREVMX0RPV05MT0FEID0gNjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX01PREVMX0RPV05MT0FEX0xJU1RFTkVSID0gNzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVIgPSA4OwotCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CkBAIC0xMjAsMjEgKzExNCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQXJncy5tSW50ZW50LCBjaGVja0FyZ3MuY2FsbGJhY2ssIGNoZWNrQXJncy5tQXR0cmlidXRpb25Tb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1TR19UUklHR0VSX01PREVMX0RPV05MT0FEOgotICAgICAgICAgICAgICAgICAgICBQYWlyPEludGVudCwgQXR0cmlidXRpb25Tb3VyY2U+IHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhaXI8SW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZT4pIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJpZ2dlck1vZGVsRG93bmxvYWQocGFyYW1zLmZpcnN0LCBwYXJhbXMuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX01PREVMX0RPV05MT0FEX0xJU1RFTkVSOgotICAgICAgICAgICAgICAgICAgICBNb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzIGRMaXN0ZW5lckFyZ3MgPSAoTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hTZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZExpc3RlbmVyQXJncy5tSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRMaXN0ZW5lckFyZ3MubUxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRMaXN0ZW5lckFyZ3MubUF0dHJpYnV0aW9uU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVI6Ci0gICAgICAgICAgICAgICAgICAgIFBhaXI8SW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZT4gY2xlYXJEbFBhaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYWlyPEludGVudCwgQXR0cmlidXRpb25Tb3VyY2U+KSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaENsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKGNsZWFyRGxQYWlyLmZpcnN0LCBjbGVhckRsUGFpci5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBNb2RlbERvd25sb2FkQXJncyBtb2RlbERvd25sb2FkQXJncyA9IChNb2RlbERvd25sb2FkQXJncykgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hUcmlnZ2VyTW9kZWxEb3dubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkQXJncy5tSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRBcmdzLm1BdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkQXJncy5tTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM5LDU5ICsyMjMsNTIgQEAKIAogICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFRyaWdnZXJNb2RlbERvd25sb2FkKAogICAgICAgICAgICAgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgIFJlY29nbml0aW9uU2VydmljZS50aGlzLm9uVHJpZ2dlck1vZGVsRG93bmxvYWQoaW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoU2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICBSZWNvZ25pdGlvblNlcnZpY2UudGhpcy5zZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgaW50ZW50LAotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgICAgIG5ldyBNb2RlbERvd25sb2FkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzKGludCBjb21wbGV0ZWRQZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uUHJvZ3Jlc3MoY29tcGxldGVkUGVyY2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVjb2duaXRpb25TZXJ2aWNlLnRoaXMub25UcmlnZ2VyTW9kZWxEb3dubG9hZChpbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlY29nbml0aW9uU2VydmljZS50aGlzLm9uVHJpZ2dlck1vZGVsRG93bmxvYWQoCisgICAgICAgICAgICAgICAgICAgIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIG5ldyBNb2RlbERvd25sb2FkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3MoaW50IGNvbXBsZXRlZFBlcmNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblByb2dyZXNzKGNvbXBsZXRlZFBlcmNlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblN1Y2Nlc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25TdWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNjaGVkdWxlZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25TY2hlZHVsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNjaGVkdWxlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblNjaGVkdWxlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25FcnJvcihlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkVycm9yKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoQ2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICBSZWNvZ25pdGlvblNlcnZpY2UudGhpcy5jbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihpbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGFydExpc3RlbmluZ0FyZ3MgewpAQCAtMzIzLDE3ICszMDAsMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsRG93bmxvYWRBcmdzIHsKICAgICAgICAgZmluYWwgSW50ZW50IG1JbnRlbnQ7Ci0gICAgICAgIGZpbmFsIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbUxpc3RlbmVyOwogICAgICAgICBmaW5hbCBBdHRyaWJ1dGlvblNvdXJjZSBtQXR0cmlidXRpb25Tb3VyY2U7CisgICAgICAgIEBOdWxsYWJsZSBmaW5hbCBJTW9kZWxEb3dubG9hZExpc3RlbmVyIG1MaXN0ZW5lcjsKIAotICAgICAgICBwcml2YXRlIE1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MoSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICBwcml2YXRlIE1vZGVsRG93bmxvYWRBcmdzKAorICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsCisgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHRoaXMubUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIHRoaXMubUF0dHJpYnV0aW9uU291cmNlID0gYXR0cmlidXRpb25Tb3VyY2U7CiAgICAgICAgICAgICB0aGlzLm1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlID0gYXR0cmlidXRpb25Tb3VyY2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ0MywzOCArNDIxLDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXJ9IHRvIHJlY2VpdmUgcHJvZ3Jlc3MgdXBkYXRlcyBhZnRlcgotICAgICAqIHtAbGluayAjb25UcmlnZ2VyTW9kZWxEb3dubG9hZH0gY2FsbHMuCisgICAgICogUmVxdWVzdHMgdGhlIGRvd25sb2FkIG9mIHRoZSByZWNvZ25pemVyIHN1cHBvcnQgZm9yIHtAY29kZSByZWNvZ25pemVySW50ZW50fS4KICAgICAgKgotICAgICAqIEBwYXJhbSByZWNvZ25pemVySW50ZW50IHRoZSByZXF1ZXN0IHRvIG1vbml0b3IgbW9kZWwgZG93bmxvYWQgcHJvZ3Jlc3MgZm9yLgotICAgICAqIEBwYXJhbSBtb2RlbERvd25sb2FkTGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGtlZXAgdXBkYXRlZC4KKyAgICAgKiA8cD4gUHJvdmlkZXMgdGhlIGNhbGxpbmcge0BsaW5rIEF0dHJpYnV0aW9uU291cmNlfSB0byB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBzbyB0aGF0CisgICAgICogcGVybWlzc2lvbnMgYW5kIGJhbmR3aWR0aCBjb3VsZCBiZSBjb3JyZWN0bHkgYmxhbWVkLgorICAgICAqCisgICAgICogPHA+IENsaWVudCB3aWxsIHJlY2VpdmUgdGhlIHByb2dyZXNzIHVwZGF0ZXMgdmlhIHRoZSBnaXZlbiB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyfToKKyAgICAgKgorICAgICAqIDxsaT4gSWYgdGhlIG1vZGVsIGlzIGFscmVhZHkgYXZhaWxhYmxlLCB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uU3VjY2VzcygpfSB3aWxsIGJlCisgICAgICogY2FsbGVkIGRpcmVjdGx5LiBUaGUgbW9kZWwgY2FuIGJlIHNhZmVseSB1c2VkIGFmdGVyd2FyZHMuCisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBoYXMgc3RhcnRlZCB0aGUgZG93bmxvYWQsCisgICAgICoge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lciNvblByb2dyZXNzKGludCl9IHdpbGwgYmUgY2FsbGVkIGFuIHVuc3BlY2lmaWVkICh6ZXJvIG9yIG1vcmUpCisgICAgICogbnVtYmVyIG9mIHRpbWVzIHVudGlsIHRoZSBkb3dubG9hZCBpcyBjb21wbGV0ZS4KKyAgICAgKiBXaGVuIHRoZSBkb3dubG9hZCBmaW5pc2hlcywge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lciNvblN1Y2Nlc3MoKX0gd2lsbCBiZSBjYWxsZWQuCisgICAgICogVGhlIG1vZGVsIGNhbiBiZSBzYWZlbHkgdXNlZCBhZnRlcndhcmRzLgorICAgICAqCisgICAgICogPGxpPiBJZiB0aGUge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gaGFzIG9ubHkgc2NoZWR1bGVkIHRoZSBkb3dubG9hZCwgYnV0IHdvbid0IHNhdGlzZnkgaXQKKyAgICAgKiBpbW1lZGlhdGVseSwge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lciNvblNjaGVkdWxlZCgpfSB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKiBUaGVyZSB3aWxsIGJlIG5vIGZ1cnRoZXIgdXBkYXRlcyBvbiB0aGlzIGxpc3RlbmVyLgorICAgICAqCisgICAgICogPGxpPiBJZiB0aGUgcmVxdWVzdCBmYWlscyBhdCBhbnkgdGltZSBkdWUgdG8gYSBuZXR3b3JrIG9yIHNjaGVkdWxpbmcgZXJyb3IsCisgICAgICoge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lciNvbkVycm9yKGludCl9IHdpbGwgYmUgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY29nbml6ZXJJbnRlbnQgY29udGFpbnMgcGFyYW1ldGVycyBmb3IgdGhlIHJlY29nbml0aW9uIHRvIGJlIHBlcmZvcm1lZC4gVGhlIGludGVudAorICAgICAqICAgICAgICBtYXkgYWxzbyBjb250YWluIG9wdGlvbmFsIGV4dHJhcywgc2VlIHtAbGluayBSZWNvZ25pemVySW50ZW50fS4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRpb25Tb3VyY2UgdGhlIGF0dHJpYnV0aW9uIHNvdXJjZSBvZiB0aGUgY2FsbGVyLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBvbiB3aGljaCB0byByZWNlaXZlIHVwZGF0ZXMgYWJvdXQgdGhlIG1vZGVsIGRvd25sb2FkIHJlcXVlc3QuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICBATm9uTnVsbCBJbnRlbnQgcmVjb2duaXplckludGVudCwKICAgICAgICAgICAgIEBOb25OdWxsIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgQE5vbk51bGwgTW9kZWxEb3dubG9hZExpc3RlbmVyIG1vZGVsRG93bmxvYWRMaXN0ZW5lcikgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsIFRleHRVdGlscy5mb3JtYXRTaW1wbGUoCi0gICAgICAgICAgICAgICAgICAgICIjc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyIFslc10gWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRMaXN0ZW5lcikpOwotICAgICAgICB9Ci0gICAgICAgIG1vZGVsRG93bmxvYWRMaXN0ZW5lci5vbkVycm9yKFNwZWVjaFJlY29nbml6ZXIuRVJST1JfQ0FOTk9UX0xJU1RFTl9UT19ET1dOTE9BRF9FVkVOVFMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lcn0gc2V0IHRvIHJlY2VpdmUgcHJvZ3Jlc3MgdXBkYXRlcyBmb3IgdGhlIGdpdmVuCi0gICAgICoge0Bjb2RlIHJlY29nbml6ZXJJbnRlbnR9LCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCB0aGUgcmVxdWVzdCB0byBtb25pdG9yIG1vZGVsIGRvd25sb2FkIHByb2dyZXNzIGZvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgIEBOb25OdWxsIEludGVudCByZWNvZ25pemVySW50ZW50LAotICAgICAgICAgICAgQE5vbk51bGwgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmkoVEFHLCBUZXh0VXRpbHMuZm9ybWF0U2ltcGxlKAotICAgICAgICAgICAgICAgICAgICAiI2NsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyIFslc10iLCByZWNvZ25pemVySW50ZW50KSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIEBOb25OdWxsIE1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lci5vbkVycm9yKFNwZWVjaFJlY29nbml6ZXIuRVJST1JfQ0FOTk9UX0xJU1RFTl9UT19ET1dOTE9BRF9FVkVOVFMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODE1LDQxICs3OTQsMTggQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoCi0gICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsIEBOb25OdWxsIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7CisgICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICAgICAgZmluYWwgUmVjb2duaXRpb25TZXJ2aWNlIHNlcnZpY2UgPSBtU2VydmljZVJlZi5nZXQoKTsKICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXJ2aWNlLm1IYW5kbGVyLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubUhhbmRsZXIsIE1TR19UUklHR0VSX01PREVMX0RPV05MT0FELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZShyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaW5hbCBSZWNvZ25pdGlvblNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UubUhhbmRsZXIuc2VuZE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihzZXJ2aWNlLm1IYW5kbGVyLCBNU0dfU0VUX01PREVMX0RPV05MT0FEX0xJU1RFTkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vZGVsRG93bmxvYWRBcmdzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgUmVjb2duaXRpb25TZXJ2aWNlIHNlcnZpY2UgPSBtU2VydmljZVJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm1IYW5kbGVyLnNlbmRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4oc2VydmljZS5tSGFuZGxlciwgTVNHX0NMRUFSX01PREVMX0RPV05MT0FEX0xJU1RFTkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZShyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcikpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQppbmRleCA3NmViMDllLi5kYWNiMjVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKQEAgLTI5Nyw4ICsyOTcsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX1RFTVBPUkFSWV9PTl9ERVZJQ0VfQ09NUE9ORU5UID0gNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NIRUNLX1JFQ09HTklUSU9OX1NVUFBPUlQgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFJJR0dFUl9NT0RFTF9ET1dOTE9BRCA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfTU9ERUxfRE9XTkxPQURfTElTVEVORVIgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVIgPSA5OwogCiAgICAgLyoqIFRoZSBhY3R1YWwgUmVjb2duaXRpb25TZXJ2aWNlIGVuZHBvaW50ICovCiAgICAgcHJpdmF0ZSBJUmVjb2duaXRpb25TZXJ2aWNlIG1TZXJ2aWNlOwpAQCAtMzQxLDE5ICszMzksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm1JbnRlbnQsIGFyZ3MubUNhbGxiYWNrRXhlY3V0b3IsIGFyZ3MubUNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFJJR0dFUl9NT0RFTF9ET1dOTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlck1vZGVsRG93bmxvYWQoKEludGVudCkgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUjoKICAgICAgICAgICAgICAgICAgICAgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncyBtb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzLm1JbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxEb3dubG9hZExpc3RlbmVyQXJncy5tRXhlY3V0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxEb3dubG9hZExpc3RlbmVyQXJncy5tTW9kZWxEb3dubG9hZExpc3RlbmVyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVI6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKChJbnRlbnQpIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC02NTcsMTcgKzY0OSwxMyBAQAogICAgICAqIHVzZXIgaW50ZXJhY3Rpb24gdG8gYXBwcm92ZSB0aGUgZG93bmxvYWQuIENhbGxlcnMgY2FuIHZlcmlmeSB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0IHZpYQogICAgICAqIHtAbGluayAjY2hlY2tSZWNvZ25pdGlvblN1cHBvcnQoSW50ZW50LCBFeGVjdXRvciwgUmVjb2duaXRpb25TdXBwb3J0Q2FsbGJhY2spfS4KICAgICAgKgotICAgICAqIDxwPkxpc3RlbmVycyBzZXQgdmlhCi0gICAgICoge0BsaW5rICNzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoSW50ZW50LCBFeGVjdXRvciwgTW9kZWxEb3dubG9hZExpc3RlbmVyKX0gd2lsbCByZWNlaXZlCi0gICAgICogdXBkYXRlcyBhYm91dCB0aGlzIGRvd25sb2FkIHJlcXVlc3QuPC9wPgotICAgICAqCiAgICAgICogQHBhcmFtIHJlY29nbml6ZXJJbnRlbnQgY29udGFpbnMgcGFyYW1ldGVycyBmb3IgdGhlIHJlY29nbml0aW9uIHRvIGJlIHBlcmZvcm1lZC4gVGhlIGludGVudAogICAgICAqICAgICAgICBtYXkgYWxzbyBjb250YWluIG9wdGlvbmFsIGV4dHJhcywgc2VlIHtAbGluayBSZWNvZ25pemVySW50ZW50fS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZChATm9uTnVsbCBJbnRlbnQgcmVjb2duaXplckludGVudCkgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlY29nbml6ZXJJbnRlbnQsICJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3RyaWdnZXJNb2RlbERvd25sb2FkIGNhbGxlZCIpOworICAgICAgICAgICAgU2xvZy5pKFRBRywgIiN0cmlnZ2VyTW9kZWxEb3dubG9hZCB3aXRob3V0IGEgbGlzdGVuZXIgY2FsbGVkIik7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb25uZWN0aW9uIGlzIG5vdCBlc3RhYmxpc2hlZCB5ZXQiKTsKICAgICAgICAgICAgIH0KQEAgLTY3NiwyMyArNjY0LDQ3IEBACiAgICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGNvbm5lY3Rpb246IGZpcnN0IGVzdGFibGlzaCBhIGNvbm5lY3Rpb24sIHRoZW4gZGlzcGF0Y2guCiAgICAgICAgICAgICBjb25uZWN0VG9TeXN0ZW1TZXJ2aWNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgcHV0TWVzc2FnZShNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQsIHJlY29nbml6ZXJJbnRlbnQpKTsKKyAgICAgICAgcHV0TWVzc2FnZShNZXNzYWdlLm9idGFpbigKKyAgICAgICAgICAgICAgICBtSGFuZGxlciwgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQsCisgICAgICAgICAgICAgICAgbmV3IE1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MocmVjb2duaXplckludGVudCwgbnVsbCwgbnVsbCkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gbW9kZWwgZG93bmxvYWQgdXBkYXRlcy4gQ2xpZW50cyB3aWxsIGhhdmUgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUKLSAgICAgKiB7QGxpbmsgI3RyaWdnZXJNb2RlbERvd25sb2FkKEludGVudCl9LgorICAgICAqIEF0dGVtcHRzIHRvIGRvd25sb2FkIHRoZSBzdXBwb3J0IGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIHJlY29nbml6ZXJJbnRlbnR9LiBUaGlzIG1pZ2h0IHRyaWdnZXIKKyAgICAgKiB1c2VyIGludGVyYWN0aW9uIHRvIGFwcHJvdmUgdGhlIGRvd25sb2FkLiBDYWxsZXJzIGNhbiB2ZXJpZnkgdGhlIHN0YXR1cyBvZiB0aGUgcmVxdWVzdCB2aWEKKyAgICAgKiB7QGxpbmsgI2NoZWNrUmVjb2duaXRpb25TdXBwb3J0KEludGVudCwgRXhlY3V0b3IsIFJlY29nbml0aW9uU3VwcG9ydENhbGxiYWNrKX0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCB0aGUgcmVxdWVzdCB0byBtb25pdG9yIHN1cHBvcnQgZm9yLgorICAgICAqIDxwPiBUaGUgdXBkYXRlcyBhYm91dCB0aGUgbW9kZWwgZG93bmxvYWQgcmVxdWVzdCBhcmUgcmVjZWl2ZWQgdmlhIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXJ9OgorICAgICAqCisgICAgICogPGxpPiBJZiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBhdmFpbGFibGUsIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25TdWNjZXNzKCl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgZGlyZWN0bHkuIFRoZSBtb2RlbCBjYW4gYmUgc2FmZWx5IHVzZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKgorICAgICAqIDxsaT4gSWYgdGhlIHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9IGhhcyBzdGFydGVkIHRoZSBkb3dubG9hZCwKKyAgICAgKiB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uUHJvZ3Jlc3MoaW50KX0gd2lsbCBiZSBjYWxsZWQgYW4gdW5zcGVjaWZpZWQgKHplcm8gb3IgbW9yZSkKKyAgICAgKiBudW1iZXIgb2YgdGltZXMgdW50aWwgdGhlIGRvd25sb2FkIGlzIGNvbXBsZXRlLgorICAgICAqIFdoZW4gdGhlIGRvd25sb2FkIGZpbmlzaGVzLCB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uU3VjY2VzcygpfSB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKiBUaGUgbW9kZWwgY2FuIGJlIHNhZmVseSB1c2VkIGFmdGVyd2FyZHMuCisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBoYXMgb25seSBzY2hlZHVsZWQgdGhlIGRvd25sb2FkLCBidXQgd29uJ3Qgc2F0aXNmeSBpdAorICAgICAqIGltbWVkaWF0ZWx5LCB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uU2NoZWR1bGVkKCl9IHdpbGwgYmUgY2FsbGVkLgorICAgICAqIFRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciB1cGRhdGVzIG9uIHRoaXMgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSByZXF1ZXN0IGZhaWxzIGF0IGFueSB0aW1lIGR1ZSB0byBhIG5ldHdvcmsgb3Igc2NoZWR1bGluZyBlcnJvciwKKyAgICAgKiB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uRXJyb3IoaW50KX0gd2lsbCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCBjb250YWlucyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVjb2duaXRpb24gdG8gYmUgcGVyZm9ybWVkLiBUaGUgaW50ZW50CisgICAgICogICAgICAgIG1heSBhbHNvIGNvbnRhaW4gb3B0aW9uYWwgZXh0cmFzLCBzZWUge0BsaW5rIFJlY29nbml6ZXJJbnRlbnR9LgorICAgICAqIEBwYXJhbSBleGVjdXRvciBmb3IgZGlzcGF0Y2hpbmcgbGlzdGVuZXIgY2FsbGJhY2tzCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIG9uIHdoaWNoIHRvIHJlY2VpdmUgdXBkYXRlcyBhYm91dCB0aGUgbW9kZWwgZG93bmxvYWQgcmVxdWVzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgcHVibGljIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICBATm9uTnVsbCBJbnRlbnQgcmVjb2duaXplckludGVudCwKICAgICAgICAgICAgIEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAogICAgICAgICAgICAgQE5vbk51bGwgTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVjb2duaXplckludGVudCwgImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7CiAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICIjc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyIGNhbGxlZCIpOworICAgICAgICAgICAgU2xvZy5pKFRBRywgIiN0cmlnZ2VyTW9kZWxEb3dubG9hZCB3aXRoIGEgbGlzdGVuZXIgY2FsbGVkIik7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb25uZWN0aW9uIGlzIG5vdCBlc3RhYmxpc2hlZCB5ZXQiKTsKICAgICAgICAgICAgIH0KQEAgLTcwMiwzMiArNzE0LDExIEBACiAgICAgICAgICAgICBjb25uZWN0VG9TeXN0ZW1TZXJ2aWNlKCk7CiAgICAgICAgIH0KICAgICAgICAgcHV0TWVzc2FnZShNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgICAgICBtSGFuZGxlciwgTVNHX1NFVF9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUiwKKyAgICAgICAgICAgICAgICBtSGFuZGxlciwgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQsCiAgICAgICAgICAgICAgICAgbmV3IE1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MocmVjb2duaXplckludGVudCwgZXhlY3V0b3IsIGxpc3RlbmVyKSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgbGlzdGVuZXIgZm9yIG1vZGVsIGRvd25sb2FkIHVwZGF0ZXMgaWYgYW55LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29nbml6ZXJJbnRlbnQgdGhlIHJlcXVlc3QgdG8gbW9uaXRvciBzdXBwb3J0IGZvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihATm9uTnVsbCBJbnRlbnQgcmVjb2duaXplckludGVudCkgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlY29nbml6ZXJJbnRlbnQsICJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiI2NsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyIGNhbGxlZCIpOwotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQ29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQgeWV0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgY29ubmVjdGlvbjogZmlyc3QgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiwgdGhlbiBkaXNwYXRjaC4KLSAgICAgICAgICAgIGNvbm5lY3RUb1N5c3RlbVNlcnZpY2UoKTsKLSAgICAgICAgfQotICAgICAgICBwdXRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKAotICAgICAgICAgICAgICAgIG1IYW5kbGVyLCBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVIsIHJlY29nbml6ZXJJbnRlbnQpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBTZXRzIGEgdGVtcG9yYXJ5IGNvbXBvbmVudCB0byBwb3dlciBvbi1kZXZpY2Ugc3BlZWNoIHJlY29nbml6ZXIuCiAgICAgICoKICAgICAgKiA8cD5UaGlzIGlzIG9ubHkgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGluIHRlc3RzLCBzeXN0ZW0gd291bGQgcmVqZWN0IGNhbGxzIGZyb20gY2xpZW50IGFwcHMuCkBAIC04MzYsNTEgKzgyNywzNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyaWdnZXJNb2RlbERvd25sb2FkKEludGVudCByZWNvZ25pemVySW50ZW50KSB7Ci0gICAgICAgIGlmICghbWF5YmVJbml0aWFsaXplTWFuYWdlclNlcnZpY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZChyZWNvZ25pemVySW50ZW50LCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImRvd25sb2FkTW9kZWwoKSBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkVycm9yKEVSUk9SX0NMSUVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUcmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgIEludGVudCByZWNvZ25pemVySW50ZW50LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAogICAgICAgICAgICAgQE51bGxhYmxlIE1vZGVsRG93bmxvYWRMaXN0ZW5lciBtb2RlbERvd25sb2FkTGlzdGVuZXIpIHsKICAgICAgICAgaWYgKCFtYXliZUluaXRpYWxpemVNYW5hZ2VyU2VydmljZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVybmFsTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxEb3dubG9hZExpc3RlbmVyID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnRlcm5hbE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkTGlzdGVuZXIpOwotICAgICAgICAgICAgbVNlcnZpY2Uuc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVySW50ZW50LCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLCBsaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoKSIpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKCkgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICBjYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gbW9kZWxEb3dubG9hZExpc3RlbmVyLm9uRXJyb3IoRVJST1JfQ0xJRU5UKSk7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoSW50ZW50IHJlY29nbml6ZXJJbnRlbnQpIHsKLSAgICAgICAgaWYgKCFtYXliZUluaXRpYWxpemVNYW5hZ2VyU2VydmljZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIFRyaWdnZXIgbW9kZWwgZG93bmxvYWQgd2l0aG91dCBhIGxpc3RlbmVyLgorICAgICAgICBpZiAobW9kZWxEb3dubG9hZExpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2UudHJpZ2dlck1vZGVsRG93bmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVySW50ZW50LCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJ0cmlnZ2VyTW9kZWxEb3dubG9hZCgpIHdpdGhvdXQgYSBsaXN0ZW5lciIpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ0cmlnZ2VyTW9kZWxEb3dubG9hZCgpIHdpdGhvdXQgYSBsaXN0ZW5lciBmYWlsZWQiLCBlKTsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25FcnJvcihFUlJPUl9DTElFTlQpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS5jbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplckludGVudCwgbUNvbnRleHQuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKSk7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigpIik7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigpIGZhaWxlZCIsIGUpOworICAgICAgICAvLyBUcmlnZ2VyIG1vZGVsIGRvd25sb2FkIHdpdGggYSBsaXN0ZW5lci4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnRyaWdnZXJNb2RlbERvd25sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplckludGVudCwgbUNvbnRleHQuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlcm5hbE1vZGVsRG93bmxvYWRMaXN0ZW5lcihjYWxsYmFja0V4ZWN1dG9yLCBtb2RlbERvd25sb2FkTGlzdGVuZXIpKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJ0cmlnZ2VyTW9kZWxEb3dubG9hZCgpIHdpdGggYSBsaXN0ZW5lciIpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ0cmlnZ2VyTW9kZWxEb3dubG9hZCgpIHdpdGggYSBsaXN0ZW5lciBmYWlsZWQiLCBlKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gbW9kZWxEb3dubG9hZExpc3RlbmVyLm9uRXJyb3IoRVJST1JfQ0xJRU5UKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dEZsYWdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRGbGFncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTFlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRGbGFncy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworLyoqCisgKiBGbGFncyBpbiB0aGUgInRleHQiIG5hbWVzcGFjZS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGV4dEZsYWdzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIHNwYWNlIG9mIHRoZSAidGV4dCIgZmVhdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgbmVlZHMgdG8gbW92ZSB0byBEZXZpY2VDb25maWcgY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gInRleHQiOworCisgICAgLyoqCisgICAgICogV2hldGhlciB3ZSB1c2UgdGhlIG5ldyBkZXNpZ24gb2YgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9ORVdfQ09OVEVYVF9NRU5VID0KKyAgICAgICAgICAgICJUZXh0RWRpdGluZ19fZW5hYmxlX25ld19jb250ZXh0X21lbnUiOworCisgICAgLyoqCisgICAgICogVGhlIGtleSBuYW1lIHVzZWQgaW4gYXBwIGNvcmUgc2V0dGluZ3MgZm9yIHtAbGluayAjRU5BQkxFX05FV19DT05URVhUX01FTlV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVSA9ICJ0ZXh0X19lbmFibGVfbmV3X2NvbnRleHRfbWVudSI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxhZyB7QGxpbmsgI0VOQUJMRV9ORVdfQ09OVEVYVF9NRU5VfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX05FV19DT05URVhUX01FTlVfREVGQVVMVCA9IGZhbHNlOworCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Rd2VydHlLZXlMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvUXdlcnR5S2V5TGlzdGVuZXIuamF2YQppbmRleCBiNGExZThjLi5jNDM4NjRkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Rd2VydHlLZXlMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1F3ZXJ0eUtleUxpc3RlbmVyLmphdmEKQEAgLTM2Miw2ICszNjIsMTUgQEAKIAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FU0NBUEUgJiYgZXZlbnQuaGFzTm9Nb2RpZmllcnMoKSkgeworICAgICAgICAgICAgLy8gSWYgdXNlciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb21wb3Npbmcgd2l0aCBhIGRlYWQga2V5LCBhbmQKKyAgICAgICAgICAgIC8vIHByZXNzZXMgRXNjYXBlLCBjYW5jZWwgaXQuIFdlIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGUgRXNjYXBlIGtleSB3aWxsIG5vdCBwcm9kdWNlIGEgVW5pY29kZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmIChhY3RpdmVTdGFydCA9PSBzZWxTdGFydCAmJiBhY3RpdmVFbmQgPT0gc2VsRW5kKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihjb250ZW50LCBzZWxFbmQpOworICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlU3BhbihUZXh0S2V5TGlzdGVuZXIuQUNUSVZFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24odmlldywgY29udGVudCwga2V5Q29kZSwgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GZWF0dXJlRmxhZ1V0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZlYXR1cmVGbGFnVXRpbHMuamF2YQppbmRleCAyYWU4ODJjLi42MjAxYjNhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZlYXR1cmVGbGFnVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZlYXR1cmVGbGFnVXRpbHMuamF2YQpAQCAtMjIwLDkgKzIyMCw5IEBACiAgICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX0FQUF9BTExPV19EQVJLX1RIRU1FX0FDVElWQVRJT05fQVRfQkVEVElNRSwgInRydWUiKTsKICAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfTkVFRF9DT05ORUNURURfQkxFX0RFVklDRV9GT1JfQlJPQURDQVNULCAidHJ1ZSIpOwogICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19BVVRPX1RFWFRfV1JBUFBJTkcsICJmYWxzZSIpOwotICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfVUksICJmYWxzZSIpOwotICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfTU9ESUZJRVJfS0VZLCAiZmFsc2UiKTsKLSAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfTkVXX0tFWUJPQVJEX1RSQUNLUEFELCAiZmFsc2UiKTsKKyAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfTkVXX0tFWUJPQVJEX1VJLCAidHJ1ZSIpOworICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfTU9ESUZJRVJfS0VZLCAidHJ1ZSIpOworICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfVFJBQ0tQQUQsICJ0cnVlIik7CiAgICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX05FV19LRVlCT0FSRF9UUkFDS1BBRF9HRVNUVVJFLCAiZmFsc2UiKTsKICAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfRU5BQkxFX1NQQSwgInRydWUiKTsKICAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfRU5BQkxFX1NQQV9QSEFTRTIsICJmYWxzZSIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9DaG9yZW9ncmFwaGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXIuamF2YQppbmRleCA4YzRlOTBjLi5jOTJiMWI4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXIuamF2YQpAQCAtMTk1LDcgKzE5NSw3IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbURlYnVnUHJpbnROZXh0RnJhbWVUaW1lRGVsdGE7CiAgICAgcHJpdmF0ZSBpbnQgbUZQU0Rpdmlzb3IgPSAxOwotICAgIHByaXZhdGUgRGlzcGxheUV2ZW50UmVjZWl2ZXIuVnN5bmNFdmVudERhdGEgbUxhc3RWc3luY0V2ZW50RGF0YSA9CisgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5RXZlbnRSZWNlaXZlci5Wc3luY0V2ZW50RGF0YSBtTGFzdFZzeW5jRXZlbnREYXRhID0KICAgICAgICAgICAgIG5ldyBEaXNwbGF5RXZlbnRSZWNlaXZlci5Wc3luY0V2ZW50RGF0YSgpOwogICAgIHByaXZhdGUgZmluYWwgRnJhbWVEYXRhIG1GcmFtZURhdGEgPSBuZXcgRnJhbWVEYXRhKCk7CiAKQEAgLTg1Nyw3ICs4NTcsNyBAQAogICAgICAgICAgICAgICAgIG1GcmFtZVNjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lTmFub3MgPSBmcmFtZVRpbWVOYW5vczsKICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lSW50ZXJ2YWxOYW5vcyA9IGZyYW1lSW50ZXJ2YWxOYW5vczsKLSAgICAgICAgICAgICAgICBtTGFzdFZzeW5jRXZlbnREYXRhID0gdnN5bmNFdmVudERhdGE7CisgICAgICAgICAgICAgICAgbUxhc3RWc3luY0V2ZW50RGF0YS5jb3B5RnJvbSh2c3luY0V2ZW50RGF0YSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFuaW1hdGlvblV0aWxzLmxvY2tBbmltYXRpb25DbG9jayhmcmFtZVRpbWVOYW5vcyAvIFRpbWVVdGlscy5OQU5PU19QRVJfTVMpOwpAQCAtMTI0Nyw3ICsxMjQ3LDcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlUGVuZGluZ1ZzeW5jOwogICAgICAgICBwcml2YXRlIGxvbmcgbVRpbWVzdGFtcE5hbm9zOwogICAgICAgICBwcml2YXRlIGludCBtRnJhbWU7Ci0gICAgICAgIHByaXZhdGUgVnN5bmNFdmVudERhdGEgbUxhc3RWc3luY0V2ZW50RGF0YSA9IG5ldyBWc3luY0V2ZW50RGF0YSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFZzeW5jRXZlbnREYXRhIG1MYXN0VnN5bmNFdmVudERhdGEgPSBuZXcgVnN5bmNFdmVudERhdGEoKTsKIAogICAgICAgICBGcmFtZURpc3BsYXlFdmVudFJlY2VpdmVyKExvb3BlciBsb29wZXIsIGludCB2c3luY1NvdXJjZSwgbG9uZyBsYXllckhhbmRsZSkgewogICAgICAgICAgICAgc3VwZXIobG9vcGVyLCB2c3luY1NvdXJjZSwgLyogZXZlbnRSZWdpc3RyYXRpb24gKi8gMCwgbGF5ZXJIYW5kbGUpOwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBOYW5vcyA9IHRpbWVzdGFtcE5hbm9zOwogICAgICAgICAgICAgICAgIG1GcmFtZSA9IGZyYW1lOwotICAgICAgICAgICAgICAgIG1MYXN0VnN5bmNFdmVudERhdGEgPSB2c3luY0V2ZW50RGF0YTsKKyAgICAgICAgICAgICAgICBtTGFzdFZzeW5jRXZlbnREYXRhLmNvcHlGcm9tKHZzeW5jRXZlbnREYXRhKTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtc2cuc2V0QXN5bmNocm9ub3VzKHRydWUpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1zZywgdGltZXN0YW1wTmFub3MgLyBUaW1lVXRpbHMuTkFOT1NfUEVSX01TKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheUV2ZW50UmVjZWl2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheUV2ZW50UmVjZWl2ZXIuamF2YQppbmRleCBiNDY3NWUwLi41NGRiMzRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXlFdmVudFJlY2VpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5RXZlbnRSZWNlaXZlci5qYXZhCkBAIC0xNDYsNyArMTQ2LDEyIEBACiAgICAgICAgIG1NZXNzYWdlUXVldWUgPSBudWxsOwogICAgIH0KIAotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBWc3luY0V2ZW50RGF0YSB7CisgICAgLyoqCisgICAgICogQ2xhc3MgdG8gY2FwdHVyZSBhbGwgaW5wdXRzIHJlcXVpcmVkIGZvciBzeW5jaW5nIGV2ZW50cyBkYXRhLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZzeW5jRXZlbnREYXRhIHsKICAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBmcmFtZSB0aW1lbGluZSBjaG9pY2VzLgogICAgICAgICAvLyBNdXN0IGJlIGluIHN5bmMgd2l0aCBWc3luY0V2ZW50RGF0YTo6a0ZyYW1lVGltZWxpbmVzTGVuZ3RoIGluCiAgICAgICAgIC8vIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL2luY2x1ZGUvZ3VpL1ZzeW5jRXZlbnREYXRhLmguIElmIHRoZXkgZG8gbm90IG1hdGNoLCBhIHJ1bnRpbWUKQEAgLTE2NCw2ICsxNjksMTIgQEAKICAgICAgICAgICAgICAgICB0aGlzLmRlYWRsaW5lID0gZGVhZGxpbmU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHZvaWQgY29weUZyb20oRnJhbWVUaW1lbGluZSBvdGhlcikgeworICAgICAgICAgICAgICAgIHZzeW5jSWQgPSBvdGhlci52c3luY0lkOworICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSA9IG90aGVyLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZTsKKyAgICAgICAgICAgICAgICBkZWFkbGluZSA9IG90aGVyLmRlYWRsaW5lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBUaGUgZnJhbWUgdGltZWxpbmUgdnN5bmMgaWQsIHVzZWQgdG8gY29ycmVsYXRlIGEgZnJhbWUKICAgICAgICAgICAgIC8vIHByb2R1Y2VkIGJ5IEhXVUkgd2l0aCB0aGUgdGltZWxpbmUgZGF0YSBzdG9yZWQgaW4gU3VyZmFjZSBGbGluZ2VyLgogICAgICAgICAgICAgcHVibGljIGxvbmcgdnN5bmNJZCA9IEZyYW1lSW5mby5JTlZBTElEX1ZTWU5DX0lEOwpAQCAtMjAzLDYgKzIxNCwxNCBAQAogICAgICAgICAgICAgdGhpcy5mcmFtZUludGVydmFsID0gZnJhbWVJbnRlcnZhbDsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgY29weUZyb20oVnN5bmNFdmVudERhdGEgb3RoZXIpIHsKKyAgICAgICAgICAgIHByZWZlcnJlZEZyYW1lVGltZWxpbmVJbmRleCA9IG90aGVyLnByZWZlcnJlZEZyYW1lVGltZWxpbmVJbmRleDsKKyAgICAgICAgICAgIGZyYW1lSW50ZXJ2YWwgPSBvdGhlci5mcmFtZUludGVydmFsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZVRpbWVsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZyYW1lVGltZWxpbmVzW2ldLmNvcHlGcm9tKG90aGVyLmZyYW1lVGltZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBGcmFtZVRpbWVsaW5lIHByZWZlcnJlZEZyYW1lVGltZWxpbmUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZnJhbWVUaW1lbGluZXNbcHJlZmVycmVkRnJhbWVUaW1lbGluZUluZGV4XTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYW5kd3JpdGluZ0luaXRpYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYW5kd3JpdGluZ0luaXRpYXRvci5qYXZhCmluZGV4IGE0Nzc4M2MuLjZiNjA0NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFuZHdyaXRpbmdJbml0aWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhbmR3cml0aW5nSW5pdGlhdG9yLmphdmEKQEAgLTIwNSw2ICsyMDUsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgSGFuZHdyaXRpbmdJbml0aWF0b3IgdGhhdCBhIGRlbGVnYXRlIHZpZXcgKHNlZSB7QGxpbmsgVmlldyNpc0hhbmR3cml0aW5nRGVsZWdhdGV9KQorICAgICAqIGdhaW5lZCBmb2N1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlbGVnYXRlVmlld0ZvY3VzZWQoQE5vbk51bGwgVmlldyB2aWV3KSB7CisgICAgICAgIGlmICh2aWV3ID09IGdldENvbm5lY3RlZFZpZXcoKSkgeworICAgICAgICAgICAgdHJ5QWNjZXB0U3R5bHVzSGFuZHdyaXRpbmdEZWxlZ2F0aW9uKHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTm90aWZ5IEhhbmR3cml0aW5nSW5pdGlhdG9yIHRoYXQgYSBuZXcgSW5wdXRDb25uZWN0aW9uIGlzIGNyZWF0ZWQuCiAgICAgICogVGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZ3VhcmFudGVlIHRoYXQgZWFjaCBvbklucHV0Q29ubmVjdGlvbkNyZWF0ZWQgY2FsbAogICAgICAqIGlzIHBhaXJlZCB3aXRoIGEgb25JbnB1dENvbm5lY3Rpb25DbG9zZWQgY2FsbC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSW5wdXREZXZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSW5wdXREZXZpY2UuamF2YQppbmRleCA3MjBmNTY5Li45MjI1Y2Q5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lucHV0RGV2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JbnB1dERldmljZS5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5Ib3N0VXNpVmVyc2lvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0RGV2aWNlSWRlbnRpZmllcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlckdsb2JhbDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0cy5MaWdodHNNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuaWN1LnV0aWwuVUxvY2FsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwpAQCAtNzQyLDcgKzc0Myw3IEBACiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgcHVibGljIHN0YXRpYyBJbnB1dERldmljZSBnZXREZXZpY2UoaW50IGlkKSB7Ci0gICAgICAgIHJldHVybiBJbnB1dE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZShpZCk7CisgICAgICAgIHJldHVybiBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZShpZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NTAsNyArNzUxLDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBpbnB1dCBkZXZpY2UgaWRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2V0RGV2aWNlSWRzKCkgewotICAgICAgICByZXR1cm4gSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgcmV0dXJuIElucHV0TWFuYWdlckdsb2JhbC5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDgwMGZjOTcuLmFlYzM0ODcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC04MzI0LDYgKzgzMjQsMTMgQEAKICAgICAgICAgICAgIG9uRm9jdXNMb3N0KCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgbm90aWZ5Rm9jdXNDaGFuZ2VUb0ltZUZvY3VzQ29udHJvbGxlcih0cnVlIC8qIGhhc0ZvY3VzICovKTsKKworICAgICAgICAgICAgaWYgKG1Jc0hhbmR3cml0aW5nRGVsZWdhdGUpIHsKKyAgICAgICAgICAgICAgICBWaWV3Um9vdEltcGwgdmlld1Jvb3QgPSBnZXRWaWV3Um9vdEltcGwoKTsKKyAgICAgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2aWV3Um9vdC5nZXRIYW5kd3JpdGluZ0luaXRpYXRvcigpLm9uRGVsZWdhdGVWaWV3Rm9jdXNlZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpbnZhbGlkYXRlKHRydWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCmluZGV4IGM5NmQyOTguLmQ4MDgxOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXJHbG9iYWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTExODgsNyArMTE4OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlSW5mb1ZhbGlkKGludCBpZCwgaW50IGF4aXMsIGludCBzb3VyY2UpIHsKLSAgICAgICAgSW5wdXREZXZpY2UgZGV2aWNlID0gSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2UoaWQpOworICAgICAgICBJbnB1dERldmljZSBkZXZpY2UgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZShpZCk7CiAgICAgICAgIHJldHVybiBkZXZpY2UgIT0gbnVsbCAmJiBkZXZpY2UuZ2V0TW90aW9uUmFuZ2UoYXhpcywgc291cmNlKSAhPSBudWxsOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEKaW5kZXggMjRkY2I2OS4uZmIyNWU3YTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdEltcGwuamF2YQpAQCAtMTE2MjYsNyArMTE2MjYsOCBAQAogCiAgICAgICAgIG1OdW1QYXVzZWRGb3JTeW5jKys7CiAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19QQVVTRURfRk9SX1NZTkNfVElNRU9VVCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19QQVVTRURfRk9SX1NZTkNfVElNRU9VVCwgMTAwMCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19QQVVTRURfRk9SX1NZTkNfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAxMDAwICogQnVpbGQuSFdfVElNRU9VVF9NVUxUSVBMSUVSKTsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVTdXJmYWNlU3luY0dyb3VwOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGl0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGl0b3IuamF2YQppbmRleCA5ZjlhNzgxLi5kY2U1NDMyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRpdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkaXRvci5qYXZhCkBAIC03NCw2ICs3NCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dEZsYWdzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5JbnNlcnRNb2RlVHJhbnNmb3JtYXRpb25NZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lcjsKQEAgLTE2OSw5ICsxNzAsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRWRpdG9yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1VORE8gPSBmYWxzZTsKIAotICAgIC8vIFRPRE8obm9uYSk6IE1ha2UgdGhpcyBjb25maWd1cmFibGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGTEFHX1VTRV9ORVdfQ09OVEVYVF9NRU5VID0gZmFsc2U7Ci0KICAgICAvLyBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgdGhlIG1hZ25pZmllciB3aGVuIHByZXNzaW5nIHRoZSBpbnNlcnRpb24gb3Igc2VsZWN0aW9uIGhhbmRsZXMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGTEFHX1VTRV9NQUdOSUZJRVIgPSB0cnVlOwogCkBAIC00NzAsNiArNDY4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORV9DSEFOR0VfU0xPUF9NSU5fRFAgPSA4OwogICAgIHByaXZhdGUgaW50IG1MaW5lQ2hhbmdlU2xvcE1heDsKICAgICBwcml2YXRlIGludCBtTGluZUNoYW5nZVNsb3BNaW47CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VOZXdDb250ZXh0TWVudTsKIAogICAgIHByaXZhdGUgZmluYWwgQWNjZXNzaWJpbGl0eVNtYXJ0QWN0aW9ucyBtQTExeVNtYXJ0QWN0aW9uczsKICAgICBwcml2YXRlIEluc2VydE1vZGVDb250cm9sbGVyIG1JbnNlcnRNb2RlQ29udHJvbGxlcjsKQEAgLTUwMCw2ICs0OTksOSBAQAogICAgICAgICBtTGluZVNsb3BSYXRpbyA9IEFwcEdsb2JhbHMuZ2V0RmxvYXRDb3JlU2V0dGluZygKICAgICAgICAgICAgICAgICBXaWRnZXRGbGFncy5LRVlfTElORV9TTE9QX1JBVElPLAogICAgICAgICAgICAgICAgIFdpZGdldEZsYWdzLkxJTkVfU0xPUF9SQVRJT19ERUZBVUxUKTsKKyAgICAgICAgbVVzZU5ld0NvbnRleHRNZW51ID0gQXBwR2xvYmFscy5nZXRJbnRDb3JlU2V0dGluZygKKyAgICAgICAgICAgICAgICBUZXh0RmxhZ3MuS0VZX0VOQUJMRV9ORVdfQ09OVEVYVF9NRU5VLAorICAgICAgICAgICAgICAgIFRleHRGbGFncy5FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVV9ERUZBVUxUID8gMSA6IDApICE9IDA7CiAgICAgICAgIGlmIChUZXh0Vmlldy5ERUJVR19DVVJTT1IpIHsKICAgICAgICAgICAgIGxvZ0N1cnNvcigiRWRpdG9yIiwgIkN1cnNvciBkcmFnIGZyb20gYW55d2hlcmUgaXMgJXMuIiwKICAgICAgICAgICAgICAgICAgICAgbUZsYWdDdXJzb3JEcmFnRnJvbUFueXdoZXJlRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwpAQCAtMzE3MSw3ICszMTczLDcgQEAKICAgICAgICAgZmluYWwgaW50IG1lbnVJdGVtT3JkZXJTZWxlY3RBbGw7CiAgICAgICAgIGZpbmFsIGludCBtZW51SXRlbU9yZGVyU2hhcmU7CiAgICAgICAgIGZpbmFsIGludCBtZW51SXRlbU9yZGVyQXV0b2ZpbGw7Ci0gICAgICAgIGlmIChGTEFHX1VTRV9ORVdfQ09OVEVYVF9NRU5VKSB7CisgICAgICAgIGlmIChtVXNlTmV3Q29udGV4dE1lbnUpIHsKICAgICAgICAgICAgIG1lbnVJdGVtT3JkZXJQYXN0ZUFzUGxhaW5UZXh0ID0gNzsKICAgICAgICAgICAgIG1lbnVJdGVtT3JkZXJTZWxlY3RBbGwgPSA4OwogICAgICAgICAgICAgbWVudUl0ZW1PcmRlclNoYXJlID0gOTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggMTYwMGExNi4uZmQ4MDk4MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTQ2MiwxMiArNDYyLDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9XQVRDSEVSX1BSSU9SSVRZID0gMTAwOwogCiAgICAgLyoqCi0gICAgICogVGhlIHNwYW4gcHJpb3JpdHkgb2YgdGhlIHtAbGluayBUcmFuc2Zvcm1hdGlvbk1ldGhvZH0gdGhhdCBpcyBzZXQgb24gdGhlIHRleHQuIEl0IG11c3QgYmUKKyAgICAgKiBUaGUgc3BhbiBwcmlvcml0eSBvZiB0aGUge0BsaW5rIE9mZnNldE1hcHBpbmd9IHRoYXQgaXMgc2V0IG9uIHRoZSB0ZXh0LiBJdCBtdXN0IGJlCiAgICAgICogaGlnaGVyIHRoYW4gdGhlIHtAbGluayBEeW5hbWljTGF5b3V0fSdzIHtAbGluayBUZXh0V2F0Y2hlcn0sIHNvIHRoYXQgdGhlIHRyYW5zZm9ybWVkIHRleHQgaXMKICAgICAgKiB1cGRhdGVkIGJlZm9yZSB7QGxpbmsgRHluYW1pY0xheW91dCNyZWZsb3coQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgaW50KX0gYmVpbmcgdHJpZ2dlcmVkCiAgICAgICogYnkge0BsaW5rIFRleHRXYXRjaGVyI29uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgaW50KX0uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TRk9STUFUSU9OX1NQQU5fUFJJT1JJVFkgPSAyMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9NQVBQSU5HX1NQQU5fUFJJT1JJVFkgPSAyMDA7CiAKICAgICAvLyBOZXcgc3RhdGUgdXNlZCB0byBjaGFuZ2UgYmFja2dyb3VuZCBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgVGV4dFZpZXcgaXMgbXVsdGlsaW5lLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE1VTFRJTElORV9TVEFURV9TRVQgPSB7IFIuYXR0ci5zdGF0ZV9tdWx0aWxpbmUgfTsKQEAgLTcwMzMsOSArNzAzMyw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBpbnQgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPZmZzZXRNYXBwaW5nID0gbVRyYW5zZm9ybWVkIGluc3RhbmNlb2YgT2Zmc2V0TWFwcGluZzsKIAotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiAoIW1BbGxvd1RyYW5zZm9ybWF0aW9uTGVuZ3RoQ2hhbmdlCi0gICAgICAgICAgICAgICAgfHwgdGV4dCBpbnN0YW5jZW9mIE9mZnNldE1hcHBpbmcpKSB7CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlICYmICghbUFsbG93VHJhbnNmb3JtYXRpb25MZW5ndGhDaGFuZ2UgfHwgaXNPZmZzZXRNYXBwaW5nKSkgewogICAgICAgICAgICAgU3Bhbm5hYmxlIHNwID0gKFNwYW5uYWJsZSkgdGV4dDsKIAogICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBDaGFuZ2VXYXRjaGVycyB0aGF0IG1pZ2h0IGhhdmUgY29tZSBmcm9tIG90aGVyIFRleHRWaWV3cy4KQEAgLTcwNTMsOCArNzA1Myw5IEBACiAgICAgICAgICAgICBpZiAobUVkaXRvciAhPSBudWxsKSBtRWRpdG9yLmFkZFNwYW5XYXRjaGVycyhzcCk7CiAKICAgICAgICAgICAgIGlmIChtVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSA9IGlzT2Zmc2V0TWFwcGluZyA/IE9GRlNFVF9NQVBQSU5HX1NQQU5fUFJJT1JJVFkgOiAwOwogICAgICAgICAgICAgICAgIHNwLnNldFNwYW4obVRyYW5zZm9ybWF0aW9uLCAwLCB0ZXh0TGVuZ3RoLCBTcGFubmVkLlNQQU5fSU5DTFVTSVZFX0lOQ0xVU0lWRQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoVFJBTlNGT1JNQVRJT05fU1BBTl9QUklPUklUWSA8PCBTcGFubmVkLlNQQU5fUFJJT1JJVFlfU0hJRlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKHByaW9yaXR5IDw8IFNwYW5uZWQuU1BBTl9QUklPUklUWV9TSElGVCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobU1vdmVtZW50ICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TbmFwc2hvdERyYXdlclV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU25hcHNob3REcmF3ZXJVdGlscy5qYXZhCmluZGV4IDFlNmMxZmYuLjUyZTE3Y2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TbmFwc2hvdERyYXdlclV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1NuYXBzaG90RHJhd2VyVXRpbHMuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UUkFOU0xVQ0VOVF9OQVZJR0FUSU9OOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UUkFOU0xVQ0VOVF9TVEFUVVM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1dBVENIX09VVFNJREVfVE9VQ0g7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5JTlBVVF9GRUFUVVJFX05PX0lOUFVUX0NIQU5ORUw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfRk9SQ0VfRFJBV19CQVJfQkFDS0dST1VORFM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfVFJVU1RFRF9PVkVSTEFZOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX1VTRV9CTEFTVDsKQEAgLTQxNSw2ICs0MTYsNyBAQAogICAgICAgICBsYXlvdXRQYXJhbXMuc2V0Rml0SW5zZXRzSWdub3JpbmdWaXNpYmlsaXR5KGF0dHJzLmlzRml0SW5zZXRzSWdub3JpbmdWaXNpYmlsaXR5KCkpOwogCiAgICAgICAgIGxheW91dFBhcmFtcy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIGxheW91dFBhcmFtcy5pbnB1dEZlYXR1cmVzIHw9IElOUFVUX0ZFQVRVUkVfTk9fSU5QVVRfQ0hBTk5FTDsKICAgICAgICAgcmV0dXJuIGxheW91dFBhcmFtczsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TdXJmYWNlU3luY0dyb3VwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU3VyZmFjZVN5bmNHcm91cC5qYXZhCmluZGV4IDA2NzJkNjMuLjdmOTlmYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TdXJmYWNlU3luY0dyb3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1N1cmZhY2VTeW5jR3JvdXAuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VaVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlclByb3h5OworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwpAQCAtNjIsNyArNjMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09VTlQgPSAxMDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHNDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JFQURZX1RJTUVPVVQgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SRUFEWV9USU1FT1VUID0gMTAwMCAqIEJ1aWxkLkhXX1RJTUVPVVRfTVVMVElQTElFUjsKIAogICAgIHByaXZhdGUgc3RhdGljIFN1cHBsaWVyPFRyYW5zYWN0aW9uPiBzVHJhbnNhY3Rpb25GYWN0b3J5ID0gVHJhbnNhY3Rpb246Om5ldzsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1dpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24uamF2YQppbmRleCBhMzIwOWY2Li5mYWJiMDg5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24uamF2YQpAQCAtMTMxLDYgKzEzMSwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlbnNpdHlEcGkgdmFsdWUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBjb250YWluZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiBzZXREZW5zaXR5RHBpKEBOb25OdWxsIFdpbmRvd0NvbnRhaW5lclRva2VuIGNvbnRhaW5lciwKKyAgICAgICAgICAgIGludCBkZW5zaXR5RHBpKSB7CisgICAgICAgIENoYW5nZSBjaGcgPSBnZXRPckNyZWF0ZUNoYW5nZShjb250YWluZXIuYXNCaW5kZXIoKSk7CisgICAgICAgIGNoZy5tQ29uZmlndXJhdGlvbi5kZW5zaXR5RHBpID0gZGVuc2l0eURwaTsKKyAgICAgICAgY2hnLm1Db25maWdTZXRNYXNrIHw9IEFjdGl2aXR5SW5mby5DT05GSUdfREVOU0lUWTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTm90aWZ5IHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIud20uUGlubmVkVGFza0NvbnRyb2xsZXJ9IHRoYXQgdGhlIHBpY3R1cmUtaW4tcGljdHVyZSB0YXNrCiAgICAgICogaGFzIGZpbmlzaGVkIHRoZSBlbnRlciBhbmltYXRpb24gd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlSGVscGVyLmphdmEKaW5kZXggNTdiZDNmOS4uZDUyMTg2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVIZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZUhlbHBlci5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwogaW1wb3J0IGFuZHJvaWQuaWN1LnRleHQuQ2FzZU1hcDsKIGltcG9ydCBhbmRyb2lkLmljdS50ZXh0Lkxpc3RGb3JtYXR0ZXI7CitpbXBvcnQgYW5kcm9pZC5pY3UudGV4dC5OdW1iZXJpbmdTeXN0ZW07CiBpbXBvcnQgYW5kcm9pZC5pY3UudXRpbC5VTG9jYWxlOwogaW1wb3J0IGFuZHJvaWQub3MuTG9jYWxlTGlzdDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMTczLDYgKzE3NCwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgbnVtYmVyaW5nIHN5c3RlbSB2YWx1ZSBvZiBhIGxvY2FsZSBmb3IgZGlzcGxheSBpbiB0aGUgcHJvdmlkZWQgbG9jYWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHdob3NlIGtleSB2YWx1ZSBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIGRpc3BsYXlMb2NhbGUgVGhlIGxvY2FsZSBpbiB3aGljaCB0byBkaXNwbGF5IHRoZSBrZXkgdmFsdWUuCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIG9mIG51bWJlcmluZyBzeXN0ZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU51bWJlcmluZ1N5c3RlbUtleVZhbHVlKAorICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwgTG9jYWxlIGRpc3BsYXlMb2NhbGUpIHsKKyAgICAgICAgVUxvY2FsZSB1TG9jYWxlID0gbmV3IFVMb2NhbGUuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFVuaWNvZGVMb2NhbGVLZXl3b3JkKCJudSIsIE51bWJlcmluZ1N5c3RlbS5nZXRJbnN0YW5jZShsb2NhbGUpLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIHVMb2NhbGUuZ2V0RGlzcGxheUtleXdvcmRWYWx1ZSgibnVtYmVycyIsIFVMb2NhbGUuZm9yTG9jYWxlKGRpc3BsYXlMb2NhbGUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBZGRzIHRoZSBsaWtlbHkgc3VidGFncyBmb3IgYSBwcm92aWRlZCBsb2NhbGUgSUQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgdG8gbWF4aW1pemUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVBpY2tlcldpdGhSZWdpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5qYXZhCmluZGV4IDY4NWJkOWEuLjVkZmMwZWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBpbnQgbVRvcERpc3RhbmNlID0gMDsKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGUgPSBudWxsOwogICAgIHByaXZhdGUgT25BY3Rpb25FeHBhbmRMaXN0ZW5lciBtT25BY3Rpb25FeHBhbmRMaXN0ZW5lcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTnVtYmVyaW5nU3lzdGVtID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBPdGhlciBjbGFzc2VzIGNhbiByZWdpc3RlciB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9jYWxlIHdhcyBzZWxlY3RlZC4KQEAgLTkwLDYgKzkxLDE4IEBACiAgICAgICAgIGJvb2xlYW4gaGFzU3BlY2lmaWNQYWNrYWdlTmFtZSgpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIExvY2FsZVBpY2tlcldpdGhSZWdpb24gY3JlYXRlTnVtYmVyaW5nU3lzdGVtUGlja2VyKAorICAgICAgICAgICAgTG9jYWxlU2VsZWN0ZWRMaXN0ZW5lciBsaXN0ZW5lciwgTG9jYWxlU3RvcmUuTG9jYWxlSW5mbyBwYXJlbnQsCisgICAgICAgICAgICBib29sZWFuIHRyYW5zbGF0ZWRPbmx5LCBPbkFjdGlvbkV4cGFuZExpc3RlbmVyIG9uQWN0aW9uRXhwYW5kTGlzdGVuZXIsCisgICAgICAgICAgICBMb2NhbGVDb2xsZWN0b3JCYXNlIGxvY2FsZVBpY2tlckNvbGxlY3RvcikgeworICAgICAgICBMb2NhbGVQaWNrZXJXaXRoUmVnaW9uIGxvY2FsZVBpY2tlciA9IG5ldyBMb2NhbGVQaWNrZXJXaXRoUmVnaW9uKCk7CisgICAgICAgIGxvY2FsZVBpY2tlci5zZXRPbkFjdGlvbkV4cGFuZExpc3RlbmVyKG9uQWN0aW9uRXhwYW5kTGlzdGVuZXIpOworICAgICAgICBsb2NhbGVQaWNrZXIuc2V0SXNOdW1iZXJpbmdTeXN0ZW0odHJ1ZSk7CisgICAgICAgIGJvb2xlYW4gc2hvdWxkU2hvd1RoZUxpc3QgPSBsb2NhbGVQaWNrZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIsIHBhcmVudCwKKyAgICAgICAgICAgICAgICB0cmFuc2xhdGVkT25seSwgbG9jYWxlUGlja2VyQ29sbGVjdG9yKTsKKyAgICAgICAgcmV0dXJuIHNob3VsZFNob3dUaGVMaXN0ID8gbG9jYWxlUGlja2VyIDogbnVsbDsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGVQaWNrZXJXaXRoUmVnaW9uIGNyZWF0ZUNvdW50cnlQaWNrZXIoCiAgICAgICAgICAgICBMb2NhbGVTZWxlY3RlZExpc3RlbmVyIGxpc3RlbmVyLCBMb2NhbGVTdG9yZS5Mb2NhbGVJbmZvIHBhcmVudCwKICAgICAgICAgICAgIGJvb2xlYW4gdHJhbnNsYXRlZE9ubHksIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgb25BY3Rpb25FeHBhbmRMaXN0ZW5lciwKQEAgLTEyOCw2ICsxNDEsMTAgQEAKICAgICAgICAgcmV0dXJuIGxvY2FsZVBpY2tlcjsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc2V0SXNOdW1iZXJpbmdTeXN0ZW0oYm9vbGVhbiBpc051bWJlcmluZ1N5c3RlbSkgeworICAgICAgICBtSXNOdW1iZXJpbmdTeXN0ZW0gPSBpc051bWJlcmluZ1N5c3RlbTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsaXN0ZW5lciBhbmQgaW5pdGlhbGl6ZXMgdGhlIGxvY2FsZSBsaXN0LgogICAgICAqCkBAIC0xODQsNiArMjAxLDcgQEAKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNTcGVjaWZpY1BhY2thZ2VOYW1lID0KICAgICAgICAgICAgICAgICBtTG9jYWxlUGlja2VyQ29sbGVjdG9yICE9IG51bGwgJiYgbUxvY2FsZVBpY2tlckNvbGxlY3Rvci5oYXNTcGVjaWZpY1BhY2thZ2VOYW1lKCk7CiAgICAgICAgIG1BZGFwdGVyID0gbmV3IFN1Z2dlc3RlZExvY2FsZUFkYXB0ZXIobUxvY2FsZUxpc3QsIGNvdW50cnlNb2RlLCBoYXNTcGVjaWZpY1BhY2thZ2VOYW1lKTsKKyAgICAgICAgbUFkYXB0ZXIuc2V0TnVtYmVyaW5nU3lzdGVtTW9kZShtSXNOdW1iZXJpbmdTeXN0ZW0pOwogICAgICAgICBmaW5hbCBMb2NhbGVIZWxwZXIuTG9jYWxlSW5mb0NvbXBhcmF0b3IgY29tcCA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2FsZUhlbHBlci5Mb2NhbGVJbmZvQ29tcGFyYXRvcihzb3J0aW5nTG9jYWxlLCBjb3VudHJ5TW9kZSk7CiAgICAgICAgIG1BZGFwdGVyLnNvcnQoY29tcCk7CkBAIC0yMTMsNyArMjMxLDYgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLQogICAgICAgICBpZiAobVBhcmVudExvY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLnNldFRpdGxlKG1QYXJlbnRMb2NhbGUuZ2V0RnVsbE5hbWVOYXRpdmUoKSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yNTAsMTYgKzI2NywyOCBAQAogICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlc2V0dGluZyB0aGUgYXBwIGxvY2FsZSB0byBlcXVhbCB0aGUgc3lzdGVtIGxvY2FsZS4KICAgICAgICAgYm9vbGVhbiBpc1N5c3RlbUxvY2FsZSA9IGxvY2FsZS5pc1N5c3RlbUxvY2FsZSgpOwogICAgICAgICBib29sZWFuIGlzUmVnaW9uTG9jYWxlID0gbG9jYWxlLmdldFBhcmVudCgpICE9IG51bGw7CisgICAgICAgIGJvb2xlYW4gbWF5SGF2ZURpZmZlcmVudE51bWJlcmluZ1N5c3RlbSA9IGxvY2FsZS5oYXNOdW1iZXJpbmdTeXN0ZW1zKCk7CiAKLSAgICAgICAgaWYgKGlzU3lzdGVtTG9jYWxlIHx8IGlzUmVnaW9uTG9jYWxlKSB7CisgICAgICAgIGlmIChpc1N5c3RlbUxvY2FsZQorICAgICAgICAgICAgICAgIHx8IChpc1JlZ2lvbkxvY2FsZSAmJiAhbWF5SGF2ZURpZmZlcmVudE51bWJlcmluZ1N5c3RlbSkKKyAgICAgICAgICAgICAgICB8fCBtSXNOdW1iZXJpbmdTeXN0ZW0pIHsKICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvY2FsZVNlbGVjdGVkKGxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5Ub1BhcmVudEZyYW1lKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2NhbGVQaWNrZXJXaXRoUmVnaW9uIHNlbGVjdG9yID0gTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5jcmVhdGVDb3VudHJ5UGlja2VyKAotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIsIGxvY2FsZSwgbVRyYW5zbGF0ZWRPbmx5IC8qIHRyYW5zbGF0ZSBvbmx5ICovLAotICAgICAgICAgICAgICAgICAgICBtT25BY3Rpb25FeHBhbmRMaXN0ZW5lciwgdGhpcy5tTG9jYWxlUGlja2VyQ29sbGVjdG9yKTsKKyAgICAgICAgICAgIExvY2FsZVBpY2tlcldpdGhSZWdpb24gc2VsZWN0b3I7CisgICAgICAgICAgICBpZiAobWF5SGF2ZURpZmZlcmVudE51bWJlcmluZ1N5c3RlbSkgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZVBpY2tlcldpdGhSZWdpb24uY3JlYXRlTnVtYmVyaW5nU3lzdGVtUGlja2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLCBsb2NhbGUsIG1UcmFuc2xhdGVkT25seSAvKiB0cmFuc2xhdGUgb25seSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyLCB0aGlzLm1Mb2NhbGVQaWNrZXJDb2xsZWN0b3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvciA9IExvY2FsZVBpY2tlcldpdGhSZWdpb24uY3JlYXRlQ291bnRyeVBpY2tlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lciwgbG9jYWxlLCBtVHJhbnNsYXRlZE9ubHkgLyogdHJhbnNsYXRlIG9ubHkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBtT25BY3Rpb25FeHBhbmRMaXN0ZW5lciwgdGhpcy5tTG9jYWxlUGlja2VyQ29sbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUcmFuc2l0aW9uKEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZS5qYXZhCmluZGV4IDhiNDE4MjkuLmJjYmZkYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlLmphdmEKQEAgLTM5LDYgKzM5LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgTG9jYWxlU3RvcmUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSUVSX0xBTkdVQUdFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElFUl9SRUdJT04gPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSUVSX05VTUJFUklORyA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExvY2FsZUluZm8+IHNMb2NhbGVDYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTG9jYWxlU3RvcmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0Z1bGx5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKQEAgLTY4LDEwICs3MSwxMyBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBtRnVsbENvdW50cnlOYW1lTmF0aXZlOwogICAgICAgICBwcml2YXRlIFN0cmluZyBtTGFuZ1NjcmlwdEtleTsKIAorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc051bWJlcmluZ1N5c3RlbXM7CisKICAgICAgICAgcHJpdmF0ZSBMb2NhbGVJbmZvKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgICAgIHRoaXMubUxvY2FsZSA9IGxvY2FsZTsKICAgICAgICAgICAgIHRoaXMubUlkID0gbG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKTsKICAgICAgICAgICAgIHRoaXMubVBhcmVudCA9IGdldFBhcmVudChsb2NhbGUpOworICAgICAgICAgICAgdGhpcy5tSGFzTnVtYmVyaW5nU3lzdGVtcyA9IGZhbHNlOwogICAgICAgICAgICAgdGhpcy5tSXNDaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgICB0aGlzLm1TdWdnZXN0aW9uRmxhZ3MgPSBTVUdHRVNUSU9OX1RZUEVfTk9ORTsKICAgICAgICAgICAgIHRoaXMubUlzVHJhbnNsYXRlZCA9IGZhbHNlOwpAQCAtOTMsNiArOTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIH0KIAorICAgICAgICAvKiogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBzYW1lIGxvY2FsZXMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyaW5nIHN5c3RlbS4gKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTnVtYmVyaW5nU3lzdGVtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGFzTnVtYmVyaW5nU3lzdGVtczsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIG1JZDsKQEAgLTE5NSw2ICsyMDYsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIFN0cmluZyBnZXROdW1iZXJpbmdTeXN0ZW0oKSB7CisgICAgICAgICAgICByZXR1cm4gTG9jYWxlSGVscGVyLmdldERpc3BsYXlOdW1iZXJpbmdTeXN0ZW1LZXlWYWx1ZShtTG9jYWxlLCBtTG9jYWxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIFN0cmluZyBnZXRDb250ZW50RGVzY3JpcHRpb24oYm9vbGVhbiBjb3VudHJ5TW9kZSkgewogICAgICAgICAgICAgaWYgKGNvdW50cnlNb2RlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEZ1bGxDb3VudHJ5TmFtZUluVWlMYW5ndWFnZSgpOwpAQCAtMzgzLDYgKzM5OCwxMiBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJbkRldmVsb3Blck1vZGUgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLkRFVkVMT1BNRU5UX1NFVFRJTkdTX0VOQUJMRUQsIDApICE9IDA7CisgICAgICAgIFNldDxMb2NhbGU+IG51bWJlclN5c3RlbUxvY2FsZUxpc3QgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGxvY2FsZUlkIDogTG9jYWxlUGlja2VyLmdldFN1cHBvcnRlZExvY2FsZXMoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGlmIChMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcobG9jYWxlSWQpLmdldFVuaWNvZGVMb2NhbGVUeXBlKCJudSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1iZXJTeXN0ZW1Mb2NhbGVMaXN0LmFkZChMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcobG9jYWxlSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBmb3IgKFN0cmluZyBsb2NhbGVJZCA6IExvY2FsZVBpY2tlci5nZXRTdXBwb3J0ZWRMb2NhbGVzKGNvbnRleHQpKSB7CiAgICAgICAgICAgICBpZiAobG9jYWxlSWQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGZvcm1lZExvY2FsZUV4Y2VwdGlvbigiQmFkIGxvY2FsZSBlbnRyeSBpbiBsb2NhbGVfY29uZmlnLnhtbCIpOwpAQCAtNDAzLDYgKzQyNCwxMiBAQAogICAgICAgICAgICAgaWYgKHNpbUNvdW50cmllcy5jb250YWlucyhsaS5nZXRMb2NhbGUoKS5nZXRDb3VudHJ5KCkpKSB7CiAgICAgICAgICAgICAgICAgbGkubVN1Z2dlc3Rpb25GbGFncyB8PSBMb2NhbGVJbmZvLlNVR0dFU1RJT05fVFlQRV9TSU07CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXJTeXN0ZW1Mb2NhbGVMaXN0LmZvckVhY2gobCAtPiB7CisgICAgICAgICAgICAgICAgaWYgKGxpLmdldExvY2FsZSgpLnN0cmlwRXh0ZW5zaW9ucygpLmVxdWFscyhsLnN0cmlwRXh0ZW5zaW9ucygpKSkgeworICAgICAgICAgICAgICAgICAgICBsaS5tSGFzTnVtYmVyaW5nU3lzdGVtcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKICAgICAgICAgICAgIHNMb2NhbGVDYWNoZS5wdXQobGkuZ2V0SWQoKSwgbGkpOwogICAgICAgICAgICAgZmluYWwgTG9jYWxlIHBhcmVudCA9IGxpLmdldFBhcmVudCgpOwogICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CkBAIC00NDUsMjAgKzQ3Miw0MyBAQAogICAgICAgICBzRnVsbHlJbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExldmVsKFNldDxTdHJpbmc+IGlnbm9yYWJsZXMsIExvY2FsZUluZm8gbGksIGJvb2xlYW4gdHJhbnNsYXRlZE9ubHkpIHsKLSAgICAgICAgaWYgKGlnbm9yYWJsZXMuY29udGFpbnMobGkuZ2V0SWQoKSkpIHJldHVybiAwOwotICAgICAgICBpZiAobGkubUlzUHNldWRvKSByZXR1cm4gMjsKLSAgICAgICAgaWYgKHRyYW5zbGF0ZWRPbmx5ICYmICFsaS5pc1RyYW5zbGF0ZWQoKSkgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChsaS5nZXRQYXJlbnQoKSAhPSBudWxsKSByZXR1cm4gMjsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NoYWxsSWdub3JlKAorICAgICAgICAgICAgU2V0PFN0cmluZz4gaWdub3JhYmxlcywgTG9jYWxlSW5mbyBsaSwgYm9vbGVhbiB0cmFuc2xhdGVkT25seSkgeworICAgICAgICBpZiAoaWdub3JhYmxlcy5zdHJlYW0oKS5hbnlNYXRjaCh0YWcgLT4KKyAgICAgICAgICAgICAgICBMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcodGFnKS5zdHJpcEV4dGVuc2lvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhsaS5nZXRMb2NhbGUoKS5zdHJpcEV4dGVuc2lvbnMoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGkubUlzUHNldWRvKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0cmFuc2xhdGVkT25seSAmJiAhbGkuaXNUcmFuc2xhdGVkKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAobGkuZ2V0UGFyZW50KCkgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TG9jYWxlVGllcihMb2NhbGVJbmZvIHBhcmVudCkgeworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBUSUVSX0xBTkdVQUdFOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5nZXRMb2NhbGUoKS5nZXRDb3VudHJ5KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gVElFUl9SRUdJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gVElFUl9OVU1CRVJJTkc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGVzIGZvciBsYW5ndWFnZSBvciByZWdpb24gc2VsZWN0aW9uLgorICAgICAqCiAgICAgICogSWYgdGhlIHBhcmVudCBpcyBudWxsLCB0aGVuIGl0IGlzIHRoZSBsYW5ndWFnZSBsaXN0LgorICAgICAqCiAgICAgICogSWYgaXQgaXMgbm90IG51bGwsIHRoZW4gdGhlIGxpc3Qgd2lsbCBjb250YWluIGFsbCB0aGUgbG9jYWxlcyB0aGF0IGJlbG9uZyB0byB0aGF0IHBhcmVudC4KICAgICAgKiBFeGFtcGxlOiBpZiB0aGUgcGFyZW50IGlzICJhciIsIHRoZW4gdGhlIHJlZ2lvbiBsaXN0IHdpbGwgY29udGFpbiBhbGwgQXJhYmljIGxvY2FsZXMuCi0gICAgICogKHRoaXMgaXMgbm90IGxhbmd1YWdlIGJhc2VkLCBidXQgbGFuZ3VhZ2Utc2NyaXB0LCBzbyB0aGF0IGl0IHdvcmtzIGZvciB6aC1IYW50IGFuZCBzbyBvbi4KKyAgICAgKiAodGhpcyBpcyBub3QgbGFuZ3VhZ2UgYmFzZWQsIGJ1dCBsYW5ndWFnZS1zY3JpcHQsIHNvIHRoYXQgaXQgd29ya3MgZm9yIHpoLUhhbnQgYW5kIHNvIG9uLikKKyAgICAgKgorICAgICAqIElmIGl0IGlzIG5vdCBudWxsIGFuZCBoYXMgY291bnRyeSwgdGhlbiB0aGUgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGxvY2FsZXMgd2l0aCB0aGF0IHBhcmVudCdzCisgICAgICogbGFuZ3VhZ2UgYW5kIGNvdW50cnksIGkuZS4gY29udGFpbmluZyBhbHRlcm5hdGUgbnVtYmVyaW5nIHN5c3RlbXMuCisgICAgICoKKyAgICAgKiBFeGFtcGxlOiBpZiB0aGUgcGFyZW50IGlzICJmZi1BZGxtLUJGIiwgdGhlbiB0aGUgbnVtYmVyaW5nIGxpc3Qgd2lsbCBjb250YWluIGFsbAorICAgICAqIEZ1bGEgKEFkbGFtLCBCdXJraW5hIEZhc28pIGkuZS4gImZmLUFkbG0tQkYiIGFuZCAiZmYtQWRsbS1CRi11LW51LWxhdG4iCiAgICAgICovCiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICBwdWJsaWMgc3RhdGljIFNldDxMb2NhbGVJbmZvPiBnZXRMZXZlbExvY2FsZXMoQ29udGV4dCBjb250ZXh0LCBTZXQ8U3RyaW5nPiBpZ25vcmFibGVzLApAQCAtNDc4LDI4ICs1MjgsNDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNldDxMb2NhbGVJbmZvPiBnZXRMZXZlbExvY2FsZXMoQ29udGV4dCBjb250ZXh0LCBTZXQ8U3RyaW5nPiBpZ25vcmFibGVzLAogICAgICAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQsIGJvb2xlYW4gdHJhbnNsYXRlZE9ubHksIExvY2FsZUxpc3QgZXhwbGljaXRMb2NhbGVzKSB7Ci0gICAgICAgIGZpbGxDYWNoZShjb250ZXh0KTsKLSAgICAgICAgU3RyaW5nIHBhcmVudElkID0gcGFyZW50ID09IG51bGwgPyBudWxsIDogcGFyZW50LmdldElkKCk7Ci0gICAgICAgIEhhc2hTZXQ8TG9jYWxlSW5mbz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWxsQ2FjaGUoY29udGV4dCk7CisgICAgICAgIH0KICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExvY2FsZUluZm8+IHN1cHBvcnRlZExjb2FsZUluZm9zID0KICAgICAgICAgICAgICAgICBleHBsaWNpdExvY2FsZXMgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgPyBzTG9jYWxlQ2FjaGUKICAgICAgICAgICAgICAgICAgICAgICAgIDogY29udmVydEV4cGxpY2l0TG9jYWxlcyhleHBsaWNpdExvY2FsZXMsIHNMb2NhbGVDYWNoZS52YWx1ZXMoKSk7CisgICAgICAgIHJldHVybiBnZXRUaWVyTG9jYWxlcyhpZ25vcmFibGVzLCBwYXJlbnQsIHRyYW5zbGF0ZWRPbmx5LCBzdXBwb3J0ZWRMY29hbGVJbmZvcyk7CisgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PExvY2FsZUluZm8+IGdldFRpZXJMb2NhbGVzKAorICAgICAgICAgICAgU2V0PFN0cmluZz4gaWdub3JhYmxlcywKKyAgICAgICAgICAgIExvY2FsZUluZm8gcGFyZW50LAorICAgICAgICAgICAgYm9vbGVhbiB0cmFuc2xhdGVkT25seSwKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMb2NhbGVJbmZvPiBzdXBwb3J0ZWRMY29hbGVJbmZvcykgeworCisgICAgICAgIGJvb2xlYW4gaGFzVGFyZ2V0UGFyZW50ID0gcGFyZW50ICE9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXJlbnRJZCA9IGhhc1RhcmdldFBhcmVudCA/IHBhcmVudC5nZXRJZCgpIDogbnVsbDsKKyAgICAgICAgSGFzaFNldDxMb2NhbGVJbmZvPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGZvciAoTG9jYWxlU3RvcmUuTG9jYWxlSW5mbyBsaSA6IHN1cHBvcnRlZExjb2FsZUluZm9zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpbnQgbGV2ZWwgPSBnZXRMZXZlbChpZ25vcmFibGVzLCBsaSwgdHJhbnNsYXRlZE9ubHkpOwotICAgICAgICAgICAgaWYgKGxldmVsID09IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsgLy8gcmVnaW9uIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQuZXF1YWxzKGxpLmdldFBhcmVudCgpLnRvTGFuZ3VhZ2VUYWcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbGFuZ3VhZ2Ugc2VsZWN0aW9uCisgICAgICAgICAgICBpZiAoaXNTaGFsbElnbm9yZShpZ25vcmFibGVzLCBsaSwgdHJhbnNsYXRlZE9ubHkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2goZ2V0TG9jYWxlVGllcihwYXJlbnQpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUSUVSX0xBTkdVQUdFOgogICAgICAgICAgICAgICAgICAgICBpZiAobGkuaXNTdWdnZXN0aW9uT2ZUeXBlKExvY2FsZUluZm8uU1VHR0VTVElPTl9UWVBFX1NJTSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobGkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChnZXRMb2NhbGVJbmZvKGxpLmdldFBhcmVudCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdldExvY2FsZUluZm8obGkuZ2V0UGFyZW50KCksIHN1cHBvcnRlZExjb2FsZUluZm9zKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVElFUl9SRUdJT046CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZC5lcXVhbHMobGkuZ2V0UGFyZW50KCkudG9MYW5ndWFnZVRhZygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChnZXRMb2NhbGVJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5nZXRMb2NhbGUoKS5zdHJpcEV4dGVuc2lvbnMoKSwgc3VwcG9ydGVkTGNvYWxlSW5mb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRJRVJfTlVNQkVSSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdldExvY2FsZSgpLnN0cmlwRXh0ZW5zaW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhsaS5nZXRMb2NhbGUoKS5zdHJpcEV4dGVuc2lvbnMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC01MzgsMTggKzYwOSwyMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIExvY2FsZUxpc3QgbWF0Y2hMb2NhbGVGcm9tU3VwcG9ydGVkTG9jYWxlTGlzdCgKLSAgICAgICAgICAgIExvY2FsZUxpc3QgZXhwbGljaXRMb2NhbGVzLCBDb2xsZWN0aW9uPExvY2FsZUluZm8+IGxvY2FsZWluZm8pIHsKKyAgICAgICAgICAgIExvY2FsZUxpc3QgZXhwbGljaXRMb2NhbGVzLCBDb2xsZWN0aW9uPExvY2FsZUluZm8+IGxvY2FsZUluZm9zKSB7CisgICAgICAgIGlmIChsb2NhbGVJbmZvcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZXhwbGljaXRMb2NhbGVzOworICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogQWRkcyBhIGZ1bmN0aW9uIGZvciB1bmljb2RlIGV4dGVuc2lvbiBpZiBuZWVkZWQuCiAgICAgICAgIExvY2FsZVtdIHJlc3VsdExvY2FsZXMgPSBuZXcgTG9jYWxlW2V4cGxpY2l0TG9jYWxlcy5zaXplKCldOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGxpY2l0TG9jYWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGV4cGxpY2l0TG9jYWxlcy5nZXQoaSkuc3RyaXBFeHRlbnNpb25zKCk7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gZXhwbGljaXRMb2NhbGVzLmdldChpKTsKICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobG9jYWxlLmdldENvdW50cnkoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKExvY2FsZUluZm8gbG9jYWxlSW5mbyA6bG9jYWxlaW5mbykgeworICAgICAgICAgICAgICAgIGZvciAoTG9jYWxlSW5mbyBsb2NhbGVJbmZvIDpsb2NhbGVJbmZvcykgewogICAgICAgICAgICAgICAgICAgICBpZiAoTG9jYWxlTGlzdC5tYXRjaGVzTGFuZ3VhZ2VBbmRTY3JpcHQobG9jYWxlLCBsb2NhbGVJbmZvLmdldExvY2FsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobG9jYWxlLmdldENvdW50cnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVJbmZvLmdldExvY2FsZSgpLmdldENvdW50cnkoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExvY2FsZXNbaV0gPSBsb2NhbGVJbmZvLmdldExvY2FsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU2MiwxOCArNjM2LDIzIEBACiAKICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxlSW5mbyBnZXRMb2NhbGVJbmZvKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGdldExvY2FsZUluZm8obG9jYWxlLCBzTG9jYWxlQ2FjaGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsZUluZm8gZ2V0TG9jYWxlSW5mbygKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsIEhhc2hNYXA8U3RyaW5nLCBMb2NhbGVJbmZvPiBsb2NhbGVJbmZvcykgewogICAgICAgICBTdHJpbmcgaWQgPSBsb2NhbGUudG9MYW5ndWFnZVRhZygpOwogICAgICAgICBMb2NhbGVJbmZvIHJlc3VsdDsKLSAgICAgICAgaWYgKCFzTG9jYWxlQ2FjaGUuY29udGFpbnNLZXkoaWQpKSB7CisgICAgICAgIGlmICghbG9jYWxlSW5mb3MuY29udGFpbnNLZXkoaWQpKSB7CiAgICAgICAgICAgICAvLyBMb2NhbGUgcHJlZmVyZW5jZXMgY2FuIG1vZGlmeSB0aGUgbGFuZ3VhZ2UgdGFnIHRvIGN1cnJlbnQgc3lzdGVtIGxhbmd1YWdlcywgc28gd2UKICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgdGhlIGlucHV0IGxvY2FsZSB3aXRob3V0IGV4dHJhIHUgZXh0ZW5zaW9uIGV4Y2VwdCBudW1iZXJpbmcgc3lzdGVtLgogICAgICAgICAgICAgTG9jYWxlIGZpbHRlcmVkTG9jYWxlID0gbmV3IExvY2FsZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgLnNldExvY2FsZShsb2NhbGUuc3RyaXBFeHRlbnNpb25zKCkpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRVbmljb2RlTG9jYWxlS2V5d29yZCgibnUiLCBsb2NhbGUuZ2V0VW5pY29kZUxvY2FsZVR5cGUoIm51IikpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgaWYgKHNMb2NhbGVDYWNoZS5jb250YWluc0tleShmaWx0ZXJlZExvY2FsZS50b0xhbmd1YWdlVGFnKCkpKSB7CisgICAgICAgICAgICBpZiAobG9jYWxlSW5mb3MuY29udGFpbnNLZXkoZmlsdGVyZWRMb2NhbGUudG9MYW5ndWFnZVRhZygpKSkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBMb2NhbGVJbmZvKGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgTG9jYWxlSW5mbyBsb2NhbGVJbmZvID0gc0xvY2FsZUNhY2hlLmdldChmaWx0ZXJlZExvY2FsZS50b0xhbmd1YWdlVGFnKCkpOworICAgICAgICAgICAgICAgIExvY2FsZUluZm8gbG9jYWxlSW5mbyA9IGxvY2FsZUluZm9zLmdldChmaWx0ZXJlZExvY2FsZS50b0xhbmd1YWdlVGFnKCkpOwogICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9jYWxlIGlzIGluY2x1ZGVkIGluIHN1cHBvcnRlZCBsb2NhbGVzLCBzbyBmb2xsb3cgdGhlIHNldHRpbmdzCiAgICAgICAgICAgICAgICAgLy8gb2Ygc3VwcG9ydGVkIGxvY2FsZXMuCiAgICAgICAgICAgICAgICAgcmVzdWx0Lm1Jc1BzZXVkbyA9IGxvY2FsZUluZm8ubUlzUHNldWRvOwpAQCAtNTgyLDkgKzY2MSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBMb2NhbGVJbmZvKGxvY2FsZSk7Ci0gICAgICAgICAgICBzTG9jYWxlQ2FjaGUucHV0KGlkLCByZXN1bHQpOworICAgICAgICAgICAgbG9jYWxlSW5mb3MucHV0KGlkLCByZXN1bHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gc0xvY2FsZUNhY2hlLmdldChpZCk7CisgICAgICAgICAgICByZXN1bHQgPSBsb2NhbGVJbmZvcy5nZXQoaWQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TdWdnZXN0ZWRMb2NhbGVBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1N1Z2dlc3RlZExvY2FsZUFkYXB0ZXIuamF2YQppbmRleCBhNjFhNmQ3Li4wOGRlNGRmYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TdWdnZXN0ZWRMb2NhbGVBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TdWdnZXN0ZWRMb2NhbGVBZGFwdGVyLmphdmEKQEAgLTY0LDYgKzY0LDcgQEAKICAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0PExvY2FsZVN0b3JlLkxvY2FsZUluZm8+IG1PcmlnaW5hbExvY2FsZU9wdGlvbnM7CiAgICAgcHJvdGVjdGVkIGludCBtU3VnZ2VzdGlvbkNvdW50OwogICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1Db3VudHJ5TW9kZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNOdW1iZXJpbmdNb2RlOwogICAgIHByb3RlY3RlZCBMYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXI7CiAKICAgICBwcm90ZWN0ZWQgTG9jYWxlIG1EaXNwbGF5TG9jYWxlID0gbnVsbDsKQEAgLTg5LDYgKzkwLDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJpbmdTeXN0ZW1Nb2RlKGJvb2xlYW4gaXNOdW1iZXJTeXN0ZW1Nb2RlKSB7CisgICAgICAgIG1Jc051bWJlcmluZ01vZGUgPSBpc051bWJlclN5c3RlbU1vZGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SXNGb3JOdW1iZXJpbmdTeXN0ZW0oKSB7CisgICAgICAgIHJldHVybiBtSXNOdW1iZXJpbmdNb2RlOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjA5LDcgKzIxOCw2IEBACiAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsICYmIG1JbmZsYXRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBtSW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHBhcmVudC5nZXRDb250ZXh0KCkpOwogICAgICAgICB9Ci0KICAgICAgICAgaW50IGl0ZW1UeXBlID0gZ2V0SXRlbVZpZXdUeXBlKHBvc2l0aW9uKTsKICAgICAgICAgVmlldyBpdGVtVmlldyA9IGdldE5ld1ZpZXdJZk5lZWRlZChjb252ZXJ0VmlldywgcGFyZW50LCBpdGVtVHlwZSwgcG9zaXRpb24pOwogICAgICAgICBzd2l0Y2ggKGl0ZW1UeXBlKSB7CkBAIC0yMTcsMTMgKzIyNSwxMyBAQAogICAgICAgICAgICAgY2FzZSBUWVBFX0hFQURFUl9BTExfT1RIRVJTOgogICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSBpdGVtVmlldzsKICAgICAgICAgICAgICAgICBpZiAoaXRlbVR5cGUgPT0gVFlQRV9IRUFERVJfU1VHR0VTVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG1Db3VudHJ5TW9kZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUNvdW50cnlNb2RlICYmICFtSXNOdW1iZXJpbmdNb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZXh0VG8odGV4dFZpZXcsIFIuc3RyaW5nLmxhbmd1YWdlX3BpY2tlcl9yZWdpb25zX3NlY3Rpb25fc3VnZ2VzdGVkKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRleHRUbyh0ZXh0VmlldywgUi5zdHJpbmcubGFuZ3VhZ2VfcGlja2VyX3NlY3Rpb25fc3VnZ2VzdGVkKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ291bnRyeU1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db3VudHJ5TW9kZSAmJiAhbUlzTnVtYmVyaW5nTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGV4dFRvKHRleHRWaWV3LCBSLnN0cmluZy5yZWdpb25fcGlja2VyX3NlY3Rpb25fYWxsKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRleHRUbyh0ZXh0VmlldywgUi5zdHJpbmcubGFuZ3VhZ2VfcGlja2VyX3NlY3Rpb25fYWxsKTsKQEAgLTQxOSw5ICs0MjcsMTEgQEAKIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUZXh0VmlldyhWaWV3IGNvbnZlcnRWaWV3LCBUZXh0VmlldyB0ZXh0LCBpbnQgcG9zaXRpb24pIHsKICAgICAgICAgTG9jYWxlU3RvcmUuTG9jYWxlSW5mbyBpdGVtID0gKExvY2FsZVN0b3JlLkxvY2FsZUluZm8pIGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICB0ZXh0LnNldFRleHQoaXRlbS5nZXRMYWJlbChtQ291bnRyeU1vZGUpKTsKKyAgICAgICAgdGV4dC5zZXRUZXh0KG1Jc051bWJlcmluZ01vZGUKKyAgICAgICAgICAgICAgICA/IGl0ZW0uZ2V0TnVtYmVyaW5nU3lzdGVtKCkgOiBpdGVtLmdldExhYmVsKG1Db3VudHJ5TW9kZSkpOwogICAgICAgICB0ZXh0LnNldFRleHRMb2NhbGUoaXRlbS5nZXRMb2NhbGUoKSk7Ci0gICAgICAgIHRleHQuc2V0Q29udGVudERlc2NyaXB0aW9uKGl0ZW0uZ2V0Q29udGVudERlc2NyaXB0aW9uKG1Db3VudHJ5TW9kZSkpOworICAgICAgICB0ZXh0LnNldENvbnRlbnREZXNjcmlwdGlvbihtSXNOdW1iZXJpbmdNb2RlCisgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0uZ2V0TnVtYmVyaW5nU3lzdGVtKCkgOiBpdGVtLmdldENvbnRlbnREZXNjcmlwdGlvbihtQ291bnRyeU1vZGUpKTsKICAgICAgICAgaWYgKG1Db3VudHJ5TW9kZSkgewogICAgICAgICAgICAgaW50IGxheW91dERpciA9IFRleHRVdGlscy5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGl0ZW0uZ2V0UGFyZW50KCkpOwogICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gUmVzb3VyY2VUeXBlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9EdW1wVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL0R1bXBVdGlscy5qYXZhCmluZGV4IGJjZTBkNjAuLmY2YmNjNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL0R1bXBVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL0R1bXBVdGlscy5qYXZhCkBAIC0yNywxMiArMjcsMTIgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuQURKX1NDUkVFTl9PRkY7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLkFESl9TQ1JFRU5fT047CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0JBQ0tVUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQk9VTkRfVE9QX09SX0ZHUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ0FDSEVEX0FDVElWSVRZOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DQUNIRURfRU1QVFk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0JPVU5EX0ZHUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQk9VTkRfVE9QOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DQUNIRUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NPVU5UOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9GR1M7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0ZST1pFTjsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfSEVBVllfV0VJR0hUOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9IT01FOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORDsKQEAgLTcyLDcgKzcyLDggQEAKICAgICAgICAgU1RBVEVfTkFNRVMgPSBuZXcgU3RyaW5nW1NUQVRFX0NPVU5UXTsKICAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfUEVSU0lTVEVOVF0gICAgICAgICAgICAgICA9ICJQZXJzaXN0IjsKICAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfVE9QXSAgICAgICAgICAgICAgICAgICAgICA9ICJUb3AiOwotICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9CT1VORF9UT1BfT1JfRkdTXSAgICAgICAgID0gIkJUb3BGZ3MiOworICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9CT1VORF9GR1NdICAgICAgICAgICAgICAgID0gIkJGZ3MiOworICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9CT1VORF9UT1BdICAgICAgICAgICAgICAgID0gIkJUb3AiOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9GR1NdICAgICAgICAgICAgICAgICAgICAgID0gIkZncyI7CiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5EXSAgICAgPSAiSW1wRmciOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORF0gICAgID0gIkltcEJnIjsKQEAgLTgzLDE0ICs4NCwxNCBAQAogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9IRUFWWV9XRUlHSFRdICAgICAgICAgICAgID0gIkhlYXZ5V3QiOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9IT01FXSAgICAgICAgICAgICAgICAgICAgID0gIkhvbWUiOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9MQVNUX0FDVElWSVRZXSAgICAgICAgICAgID0gIkxhc3RBY3QiOwotICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9DQUNIRURfQUNUSVZJVFldICAgICAgICAgID0gIkNjaEFjdCI7Ci0gICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlRdICAgPSAiQ2NoQ0FjdCI7Ci0gICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0NBQ0hFRF9FTVBUWV0gICAgICAgICAgICAgPSAiQ2NoRW10eSI7CisgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0NBQ0hFRF0gICAgICAgICAgICAgICAgICAgPSAiQ2FjaGVkIjsKKyAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfRlJPWkVOXSAgICAgICAgICAgICAgICAgICA9ICJGcm96ZW4iOwogCiAgICAgICAgIFNUQVRFX0xBQkVMUyA9IG5ldyBTdHJpbmdbU1RBVEVfQ09VTlRdOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfUEVSU0lTVEVOVF0gICAgICAgICAgICAgID0gIlBlcnNpc3RlbnQiOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfVE9QXSAgICAgICAgICAgICAgICAgICAgID0gIiAgICAgICBUb3AiOwotICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQk9VTkRfVE9QX09SX0ZHU10gICAgICAgID0gIkJuZCBUb3BGZ3MiOworICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQk9VTkRfRkdTXSAgICAgICAgICAgICAgID0gIiAgIEJuZCBGZ3MiOworICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQk9VTkRfVE9QXSAgICAgICAgICAgICAgID0gIiAgIEJuZCBUb3AiOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfRkdTXSAgICAgICAgICAgICAgICAgICAgID0gIiAgICAgICBGZ3MiOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkRdICAgID0gIiAgICBJbXAgRmciOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkRdICAgID0gIiAgICBJbXAgQmciOwpAQCAtMTAxLDE2ICsxMDIsMTYgQEAKICAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0hFQVZZX1dFSUdIVF0gICAgICAgICAgICA9ICIgSGVhdnkgV2d0IjsKICAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0hPTUVdICAgICAgICAgICAgICAgICAgICA9ICIgICAgKEhvbWUpIjsKICAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0xBU1RfQUNUSVZJVFldICAgICAgICAgICA9ICIoTGFzdCBBY3QpIjsKLSAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV0gICAgICAgICA9ICIgKENjaCBBY3QpIjsKLSAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlRdICA9ICIoQ2NoIENBY3QpIjsKLSAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0NBQ0hFRF9FTVBUWV0gICAgICAgICAgICA9ICIoQ2NoIEVtdHkpIjsKKyAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0NBQ0hFRF0gICAgICAgICAgICAgICAgICA9ICIgIChDYWNoZWQpIjsKKyAgICAgICAgU1RBVEVfTEFCRUxTW1NUQVRFX0ZST1pFTl0gICAgICAgICAgICAgICAgICA9ICIgICAgRnJvemVuIjsKICAgICAgICAgU1RBVEVfTEFCRUxfQ0FDSEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9ICIgIChDYWNoZWQpIjsKICAgICAgICAgU1RBVEVfTEFCRUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICIgICAgIFRPVEFMIjsKIAogICAgICAgICBTVEFURV9OQU1FU19DU1YgPSBuZXcgU3RyaW5nW1NUQVRFX0NPVU5UXTsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX1BFUlNJU1RFTlRdICAgICAgICAgICAgICAgPSAicGVycyI7CiAgICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9UT1BdICAgICAgICAgICAgICAgICAgICAgID0gInRvcCI7Ci0gICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9CT1VORF9UT1BfT1JfRkdTXSAgICAgICAgID0gImJ0b3BmZ3MiOworICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfQk9VTkRfRkdTXSAgICAgICAgICAgICAgICA9ICJiZmdzIjsKKyAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0JPVU5EX1RPUF0gICAgICAgICAgICAgICAgPSAiYnRvcCI7CiAgICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9GR1NdICAgICAgICAgICAgICAgICAgICAgID0gImZncyI7CiAgICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORF0gICAgID0gImltcGZnIjsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5EXSAgICAgPSAiaW1wYmciOwpAQCAtMTIxLDE0ICsxMjIsMTQgQEAKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0hFQVZZX1dFSUdIVF0gICAgICAgICAgICAgPSAiaGVhdnkiOwogICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfSE9NRV0gICAgICAgICAgICAgICAgICAgICA9ICJob21lIjsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0xBU1RfQUNUSVZJVFldICAgICAgICAgICAgPSAibGFzdGFjdCI7Ci0gICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9DQUNIRURfQUNUSVZJVFldICAgICAgICAgID0gImNjaC1hY3Rpdml0eSI7Ci0gICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UXSAgID0gImNjaC1hY2xpZW50IjsKLSAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0NBQ0hFRF9FTVBUWV0gICAgICAgICAgICAgPSAiY2NoLWVtcHR5IjsKKyAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0NBQ0hFRF0gICAgICAgICAgICAgICAgICAgPSAiY2FjaGVkIjsKKyAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0ZST1pFTl0gICAgICAgICAgICAgICAgICAgPSAiZnJ6biI7CiAKICAgICAgICAgU1RBVEVfVEFHUyA9IG5ldyBTdHJpbmdbU1RBVEVfQ09VTlRdOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX1BFUlNJU1RFTlRdICAgICAgICAgICAgICAgID0gInAiOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX1RPUF0gICAgICAgICAgICAgICAgICAgICAgID0gInQiOwotICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0JPVU5EX1RPUF9PUl9GR1NdICAgICAgICAgID0gImQiOworICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0JPVU5EX0ZHU10gICAgICAgICAgICAgICAgID0gInkiOworICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0JPVU5EX1RPUF0gICAgICAgICAgICAgICAgID0gInoiOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0ZHU10gICAgICAgICAgICAgICAgICAgICAgID0gImciOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5EXSAgICAgID0gImYiOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5EXSAgICAgID0gImIiOwpAQCAtMTM5LDE1ICsxNDAsMTQgQEAKICAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9IRUFWWV9XRUlHSFRdICAgICAgICAgICAgICA9ICJ3IjsKICAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9IT01FXSAgICAgICAgICAgICAgICAgICAgICA9ICJoIjsKICAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9MQVNUX0FDVElWSVRZXSAgICAgICAgICAgICA9ICJsIjsKLSAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9DQUNIRURfQUNUSVZJVFldICAgICAgICAgICA9ICJhIjsKLSAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UXSAgICA9ICJjIjsKLSAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9DQUNIRURfRU1QVFldICAgICAgICAgICAgICA9ICJlIjsKKyAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9DQUNIRURdICAgICAgICAgICAgICAgICAgICA9ICJhIjsKKyAgICAgICAgU1RBVEVfVEFHU1tTVEFURV9GUk9aRU5dICAgICAgICAgICAgICAgICAgICA9ICJlIjsKIAogICAgICAgICBTVEFURV9QUk9UT19FTlVNUyA9IG5ldyBpbnRbU1RBVEVfQ09VTlRdOwogICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9QRVJTSVNURU5UXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVDsKICAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfVE9QXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfVE9QOwotICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9CT1VORF9UT1BfT1JfRkdTXSA9Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9CT1VORF9UT1BfT1JfRkdTOworICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9CT1VORF9GR1NdID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9CT1VORF9GR1M7CisgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0JPVU5EX1RPUF0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0JPVU5EX1RPUDsKICAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfRkdTXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfRkdTOwogICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORF0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkQ7CkBAIC0xNjEsMTAgKzE2MSw4IEBACiAgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0hFQVZZX1dFSUdIVF0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0hFQVZZX1dFSUdIVDsKICAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfSE9NRV0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0hPTUU7CiAgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0xBU1RfQUNUSVZJVFldID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9MQVNUX0FDVElWSVRZOwotICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9DQUNIRURfQUNUSVZJVFldID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFk7Ci0gICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlRdID0KLSAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQ7Ci0gICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0NBQ0hFRF9FTVBUWV0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9FTVBUWTsKKyAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfQ0FDSEVEXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZOworICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9GUk9aRU5dID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9GUk9aRU47CiAKICAgICAgICAgLy8gUmVtYXAgc3RhdGVzLCBhcyBkZWZpbmVkIGJ5IFByb2Nlc3NTdGF0cy5qYXZhLCB0byBhIHJlZHVjZWQgc3Vic2V0IG9mIHN0YXRlcyBmb3IgZGF0YQogICAgICAgICAvLyBhZ2dyZWdhdGlvbiAvIHNpemUgcmVkdWN0aW9uIHB1cnBvc2VzLgpAQCAtMTczLDcgKzE3MSw5IEBACiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlQ7CiAgICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9UT1BdID0KICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfVE9QOwotICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfQk9VTkRfVE9QX09SX0ZHU10gPQorICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfQk9VTkRfRkdTXSA9CisgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX0JPVU5EX1RPUF9PUl9GR1M7CisgICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9CT1VORF9UT1BdID0KICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfQk9VTkRfVE9QX09SX0ZHUzsKICAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0ZHU10gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9GR1M7CkBAIC0xOTYsMTEgKzE5Niw5IEBACiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX0NBQ0hFRDsKICAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0xBU1RfQUNUSVZJVFldID0KICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfQ0FDSEVEOwotICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfQ0FDSEVEX0FDVElWSVRZXSA9CisgICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9DQUNIRURdID0KICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfQ0FDSEVEOwotICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVF0gPQotICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9DQUNIRUQ7Ci0gICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9DQUNIRURfRU1QVFldID0KKyAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0ZST1pFTl0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9DQUNIRUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdGUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0ZS5qYXZhCmluZGV4IDgxOGE1MDMuLmZmZjc3OGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0ZS5qYXZhCkBAIC0yOCwxMCArMjgsOSBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5QU1NfVVNTX01BWElNVU07CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlBTU19VU1NfTUlOSU1VTTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQkFDS1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CT1VORF9UT1BfT1JfRkdTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DQUNIRURfQUNUSVZJVFk7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRF9FTVBUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQk9VTkRfRkdTOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CT1VORF9UT1A7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ09VTlQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0ZHUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfSEVBVllfV0VJR0hUOwpAQCAtODUsOSArODQsOSBAQAogICAgICAgICBTVEFURV9QRVJTSVNURU5ULCAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlQKICAgICAgICAgU1RBVEVfUEVSU0lTVEVOVCwgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJCiAgICAgICAgIFNUQVRFX1RPUCwgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfVE9QCi0gICAgICAgIFNUQVRFX0JPVU5EX1RPUF9PUl9GR1MsICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfVE9QCisgICAgICAgIFNUQVRFX0JPVU5EX1RPUCwgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfVE9QCiAgICAgICAgIFNUQVRFX0ZHUywgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfRk9SRUdST1VORF9TRVJWSUNFCi0gICAgICAgIFNUQVRFX0JPVU5EX1RPUF9PUl9GR1MsICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFCisgICAgICAgIFNUQVRFX0JPVU5EX0ZHUywgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFCiAgICAgICAgIFNUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5ELCAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkQKICAgICAgICAgU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkQsICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORAogICAgICAgICBTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORCwgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX1RSQU5TSUVOVF9CQUNLR1JPVU5ECkBAIC05OCwxMCArOTcsMTAgQEAKICAgICAgICAgU1RBVEVfSEVBVllfV0VJR0hULCAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9IRUFWWV9XRUlHSFQKICAgICAgICAgU1RBVEVfSE9NRSwgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9IT01FCiAgICAgICAgIFNUQVRFX0xBU1RfQUNUSVZJVFksICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfTEFTVF9BQ1RJVklUWQotICAgICAgICBTVEFURV9DQUNIRURfQUNUSVZJVFksICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9BQ1RJVklUWQotICAgICAgICBTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5ULCAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQKLSAgICAgICAgU1RBVEVfQ0FDSEVEX0FDVElWSVRZLCAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9DQUNIRURfUkVDRU5UCi0gICAgICAgIFNUQVRFX0NBQ0hFRF9FTVBUWSwgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0VNUFRZCisgICAgICAgIFNUQVRFX0NBQ0hFRCwgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZCisgICAgICAgIFNUQVRFX0NBQ0hFRCwgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVAorICAgICAgICBTVEFURV9DQUNIRUQsICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9SRUNFTlQKKyAgICAgICAgU1RBVEVfQ0FDSEVELCAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9DQUNIRURfRU1QVFkKICAgICB9OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFByb2Nlc3NTdGF0ZT4gQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPFByb2Nlc3NTdGF0ZT4oKSB7CkBAIC05MjYsOCArOTI1LDExIEBACiAgICAgICAgICAgICAgICAgc2NyZWVuU3RhdGVzLCBtZW1TdGF0ZXMsIG5ldyBpbnRbXSB7IFNUQVRFX1BFUlNJU1RFTlQgfSwgbm93LCB0b3RhbFRpbWUsIHRydWUpOwogICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTFNbU1RBVEVfVE9QXSwKICAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHtTVEFURV9UT1B9LCBub3csIHRvdGFsVGltZSwgdHJ1ZSk7Ci0gICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9UT1BfT1JfRkdTXSwKLSAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHsgU1RBVEVfQk9VTkRfVE9QX09SX0ZHU30sIG5vdywgdG90YWxUaW1lLAorICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTFNbU1RBVEVfQk9VTkRfVE9QXSwKKyAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHsgU1RBVEVfQk9VTkRfVE9QIH0sIG5vdywgdG90YWxUaW1lLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTFNbU1RBVEVfQk9VTkRfRkdTXSwKKyAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHsgU1RBVEVfQk9VTkRfRkdTIH0sIG5vdywgdG90YWxUaW1lLAogICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTFNbU1RBVEVfRkdTXSwKICAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHsgU1RBVEVfRkdTfSwgbm93LCB0b3RhbFRpbWUsCkBAIC05NTMsOSArOTU1LDYgQEAKICAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHtTVEFURV9IT01FfSwgbm93LCB0b3RhbFRpbWUsIHRydWUpOwogICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTFNbU1RBVEVfTEFTVF9BQ1RJVklUWV0sCiAgICAgICAgICAgICAgICAgc2NyZWVuU3RhdGVzLCBtZW1TdGF0ZXMsIG5ldyBpbnRbXSB7U1RBVEVfTEFTVF9BQ1RJVklUWX0sIG5vdywgdG90YWxUaW1lLCB0cnVlKTsKLSAgICAgICAgZHVtcFByb2Nlc3NTdW1tYXJ5RGV0YWlscyhwdywgcHJlZml4LCBEdW1wVXRpbHMuU1RBVEVfTEFCRUxfQ0FDSEVELAotICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10ge1NUQVRFX0NBQ0hFRF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQsIFNUQVRFX0NBQ0hFRF9FTVBUWX0sIG5vdywgdG90YWxUaW1lLCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkdW1wUHJvY2Vzc1N0YXRlKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgcHJlZml4LApAQCAtMTU2Myw3ICsxNTYyLDEwIEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9UT1A6CiAgICAgICAgICAgICAgICAgICAgIHRvcE1zICs9IGR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0JPVU5EX1RPUF9PUl9GR1M6CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9CT1VORF9GR1M6CisgICAgICAgICAgICAgICAgICAgIGJvdW5kRmdzTXMgKz0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQk9VTkRfVE9QOgogICAgICAgICAgICAgICAgICAgICBib3VuZFRvcE1zICs9IGR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0ZHUzoKQEAgLTE1ODMsMTMgKzE1ODUsMTAgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BFUlNJU1RFTlQ6CiAgICAgICAgICAgICAgICAgICAgIG90aGVyTXMgKz0gZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0FDSEVEX0FDVElWSVRZOgotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NBQ0hFRF9FTVBUWToKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NBQ0hFRDoKICAgICAgICAgICAgICAgICAgICAgY2FjaGVkTXMgKz0gZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIChiLzI2MTkxMDg3NykgQWRkIHN1cHBvcnQgZm9yIHRyYWNraW5nIGJvdW5kRmdzTXMgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb3plbk1zLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIChiLzI2MTkxMDg3NykgQWRkIHN1cHBvcnQgZm9yIHRyYWNraW5nIGZyb3plbk1zLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0YXRzRXZlbnRPdXRwdXQud3JpdGUoCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0cy5qYXZhCmluZGV4IGYzZWQwOWEuLjNjZTIzNGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0cy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0cy5qYXZhCkBAIC04MSwyMSArODEsMjEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9OT1RISU5HID0gLTE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEVSU0lTVEVOVCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVE9QID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9CT1VORF9UT1BfT1JfRkdTID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9CT1VORF9UT1AgPSAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZHUyA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5EID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9CQUNLVVAgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFUlZJQ0UgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFUlZJQ0VfUkVTVEFSVElORyA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVDRUlWRVIgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hFQVZZX1dFSUdIVCA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hPTUUgPSAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9MQVNUX0FDVElWSVRZID0gMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0FDSEVEX0FDVElWSVRZID0gMTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVCA9IDE0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NBQ0hFRF9FTVBUWSA9IDE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPVU5UID0gU1RBVEVfQ0FDSEVEX0VNUFRZKzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQk9VTkRfRkdTID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkQgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JBQ0tVUCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VSVklDRSA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VSVklDRV9SRVNUQVJUSU5HID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUNFSVZFUiA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hFQVZZX1dFSUdIVCA9IDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hPTUUgPSAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9MQVNUX0FDVElWSVRZID0gMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0FDSEVEID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRlJPWkVOID0gMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09VTlQgPSBTVEFURV9GUk9aRU4gKyAxOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFNTX1NBTVBMRV9DT1VOVCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFNTX01JTklNVU0gPSAxOwpAQCAtMTU0LDkgKzE1NCwxMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQUxMX1NDUkVFTl9BREogPSBuZXcgaW50W10geyBBREpfU0NSRUVOX09GRiwgQURKX1NDUkVFTl9PTiB9OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBOT05fQ0FDSEVEX1BST0NfU1RBVEVTID0gbmV3IGludFtdIHsKLSAgICAgICAgICAgIFNUQVRFX1BFUlNJU1RFTlQsIFNUQVRFX1RPUCwgU1RBVEVfQk9VTkRfVE9QX09SX0ZHUywgU1RBVEVfRkdTLAorICAgICAgICAgICAgU1RBVEVfUEVSU0lTVEVOVCwgU1RBVEVfVE9QLCBTVEFURV9GR1MsCiAgICAgICAgICAgICBTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORCwgU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkQsIFNUQVRFX0JBQ0tVUCwKLSAgICAgICAgICAgIFNUQVRFX1NFUlZJQ0UsIFNUQVRFX1NFUlZJQ0VfUkVTVEFSVElORywgU1RBVEVfUkVDRUlWRVIsIFNUQVRFX0hFQVZZX1dFSUdIVAorICAgICAgICAgICAgU1RBVEVfU0VSVklDRSwgU1RBVEVfU0VSVklDRV9SRVNUQVJUSU5HLCBTVEFURV9SRUNFSVZFUiwgU1RBVEVfSEVBVllfV0VJR0hULAorICAgICAgICAgICAgU1RBVEVfQk9VTkRfVE9QLCBTVEFURV9CT1VORF9GR1MKICAgICB9OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBCQUNLR1JPVU5EX1BST0NfU1RBVEVTID0gbmV3IGludFtdIHsKQEAgLTE2NSwxMSArMTY2LDExIEBACiAgICAgfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQUxMX1BST0NfU1RBVEVTID0gbmV3IGludFtdIHsgU1RBVEVfUEVSU0lTVEVOVCwKLSAgICAgICAgICAgIFNUQVRFX1RPUCwgU1RBVEVfQk9VTkRfVE9QX09SX0ZHUywgU1RBVEVfRkdTLCBTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORCwKKyAgICAgICAgICAgIFNUQVRFX1RPUCwgU1RBVEVfRkdTLCBTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORCwKICAgICAgICAgICAgIFNUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5ELCBTVEFURV9CQUNLVVAsCiAgICAgICAgICAgICBTVEFURV9TRVJWSUNFLCBTVEFURV9TRVJWSUNFX1JFU1RBUlRJTkcsIFNUQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgU1RBVEVfSEVBVllfV0VJR0hULCBTVEFURV9IT01FLCBTVEFURV9MQVNUX0FDVElWSVRZLCBTVEFURV9DQUNIRURfQUNUSVZJVFksCi0gICAgICAgICAgICBTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5ULCBTVEFURV9DQUNIRURfRU1QVFkKKyAgICAgICAgICAgIFNUQVRFX0hFQVZZX1dFSUdIVCwgU1RBVEVfSE9NRSwgU1RBVEVfTEFTVF9BQ1RJVklUWSwgU1RBVEVfQ0FDSEVELAorICAgICAgICAgICAgU1RBVEVfQk9VTkRfVE9QLCBTVEFURV9CT1VORF9GR1MsIFNUQVRFX0ZST1pFTgogICAgIH07CiAKICAgICAvLyBTaG91bGQgcmVwb3J0IHByb2Nlc3Mgc3RhdHMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvamFuay9JbnRlcmFjdGlvbkphbmtNb25pdG9yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvamFuay9JbnRlcmFjdGlvbkphbmtNb25pdG9yLmphdmEKaW5kZXggN2FlNjNiMS4uOTI4YTA5NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2phbmsvSW50ZXJhY3Rpb25KYW5rTW9uaXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9qYW5rL0ludGVyYWN0aW9uSmFua01vbml0b3IuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX0RFVklDRV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9JTlRFUkFDVElPTl9KQU5LX01PTklUT1I7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuamFuay5GcmFtZVRyYWNrZXIuUkVBU09OX0NBTkNFTF9OT1JNQUw7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmphbmsuRnJhbWVUcmFja2VyLlJFQVNPTl9DQU5DRUxfVElNRU9VVDsKQEAgLTQ0OCwxNyArNDQ5LDcgQEAKICAgICAgICAgbUVuYWJsZWQgPSBERUZBVUxUX0VOQUJMRUQ7CiAKICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gQWN0aXZpdHlUaHJlYWQuY3VycmVudEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGlmIChjb250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oUkVBRF9ERVZJQ0VfQ09ORklHKSA9PSBQRVJNSVNTSU9OX0dSQU5URUQpIHsKLSAgICAgICAgICAgIC8vIFBvc3QgaW5pdGlhbGl6YXRpb24gdG8gdGhlIGJhY2tncm91bmQgaW4gY2FzZSB3ZSdyZSBydW5uaW5nIG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICAgICAgICAgIG1Xb3JrZXIuZ2V0VGhyZWFkSGFuZGxlcigpLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICgpIC0+IG1Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyLm9uUHJvcGVydGllc0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuTkFNRVNQQUNFX0lOVEVSQUNUSU9OX0pBTktfTU9OSVRPUikpKTsKLSAgICAgICAgICAgIERldmljZUNvbmZpZy5hZGRPblByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5OQU1FU1BBQ0VfSU5URVJBQ1RJT05fSkFOS19NT05JVE9SLAotICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlckV4ZWN1dG9yKG1Xb3JrZXIuZ2V0VGhyZWFkSGFuZGxlcigpKSwKLSAgICAgICAgICAgICAgICAgICAgbVByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKFJFQURfREVWSUNFX0NPTkZJRykgIT0gUEVSTUlTU0lPTl9HUkFOVEVEKSB7CiAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbml0aWFsaXplZCB0aGUgSW50ZXJhY3Rpb25KYW5rTW9uaXRvci4iCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgKE5vIFJFQURfREVWSUNFX0NPTkZJRyBwZXJtaXNzaW9uIHRvIGNoYW5nZSBjb25maWdzKSIKQEAgLTQ2Nyw3ICs0NTgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZnJhbWVUaW1lVGhyZXNob2xkPSIgKyBtVHJhY2VUaHJlc2hvbGRGcmFtZVRpbWVNaWxsaXMKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcGFja2FnZT0iICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIC8vIFBvc3QgaW5pdGlhbGl6YXRpb24gdG8gdGhlIGJhY2tncm91bmQgaW4gY2FzZSB3ZSdyZSBydW5uaW5nIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgbVdvcmtlci5nZXRUaHJlYWRIYW5kbGVyKCkucG9zdCgKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllc0NoYW5nZWRMaXN0ZW5lci5vblByb3BlcnRpZXNDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcyhOQU1FU1BBQ0VfSU5URVJBQ1RJT05fSkFOS19NT05JVE9SKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuYWRkT25Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfSU5URVJBQ1RJT05fSkFOS19NT05JVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlckV4ZWN1dG9yKG1Xb3JrZXIuZ2V0VGhyZWFkSGFuZGxlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FuJ3QgZ2V0IHByb3BlcnRpZXM6IFJFQURfREVWSUNFX0NPTkZJRyBncmFudGVkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oUkVBRF9ERVZJQ0VfQ09ORklHKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHBhY2thZ2U9IiArIGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCmluZGV4IDA3NmU0ZTEuLjE1MDVjY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQpAQCAtMTg1LDggKzE4NSwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJlbG9hZFNoYXJlZExpYnJhcmllcygpIHsKICAgICAgICAgTG9nLmkoVEFHLCAiUHJlbG9hZGluZyBzaGFyZWQgbGlicmFyaWVzLi4uIik7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYW5kcm9pZCIpOwotICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImNvbXBpbGVyX3J0Iik7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiam5pZ3JhcGhpY3MiKTsKKworICAgICAgICAvLyBUT0RPKGIvMjA2Njc2MTY3KTogVGhpcyBsaWJyYXJ5IGlzIG9ubHkgdXNlZCBmb3IgcmVuZGVyc2NyaXB0IHRvZGF5LiBXaGVuIHJlbmRlcnNjcmlwdCBpcworICAgICAgICAvLyByZW1vdmVkLCB0aGlzIGxvYWQgY2FuIGJlIHJlbW92ZWQgYXMgd2VsbC4KKyAgICAgICAgaWYgKCFTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbmZpZy5kaXNhYmxlX3JlbmRlcnNjcmlwdCIsIGZhbHNlKSkgeworICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjb21waWxlcl9ydCIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgbmF0aXZlUHJlbG9hZEFwcFByb2Nlc3NIQUxzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9TY3JlZW5zaG90SGVscGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9TY3JlZW5zaG90SGVscGVyLmphdmEKaW5kZXggM2EzOTNiNi4uNjlkM2Q2YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvU2NyZWVuc2hvdEhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1NjcmVlbnNob3RIZWxwZXIuamF2YQpAQCAtMTk1LDYgKzE5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLkNVUlJFTlQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TY3JlZW5zaG90Q29ubmVjdGlvbiA9IGNvbm47CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucG9zdERlbGF5ZWQobVNjcmVlbnNob3RUaW1lb3V0LCB0aW1lb3V0TXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UoY29ubik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtU2NyZWVuc2hvdFNlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19EaXNwbGF5RXZlbnRSZWNlaXZlci5jcHAKaW5kZXggNzM5MDU1ZS4uMGMzZmY2YyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwCkBAIC0xNjksMjEgKzE2OSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8udnN5bmNFdmVudERhdGFDbGFzc0luZm8uZnJhbWVJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbCk7CiAKLSAgICAgICAgam9iamVjdEFycmF5IGZyYW1lVGltZWxpbmVzT2JqID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0QXJyYXk+KAotICAgICAgICAgICAgICAgIGVudi0+R2V0T2JqZWN0RmllbGQodnN5bmNFdmVudERhdGFPYmouZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8udnN5bmNFdmVudERhdGFDbGFzc0luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1lVGltZWxpbmVzKSk7CisgICAgICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3RBcnJheT4KKyAgICAgICAgICAgICAgICBmcmFtZVRpbWVsaW5lc09iaihlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0QXJyYXk+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5HZXRPYmplY3RGaWVsZCh2c3luY0V2ZW50RGF0YU9iai5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Rpc3BsYXlFdmVudFJlY2VpdmVyQ2xhc3NJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZzeW5jRXZlbnREYXRhQ2xhc3NJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1lVGltZWxpbmVzKSkpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZzeW5jRXZlbnREYXRhOjprRnJhbWVUaW1lbGluZXNMZW5ndGg7IGkrKykgewogICAgICAgICAgICAgVnN5bmNFdmVudERhdGE6OkZyYW1lVGltZWxpbmUmIGZyYW1lVGltZWxpbmUgPSB2c3luY0V2ZW50RGF0YS5mcmFtZVRpbWVsaW5lc1tpXTsKLSAgICAgICAgICAgIGpvYmplY3QgZnJhbWVUaW1lbGluZU9iaiA9IGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGZyYW1lVGltZWxpbmVzT2JqLCBpKTsKLSAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmosCisgICAgICAgICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVsaW5lT2JqKGVudiwgZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoZnJhbWVUaW1lbGluZXNPYmouZ2V0KCksIGkpKTsKKyAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmouZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8uZnJhbWVUaW1lbGluZUNsYXNzSW5mby52c3luY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lbGluZS52c3luY0lkKTsKLSAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmosCisgICAgICAgICAgICBlbnYtPlNldExvbmdGaWVsZChmcmFtZVRpbWVsaW5lT2JqLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Rpc3BsYXlFdmVudFJlY2VpdmVyQ2xhc3NJbmZvLmZyYW1lVGltZWxpbmVDbGFzc0luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZWxpbmUuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lKTsKLSAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmosCisgICAgICAgICAgICBlbnYtPlNldExvbmdGaWVsZChmcmFtZVRpbWVsaW5lT2JqLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Rpc3BsYXlFdmVudFJlY2VpdmVyQ2xhc3NJbmZvLmZyYW1lVGltZWxpbmVDbGFzc0luZm8uZGVhZGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVsaW5lLmRlYWRsaW5lVGltZXN0YW1wKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjExMDM1ZS4uNzBhMTM1NCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00NDkyLDcgKzQ0OTIsNyBAQAogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYmUgYWJsZSB0byBzdG9yZSBhbmQgcmV0cmlldmUgY3JlZGVudGlhbHMgZnJvbSBhIHJlbW90ZQogICAgICAgICAgZGV2aWNlLgotICAgICAgICAgQGhpZGUgQFN5c3RlbUFwaSAtLT4KKyAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmV8cHJpdmlsZWdlZHxyb2xlIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZHxyb2xlIiAvPgogCkBAIC01MzAzLDEyICs1MzAzLDEyIEBACiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1VTRV9FWEFDVF9BTEFSTX0gb25jZSBpdCB0YXJnZXRzIEFQSQogICAgICAgICAge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNUSVJBTUlTVX0uIEFsbCBhcHBzIHVzaW5nIGV4YWN0IGFsYXJtcyBmb3Igc2Vjb25kYXJ5CiAgICAgICAgICBmZWF0dXJlcyAod2hpY2ggc2hvdWxkIHN0aWxsIGJlIHVzZXIgZmFjaW5nKSBzaG91bGQgY29udGludWUgdXNpbmcgdGhpcyBwZXJtaXNzaW9uLgotICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogYXBwb3AKKyAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IHNpZ25hdHVyZXxwcml2aWxlZ2VkfGFwcG9wCiAgICAgIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNDSEVEVUxFX0VYQUNUX0FMQVJNIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfc2NoZWR1bGVfZXhhY3RfYWxhcm0iCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfc2NoZWR1bGVfZXhhY3RfYWxhcm0iCi0gICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJub3JtYWx8YXBwb3AiLz4KKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkfGFwcG9wIi8+CiAKICAgICA8IS0tIEFsbG93cyBhcHBzIHRvIHVzZSBleGFjdCBhbGFybXMganVzdCBsaWtlIHdpdGgge0BsaW5rCiAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jU0NIRURVTEVfRVhBQ1RfQUxBUk19IGJ1dCB3aXRob3V0IG5lZWRpbmcgdG8gcmVxdWVzdCB0aGlzCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L21pbmlyZXNvbHZlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L21pbmlyZXNvbHZlci54bWwKaW5kZXggZDA3YWQ4OS4uMWFkM2FjZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9taW5pcmVzb2x2ZXIueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbWluaXJlc29sdmVyLnhtbApAQCAtNTYsNiArNTYsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9pY29uIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQHN0cmluZy9jb25maWdfaGVhZGxpbmVGb250RmFtaWx5IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRzcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGluZUhlaWdodD0iMzJzcCIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fZXhwYW5kX2J1dHRvbi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9leHBhbmRfYnV0dG9uLnhtbAppbmRleCBlNzUyNDMxLi44ZWFlMDY0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9leHBhbmRfYnV0dG9uLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9leHBhbmRfYnV0dG9uLnhtbApAQCAtMTksMjMgKzE5LDI4IEBACiAgICAgYW5kcm9pZDppZD0iQCtpZC9leHBhbmRfYnV0dG9uIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVyX2hlaWdodCIKICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8ZW5kIgogICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL2V4cGFuZF9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbl9jb2xsYXBzZWQiCi0gICAgYW5kcm9pZDpwYWRkaW5nPSIxNmRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0hvcml6b250YWw9IjE2ZHAiCiAgICAgPgogCiAgICAgPExpbmVhckxheW91dAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4cGFuZF9idXR0b25fcGlsbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b25fcGlsbF9oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9leHBhbmRfYnV0dG9uX3BpbGxfaGVpZ2h0IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgogICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9leHBhbmRfYnV0dG9uX3BpbGxfYmciCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgICAgID4KIAogICAgICAgICA8VGV4dFZpZXcKICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXhwYW5kX2J1dHRvbl9udW1iZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b25fcGlsbF9oZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b25fcGlsbF9oZWlnaHQiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuRGV2aWNlRGVmYXVsdC5Ob3RpZmljYXRpb24uSW5mbyIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nU3RhcnQ9IjhkcCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX2Jhc2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfYmFzZS54bWwKaW5kZXggZmQ3ODdmNi4uMTZhOGJiNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfYmFzZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfYmFzZS54bWwKQEAgLTc5LDcgKzc5LDggQEAKICAgICAgICAgICAgIDxOb3RpZmljYXRpb25Ub3BMaW5lVmlldwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uX3RvcF9saW5lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlYWRlcmxlc3NfbGluZV9oZWlnaHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLkRldmljZURlZmF1bHQuTm90aWZpY2F0aW9uIgogICAgICAgICAgICAgICAgID4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX2NhbGwueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfY2FsbC54bWwKaW5kZXggMWIzYmQyNi4uNzZiY2M5NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfY2FsbC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfY2FsbC54bWwKQEAgLTI5LDcgKzI5LDggQEAKICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4OGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ijg4ZHAiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCiAgICAgICAgID4KIApAQCAtNDEsNiArNDIsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IkBkaW1lbi9jb252ZXJzYXRpb25fY29udGVudF9zdGFydCIKICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjY4ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19tYXJnaW5fdHdvbGluZSIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPGluY2x1ZGUKQEAgLTQ5LDcgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgLz4KIAotICAgICAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV90ZXh0IiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV90ZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgICAgIC8+CiAKICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX21lZGlhLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX21lZGlhLnhtbAppbmRleCA5NWRkYzJlLi5kZjMyZDMwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9tZWRpYS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVkaWEueG1sCkBAIC0xOSw3ICsxOSw4IEBACiAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50IgogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9taW5faGVpZ2h0IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX21pbl9oZWlnaHQiCiAgICAgYW5kcm9pZDp0YWc9Im1lZGlhIgogICAgID4KIApAQCAtNzcsNyArNzgsOCBAQAogICAgICAgICAgICAgPE5vdGlmaWNhdGlvblRvcExpbmVWaWV3CiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25fdG9wX2xpbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcENoaWxkcmVuPSJmYWxzZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdC5Ob3RpZmljYXRpb24iCiAgICAgICAgICAgICAgICAgPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVzc2FnaW5nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX21lc3NhZ2luZy54bWwKaW5kZXggYmVmMWQwYi4uM2U4MmJkMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVzc2FnaW5nLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9tZXNzYWdpbmcueG1sCkBAIC0xMDIsNyArMTAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgPE5vdGlmaWNhdGlvblRvcExpbmVWaWV3CiAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbl90b3BfbGluZSIKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCIKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSJAZGltZW4vbm90aWZpY2F0aW9uX2NvbnRlbnRfbWFyZ2luX3N0YXJ0IgogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIgogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLkRldmljZURlZmF1bHQuTm90aWZpY2F0aW9uIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmluZGV4IGIzNTQ4MWQuLjk3ZTc1M2UgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTIyNyw2ICsyMjcsMTIgQEAKICAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fdGhlcm1hbF9jb250ZW50cyI+CiAgICAgICAgIDxpdGVtPkBzdHJpbmcvY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl90aGVybWFsX2NvbnRlbnQ8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CisgICAgPHN0cmluZy1hcnJheSBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfdGl0bGVzIj4KKyAgICAgICAgPGl0ZW0+QHN0cmluZy9jb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfdGl0bGU8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisgICAgPHN0cmluZy1hcnJheSBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudHMiPgorICAgICAgICA8aXRlbT5Ac3RyaW5nL2NvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV9jb250ZW50PC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgogCiAgICAgPCEtLSBDZXJ0aWZpY2F0ZSBkaWdlc3RzIGZvciB0cnVzdGVkIGFwcHMgdGhhdCB3aWxsIGJlIGFsbG93ZWQgdG8gb2J0YWluIHRoZSBrbm93blNpZ25lciBvZiB0aGUKICAgICAgICAgIGRlbW8gZGV2aWNlIHByb3Zpc2lvbmluZyBwZXJtaXNzaW9ucy4gLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggNWJiODZkYy4uODBiZjc5NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX21hcmdpbl90d29saW5lIj4yMGRwPC9kaW1lbj4KIAogICAgIDwhLS0gVGhlIGhlaWdodCBvZiBlYWNoIG9mIHRoZSAxIG9yIDIgbGluZXMgaW4gdGhlIGhlYWRlcmxlc3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlIC0tPgotICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0Ij4yNHNwPC9kaW1lbj4KIAogICAgIDwhLS0gdmVydGljYWwgbWFyZ2luIGZvciB0aGUgaGVhZGVybGVzcyBub3RpZmljYXRpb24gY29udGVudCAtLT4KICAgICA8ZGltZW4gbmFtZT0ibm90aWZpY2F0aW9uX2hlYWRlcmxlc3NfbWluX2hlaWdodCI+NTZkcDwvZGltZW4+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAzMDc0OTA2Li42YWZkYWU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTMyNyw2ICszMjcsNyBAQAogICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF93aWZpX2NhbGxpbmdfd29faHlwaGVuPC9pdGVtPgogICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF92b3dpZmk8L2l0ZW0+CiAgICAgICAgIDxpdGVtPkBzdHJpbmcvd2ZjU3BuRm9ybWF0X3Nwbl93aWZpX2NhbGxpbmdfdm9faHlwaGVuPC9pdGVtPgorICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF93aWZpX2NhbGw8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKICAgICA8IS0tIFNwbiBkdXJpbmcgV2ktRmkgQ2FsbGluZzogIjxvcGVyYXRvcj4iIC0tPgpAQCAtMzUzLDYgKzM1NCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJ3ZmNTcG5Gb3JtYXRfd2lmaV9jYWxsaW5nX3dvX2h5cGhlbiI+V2lGaSBDYWxsaW5nPC9zdHJpbmc+CiAgICAgPCEtLSBTcG4gZHVyaW5nIFdpLUZpIENhbGxpbmc6ICJWb1dpZmkiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0id2ZjU3BuRm9ybWF0X3Zvd2lmaSI+Vm9XaWZpPC9zdHJpbmc+CisgICAgPCEtLSBTcG4gZHVyaW5nIFdpX0ZpIENhbGxpbmc6ICJXaUZpIENhbGwiICh3aXRob3V0IGh5cGhlbikuICBUaGlzIHN0cmluZyBpcyBzaG93biBpbiB0aGUgY2FsbCBiYW5uZXIgZm9yIGNhbGxzIHdoaWNoIHRha2UgcGxhY2Ugb3ZlciBhIFdpRmkgbmV0d29yay4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZmNTcG5Gb3JtYXRfd2lmaV9jYWxsIj5XaUZpIENhbGw8L3N0cmluZz4KIAogICAgIDwhLS0gV0ZDLCBzdW1tYXJ5IGZvciBEaXNhYmxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9IndpZmlfY2FsbGluZ19vZmZfc3VtbWFyeSI+T2ZmPC9zdHJpbmc+CkBAIC02MjY0LDYgKzYyNjcsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fdGhlcm1hbF90aXRsZSI+RGV2aWNlIGlzIHRvbyB3YXJtPC9zdHJpbmc+CiAgICAgPCEtLSBDb250ZW50IG9mIGNvbmN1cnJlbnQgZGlzcGxheSB0aGVybWFsIG5vdGlmaWNhdGlvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3RoZXJtYWxfY29udGVudCI+RHVhbCBTY3JlZW4gaXMgdW5hdmFpbGFibGUgYmVjYXVzZSB5b3VyIHBob25lIGlzIGdldHRpbmcgdG9vIHdhcm08L3N0cmluZz4KKyAgICA8IS0tIFRpdGxlIG9mIGNvbmN1cnJlbnQgZGlzcGxheSBwb3dlciBzYXZlciBub3RpZmljYXRpb24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl9wb3dlcl9zYXZlX3RpdGxlIj5EdWFsIFNjcmVlbiBpcyB1bmF2YWlsYWJsZTwvc3RyaW5nPgorICAgIDwhLS0gQ29udGVudCBvZiBjb25jdXJyZW50IGRpc3BsYXkgcG93ZXIgc2F2ZXIgbm90aWZpY2F0aW9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV9jb250ZW50Ij5EdWFsIFNjcmVlbiBpcyB1bmF2YWlsYWJsZSBiZWNhdXNlIEJhdHRlcnkgU2F2ZXIgaXMgb24uIFlvdSBjYW4gdHVybiB0aGlzIG9mZiBpbiBTZXR0aW5ncy48L3N0cmluZz4KKyAgICA8IS0tIFRleHQgb2YgcG93ZXIgc2F2ZXIgbm90aWZpY2F0aW9uIHNldHRpbmdzIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3NldHRpbmdzX2J1dHRvbiI+R28gdG8gU2V0dGluZ3M8L3N0cmluZz4KICAgICA8IS0tIFRleHQgb2YgZGV2aWNlIHN0YXRlIG5vdGlmaWNhdGlvbiB0dXJuIG9mZiBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX3N0YXRlX25vdGlmaWNhdGlvbl90dXJuX29mZl9idXR0b24iPlR1cm4gb2ZmPC9zdHJpbmc+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmluZGV4IGMxMDYxMmUuLjFjYjU2ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbApAQCAtNDkzMSwxMiArNDkzMSwxNyBAQAogICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fYWN0aXZlX2NvbnRlbnRzIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJhcnJheSIgbmFtZT0iZGV2aWNlX3N0YXRlX25vdGlmaWNhdGlvbl90aGVybWFsX3RpdGxlcyIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fdGhlcm1hbF9jb250ZW50cyIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZXMiLz4KKyAgPGphdmEtc3ltYm9sIHR5cGU9ImFycmF5IiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudHMiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl9uYW1lIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fYWN0aXZlX3RpdGxlIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fYWN0aXZlX2NvbnRlbnQiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl90aGVybWFsX3RpdGxlIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fdGhlcm1hbF9jb250ZW50Ii8+CisgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZSIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJjb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudCIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbiIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3NldHRpbmdzX2J1dHRvbiIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYm9vbCIgbmFtZT0iY29uZmlnX2luZGVwZW5kZW50TG9ja3NjcmVlbkxpdmVXYWxscGFwZXIiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9ImludGVnZXIiIG5hbWU9ImNvbmZpZ19kZXZpY2VTdGF0ZUNvbmN1cnJlbnRSZWFyRGlzcGxheSIgLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uZmlnX3JlYXJEaXNwbGF5UGh5c2ljYWxBZGRyZXNzIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9zdHlsdXMvSGFuZHdyaXRpbmdJbml0aWF0b3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L3N0eWx1cy9IYW5kd3JpdGluZ0luaXRpYXRvclRlc3QuamF2YQppbmRleCAxZWMyNjEzLi5mY2NiMTc3IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L3N0eWx1cy9IYW5kd3JpdGluZ0luaXRpYXRvclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L3N0eWx1cy9IYW5kd3JpdGluZ0luaXRpYXRvclRlc3QuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ucmVzZXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKQEAgLTIyNCw3ICsyMjUsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50X3N0YXJ0SGFuZHdyaXRpbmdfZGVsZWdhdGUoKSB7CisgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50X3RyeUFjY2VwdERlbGVnYXRpb25fZGVsZWdhdG9yQ2FsbGJhY2tDcmVhdGVzSW5wdXRDb25uZWN0aW9uKCkgewogICAgICAgICBWaWV3IGRlbGVnYXRlVmlldyA9IG5ldyBWaWV3KG1Db250ZXh0KTsKICAgICAgICAgZGVsZWdhdGVWaWV3LnNldElzSGFuZHdyaXRpbmdEZWxlZ2F0ZSh0cnVlKTsKIApAQCAtMjQ1LDYgKzI0NiwyOSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50X3RyeUFjY2VwdERlbGVnYXRpb25fZGVsZWdhdG9yQ2FsbGJhY2tGb2N1c2VzRGVsZWdhdGUoKSB7CisgICAgICAgIFZpZXcgZGVsZWdhdGVWaWV3ID0gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICBkZWxlZ2F0ZVZpZXcuc2V0SXNIYW5kd3JpdGluZ0RlbGVnYXRlKHRydWUpOworICAgICAgICBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25JbnB1dENvbm5lY3Rpb25DcmVhdGVkKGRlbGVnYXRlVmlldyk7CisgICAgICAgIHJlc2V0KG1IYW5kd3JpdGluZ0luaXRpYXRvcik7CisKKyAgICAgICAgbVRlc3RWaWV3MS5zZXRIYW5kd3JpdGluZ0RlbGVnYXRvckNhbGxiYWNrKAorICAgICAgICAgICAgICAgICgpIC0+IG1IYW5kd3JpdGluZ0luaXRpYXRvci5vbkRlbGVnYXRlVmlld0ZvY3VzZWQoZGVsZWdhdGVWaWV3KSk7CisKKyAgICAgICAgZmluYWwgaW50IHgxID0gKHNId0FyZWExLmxlZnQgKyBzSHdBcmVhMS5yaWdodCkgLyAyOworICAgICAgICBmaW5hbCBpbnQgeTEgPSAoc0h3QXJlYTEudG9wICsgc0h3QXJlYTEuYm90dG9tKSAvIDI7CisgICAgICAgIE1vdGlvbkV2ZW50IHN0eWx1c0V2ZW50MSA9IGNyZWF0ZVN0eWx1c0V2ZW50KEFDVElPTl9ET1dOLCB4MSwgeTEsIDApOworICAgICAgICBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25Ub3VjaEV2ZW50KHN0eWx1c0V2ZW50MSk7CisKKyAgICAgICAgZmluYWwgaW50IHgyID0geDEgKyBtSGFuZHdyaXRpbmdTbG9wICogMjsKKyAgICAgICAgZmluYWwgaW50IHkyID0geTE7CisgICAgICAgIE1vdGlvbkV2ZW50IHN0eWx1c0V2ZW50MiA9IGNyZWF0ZVN0eWx1c0V2ZW50KEFDVElPTl9NT1ZFLCB4MiwgeTIsIDApOworICAgICAgICBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25Ub3VjaEV2ZW50KHN0eWx1c0V2ZW50Mik7CisKKyAgICAgICAgdmVyaWZ5KG1IYW5kd3JpdGluZ0luaXRpYXRvciwgdGltZXMoMSkpLnRyeUFjY2VwdFN0eWx1c0hhbmR3cml0aW5nRGVsZWdhdGlvbihkZWxlZ2F0ZVZpZXcpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50X25vdFN0YXJ0SGFuZHdyaXRpbmdfd2hlbkhhbmR3cml0aW5nTm90QXZhaWxhYmxlKCkgewogICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCg2MDAsIDYwMCwgOTAwLCA5MDApOwogICAgICAgICBmaW5hbCBWaWV3IHRlc3RWaWV3ID0gY3JlYXRlVmlldyhyZWN0LCB0cnVlIC8qIGF1dG9IYW5kd3JpdGluZ0VuYWJsZWQgKi8sCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdHNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdHNUZXN0LmphdmEKaW5kZXggMzViMzI2Ny4uNjE4OTkxNCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0c1Rlc3QuamF2YQpAQCAtMjMsNiArMjMsOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2NrczsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKKwogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nOwpAQCAtMTI4LDYgKzEzMCwzNCBAQAogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcEJvdW5kRmdzRHVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvY2Vzc1N0YXRzIHByb2Nlc3NTdGF0cyA9IG5ldyBQcm9jZXNzU3RhdHMoKTsKKyAgICAgICAgUHJvY2Vzc1N0YXRlIHByb2Nlc3NTdGF0ZSA9CisgICAgICAgICAgICAgICAgcHJvY2Vzc1N0YXRzLmdldFByb2Nlc3NTdGF0ZUxvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUF8xX1BBQ0tBR0VfTkFNRSwgQVBQXzFfVUlELCBBUFBfMV9WRVJTSU9OLCBBUFBfMV9QUk9DRVNTX05BTUUpOworICAgICAgICBwcm9jZXNzU3RhdGUuc2V0U3RhdGUoQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFLAorICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0cy5BREpfTUVNX0ZBQ1RPUl9OT1JNQUwsIE5PV19NUywgLyogcGtnTGlzdCAqLyBudWxsKTsKKyAgICAgICAgcHJvY2Vzc1N0YXRlLmNvbW1pdFN0YXRlVGltZShOT1dfTVMgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERVUkFUSU9OX1NFQ1MpKTsKKyAgICAgICAgcHJvY2Vzc1N0YXRzLmR1bXBQcm9jZXNzU3RhdGUoRnJhbWV3b3JrU3RhdHNMb2cuUFJPQ0VTU19TVEFURSwgbVN0YXRzRXZlbnRPdXRwdXQpOworICAgICAgICB2ZXJpZnkobVN0YXRzRXZlbnRPdXRwdXQpCisgICAgICAgICAgICAgICAgLndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoRnJhbWV3b3JrU3RhdHNMb2cuUFJPQ0VTU19TVEFURSksCisgICAgICAgICAgICAgICAgICAgICAgICBlcShBUFBfMV9VSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoQVBQXzFfUFJPQ0VTU19OQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFueUludCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYW55SW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKERVUkFUSU9OX1NFQ1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcFByb2Nlc3NBc3NvY2lhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9jZXNzU3RhdHMgcHJvY2Vzc1N0YXRzID0gbmV3IFByb2Nlc3NTdGF0cygpOwogICAgICAgICBBc3NvY2lhdGlvblN0YXRlIGFzc29jaWF0aW9uU3RhdGUgPQpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvY29tLmFuZHJvaWQuZW1lcmdlbmN5LnhtbCBiL2RhdGEvZXRjL2NvbS5hbmRyb2lkLmVtZXJnZW5jeS54bWwKaW5kZXggMmQ2YWUyZS4uMTljNTJhNiAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvY29tLmFuZHJvaWQuZW1lcmdlbmN5LnhtbAorKysgYi9kYXRhL2V0Yy9jb20uYW5kcm9pZC5lbWVyZ2VuY3kueG1sCkBAIC0yMCw2ICsyMCw3IEBACiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQUxMX1BSSVZJTEVHRUQiLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9VU0VSUyIvPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QUklWSUxFR0VEX1BIT05FX1NUQVRFIi8+CisgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TQ0hFRFVMRV9FWEFDVF9BTEFSTSIvPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBUlRfQUNUSVZJVElFU19GUk9NX0JBQ0tHUk9VTkQiLz4KICAgICAgICAgPCEtLSBSZXF1aXJlZCB0byB1cGRhdGUgZW1lcmdlbmN5IGdlc3R1cmUgc2V0dGluZ3MgLS0+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiLz4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3ByaXZhcHAtcGVybWlzc2lvbnMtcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKaW5kZXggNWQzMDNjZi4uMGZhZjYyZSAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKKysrIGIvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKQEAgLTMyMSw2ICszMjEsNyBAQAogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVHSVNURVJfQ09OTkVDVElPTl9NQU5BR0VSIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUdJU1RFUl9TSU1fU1VCU0NSSVBUSU9OIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRVRSSUVWRV9XSU5ET1dfQ09OVEVOVCIvPgorICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0NIRURVTEVfRVhBQ1RfQUxBUk0iLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTFdBWVNfRklOSVNIIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfREVCVUdfQVBQIi8+CmRpZmYgLS1naXQgYS9kYXRhL2ZvbnRzL2ZvbnRzLnhtbCBiL2RhdGEvZm9udHMvZm9udHMueG1sCmluZGV4IDhlMmE1OWMuLmU3ZGRjODggMTAwNjQ0Ci0tLSBhL2RhdGEvZm9udHMvZm9udHMueG1sCisrKyBiL2RhdGEvZm9udHMvZm9udHMueG1sCkBAIC0yNTUsOSArMjU1LDEyIEBACiAgICAgPC9mYW1pbHk+CiAKICAgICA8ZmFtaWx5IG5hbWU9ImN1cnNpdmUiPgotICAgICAgICA8Zm9udCB3ZWlnaHQ9IjQwMCIgc3R5bGU9Im5vcm1hbCIgcG9zdFNjcmlwdE5hbWU9IkRhbmNpbmdTY3JpcHQiPkRhbmNpbmdTY3JpcHQtUmVndWxhci50dGYKLSAgICAgICAgPC9mb250PgotICAgICAgICA8Zm9udCB3ZWlnaHQ9IjcwMCIgc3R5bGU9Im5vcm1hbCI+RGFuY2luZ1NjcmlwdC1Cb2xkLnR0ZjwvZm9udD4KKyAgICAgIDxmb250IHdlaWdodD0iNDAwIiBzdHlsZT0ibm9ybWFsIj5EYW5jaW5nU2NyaXB0LVJlZ3VsYXIudHRmCisgICAgICAgIDxheGlzIHRhZz0id2dodCIgc3R5bGV2YWx1ZT0iNDAwIiAvPgorICAgICAgPC9mb250PgorICAgICAgPGZvbnQgd2VpZ2h0PSI3MDAiIHN0eWxlPSJub3JtYWwiPkRhbmNpbmdTY3JpcHQtUmVndWxhci50dGYKKyAgICAgICAgPGF4aXMgdGFnPSJ3Z2h0IiBzdHlsZXZhbHVlPSI3MDAiIC8+CisgICAgICA8L2ZvbnQ+CiAgICAgPC9mYW1pbHk+CiAKICAgICA8ZmFtaWx5IG5hbWU9InNhbnMtc2VyaWYtc21hbGxjYXBzIj4KZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL0dlbmVyaWMua2NtIGIvZGF0YS9rZXlib2FyZHMvR2VuZXJpYy5rY20KaW5kZXggZmU2ZWVlYi4uMTA0ODc0MiAxMDA2NDQKLS0tIGEvZGF0YS9rZXlib2FyZHMvR2VuZXJpYy5rY20KKysrIGIvZGF0YS9rZXlib2FyZHMvR2VuZXJpYy5rY20KQEAgLTQyLDkgKzQyLDEwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKLSAgICBzaGlmdCthbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCisgICAgc2hpZnQrYWx0LCBjYXBzbG9jaythbHQ6ICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jaythbHQ6ICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgRCB7CkBAIC01OCw4ICs1OSw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAxJwogfQogCiBrZXkgRiB7CkBAIC04Nyw4ICs4OCw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMicKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAyJwogfQogCiBrZXkgSiB7CkBAIC0xMjMsOCArMTI0LDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAzJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDMnCiB9CiAKIGtleSBPIHsKQEAgLTE1OSw4ICsxNjAsOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZicKIH0KIAoga2V5IFQgewpAQCAtMTc0LDggKzE3NSw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwOCcKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzA4JwogfQogCiBrZXkgViB7CmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDA0Y19Qcm9kdWN0XzAyNjUuaWRjIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzAwNGNfUHJvZHVjdF8wMjY1LmlkYwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNzA3ZGZjZi4uMDAwMDAwMAotLS0gYS9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDA0Y19Qcm9kdWN0XzAyNjUuaWRjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVmVuZG9yXzA1YWNfUHJvZHVjdF8wMjY1LmlkYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wMDRjX1Byb2R1Y3RfMDI2NS5pZGMgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDA0Y19Qcm9kdWN0XzAyNjUuaWRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWE0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDA0Y19Qcm9kdWN0XzAyNjUuaWRjCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcHBsZSBNYWdpYyBUcmFja3BhZCAyIChCbHVldG9vdGgpIGNvbmZpZ3VyYXRpb24gZmlsZQorIworIyBXSEVOIE1PRElGWUlORywgYWxzbyBjaGFuZ2UgdGhlIFVTQiBmaWxlIChWZW5kb3JfMDVhY19Qcm9kdWN0XzAyNjUuaWRjKQorIworCitnZXN0dXJlUHJvcC5QcmVzc3VyZV9DYWxpYnJhdGlvbl9PZmZzZXQgPSAzMAorZ2VzdHVyZVByb3AuUGFsbV9QcmVzc3VyZSA9IDI1MC4wCitnZXN0dXJlUHJvcC5QYWxtX1dpZHRoID0gMjAuMAorZ2VzdHVyZVByb3AuTXVsdGlwbGVfUGFsbV9XaWR0aCA9IDIwLjAKKworIyBFbmFibGUgU3RhdGlvbmFyeSBXaWdnbGUgRmlsdGVyCitnZXN0dXJlUHJvcC5TdGF0aW9uYXJ5X1dpZ2dsZV9GaWx0ZXJfRW5hYmxlZCA9IDEKK2dlc3R1cmVQcm9wLkZpbmdlcl9Nb3ZpbmdfRW5lcmd5ID0gMC4wMDA4CitnZXN0dXJlUHJvcC5GaW5nZXJfTW92aW5nX0h5c3RlcmVzaXMgPSAwLjAwMDQKKworIyBBdm9pZCBhY2NpZGVudGFsIHNjcm9sbC9tb3ZlIG9uIGZpbmdlciBsaWZ0CitnZXN0dXJlUHJvcC5NYXhfU3RhdGlvbmFyeV9Nb3ZlX1NwZWVkID0gNDcKK2dlc3R1cmVQcm9wLk1heF9TdGF0aW9uYXJ5X01vdmVfU3BlZWRfSHlzdGVyZXNpcyA9IDEKK2dlc3R1cmVQcm9wLk1heF9TdGF0aW9uYXJ5X01vdmVfU3VwcHJlc3NfRGlzdGFuY2UgPSAwLjIKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wNWFjX1Byb2R1Y3RfMDI2NS5pZGMgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDVhY19Qcm9kdWN0XzAyNjUuaWRjCmluZGV4IGQ3MmRlNjQuLjUyMGQxODggMTAwNjQ0Ci0tLSBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wNWFjX1Byb2R1Y3RfMDI2NS5pZGMKKysrIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA1YWNfUHJvZHVjdF8wMjY1LmlkYwpAQCAtMTMsOSArMTMsOSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIwotIyBBcHBsZSBNYWdpYyBUcmFja3BhZCAyIGNvbmZpZ3VyYXRpb24gZmlsZQotIyAgIEJsdWV0b290aCB2ZW5kb3IgSUQgMDA0YwotIyAgIFVTQiB2ZW5kb3IgSUQgMDVhYworIyBBcHBsZSBNYWdpYyBUcmFja3BhZCAyIChVU0IpIGNvbmZpZ3VyYXRpb24gZmlsZQorIworIyBXSEVOIE1PRElGWUlORywgYWxzbyBjaGFuZ2UgdGhlIEJsdWV0b290aCBmaWxlIChWZW5kb3JfMDA0Y19Qcm9kdWN0XzAyNjUuaWRjKQogIwogCiBnZXN0dXJlUHJvcC5QcmVzc3VyZV9DYWxpYnJhdGlvbl9PZmZzZXQgPSAzMApkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvVmlydHVhbC5rY20gYi9kYXRhL2tleWJvYXJkcy9WaXJ0dWFsLmtjbQppbmRleCA1MzMwOGUzLi4wNmI4MjM3IDEwMDY0NAotLS0gYS9kYXRhL2tleWJvYXJkcy9WaXJ0dWFsLmtjbQorKysgYi9kYXRhL2tleWJvYXJkcy9WaXJ0dWFsLmtjbQpAQCAtMzksOSArMzksMTAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwotICAgIHNoaWZ0K2FsdDogICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKKyAgICBzaGlmdCthbHQsIGNhcHNsb2NrK2FsdDogICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrK2FsdDogICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBEIHsKQEAgLTU1LDggKzU2LDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAxJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDEnCiB9CiAKIGtleSBGIHsKQEAgLTg0LDggKzg1LDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAyJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAyJwogfQogCiBrZXkgSiB7CkBAIC0xMjAsOCArMTIxLDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAzJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDMnCiB9CiAKIGtleSBPIHsKQEAgLTE1Niw4ICsxNTcsOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZicKIH0KIAoga2V5IFQgewpAQCAtMTcxLDggKzE3Miw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwOCcKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzA4JwogfQogCiBrZXkgViB7CmRpZmYgLS1naXQgYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkva2V5c3RvcmUyL0FuZHJvaWRLZXlTdG9yZUtleVBhaXJHZW5lcmF0b3JTcGkuamF2YSBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9rZXlzdG9yZTIvQW5kcm9pZEtleVN0b3JlS2V5UGFpckdlbmVyYXRvclNwaS5qYXZhCmluZGV4IGMxZjZjMjkuLmMzYjBmOWIgMTAwNjQ0Ci0tLSBhL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9rZXlzdG9yZTIvQW5kcm9pZEtleVN0b3JlS2V5UGFpckdlbmVyYXRvclNwaS5qYXZhCisrKyBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9rZXlzdG9yZTIvQW5kcm9pZEtleVN0b3JlS2V5UGFpckdlbmVyYXRvclNwaS5qYXZhCkBAIC04MDgsOSArODA4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBLZXltYXN0ZXJEZWZzLktNX1RBR19BVFRFU1RBVElPTl9JRF9CUkFORCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUmVwb3J0ZWRCcmFuZC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KQogICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbGF0Zm9ybVJlcG9ydGVkRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvcGVydHlFbXB0eU9yVW5rbm93bihCdWlsZC5ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJ1aWxkLkRFVklDRSA6IEJ1aWxkLkRFVklDRV9GT1JfQVRURVNUQVRJT047CiAgICAgICAgICAgICAgICAgcGFyYW1zLmFkZChLZXlTdG9yZTJQYXJhbWV0ZXJVdGlscy5tYWtlQnl0ZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBLZXltYXN0ZXJEZWZzLktNX1RBR19BVFRFU1RBVElPTl9JRF9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICBCdWlsZC5ERVZJQ0UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUmVwb3J0ZWREZXZpY2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkKICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGxhdGZvcm1SZXBvcnRlZFByb2R1Y3QgPQogICAgICAgICAgICAgICAgICAgICAgICAgaXNQcm9wZXJ0eUVtcHR5T3JVbmtub3duKEJ1aWxkLlBST0RVQ1RfRk9SX0FUVEVTVEFUSU9OKQpAQCAtODE5LDkgKzgyMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgS2V5bWFzdGVyRGVmcy5LTV9UQUdfQVRURVNUQVRJT05fSURfUFJPRFVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUmVwb3J0ZWRQcm9kdWN0LmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpCiAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsYXRmb3JtUmVwb3J0ZWRNYW51ZmFjdHVyZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgaXNQcm9wZXJ0eUVtcHR5T3JVbmtub3duKEJ1aWxkLk1BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQnVpbGQuTUFOVUZBQ1RVUkVSIDogQnVpbGQuTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTjsKICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKEtleVN0b3JlMlBhcmFtZXRlclV0aWxzLm1ha2VCeXRlcygKICAgICAgICAgICAgICAgICAgICAgICAgIEtleW1hc3RlckRlZnMuS01fVEFHX0FUVEVTVEFUSU9OX0lEX01BTlVGQUNUVVJFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkLk1BTlVGQUNUVVJFUi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KQorICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1SZXBvcnRlZE1hbnVmYWN0dXJlci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KQogICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbGF0Zm9ybVJlcG9ydGVkTW9kZWwgPQogICAgICAgICAgICAgICAgICAgICAgICAgaXNQcm9wZXJ0eUVtcHR5T3JVbmtub3duKEJ1aWxkLk1PREVMX0ZPUl9BVFRFU1RBVElPTikKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVDb250cm9sbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlQ29udHJvbGxlci5qYXZhCmluZGV4IGVmNTM4MzkuLjQ4ZmU2NWQgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVDb250cm9sbGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZUNvbnRyb2xsZXIuamF2YQpAQCAtMTAyOCwxOSArMTAyOCwyMSBAQAogICAgICAqIHRoZSBidWJibGUgb3IgYnViYmxlIHN0YWNrLgogICAgICAqCiAgICAgICogU29tZSBub3RlczoKLSAgICAgKiAgICAtIE9ubHkgb25lIGFwcCBidWJibGUgaXMgc3VwcG9ydGVkIGF0IGEgdGltZQorICAgICAqICAgIC0gT25seSBvbmUgYXBwIGJ1YmJsZSBpcyBzdXBwb3J0ZWQgYXQgYSB0aW1lLCByZWdhcmRsZXNzIG9mIHVzZXJzLiBNdWx0aS11c2VycyBzdXBwb3J0IGlzCisgICAgICogICAgICB0cmFja2VkIGluIGIvMjczNTMzMjM1LgogICAgICAqICAgIC0gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGEgZGlmZmVyZW50IGludGVudCB0aGFuIHRoZSBleGlzdGluZyBhcHAgYnViYmxlIHdpbGwgZG8gbm90aGluZwogICAgICAqCiAgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHRvIGRpc3BsYXkgaW4gdGhlIGJ1YmJsZSBleHBhbmRlZCB2aWV3LgorICAgICAqIEBwYXJhbSB1c2VyIHRoZSB7QGxpbmsgVXNlckhhbmRsZX0gb2YgdGhlIHVzZXIgdG8gc3RhcnQgdGhpcyBhY3Rpdml0eSBmb3IuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd09ySGlkZUFwcEJ1YmJsZShJbnRlbnQgaW50ZW50KSB7CisgICAgcHVibGljIHZvaWQgc2hvd09ySGlkZUFwcEJ1YmJsZShJbnRlbnQgaW50ZW50LCBVc2VySGFuZGxlIHVzZXIpIHsKICAgICAgICAgaWYgKGludGVudCA9PSBudWxsIHx8IGludGVudC5nZXRQYWNrYWdlKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQXBwIGJ1YmJsZSBmYWlsZWQgdG8gc2hvdywgaW52YWxpZCBpbnRlbnQ6ICIgKyBpbnRlbnQKICAgICAgICAgICAgICAgICAgICAgKyAoKGludGVudCAhPSBudWxsKSA/ICIgd2l0aCBwYWNrYWdlOiAiICsgaW50ZW50LmdldFBhY2thZ2UoKSA6ICIgIikpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckZvclVzZXIobUNvbnRleHQsIG1DdXJyZW50VXNlcklkKTsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckZvclVzZXIobUNvbnRleHQsIHVzZXIuZ2V0SWRlbnRpZmllcigpKTsKICAgICAgICAgaWYgKCFpc1Jlc2l6YWJsZUFjdGl2aXR5KGludGVudCwgcGFja2FnZU1hbmFnZXIsIEtFWV9BUFBfQlVCQkxFKSkgcmV0dXJuOwogCiAgICAgICAgIEJ1YmJsZSBleGlzdGluZ0FwcEJ1YmJsZSA9IG1CdWJibGVEYXRhLmdldEJ1YmJsZUluU3RhY2tXaXRoS2V5KEtFWV9BUFBfQlVCQkxFKTsKQEAgLTEwNjEsNyArMTA2Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBBcHAgYnViYmxlIGRvZXMgbm90IGV4aXN0LCBsZXRzIGFkZCBhbmQgZXhwYW5kIGl0Ci0gICAgICAgICAgICBCdWJibGUgYiA9IG5ldyBCdWJibGUoaW50ZW50LCBVc2VySGFuZGxlLm9mKG1DdXJyZW50VXNlcklkKSwgbU1haW5FeGVjdXRvcik7CisgICAgICAgICAgICBCdWJibGUgYiA9IG5ldyBCdWJibGUoaW50ZW50LCB1c2VyLCBtTWFpbkV4ZWN1dG9yKTsKICAgICAgICAgICAgIGIuc2V0U2hvdWxkQXV0b0V4cGFuZCh0cnVlKTsKICAgICAgICAgICAgIGluZmxhdGVBbmRBZGQoYiwgLyogc3VwcHJlc3NGbHlvdXQ9ICovIHRydWUsIC8qIHNob3dJblNoYWRlPSAqLyBmYWxzZSk7CiAgICAgICAgIH0KQEAgLTE4NjksMTAgKzE4NzEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgbU1haW5FeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBCdWJibGVDb250cm9sbGVyLnRoaXMuc2hvd09ySGlkZUFwcEJ1YmJsZShpbnRlbnQpOwotICAgICAgICAgICAgfSk7CisgICAgICAgIHB1YmxpYyB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VyKSB7CisgICAgICAgICAgICBtTWFpbkV4ZWN1dG9yLmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IEJ1YmJsZUNvbnRyb2xsZXIudGhpcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCwgdXNlcikpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlRXhwYW5kZWRWaWV3LmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlRXhwYW5kZWRWaWV3LmphdmEKaW5kZXggZWNkZGJkYS4uZTVhNDM2MiAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZUV4cGFuZGVkVmlldy5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVFeHBhbmRlZFZpZXcuamF2YQpAQCAtMjM2LDEyICsyMzYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgZmlsbEluSW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSyk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWJibGUuaXNBcHBCdWJibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5jcmVhdGVDb250ZXh0QXNVc2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWJibGUuZ2V0VXNlcigpLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWVzdENvZGU9ICovIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWJibGUuZ2V0QXBwQnViYmxlSW50ZW50KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoRkxBR19BQ1RJVklUWV9ORVdfRE9DVU1FTlQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcHRpb25zPSAqLyBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXNrVmlldy5zdGFydEFjdGl2aXR5KHBpLCAvKiBmaWxsSW5JbnRlbnQ9ICovIG51bGwsIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEJvdW5kcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Jc092ZXJmbG93ICYmIG1CdWJibGUuaGFzTWV0YWRhdGFTaG9ydGN1dElkKCkpIHsKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVzLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlcy5qYXZhCmluZGV4IDRjMGE5M2YuLjU1NTViZWMgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVzLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZXMuamF2YQpAQCAtMTI5LDEyICsxMjksMTQgQEAKICAgICAgKiB0aGUgYnViYmxlIG9yIGJ1YmJsZSBzdGFjay4KICAgICAgKgogICAgICAqIFNvbWUgbm90ZXM6Ci0gICAgICogICAgLSBPbmx5IG9uZSBhcHAgYnViYmxlIGlzIHN1cHBvcnRlZCBhdCBhIHRpbWUKKyAgICAgKiAgICAtIE9ubHkgb25lIGFwcCBidWJibGUgaXMgc3VwcG9ydGVkIGF0IGEgdGltZSwgcmVnYXJkbGVzcyBvZiB1c2Vycy4gTXVsdGktdXNlcnMgc3VwcG9ydCBpcworICAgICAqICAgICAgdHJhY2tlZCBpbiBiLzI3MzUzMzIzNS4KICAgICAgKiAgICAtIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCBhIGRpZmZlcmVudCBpbnRlbnQgdGhhbiB0aGUgZXhpc3RpbmcgYXBwIGJ1YmJsZSB3aWxsIGRvIG5vdGhpbmcKICAgICAgKgogICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB0byBkaXNwbGF5IGluIHRoZSBidWJibGUgZXhwYW5kZWQgdmlldy4KKyAgICAgKiBAcGFyYW0gdXNlciB0aGUge0BsaW5rIFVzZXJIYW5kbGV9IG9mIHRoZSB1c2VyIHRvIHN0YXJ0IHRoaXMgYWN0aXZpdHkgZm9yLgogICAgICAqLwotICAgIHZvaWQgc2hvd09ySGlkZUFwcEJ1YmJsZShJbnRlbnQgaW50ZW50KTsKKyAgICB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VyKTsKIAogICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB7QGNvZGUgdGFza0lkfSBjb3JyZXNwb25kcyB0byBhcHAgYnViYmxlJ3MgdGFza0lkLiAqLwogICAgIGJvb2xlYW4gaXNBcHBCdWJibGVUYXNrSWQoaW50IHRhc2tJZCk7CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2NvbW1vbi9UYWJsZXRvcE1vZGVDb250cm9sbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2NvbW1vbi9UYWJsZXRvcE1vZGVDb250cm9sbGVyLmphdmEKaW5kZXggYmYyMjYyODMuLmNiMWE2ZTcgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvY29tbW9uL1RhYmxldG9wTW9kZUNvbnRyb2xsZXIuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2NvbW1vbi9UYWJsZXRvcE1vZGVDb250cm9sbGVyLmphdmEKQEAgLTIyLDEwICsyMiwxMiBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uRGV2aWNlUG9zdHVyZUNvbnRyb2xsZXIuREVWSUNFX1BPU1RVUkVfVU5LTk9XTjsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQud20uc2hlbGwucHJvdG9sb2cuU2hlbGxQcm90b0xvZ0dyb3VwLldNX1NIRUxMX0ZPTERBQkxFOwogCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC0zNCw2ICszNiw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLmFubm90YXRpb25zLlNoZWxsTWFpblRocmVhZDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5zeXN1aS5TaGVsbEluaXQ7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTQ5LDggKzUzLDM0IEBACiBwdWJsaWMgY2xhc3MgVGFibGV0b3BNb2RlQ29udHJvbGxlciBpbXBsZW1lbnRzCiAgICAgICAgIERldmljZVBvc3R1cmVDb250cm9sbGVyLk9uRGV2aWNlUG9zdHVyZUNoYW5nZWRMaXN0ZW5lciwKICAgICAgICAgRGlzcGxheUNvbnRyb2xsZXIuT25EaXNwbGF5c0NoYW5nZWRMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogV2hlbiB7QGNvZGUgdHJ1ZX0sIGZsb2F0aW5nIHdpbmRvd3MgbGlrZSBQaVAgd291bGQgYXV0byBtb3ZlIHRvIHRoZSBwb3NpdGlvbgorICAgICAqIHNwZWNpZmllZCBieSB7QGxpbmsgI1BSRUZFUl9UT1BfSEFMRl9JTl9UQUJMRVRPUH0gd2hlbiBpbiB0YWJsZXRvcCBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX01PVkVfRkxPQVRJTkdfV0lORE9XX0lOX1RBQkxFVE9QID0KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgInBlcnNpc3Qud20uZGVidWcuZW5hYmxlX21vdmVfZmxvYXRpbmdfd2luZG93X2luX3RhYmxldG9wIiwgZmFsc2UpOworCisgICAgLyoqCisgICAgICogUHJlZmVyIHRoZSB7QGxpbmsgI1BSRUZFUlJFRF9UQUJMRVRPUF9IQUxGX1RPUH0gaWYgdGhpcyBmbGFnIGlzIGVuYWJsZWQsCisgICAgICoge0BsaW5rICNQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9CT1RUT019IG90aGVyd2lzZS4KKyAgICAgKiBTZWUgYWxzbyB7QGxpbmsgI2dldFByZWZlcnJlZEhhbGZJblRhYmxldG9wTW9kZSgpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUl9UT1BfSEFMRl9JTl9UQUJMRVRPUCA9CisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3Qud20uZGVidWcucHJlZmVyX3RvcF9oYWxmX2luX3RhYmxldG9wIiwgdHJ1ZSk7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRBQkxFVE9QX01PREVfREVMQVlfTUlMTElTID0gMV8wMDA7CiAKKyAgICBASW50RGVmKHByZWZpeCA9IHsiUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfIn0sIHZhbHVlID0geworICAgICAgICAgICAgUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfVE9QLAorICAgICAgICAgICAgUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfQk9UVE9NCisgICAgfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlZmVycmVkVGFibGV0b3BIYWxmIHt9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9UT1AgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZFUlJFRF9UQUJMRVRPUF9IQUxGX0JPVFRPTSA9IDE7CisKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIGZpbmFsIERldmljZVBvc3R1cmVDb250cm9sbGVyIG1EZXZpY2VQb3N0dXJlQ29udHJvbGxlcjsKQEAgLTEzMiw2ICsxNjIsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGZsb2F0aW5nIHdpbmRvd3MgbGlrZSBQaVAgd291bGQgYXV0byBtb3ZlIHRvIHRoZSBwb3NpdGlvbgorICAgICAqIHNwZWNpZmllZCBieSB7QGxpbmsgI2dldFByZWZlcnJlZEhhbGZJblRhYmxldG9wTW9kZSgpfSB3aGVuIGluIHRhYmxldG9wIG1vZGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlTW92ZUZsb2F0aW5nV2luZG93SW5UYWJsZXRvcCgpIHsKKyAgICAgICAgcmV0dXJuIEVOQUJMRV9NT1ZFX0ZMT0FUSU5HX1dJTkRPV19JTl9UQUJMRVRPUDsKKyAgICB9CisKKyAgICAvKiogQHJldHVybiBQcmVmZXJyZWQgaGFsZiBmb3IgZmxvYXRpbmcgd2luZG93cyBsaWtlIFBpUCB3aGVuIGluIHRhYmxldG9wIG1vZGUuICovCisgICAgQFByZWZlcnJlZFRhYmxldG9wSGFsZgorICAgIHB1YmxpYyBpbnQgZ2V0UHJlZmVycmVkSGFsZkluVGFibGV0b3BNb2RlKCkgeworICAgICAgICByZXR1cm4gUFJFRkVSX1RPUF9IQUxGX0lOX1RBQkxFVE9QCisgICAgICAgICAgICAgICAgPyBQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9UT1AKKyAgICAgICAgICAgICAgICA6IFBSRUZFUlJFRF9UQUJMRVRPUF9IQUxGX0JPVFRPTTsKKyAgICB9CisKICAgICAvKiogUmVnaXN0ZXIge0BsaW5rIE9uVGFibGV0b3BNb2RlQ2hhbmdlZExpc3RlbmVyfSB0byBsaXN0ZW4gZm9yIHRhYmxldG9wIG1vZGUgY2hhbmdlLiAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT25UYWJsZXRvcE1vZGVDaGFuZ2VkTGlzdGVuZXIoCiAgICAgICAgICAgICBATm9uTnVsbCBPblRhYmxldG9wTW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kYWdnZXIvV01TaGVsbE1vZHVsZS5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kYWdnZXIvV01TaGVsbE1vZHVsZS5qYXZhCmluZGV4IGJhMGYwNzMuLjdhODNkMTAgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZGFnZ2VyL1dNU2hlbGxNb2R1bGUuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2RhZ2dlci9XTVNoZWxsTW9kdWxlLmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uU2hlbGxFeGVjdXRvcjsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uU3luY1RyYW5zYWN0aW9uUXVldWU7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlN5c3RlbVdpbmRvd3M7CitpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uVHJhbnNhY3Rpb25Qb29sOwogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5hbm5vdGF0aW9ucy5TaGVsbEJhY2tncm91bmRUaHJlYWQ7CkBAIC0zNTcsNiArMzU4LDcgQEAKICAgICAgICAgICAgIFRhc2tTdGFja0xpc3RlbmVySW1wbCB0YXNrU3RhY2tMaXN0ZW5lciwKICAgICAgICAgICAgIFBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIgcGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciwKICAgICAgICAgICAgIERpc3BsYXlJbnNldHNDb250cm9sbGVyIGRpc3BsYXlJbnNldHNDb250cm9sbGVyLAorICAgICAgICAgICAgVGFibGV0b3BNb2RlQ29udHJvbGxlciBwaXBUYWJsZXRvcENvbnRyb2xsZXIsCiAgICAgICAgICAgICBPcHRpb25hbDxPbmVIYW5kZWRDb250cm9sbGVyPiBvbmVIYW5kZWRDb250cm9sbGVyLAogICAgICAgICAgICAgQFNoZWxsTWFpblRocmVhZCBTaGVsbEV4ZWN1dG9yIG1haW5FeGVjdXRvcikgewogICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShQaXBDb250cm9sbGVyLmNyZWF0ZSgKQEAgLTM2Niw3ICszNjgsNyBAQAogICAgICAgICAgICAgICAgIHBpcE1vdGlvbkhlbHBlciwgcGlwTWVkaWFDb250cm9sbGVyLCBwaG9uZVBpcE1lbnVDb250cm9sbGVyLCBwaXBUYXNrT3JnYW5pemVyLAogICAgICAgICAgICAgICAgIHBpcFRyYW5zaXRpb25TdGF0ZSwgcGlwVG91Y2hIYW5kbGVyLCBwaXBUcmFuc2l0aW9uQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICB3aW5kb3dNYW5hZ2VyU2hlbGxXcmFwcGVyLCB0YXNrU3RhY2tMaXN0ZW5lciwgcGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciwKLSAgICAgICAgICAgICAgICBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwgb25lSGFuZGVkQ29udHJvbGxlciwgbWFpbkV4ZWN1dG9yKSk7CisgICAgICAgICAgICAgICAgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsIHBpcFRhYmxldG9wQ29udHJvbGxlciwgb25lSGFuZGVkQ29udHJvbGxlciwgbWFpbkV4ZWN1dG9yKSk7CiAgICAgfQogCiAgICAgQFdNU2luZ2xldG9uCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2Rlc2t0b3Btb2RlL0Rlc2t0b3BUYXNrc0NvbnRyb2xsZXIua3QgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2Rlc2t0b3Btb2RlL0Rlc2t0b3BUYXNrc0NvbnRyb2xsZXIua3QKaW5kZXggNzNhNzQwMy4uMzFjNWUzMyAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kZXNrdG9wbW9kZS9EZXNrdG9wVGFza3NDb250cm9sbGVyLmt0CisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZGVza3RvcG1vZGUvRGVza3RvcFRhc2tzQ29udHJvbGxlci5rdApAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV2luZG93aW5nTW9kZQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzCiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VDb250cm9sCiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9DSEFOR0UKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5UUkFOU0lUX05PTkUKQEAgLTMyLDYgKzMzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5UUkFOU0lUX1RPX0ZST05UCiBpbXBvcnQgYW5kcm9pZC53aW5kb3cuVHJhbnNpdGlvbkluZm8KIGltcG9ydCBhbmRyb2lkLndpbmRvdy5UcmFuc2l0aW9uUmVxdWVzdEluZm8KK2ltcG9ydCBhbmRyb2lkLndpbmRvdy5XaW5kb3dDb250YWluZXJUb2tlbgogaW1wb3J0IGFuZHJvaWQud2luZG93LldpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uCiBpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5CaW5kZXJUaHJlYWQKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wcm90b2xvZy5jb21tb24uUHJvdG9Mb2cKQEAgLTExNSwxMCArMTE3LDcgQEAKICAgICAgICAgdmFsIHdjdCA9IFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCkKICAgICAgICAgLy8gQnJpbmcgb3RoZXIgYXBwcyB0byBmcm9udCBmaXJzdAogICAgICAgICBicmluZ0Rlc2t0b3BBcHBzVG9Gcm9udCh3Y3QpCi0KLSAgICAgICAgd2N0LnNldFdpbmRvd2luZ01vZGUodGFzay5nZXRUb2tlbigpLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSkKLSAgICAgICAgd2N0LnJlb3JkZXIodGFzay5nZXRUb2tlbigpLCB0cnVlIC8qIG9uVG9wICovKQotCisgICAgICAgIGFkZE1vdmVUb0Rlc2t0b3BDaGFuZ2VzKHdjdCwgdGFzay50b2tlbikKICAgICAgICAgaWYgKFRyYW5zaXRpb25zLkVOQUJMRV9TSEVMTF9UUkFOU0lUSU9OUykgewogICAgICAgICAgICAgdHJhbnNpdGlvbnMuc3RhcnRUcmFuc2l0aW9uKFRSQU5TSVRfQ0hBTkdFLCB3Y3QsIG51bGwgLyogaGFuZGxlciAqLykKICAgICAgICAgfSBlbHNlIHsKQEAgLTEzNiw4ICsxMzUsNyBAQAogICAgICAgICBQcm90b0xvZy52KFdNX1NIRUxMX0RFU0tUT1BfTU9ERSwgIm1vdmVUb0Z1bGxzY3JlZW46ICVkIiwgdGFzay50YXNrSWQpCiAKICAgICAgICAgdmFsIHdjdCA9IFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCkKLSAgICAgICAgd2N0LnNldFdpbmRvd2luZ01vZGUodGFzay5nZXRUb2tlbigpLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQotICAgICAgICB3Y3Quc2V0Qm91bmRzKHRhc2suZ2V0VG9rZW4oKSwgbnVsbCkKKyAgICAgICAgYWRkTW92ZVRvRnVsbHNjcmVlbkNoYW5nZXMod2N0LCB0YXNrLnRva2VuKQogICAgICAgICBpZiAoVHJhbnNpdGlvbnMuRU5BQkxFX1NIRUxMX1RSQU5TSVRJT05TKSB7CiAgICAgICAgICAgICB0cmFuc2l0aW9ucy5zdGFydFRyYW5zaXRpb24oVFJBTlNJVF9DSEFOR0UsIHdjdCwgbnVsbCAvKiBoYW5kbGVyICovKQogICAgICAgICB9IGVsc2UgewpAQCAtMjM0LDggKzIzMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiIHRhc2tJZD0lZCIsCiAgICAgICAgICAgICAgICAgICAgIHRhc2sudGFza0lkCiAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbigpLmFwcGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0V2luZG93aW5nTW9kZSh0YXNrLnRva2VuLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSkKKyAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKS5hbHNvIHsgd2N0IC0+CisgICAgICAgICAgICAgICAgICAgIGFkZE1vdmVUb0Rlc2t0b3BDaGFuZ2VzKHdjdCwgdGFzay50b2tlbikKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI1MSwxNSArMjQ5LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiIHRhc2tJZD0lZCIsCiAgICAgICAgICAgICAgICAgICAgIHRhc2sudGFza0lkCiAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbigpLmFwcGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0V2luZG93aW5nTW9kZSh0YXNrLnRva2VuLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQotICAgICAgICAgICAgICAgICAgICBzZXRCb3VuZHModGFzay50b2tlbiwgbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKS5hbHNvIHsgd2N0IC0+CisgICAgICAgICAgICAgICAgICAgIGFkZE1vdmVUb0Z1bGxzY3JlZW5DaGFuZ2VzKHdjdCwgdGFzay50b2tlbikKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGwKICAgICB9CiAKKyAgICBwcml2YXRlIGZ1biBhZGRNb3ZlVG9EZXNrdG9wQ2hhbmdlcygKKyAgICAgICAgd2N0OiBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiwKKyAgICAgICAgdG9rZW46IFdpbmRvd0NvbnRhaW5lclRva2VuCisgICAgKSB7CisgICAgICAgIHdjdC5zZXRXaW5kb3dpbmdNb2RlKHRva2VuLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSkKKyAgICAgICAgd2N0LnJlb3JkZXIodG9rZW4sIHRydWUgLyogb25Ub3AgKi8pCisgICAgICAgIGlmIChpc0Rlc2t0b3BEZW5zaXR5T3ZlcnJpZGVTZXQoKSkgeworICAgICAgICAgICAgd2N0LnNldERlbnNpdHlEcGkodG9rZW4sIGdldERlc2t0b3BEZW5zaXR5RHBpKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBhZGRNb3ZlVG9GdWxsc2NyZWVuQ2hhbmdlcygKKyAgICAgICAgd2N0OiBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiwKKyAgICAgICAgdG9rZW46IFdpbmRvd0NvbnRhaW5lclRva2VuCisgICAgKSB7CisgICAgICAgIHdjdC5zZXRXaW5kb3dpbmdNb2RlKHRva2VuLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQorICAgICAgICB3Y3Quc2V0Qm91bmRzKHRva2VuLCBudWxsKQorICAgICAgICBpZiAoaXNEZXNrdG9wRGVuc2l0eU92ZXJyaWRlU2V0KCkpIHsKKyAgICAgICAgICAgIHdjdC5zZXREZW5zaXR5RHBpKHRva2VuLCBnZXRGdWxsc2NyZWVuRGVuc2l0eURwaSgpKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gZ2V0RnVsbHNjcmVlbkRlbnNpdHlEcGkoKTogSW50IHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucmVzb3VyY2VzLmRpc3BsYXlNZXRyaWNzLmRlbnNpdHlEcGkKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBnZXREZXNrdG9wRGVuc2l0eURwaSgpOiBJbnQgeworICAgICAgICByZXR1cm4gREVTS1RPUF9ERU5TSVRZX09WRVJSSURFCisgICAgfQorCiAgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGV4dGVybmFsIGludGVyZmFjZSB0byBwYXNzIHRvIGFub3RoZXIgcHJvY2Vzcy4gKi8KICAgICBwcml2YXRlIGZ1biBjcmVhdGVFeHRlcm5hbEludGVyZmFjZSgpOiBFeHRlcm5hbEludGVyZmFjZUJpbmRlciB7CiAgICAgICAgIHJldHVybiBJRGVza3RvcE1vZGVJbXBsKHRoaXMpCkBAIC0zMTgsNCArMzQ1LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0WzBdCiAgICAgICAgIH0KICAgICB9CisKKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgcHJpdmF0ZSB2YWwgREVTS1RPUF9ERU5TSVRZX09WRVJSSURFID0KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJwZXJzaXN0LndtLmRlYnVnLmRlc2t0b3BfbW9kZV9kZW5zaXR5IiwgMCkKKyAgICAgICAgcHJpdmF0ZSB2YWwgREVTS1RPUF9ERU5TSVRZX0FMTE9XRURfUkFOR0UgPSAoMTAwLi4xMDAwKQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiBkZXNrdG9wIGRlbnNpdHkgb3ZlcnJpZGUgaXMgZW5hYmxlZAorICAgICAgICAgKi8KKyAgICAgICAgQEp2bVN0YXRpYworICAgICAgICBmdW4gaXNEZXNrdG9wRGVuc2l0eU92ZXJyaWRlU2V0KCk6IEJvb2xlYW4geworICAgICAgICAgICAgcmV0dXJuIERFU0tUT1BfREVOU0lUWV9PVkVSUklERSBpbiBERVNLVE9QX0RFTlNJVFlfQUxMT1dFRF9SQU5HRQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvUGlwQm91bmRzU3RhdGUuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL1BpcEJvdW5kc1N0YXRlLmphdmEKaW5kZXggZjY2NDgwOC4uZjA4NzQyZCAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvUGlwQm91bmRzU3RhdGUuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9QaXBCb3VuZHNTdGF0ZS5qYXZhCkBAIC00Myw3ICs0Myw5IEBACiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CkBAIC0xMTMsNiArMTE1LDEyIEBACiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVmlldyNzZXRQcmVmZXJLZWVwQ2xlYXJSZWN0cwogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgU2V0PFJlY3Q+IG1VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBBcnJheVNldDw+KCk7CisgICAgLyoqCisgICAgICogQWRkaXRpb25hbCB0byB7QGxpbmsgI21VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhc30sIGFsbG93IHRoZSBjYWxsZXIgdG8gYXBwZW5kIG5hbWVkIGJvdW5kcworICAgICAqIGFzIHVucmVzdHJpY3RlZCBrZWVwIGNsZWFyIGFyZWEuIFZhbHVlcyBpbiB0aGlzIG1hcCB3b3VsZCBiZSBhcHBlbmRlZCB0bworICAgICAqIHtAbGluayAjZ2V0VW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKX0gYW5kIHRoaXMgaXMgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIG9ubHkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSZWN0PiBtTmFtZWRVbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIHByaXZhdGUgQE51bGxhYmxlIFJ1bm5hYmxlIG1Pbk1pbmltYWxTaXplQ2hhbmdlQ2FsbGJhY2s7CiAgICAgcHJpdmF0ZSBATnVsbGFibGUgVHJpQ29uc3VtZXI8Qm9vbGVhbiwgSW50ZWdlciwgQm9vbGVhbj4gbU9uU2hlbGZWaXNpYmlsaXR5Q2hhbmdlQ2FsbGJhY2s7CkBAIC0zNzgsNiArMzg2LDE2IEBACiAgICAgICAgIG1VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcy5hZGRBbGwodW5yZXN0cmljdGVkQXJlYXMpOwogICAgIH0KIAorICAgIC8qKiBBZGQgYSBuYW1lZCB1bnJlc3RyaWN0ZWQga2VlcCBjbGVhciBhcmVhLiAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYShATm9uTnVsbCBTdHJpbmcgbmFtZSwgUmVjdCB1bnJlc3RyaWN0ZWRBcmVhKSB7CisgICAgICAgIG1OYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzLnB1dChuYW1lLCB1bnJlc3RyaWN0ZWRBcmVhKTsKKyAgICB9CisKKyAgICAvKiogUmVtb3ZlIGEgbmFtZWQgdW5yZXN0cmljdGVkIGtlZXAgY2xlYXIgYXJlYS4gKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEoQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMucmVtb3ZlKG5hbWUpOworICAgIH0KKwogICAgIEBOb25OdWxsCiAgICAgcHVibGljIFNldDxSZWN0PiBnZXRSZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKSB7CiAgICAgICAgIHJldHVybiBtUmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOwpAQCAtMzg1LDcgKzQwMywxMCBAQAogCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgU2V0PFJlY3Q+IGdldFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzKCkgewotICAgICAgICByZXR1cm4gbVVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOworICAgICAgICBpZiAobU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMuaXNFbXB0eSgpKSByZXR1cm4gbVVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOworICAgICAgICBmaW5hbCBTZXQ8UmVjdD4gdW5yZXN0cmljdGVkQXJlYXMgPSBuZXcgQXJyYXlTZXQ8PihtVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMpOworICAgICAgICB1bnJlc3RyaWN0ZWRBcmVhcy5hZGRBbGwobU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMudmFsdWVzKCkpOworICAgICAgICByZXR1cm4gdW5yZXN0cmljdGVkQXJlYXM7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyLmphdmEKaW5kZXggZGI2ZWYxZC4uZWEyNTU5YSAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvcGhvbmUvUGlwQ29udHJvbGxlci5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL3Bob25lL1BpcENvbnRyb2xsZXIuamF2YQpAQCAtNDMsNiArNDMsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTcxLDYgKzcyLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uUmVtb3RlQ2FsbGFibGU7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNoZWxsRXhlY3V0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNpbmdsZUluc3RhbmNlUmVtb3RlTGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVyQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5vbmVoYW5kZWQuT25lSGFuZGVkQ29udHJvbGxlcjsKQEAgLTEwMiw3ICsxMDQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLnRyYW5zaXRpb24uVHJhbnNpdGlvbnM7CiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKQEAgLTExNyw2ICsxMTgsOCBAQAogICAgICAgICBVc2VyQ2hhbmdlTGlzdGVuZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGlwQ29udHJvbGxlciI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVJfS0VFUF9DTEVBUl9BUkVBX1RBRyA9ICJob3RzZWF0IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUElQX0tFRVBfQ0xFQVJfQVJFQVNfREVMQVkgPQogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKCJwZXJzaXN0LndtLmRlYnVnLnBpcF9rZWVwX2NsZWFyX2FyZWFzX2RlbGF5IiwgMjAwKTsKIApAQCAtMTQ3LDYgKzE1MCw3IEBACiAgICAgcHJpdmF0ZSBUYXNrU3RhY2tMaXN0ZW5lckltcGwgbVRhc2tTdGFja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBtUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlcjsKICAgICBwcml2YXRlIERpc3BsYXlJbnNldHNDb250cm9sbGVyIG1EaXNwbGF5SW5zZXRzQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgbVRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBPcHRpb25hbDxPbmVIYW5kZWRDb250cm9sbGVyPiBtT25lSGFuZGVkQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIFNoZWxsQ29tbWFuZEhhbmRsZXIgbVNoZWxsQ29tbWFuZEhhbmRsZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTaGVsbENvbnRyb2xsZXIgbVNoZWxsQ29udHJvbGxlcjsKQEAgLTQwMyw2ICs0MDcsNyBAQAogICAgICAgICAgICAgVGFza1N0YWNrTGlzdGVuZXJJbXBsIHRhc2tTdGFja0xpc3RlbmVyLAogICAgICAgICAgICAgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBwaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyLAogICAgICAgICAgICAgRGlzcGxheUluc2V0c0NvbnRyb2xsZXIgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsCisgICAgICAgICAgICBUYWJsZXRvcE1vZGVDb250cm9sbGVyIHBpcFRhYmxldG9wQ29udHJvbGxlciwKICAgICAgICAgICAgIE9wdGlvbmFsPE9uZUhhbmRlZENvbnRyb2xsZXI+IG9uZUhhbmRlZENvbnRyb2xsZXIsCiAgICAgICAgICAgICBTaGVsbEV4ZWN1dG9yIG1haW5FeGVjdXRvcikgewogICAgICAgICBpZiAoIWNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfUElDVFVSRV9JTl9QSUNUVVJFKSkgewpAQCAtNDE3LDcgKzQyMiw3IEBACiAgICAgICAgICAgICAgICAgcGlwRGlzcGxheUxheW91dFN0YXRlLCBwaXBNb3Rpb25IZWxwZXIsIHBpcE1lZGlhQ29udHJvbGxlciwgcGhvbmVQaXBNZW51Q29udHJvbGxlciwKICAgICAgICAgICAgICAgICBwaXBUYXNrT3JnYW5pemVyLCBwaXBUcmFuc2l0aW9uU3RhdGUsIHBpcFRvdWNoSGFuZGxlciwgcGlwVHJhbnNpdGlvbkNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgd2luZG93TWFuYWdlclNoZWxsV3JhcHBlciwgdGFza1N0YWNrTGlzdGVuZXIsIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsIG9uZUhhbmRlZENvbnRyb2xsZXIsIG1haW5FeGVjdXRvcikKKyAgICAgICAgICAgICAgICBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwgcGlwVGFibGV0b3BDb250cm9sbGVyLCBvbmVIYW5kZWRDb250cm9sbGVyLCBtYWluRXhlY3V0b3IpCiAgICAgICAgICAgICAgICAgLm1JbXBsOwogICAgIH0KIApAQCAtNDQ0LDYgKzQ0OSw3IEBACiAgICAgICAgICAgICBUYXNrU3RhY2tMaXN0ZW5lckltcGwgdGFza1N0YWNrTGlzdGVuZXIsCiAgICAgICAgICAgICBQaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCiAgICAgICAgICAgICBEaXNwbGF5SW5zZXRzQ29udHJvbGxlciBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwKKyAgICAgICAgICAgIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgdGFibGV0b3BNb2RlQ29udHJvbGxlciwKICAgICAgICAgICAgIE9wdGlvbmFsPE9uZUhhbmRlZENvbnRyb2xsZXI+IG9uZUhhbmRlZENvbnRyb2xsZXIsCiAgICAgICAgICAgICBTaGVsbEV4ZWN1dG9yIG1haW5FeGVjdXRvcgogICAgICkgewpAQCAtNDc3LDYgKzQ4Myw3IEBACiAgICAgICAgICAgICAgICAgLmdldEludGVnZXIoUi5pbnRlZ2VyLmNvbmZpZ19waXBFbnRlckFuaW1hdGlvbkR1cmF0aW9uKTsKICAgICAgICAgbVBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIgPSBwaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyOwogICAgICAgICBtRGlzcGxheUluc2V0c0NvbnRyb2xsZXIgPSBkaXNwbGF5SW5zZXRzQ29udHJvbGxlcjsKKyAgICAgICAgbVRhYmxldG9wTW9kZUNvbnRyb2xsZXIgPSB0YWJsZXRvcE1vZGVDb250cm9sbGVyOwogCiAgICAgICAgIHNoZWxsSW5pdC5hZGRJbml0Q2FsbGJhY2sodGhpczo6b25Jbml0LCB0aGlzKTsKICAgICB9CkBAIC02NTksNiArNjY2LDQyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKIAorICAgICAgICBtVGFibGV0b3BNb2RlQ29udHJvbGxlci5yZWdpc3Rlck9uVGFibGV0b3BNb2RlQ2hhbmdlZExpc3RlbmVyKChpc0luVGFibGV0b3BNb2RlKSAtPiB7CisgICAgICAgICAgICBpZiAoIW1UYWJsZXRvcE1vZGVDb250cm9sbGVyLmVuYWJsZU1vdmVGbG9hdGluZ1dpbmRvd0luVGFibGV0b3AoKSkgcmV0dXJuOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhZyA9ICJ0YWJsZXRvcC1tb2RlIjsKKyAgICAgICAgICAgIGlmICghaXNJblRhYmxldG9wTW9kZSkgeworICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5yZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEodGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRvIHByZXBhcmUgZm9yIHRoZSBlbnRyeSBib3VuZHMuCisgICAgICAgICAgICBmaW5hbCBSZWN0IGRpc3BsYXlCb3VuZHMgPSBtUGlwQm91bmRzU3RhdGUuZ2V0RGlzcGxheUJvdW5kcygpOworICAgICAgICAgICAgaWYgKG1UYWJsZXRvcE1vZGVDb250cm9sbGVyLmdldFByZWZlcnJlZEhhbGZJblRhYmxldG9wTW9kZSgpCisgICAgICAgICAgICAgICAgICAgID09IFRhYmxldG9wTW9kZUNvbnRyb2xsZXIuUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfVE9QKSB7CisgICAgICAgICAgICAgICAgLy8gUHJlZmVyIHRvcCwgYXZvaWQgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBkaXNwbGF5LgorICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5hZGROYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEodGFnLCBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlCb3VuZHMubGVmdCwgZGlzcGxheUJvdW5kcy5jZW50ZXJZKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Qm91bmRzLnJpZ2h0LCBkaXNwbGF5Qm91bmRzLmJvdHRvbSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBQcmVmZXIgYm90dG9tLCBhdm9pZCB0aGUgdG9wIGhhbGYgb2YgdGhlIGRpc3BsYXkuCisgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYSh0YWcsIG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUJvdW5kcy5sZWZ0LCBkaXNwbGF5Qm91bmRzLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlCb3VuZHMucmlnaHQsIGRpc3BsYXlCb3VuZHMuY2VudGVyWSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBQaVAgd2luZG93IGlmIHdlIGhhdmUgZW50ZXJlZCBQaVAgbW9kZS4KKyAgICAgICAgICAgIGlmIChtUGlwVHJhbnNpdGlvblN0YXRlLmhhc0VudGVyZWRQaXAoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgcGlwQm91bmRzID0gbVBpcEJvdW5kc1N0YXRlLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50IGVkZ2VJbnNldHMgPSBtUGlwU2l6ZVNwZWNIYW5kbGVyLmdldFNjcmVlbkVkZ2VJbnNldHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBpcEJvdW5kcy5oZWlnaHQoKSArIDIgKiBlZGdlSW5zZXRzLnkpID4gKGRpc3BsYXlCb3VuZHMuaGVpZ2h0KCkgLyAyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBQaVAgYm91bmRzIGlzIHRvbyBiaWcgdG8gZml0IGVpdGhlciBoYWxmLCBiYWlsIGVhcmx5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1NYWluRXhlY3V0b3IucmVtb3ZlQ2FsbGJhY2tzKG1Nb3ZlUGlwSW5SZXNwb25zZVRvS2VlcENsZWFyQXJlYXNDaGFuZ2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgbU1haW5FeGVjdXRvci5leGVjdXRlKG1Nb3ZlUGlwSW5SZXNwb25zZVRvS2VlcENsZWFyQXJlYXNDaGFuZ2VDYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCiAgICAgICAgIG1PbmVIYW5kZWRDb250cm9sbGVyLmlmUHJlc2VudChjb250cm9sbGVyIC0+IHsKICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJUcmFuc2l0aW9uQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBPbmVIYW5kZWRUcmFuc2l0aW9uQ2FsbGJhY2soKSB7CkBAIC04OTIsMTIgKzkzNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAwLCBtUGlwQm91bmRzU3RhdGUuZ2V0RGlzcGxheUJvdW5kcygpLmJvdHRvbSAtIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldERpc3BsYXlCb3VuZHMoKS5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldERpc3BsYXlCb3VuZHMoKS5ib3R0b20pOwotICAgICAgICAgICAgU2V0PFJlY3Q+IHJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBIYXNoU2V0PD4oCi0gICAgICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5nZXRSZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKSk7Ci0gICAgICAgICAgICByZXN0cmljdGVkS2VlcENsZWFyQXJlYXMuYWRkKHJlY3QpOwotICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLnNldEtlZXBDbGVhckFyZWFzKHJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcywKLSAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzKCkpOworICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYShMQVVOQ0hFUl9LRUVQX0NMRUFSX0FSRUFfVEFHLCByZWN0KTsKICAgICAgICAgICAgIHVwZGF0ZVBpcFBvc2l0aW9uRm9yS2VlcENsZWFyQXJlYXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5yZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEoTEFVTkNIRVJfS0VFUF9DTEVBUl9BUkVBX1RBRyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3RhZ2VDb29yZGluYXRvci5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TdGFnZUNvb3JkaW5hdG9yLmphdmEKaW5kZXggYTU1NDZlNS4uYTFlYWY4NSAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TdGFnZUNvb3JkaW5hdG9yLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TdGFnZUNvb3JkaW5hdG9yLmphdmEKQEAgLTI1OSwzNyArMjU5LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwogCi0gICAgcHJpdmF0ZSBmaW5hbCBTcGxpdFNjcmVlblRyYW5zaXRpb25zLlRyYW5zaXRpb25GaW5pc2hlZENhbGxiYWNrCi0gICAgICAgICAgICBtUmVjZW50VHJhbnNpdGlvbkZpbmlzaGVkQ2FsbGJhY2sgPQotICAgICAgICAgICAgbmV3IFNwbGl0U2NyZWVuVHJhbnNpdGlvbnMuVHJhbnNpdGlvbkZpbmlzaGVkQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZChXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiBmaW5pc2hXY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBmaW5pc2hUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWNlbnQgdHJhbnNpdGlvbiBpcyBmaW5pc2hlZCBieSByZXR1cm5pbmcgdG8gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQsIHNvIHdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhbiByZXN0b3JlIHRoZSBkaXZpZGVyIGJhci4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5pc2hXY3QuZ2V0SGllcmFyY2h5T3BzKCkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uLkhpZXJhcmNoeU9wIG9wID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoV2N0LmdldEhpZXJhcmNoeU9wcygpLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgY29udGFpbmVyID0gb3AuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AuZ2V0VHlwZSgpID09IEhJRVJBUkNIWV9PUF9UWVBFX1JFT1JERVIgJiYgb3AuZ2V0VG9Ub3AoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobU1haW5TdGFnZS5jb250YWluc0NvbnRhaW5lcihjb250YWluZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TaWRlU3RhZ2UuY29udGFpbnNDb250YWluZXIoY29udGFpbmVyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdXJmYWNlQm91bmRzKG1TcGxpdExheW91dCwgZmluaXNoVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFwcGx5UmVzaXppbmdPZmZzZXQgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpdmlkZXJWaXNpYmlsaXR5KHRydWUsIGZpbmlzaFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIERpc21pc3MgdGhlIHNwbGl0IHNjcmVlbiBpZiBpdCdzIG5vdCByZXR1cm5pbmcgdG8gc3BsaXQuCi0gICAgICAgICAgICAgICAgICAgIHByZXBhcmVFeGl0U3BsaXRTY3JlZW4oU1RBR0VfVFlQRV9VTkRFRklORUQsIGZpbmlzaFdjdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFNwbGl0c1Zpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzZXREaXZpZGVyVmlzaWJpbGl0eShmYWxzZSwgZmluaXNoVCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ0V4aXQoRVhJVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQogICAgIHByb3RlY3RlZCBTdGFnZUNvb3JkaW5hdG9yKENvbnRleHQgY29udGV4dCwgaW50IGRpc3BsYXlJZCwgU3luY1RyYW5zYWN0aW9uUXVldWUgc3luY1F1ZXVlLAogICAgICAgICAgICAgU2hlbGxUYXNrT3JnYW5pemVyIHRhc2tPcmdhbml6ZXIsIERpc3BsYXlDb250cm9sbGVyIGRpc3BsYXlDb250cm9sbGVyLAogICAgICAgICAgICAgRGlzcGxheUltZUNvbnRyb2xsZXIgZGlzcGxheUltZUNvbnRyb2xsZXIsCkBAIC0zODgsNiArMzU3LDExIEBACiAgICAgICAgIHJldHVybiBtTWFpblN0YWdlLmlzQWN0aXZlKCk7CiAgICAgfQogCisgICAgLyoqIENoZWNrcyBpZiBgdHJhbnNpdGlvbmAgaXMgYSBwZW5kaW5nIGVudGVyLXNwbGl0IHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nRW50ZXIoSUJpbmRlciB0cmFuc2l0aW9uKSB7CisgICAgICAgIHJldHVybiBtU3BsaXRUcmFuc2l0aW9ucy5pc1BlbmRpbmdFbnRlcih0cmFuc2l0aW9uKTsKKyAgICB9CisKICAgICBAU3RhZ2VUeXBlCiAgICAgaW50IGdldFN0YWdlT2ZUYXNrKGludCB0YXNrSWQpIHsKICAgICAgICAgaWYgKG1NYWluU3RhZ2UuY29udGFpbnNUYXNrKHRhc2tJZCkpIHsKQEAgLTIyNjQsMTEgKzIyMzgsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT3BlbmluZyAmJiBpbkZ1bGxzY3JlZW4pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aXZpdHlUeXBlID0gdHJpZ2dlclRhc2suZ2V0QWN0aXZpdHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5VHlwZSA9PSBBQ1RJVklUWV9UWVBFX0hPTUUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFjdGl2aXR5VHlwZSA9PSBBQ1RJVklUWV9UWVBFX1JFQ0VOVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW50ZXIgb3ZlcnZpZXcgcGFuZWwsIHNvIHN0YXJ0IHJlY2VudCB0cmFuc2l0aW9uLgotICAgICAgICAgICAgICAgICAgICBtU3BsaXRUcmFuc2l0aW9ucy5zZXRSZWNlbnRUcmFuc2l0aW9uKHRyYW5zaXRpb24sIHJlcXVlc3QuZ2V0UmVtb3RlVHJhbnNpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlbnRUcmFuc2l0aW9uRmluaXNoZWRDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5VHlwZSA9PSBBQ1RJVklUWV9UWVBFX0hPTUUgfHwgYWN0aXZpdHlUeXBlID09IEFDVElWSVRZX1RZUEVfUkVDRU5UUykgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRSZW1vdGVUcmFuc2l0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgcmVjZW50cy9ob21lLCBzbyBkb24ndCBoYW5kbGUgdGhpcyBhbmQgbGV0IGl0IGZhbGwtdGhyb3VnaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlbW90ZSBoYW5kbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byB1c2UgdGhlIG9sZCBzdHVmZiBmb3Igbm9uLXJlbW90ZSBhbmltYXRpb25zLCBvdGhlcndpc2Ugd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCBzcGxpdC1zY3JlZW4uCisgICAgICAgICAgICAgICAgICAgIG1TcGxpdFRyYW5zaXRpb25zLnNldFJlY2VudFRyYW5zaXRpb24odHJhbnNpdGlvbiwgbnVsbCAvKiByZW1vdGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpczo6b25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvbkZpbmlzaCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMjM5OCw3ICsyMzc3LDcgQEAKICAgICAgICAgICAgIHNob3VsZEFuaW1hdGUgPSBzdGFydFBlbmRpbmdFbnRlckFuaW1hdGlvbigKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwgaW5mbywgc3RhcnRUcmFuc2FjdGlvbiwgZmluaXNoVHJhbnNhY3Rpb24pOwogICAgICAgICB9IGVsc2UgaWYgKG1TcGxpdFRyYW5zaXRpb25zLmlzUGVuZGluZ1JlY2VudCh0cmFuc2l0aW9uKSkgewotICAgICAgICAgICAgc2hvdWxkQW5pbWF0ZSA9IHN0YXJ0UGVuZGluZ1JlY2VudEFuaW1hdGlvbih0cmFuc2l0aW9uLCBpbmZvLCBzdGFydFRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIG9uUmVjZW50c0luU3BsaXRBbmltYXRpb25TdGFydChzdGFydFRyYW5zYWN0aW9uKTsKICAgICAgICAgfSBlbHNlIGlmIChtU3BsaXRUcmFuc2l0aW9ucy5pc1BlbmRpbmdEaXNtaXNzKHRyYW5zaXRpb24pKSB7CiAgICAgICAgICAgICBzaG91bGRBbmltYXRlID0gc3RhcnRQZW5kaW5nRGlzbWlzc0FuaW1hdGlvbigKICAgICAgICAgICAgICAgICAgICAgbVNwbGl0VHJhbnNpdGlvbnMubVBlbmRpbmdEaXNtaXNzLCBpbmZvLCBzdGFydFRyYW5zYWN0aW9uLCBmaW5pc2hUcmFuc2FjdGlvbik7CkBAIC0yNjUzLDEwICsyNjMyLDM1IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFBlbmRpbmdSZWNlbnRBbmltYXRpb24oQE5vbk51bGwgSUJpbmRlciB0cmFuc2l0aW9uLAotICAgICAgICAgICAgQE5vbk51bGwgVHJhbnNpdGlvbkluZm8gaW5mbywgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gdCkgeworICAgIC8qKiBDYWxsIHRoaXMgd2hlbiBzdGFydGluZyB0aGUgb3Blbi1yZWNlbnRzIGFuaW1hdGlvbiB3aGlsZSBzcGxpdC1zY3JlZW4gaXMgYWN0aXZlLiAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVjZW50c0luU3BsaXRBbmltYXRpb25TdGFydChATm9uTnVsbCBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiB0KSB7CiAgICAgICAgIHNldERpdmlkZXJWaXNpYmlsaXR5KGZhbHNlLCB0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIENhbGwgdGhpcyB3aGVuIHRoZSByZWNlbnRzIGFuaW1hdGlvbiBkdXJpbmcgc3BsaXQtc2NyZWVuIGZpbmlzaGVzLiAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVjZW50c0luU3BsaXRBbmltYXRpb25GaW5pc2goV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24gZmluaXNoV2N0LAorICAgICAgICAgICAgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gZmluaXNoVCkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVjZW50IHRyYW5zaXRpb24gaXMgZmluaXNoZWQgYnkgcmV0dXJuaW5nIHRvIHRoZSBjdXJyZW50CisgICAgICAgIC8vIHNwbGl0LCBzbyB3ZSBjYW4gcmVzdG9yZSB0aGUgZGl2aWRlciBiYXIuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluaXNoV2N0LmdldEhpZXJhcmNoeU9wcygpLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbi5IaWVyYXJjaHlPcCBvcCA9CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaFdjdC5nZXRIaWVyYXJjaHlPcHMoKS5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGNvbnRhaW5lciA9IG9wLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgaWYgKG9wLmdldFR5cGUoKSA9PSBISUVSQVJDSFlfT1BfVFlQRV9SRU9SREVSICYmIG9wLmdldFRvVG9wKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1NYWluU3RhZ2UuY29udGFpbnNDb250YWluZXIoY29udGFpbmVyKQorICAgICAgICAgICAgICAgICAgICB8fCBtU2lkZVN0YWdlLmNvbnRhaW5zQ29udGFpbmVyKGNvbnRhaW5lcikpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZUJvdW5kcyhtU3BsaXRMYXlvdXQsIGZpbmlzaFQsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhcHBseVJlc2l6aW5nT2Zmc2V0ICovKTsKKyAgICAgICAgICAgICAgICBzZXREaXZpZGVyVmlzaWJpbGl0eSh0cnVlLCBmaW5pc2hUKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNtaXNzIHRoZSBzcGxpdCBzY3JlZW4gaWYgaXQncyBub3QgcmV0dXJuaW5nIHRvIHNwbGl0LgorICAgICAgICBwcmVwYXJlRXhpdFNwbGl0U2NyZWVuKFNUQUdFX1RZUEVfVU5ERUZJTkVELCBmaW5pc2hXY3QpOworICAgICAgICBzZXRTcGxpdHNWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgc2V0RGl2aWRlclZpc2liaWxpdHkoZmFsc2UsIGZpbmlzaFQpOworICAgICAgICBsb2dFeGl0KEVYSVRfUkVBU09OX1VOS05PV04pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhZGREaXZpZGVyQmFyVG9UcmFuc2l0aW9uKEBOb25OdWxsIFRyYW5zaXRpb25JbmZvIGluZm8sCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vRGVmYXVsdE1peGVkSGFuZGxlci5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC90cmFuc2l0aW9uL0RlZmF1bHRNaXhlZEhhbmRsZXIuamF2YQppbmRleCAyZTg2NDQ4Li5kMDk0ODkyIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vRGVmYXVsdE1peGVkSGFuZGxlci5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdHJhbnNpdGlvbi9EZWZhdWx0TWl4ZWRIYW5kbGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfSE9NRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1JFQ0VOVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9DSEFOR0U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLlRSQU5TSVRfVE9fQkFDSzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC53aW5kb3cuVHJhbnNpdGlvbkluZm8uRkxBR19JU19XQUxMUEFQRVI7CkBAIC0yNSw2ICsyNiw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5zcGxpdC5TcGxpdFNjcmVlbkNvbnN0YW50cy5GTEFHX0lTX0RJVklERVJfQkFSOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC53bS5zaGVsbC5zcGxpdHNjcmVlbi5TcGxpdFNjcmVlbi5TVEFHRV9UWVBFX1VOREVGSU5FRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQud20uc2hlbGwuc3BsaXRzY3JlZW4uU3BsaXRTY3JlZW5Db250cm9sbGVyLkVYSVRfUkVBU09OX0NISUxEX1RBU0tfRU5URVJfUElQOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC53bS5zaGVsbC51dGlsLlRyYW5zaXRpb25VdGlsLmlzT3BlbmluZ1R5cGU7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CkBAIC02OCwxNCArNzAsMjAgQEAKICAgICAgICAgLyoqIFBpcCB3YXMgZW50ZXJlZCB3aGlsZSBoYW5kbGluZyBhbiBpbnRlbnQgd2l0aCBpdHMgb3duIHJlbW90ZVRyYW5zaXRpb24uICovCiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PUFRJT05TX1JFTU9URV9BTkRfUElQX0NIQU5HRSA9IDM7CiAKKyAgICAgICAgLyoqIFJlY2VudHMgdHJhbnNpdGlvbiB3aGlsZSBzcGxpdC1zY3JlZW4gYWN0aXZlLiAqLworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVDRU5UU19EVVJJTkdfU1BMSVQgPSA0OworCiAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBhbmltYXRpb24gZm9yIHRoaXMgbWl4ZWQgdHJhbnNpdGlvbi4gKi8KICAgICAgICAgc3RhdGljIGZpbmFsIGludCBBTklNX1RZUEVfREVGQVVMVCA9IDA7CiAKICAgICAgICAgLyoqIEZvciBFTlRFUl9QSVBfRlJPTV9TUExJVCwgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIHRvLWhvbWUgYW5pbWF0aW9uLiAqLwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fVFlQRV9HT0lOR19IT01FID0gMTsKIAorICAgICAgICAvKiogRm9yIFJFQ0VOVFNfRFVSSU5HX1NQTElULCBpcyBzZXQgd2hlbiB0aGlzIHR1cm5zIGludG8gYSBwYWlyLT5wYWlyIHRhc2sgc3dpdGNoLiAqLworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fVFlQRV9QQUlSX1RPX1BBSVIgPSAxOworCiAgICAgICAgIGZpbmFsIGludCBtVHlwZTsKLSAgICAgICAgaW50IG1BbmltVHlwZSA9IDA7CisgICAgICAgIGludCBtQW5pbVR5cGUgPSBBTklNX1RZUEVfREVGQVVMVDsKICAgICAgICAgZmluYWwgSUJpbmRlciBtVHJhbnNpdGlvbjsKIAogICAgICAgICBUcmFuc2l0aW9ucy5UcmFuc2l0aW9uSGFuZGxlciBtTGVmdG92ZXJzSGFuZGxlciA9IG51bGw7CkBAIC0xNjcsNiArMTc1LDI3IEBACiAgICAgICAgICAgICBtaXhlZC5tTGVmdG92ZXJzSGFuZGxlciA9IGhhbmRsZXIuZmlyc3Q7CiAgICAgICAgICAgICBtQWN0aXZlVHJhbnNpdGlvbnMuYWRkKG1peGVkKTsKICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLnNlY29uZDsKKyAgICAgICAgfSBlbHNlIGlmIChtU3BsaXRIYW5kbGVyLmlzU3BsaXRBY3RpdmUoKQorICAgICAgICAgICAgICAgICYmIGlzT3BlbmluZ1R5cGUocmVxdWVzdC5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgJiYgcmVxdWVzdC5nZXRUcmlnZ2VyVGFzaygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0LmdldFRyaWdnZXJUYXNrKCkuZ2V0V2luZG93aW5nTW9kZSgpID09IFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4KKyAgICAgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRUcmlnZ2VyVGFzaygpLmdldEFjdGl2aXR5VHlwZSgpID09IEFDVElWSVRZX1RZUEVfSE9NRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVxdWVzdC5nZXRUcmlnZ2VyVGFzaygpLmdldEFjdGl2aXR5VHlwZSgpID09IEFDVElWSVRZX1RZUEVfUkVDRU5UUykKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0LmdldFJlbW90ZVRyYW5zaXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm90b0xvZy52KFNoZWxsUHJvdG9Mb2dHcm91cC5XTV9TSEVMTF9UUkFOU0lUSU9OUywgIiBHb3QgYSByZWNlbnRzIHJlcXVlc3Qgd2hpbGUgIgorICAgICAgICAgICAgICAgICAgICArICJTcGxpdC1TY3JlZW4gaXMgYWN0aXZlLCBzbyB0cmVhdCBpdCBhcyBNaXhlZC4iKTsKKyAgICAgICAgICAgIFBhaXI8VHJhbnNpdGlvbnMuVHJhbnNpdGlvbkhhbmRsZXIsIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uPiBoYW5kbGVyID0KKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci5kaXNwYXRjaFJlcXVlc3QodHJhbnNpdGlvbiwgcmVxdWVzdCwgdGhpcyk7CisgICAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKFRyYW5zaXRpb25zLlRBRywgIiAgIE5vIGhhbmRsZXIgZm9yIHJlbW90ZT8gVGhpcyBpcyB1bmV4cGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB0aGVyZSBzaG91bGQgYXQtbGVhc3QgYmUgUmVtb3RlSGFuZGxlci4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIE1peGVkVHJhbnNpdGlvbiBtaXhlZCA9IG5ldyBNaXhlZFRyYW5zaXRpb24oCisgICAgICAgICAgICAgICAgICAgIE1peGVkVHJhbnNpdGlvbi5UWVBFX1JFQ0VOVFNfRFVSSU5HX1NQTElULCB0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgIG1peGVkLm1MZWZ0b3ZlcnNIYW5kbGVyID0gaGFuZGxlci5maXJzdDsKKyAgICAgICAgICAgIG1BY3RpdmVUcmFuc2l0aW9ucy5hZGQobWl4ZWQpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2Vjb25kOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTIxNiw2ICsyNDUsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKG1peGVkLm1UeXBlID09IE1peGVkVHJhbnNpdGlvbi5UWVBFX09QVElPTlNfUkVNT1RFX0FORF9QSVBfQ0hBTkdFKSB7CiAgICAgICAgICAgICByZXR1cm4gYW5pbWF0ZU9wZW5JbnRlbnRXaXRoUmVtb3RlQW5kUGlwKG1peGVkLCBpbmZvLCBzdGFydFRyYW5zYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICBmaW5pc2hUcmFuc2FjdGlvbiwgZmluaXNoQ2FsbGJhY2spOworICAgICAgICB9IGVsc2UgaWYgKG1peGVkLm1UeXBlID09IE1peGVkVHJhbnNpdGlvbi5UWVBFX1JFQ0VOVFNfRFVSSU5HX1NQTElUKSB7CisgICAgICAgICAgICByZXR1cm4gYW5pbWF0ZVJlY2VudHNEdXJpbmdTcGxpdChtaXhlZCwgaW5mbywgc3RhcnRUcmFuc2FjdGlvbiwgZmluaXNoVHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGZpbmlzaENhbGxiYWNrKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BY3RpdmVUcmFuc2l0aW9ucy5yZW1vdmUobWl4ZWQpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3RhcnRpbmcgbWl4ZWQgYW5pbWF0aW9uIHdpdGhvdXQgYSBrbm93biBtaXhlZCB0eXBlPyAiCkBAIC00NDEsMTIgKzQ3Myw0MCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gYW5pbWF0ZVJlY2VudHNEdXJpbmdTcGxpdChATm9uTnVsbCBmaW5hbCBNaXhlZFRyYW5zaXRpb24gbWl4ZWQsCisgICAgICAgICAgICBATm9uTnVsbCBUcmFuc2l0aW9uSW5mbyBpbmZvLAorICAgICAgICAgICAgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gc3RhcnRUcmFuc2FjdGlvbiwKKyAgICAgICAgICAgIEBOb25OdWxsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIGZpbmlzaFRyYW5zYWN0aW9uLAorICAgICAgICAgICAgQE5vbk51bGwgVHJhbnNpdGlvbnMuVHJhbnNpdGlvbkZpbmlzaENhbGxiYWNrIGZpbmlzaENhbGxiYWNrKSB7CisgICAgICAgIC8vIFNwbGl0LXNjcmVlbiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHJlY2VudHMgdHJhbnNpdGlvbiBmaW5pc2hpbmcgKGFuZCBtZXJnaW5nKSwgc28KKyAgICAgICAgLy8ganVzdCB3cmFwIGZpbmlzaCBhbmQgc3RhcnQgcmVjZW50cyBhbmltYXRpb24gZGlyZWN0bHkuCisgICAgICAgIFRyYW5zaXRpb25zLlRyYW5zaXRpb25GaW5pc2hDYWxsYmFjayBmaW5pc2hDQiA9ICh3Y3QsIHdjdENCKSAtPiB7CisgICAgICAgICAgICBtaXhlZC5tSW5GbGlnaHRTdWJBbmltYXRpb25zID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVUcmFuc2l0aW9ucy5yZW1vdmUobWl4ZWQpOworICAgICAgICAgICAgLy8gSWYgcGFpci10by1wYWlyIHN3aXRjaGluZywgdGhlIHBvc3QtcmVjZW50cyBjbGVhbi11cCBpc24ndCBuZWVkZWQuCisgICAgICAgICAgICBpZiAobWl4ZWQubUFuaW1UeXBlICE9IE1peGVkVHJhbnNpdGlvbi5BTklNX1RZUEVfUEFJUl9UT19QQUlSKSB7CisgICAgICAgICAgICAgICAgd2N0ID0gd2N0ICE9IG51bGwgPyB3Y3QgOiBuZXcgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtU3BsaXRIYW5kbGVyLm9uUmVjZW50c0luU3BsaXRBbmltYXRpb25GaW5pc2god2N0LCBmaW5pc2hUcmFuc2FjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3BsaXRIYW5kbGVyLm9uVHJhbnNpdGlvbkFuaW1hdGlvbkNvbXBsZXRlKCk7CisgICAgICAgICAgICBmaW5pc2hDYWxsYmFjay5vblRyYW5zaXRpb25GaW5pc2hlZCh3Y3QsIHdjdENCKTsKKyAgICAgICAgfTsKKyAgICAgICAgbWl4ZWQubUluRmxpZ2h0U3ViQW5pbWF0aW9ucyA9IDE7CisgICAgICAgIG1TcGxpdEhhbmRsZXIub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvblN0YXJ0KHN0YXJ0VHJhbnNhY3Rpb24pOworICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQgPSBtaXhlZC5tTGVmdG92ZXJzSGFuZGxlci5zdGFydEFuaW1hdGlvbihtaXhlZC5tVHJhbnNpdGlvbiwgaW5mbywKKyAgICAgICAgICAgICAgICBzdGFydFRyYW5zYWN0aW9uLCBmaW5pc2hUcmFuc2FjdGlvbiwgZmluaXNoQ0IpOworICAgICAgICBpZiAoIWhhbmRsZWQpIHsKKyAgICAgICAgICAgIG1BY3RpdmVUcmFuc2l0aW9ucy5yZW1vdmUobWl4ZWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lcmdlQW5pbWF0aW9uKEBOb25OdWxsIElCaW5kZXIgdHJhbnNpdGlvbiwgQE5vbk51bGwgVHJhbnNpdGlvbkluZm8gaW5mbywKICAgICAgICAgICAgIEBOb25OdWxsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIHQsIEBOb25OdWxsIElCaW5kZXIgbWVyZ2VUYXJnZXQsCiAgICAgICAgICAgICBATm9uTnVsbCBUcmFuc2l0aW9ucy5UcmFuc2l0aW9uRmluaXNoQ2FsbGJhY2sgZmluaXNoQ2FsbGJhY2spIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQWN0aXZlVHJhbnNpdGlvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhbnNpdGlvbnMuZ2V0KGkpICE9IG1lcmdlVGFyZ2V0KSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhbnNpdGlvbnMuZ2V0KGkpLm1UcmFuc2l0aW9uICE9IG1lcmdlVGFyZ2V0KSBjb250aW51ZTsKICAgICAgICAgICAgIE1peGVkVHJhbnNpdGlvbiBtaXhlZCA9IG1BY3RpdmVUcmFuc2l0aW9ucy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAobWl4ZWQubUluRmxpZ2h0U3ViQW5pbWF0aW9ucyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBkb25lLCBzbyBubyBuZWVkIHRvIGVuZCBpdC4KQEAgLTQ3NCw2ICs1MzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZWQubUxlZnRvdmVyc0hhbmRsZXIubWVyZ2VBbmltYXRpb24odHJhbnNpdGlvbiwgaW5mbywgdCwgbWVyZ2VUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4ZWQubVR5cGUgPT0gTWl4ZWRUcmFuc2l0aW9uLlRZUEVfUkVDRU5UU19EVVJJTkdfU1BMSVQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNwbGl0SGFuZGxlci5pc1BlbmRpbmdFbnRlcih0cmFuc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZWNlbnRzIC0+IGVudGVyLXNwbGl0IG1lYW5zIHRoYXQgd2UgYXJlIHN3aXRjaGluZyBmcm9tIG9uZSBwYWlyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgcGFpci4KKyAgICAgICAgICAgICAgICAgICAgbWl4ZWQubUFuaW1UeXBlID0gTWl4ZWRUcmFuc2l0aW9uLkFOSU1fVFlQRV9QQUlSX1RPX1BBSVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1peGVkLm1MZWZ0b3ZlcnNIYW5kbGVyLm1lcmdlQW5pbWF0aW9uKHRyYW5zaXRpb24sIGluZm8sIHQsIG1lcmdlVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FsbGJhY2spOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQbGF5aW5nIGEgbWl4ZWQgdHJhbnNpdGlvbiB3aXRoIHVua25vd24gdHlwZT8gIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBtaXhlZC5tVHlwZSk7CkBAIC00OTMsNiArNTYxLDggQEAKICAgICAgICAgaWYgKG1peGVkID09IG51bGwpIHJldHVybjsKICAgICAgICAgaWYgKG1peGVkLm1UeXBlID09IE1peGVkVHJhbnNpdGlvbi5UWVBFX0VOVEVSX1BJUF9GUk9NX1NQTElUKSB7CiAgICAgICAgICAgICBtUGlwSGFuZGxlci5vblRyYW5zaXRpb25Db25zdW1lZCh0cmFuc2l0aW9uLCBhYm9ydGVkLCBmaW5pc2hUKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaXhlZC5tVHlwZSA9PSBNaXhlZFRyYW5zaXRpb24uVFlQRV9SRUNFTlRTX0RVUklOR19TUExJVCkgeworICAgICAgICAgICAgbWl4ZWQubUxlZnRvdmVyc0hhbmRsZXIub25UcmFuc2l0aW9uQ29uc3VtZWQodHJhbnNpdGlvbiwgYWJvcnRlZCwgZmluaXNoVCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL0Rlc2t0b3BNb2RlV2luZG93RGVjb3JhdGlvbi5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC93aW5kb3dkZWNvci9EZXNrdG9wTW9kZVdpbmRvd0RlY29yYXRpb24uamF2YQppbmRleCA3MmRhMTA4Li4zYzBlZjk2IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL0Rlc2t0b3BNb2RlV2luZG93RGVjb3JhdGlvbi5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvRGVza3RvcE1vZGVXaW5kb3dEZWNvcmF0aW9uLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CkBAIC00Niw2ICs0Nyw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLkRpc3BsYXlDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5TeW5jVHJhbnNhY3Rpb25RdWV1ZTsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5kZXNrdG9wbW9kZS5EZXNrdG9wTW9kZVN0YXR1czsKK2ltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5kZXNrdG9wbW9kZS5EZXNrdG9wVGFza3NDb250cm9sbGVyOwogCiAvKioKICAqIERlZmluZXMgdmlzdWFscyBhbmQgYmVoYXZpb3JzIG9mIGEgd2luZG93IGRlY29yYXRpb24gb2YgYSBjYXB0aW9uIGJhciBhbmQgc2hhZG93cy4gSXQgd29ya3Mgd2l0aApAQCAtOTUsNiArOTcsMTcgQEAKICAgICAgICAgbURlc2t0b3BBY3RpdmUgPSBEZXNrdG9wTW9kZVN0YXR1cy5pc0FjdGl2ZShtQ29udGV4dCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbldpdGhPdmVycmlkZXMoCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIHRhc2tJbmZvKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHRhc2tJbmZvLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKERlc2t0b3BUYXNrc0NvbnRyb2xsZXIuaXNEZXNrdG9wRGVuc2l0eU92ZXJyaWRlU2V0KCkpIHsKKyAgICAgICAgICAgIC8vIERlbnNpdHkgaXMgb3ZlcnJpZGRlbiBmb3IgZGVza3RvcCB0YXNrcy4gS2VlcCBzeXN0ZW0gZGVuc2l0eSBmb3Igd2luZG93IGRlY29yYXRpb24uCisgICAgICAgICAgICBjb25maWd1cmF0aW9uLmRlbnNpdHlEcGkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuZGVuc2l0eURwaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKICAgICB2b2lkIHNldENhcHRpb25MaXN0ZW5lcnMoCiAgICAgICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNhcHRpb25CdXR0b25DbGlja0xpc3RlbmVyLAogICAgICAgICAgICAgVmlldy5PblRvdWNoTGlzdGVuZXIgb25DYXB0aW9uVG91Y2hMaXN0ZW5lcikgewpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC93aW5kb3dkZWNvci9XaW5kb3dEZWNvcmF0aW9uLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL1dpbmRvd0RlY29yYXRpb24uamF2YQppbmRleCA3YTdhYzQ3Li5kZGQzYjQ0IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL1dpbmRvd0RlY29yYXRpb24uamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL1dpbmRvd0RlY29yYXRpb24uamF2YQpAQCAtMTMxLDcgKzEzMSwxNyBAQAogICAgICAgICBtU3VyZmFjZUNvbnRyb2xWaWV3SG9zdEZhY3RvcnkgPSBzdXJmYWNlQ29udHJvbFZpZXdIb3N0RmFjdG9yeTsKIAogICAgICAgICBtRGlzcGxheSA9IG1EaXNwbGF5Q29udHJvbGxlci5nZXREaXNwbGF5KG1UYXNrSW5mby5kaXNwbGF5SWQpOwotICAgICAgICBtRGVjb3JXaW5kb3dDb250ZXh0ID0gbUNvbnRleHQuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHQobVRhc2tJbmZvLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIG1EZWNvcldpbmRvd0NvbnRleHQgPSBtQ29udGV4dC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dCgKKyAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uV2l0aE92ZXJyaWRlcyhtVGFza0luZm8pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIENvbmZpZ3VyYXRpb259IGZyb20gc3VwcGxpZWQge0BsaW5rIFJ1bm5pbmdUYXNrSW5mb30uCisgICAgICoKKyAgICAgKiBBbGxvd3MgdmFsdWVzIHRvIGJlIG92ZXJyaWRkZW4gYmVmb3JlIHJldHVybmluZyB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uV2l0aE92ZXJyaWRlcyhSdW5uaW5nVGFza0luZm8gdGFza0luZm8pIHsKKyAgICAgICAgcmV0dXJuIHRhc2tJbmZvLmdldENvbmZpZ3VyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NSw3ICsxNzUsNyBAQAogCiAgICAgICAgIG91dFJlc3VsdC5tUm9vdFZpZXcgPSByb290VmlldzsKICAgICAgICAgcm9vdFZpZXcgPSBudWxsOyAvLyBDbGVhciBpdCBqdXN0IGluIGNhc2Ugd2UgdXNlIGl0IGFjY2lkZW50YWxseQotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tDb25maWcgPSBtVGFza0luZm8uZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHRhc2tDb25maWcgPSBnZXRDb25maWd1cmF0aW9uV2l0aE92ZXJyaWRlcyhtVGFza0luZm8pOwogICAgICAgICBpZiAob2xkVGFza0NvbmZpZy5kZW5zaXR5RHBpICE9IHRhc2tDb25maWcuZGVuc2l0eURwaQogICAgICAgICAgICAgICAgIHx8IG1EaXNwbGF5ID09IG51bGwKICAgICAgICAgICAgICAgICB8fCBtRGlzcGxheS5nZXREaXNwbGF5SWQoKSAhPSBtVGFza0luZm8uZGlzcGxheUlkKSB7CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyVGVzdC5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Rlc3RzL3VuaXR0ZXN0L3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvcGhvbmUvUGlwQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAwZTE0YzY5Li4xMDhlMjczIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL3Bob25lL1BpcENvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uRGlzcGxheUluc2V0c0NvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLkRpc3BsYXlMYXlvdXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNoZWxsRXhlY3V0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5vbmVoYW5kZWQuT25lSGFuZGVkQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5waXAuUGlwQW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTExNSw2ICsxMTYsNyBAQAogICAgIEBNb2NrIHByaXZhdGUgT3B0aW9uYWw8T25lSGFuZGVkQ29udHJvbGxlcj4gbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyOwogICAgIEBNb2NrIHByaXZhdGUgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBtTW9ja1BpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXI7CiAgICAgQE1vY2sgcHJpdmF0ZSBEaXNwbGF5SW5zZXRzQ29udHJvbGxlciBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyOworICAgIEBNb2NrIHByaXZhdGUgVGFibGV0b3BNb2RlQ29udHJvbGxlciBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiAKICAgICBATW9jayBwcml2YXRlIERpc3BsYXlMYXlvdXQgbU1vY2tEaXNwbGF5TGF5b3V0MTsKICAgICBATW9jayBwcml2YXRlIERpc3BsYXlMYXlvdXQgbU1vY2tEaXNwbGF5TGF5b3V0MjsKQEAgLTEzNyw3ICsxMzksOCBAQAogICAgICAgICAgICAgICAgIG1Nb2NrUGlwVGFza09yZ2FuaXplciwgbU1vY2tQaXBUcmFuc2l0aW9uU3RhdGUsIG1Nb2NrUGlwVG91Y2hIYW5kbGVyLAogICAgICAgICAgICAgICAgIG1Nb2NrUGlwVHJhbnNpdGlvbkNvbnRyb2xsZXIsIG1Nb2NrV2luZG93TWFuYWdlclNoZWxsV3JhcHBlciwKICAgICAgICAgICAgICAgICBtTW9ja1Rhc2tTdGFja0xpc3RlbmVyLCBtTW9ja1BpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCi0gICAgICAgICAgICAgICAgbU1vY2tEaXNwbGF5SW5zZXRzQ29udHJvbGxlciwgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKTsKKyAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKTsKICAgICAgICAgbVNoZWxsSW5pdC5pbml0KCk7CiAgICAgICAgIHdoZW4obU1vY2tQaXBCb3VuZHNBbGdvcml0aG0uZ2V0U25hcEFsZ29yaXRobSgpKS50aGVuUmV0dXJuKG1Nb2NrUGlwU25hcEFsZ29yaXRobSk7CiAgICAgICAgIHdoZW4obU1vY2tQaXBUb3VjaEhhbmRsZXIuZ2V0TW90aW9uSGVscGVyKCkpLnRoZW5SZXR1cm4obU1vY2tQaXBNb3Rpb25IZWxwZXIpOwpAQCAtMjI4LDcgKzIzMSw4IEBACiAgICAgICAgICAgICAgICAgbU1vY2tQaXBUYXNrT3JnYW5pemVyLCBtTW9ja1BpcFRyYW5zaXRpb25TdGF0ZSwgbU1vY2tQaXBUb3VjaEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgbU1vY2tQaXBUcmFuc2l0aW9uQ29udHJvbGxlciwgbU1vY2tXaW5kb3dNYW5hZ2VyU2hlbGxXcmFwcGVyLAogICAgICAgICAgICAgICAgIG1Nb2NrVGFza1N0YWNrTGlzdGVuZXIsIG1Nb2NrUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciwKLSAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja09uZUhhbmRlZENvbnRyb2xsZXIsIG1Nb2NrRXhlY3V0b3IpKTsKKyAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3BsaXRUcmFuc2l0aW9uVGVzdHMuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3BsaXRUcmFuc2l0aW9uVGVzdHMuamF2YQppbmRleCAzOTAxZGFiLi5kZjc4ZDkyIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3NwbGl0c2NyZWVuL1NwbGl0VHJhbnNpdGlvblRlc3RzLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Rlc3RzL3VuaXR0ZXN0L3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TcGxpdFRyYW5zaXRpb25UZXN0cy5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OwpAQCAtMjQ5LDcgKzI1MCw3IEBACiAKICAgICBAVGVzdAogICAgIEBVaVRocmVhZFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJSZWNlbnRzKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclJlY2VudHNBbmRDb21taXQoKSB7CiAgICAgICAgIGVudGVyU3BsaXQoKTsKIAogICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIGhvbWVUYXNrID0gbmV3IFRlc3RSdW5uaW5nVGFza0luZm9CdWlsZGVyKCkKQEAgLTI1OCwyNyArMjU5LDY1IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCB0byBicmluZyBob21lIGZvcndhcmQKLSAgICAgICAgVHJhbnNpdGlvblJlcXVlc3RJbmZvIHJlcXVlc3QgPSBuZXcgVHJhbnNpdGlvblJlcXVlc3RJbmZvKFRSQU5TSVRfVE9fRlJPTlQsIGhvbWVUYXNrLCBudWxsKTsKKyAgICAgICAgVHJhbnNpdGlvblJlcXVlc3RJbmZvIHJlcXVlc3QgPSBuZXcgVHJhbnNpdGlvblJlcXVlc3RJbmZvKFRSQU5TSVRfVE9fRlJPTlQsIGhvbWVUYXNrLAorICAgICAgICAgICAgICAgIG1vY2soUmVtb3RlVHJhbnNpdGlvbi5jbGFzcykpOwogICAgICAgICBJQmluZGVyIHRyYW5zaXRpb24gPSBtb2NrKElCaW5kZXIuY2xhc3MpOwogICAgICAgICBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiByZXN1bHQgPSBtU3RhZ2VDb29yZGluYXRvci5oYW5kbGVSZXF1ZXN0KHRyYW5zaXRpb24sIHJlcXVlc3QpOwotCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzRW1wdHkoKSk7CisgICAgICAgIC8vIERvbid0IGhhbmRsZSByZWNlbnRzIG9wZW5pbmcKKyAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQpOwogCiAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1hZGUgYW55IGxvY2FsIGNoYW5nZXMgeWV0IChuZWVkIHRvIHdhaXQgdW50aWwgdHJhbnNpdGlvbiBpcyByZWFkeSkKICAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKIAotICAgICAgICAvLyBzaW11bGF0ZSB0aGUgdHJhbnNpdGlvbgotICAgICAgICBUcmFuc2l0aW9uSW5mbyBpbmZvID0gbmV3IFRyYW5zaXRpb25JbmZvQnVpbGRlcihUUkFOU0lUX1RPX0ZST05ULCAwKQotICAgICAgICAgICAgICAgIC5hZGRDaGFuZ2UoVFJBTlNJVF9UT19GUk9OVCwgaG9tZVRhc2spCi0gICAgICAgICAgICAgICAgLmFkZENoYW5nZShUUkFOU0lUX1RPX0JBQ0ssIG1NYWluQ2hpbGQpCi0gICAgICAgICAgICAgICAgLmFkZENoYW5nZShUUkFOU0lUX1RPX0JBQ0ssIG1TaWRlQ2hpbGQpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSBzdGFydCBvZiByZWNlbnRzIHRyYW5zaXRpb24KICAgICAgICAgbU1haW5TdGFnZS5vblRhc2tWYW5pc2hlZChtTWFpbkNoaWxkKTsKICAgICAgICAgbVNpZGVTdGFnZS5vblRhc2tWYW5pc2hlZChtU2lkZUNoaWxkKTsKLSAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iuc3RhcnRBbmltYXRpb24odHJhbnNpdGlvbiwgaW5mbywKLSAgICAgICAgICAgICAgICBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKSwKLSAgICAgICAgICAgICAgICBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKSwKLSAgICAgICAgICAgICAgICBtb2NrKFRyYW5zaXRpb25zLlRyYW5zaXRpb25GaW5pc2hDYWxsYmFjay5jbGFzcykpOworICAgICAgICBtU3RhZ2VDb29yZGluYXRvci5vblJlY2VudHNJblNwbGl0QW5pbWF0aW9uU3RhcnQobW9jayhTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKG1TdGFnZUNvb3JkaW5hdG9yLmlzU3BsaXRTY3JlZW5WaXNpYmxlKCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBjbGVhbnMtdXAgaWYgcmVjZW50cyBkb2Vzbid0IHJlc3RvcmUKKyAgICAgICAgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24gY29tbWl0V0NUID0gbmV3IFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1TdGFnZUNvb3JkaW5hdG9yLm9uUmVjZW50c0luU3BsaXRBbmltYXRpb25GaW5pc2goY29tbWl0V0NULAorICAgICAgICAgICAgICAgIG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVN0YWdlQ29vcmRpbmF0b3IuaXNTcGxpdFNjcmVlblZpc2libGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGVyUmVjZW50c0FuZFJlc3RvcmUoKSB7CisgICAgICAgIGVudGVyU3BsaXQoKTsKKworICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIGhvbWVUYXNrID0gbmV3IFRlc3RSdW5uaW5nVGFza0luZm9CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0V2luZG93aW5nTW9kZShXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eVR5cGUoQUNUSVZJVFlfVFlQRV9IT01FKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgdG8gYnJpbmcgaG9tZSBmb3J3YXJkCisgICAgICAgIFRyYW5zaXRpb25SZXF1ZXN0SW5mbyByZXF1ZXN0ID0gbmV3IFRyYW5zaXRpb25SZXF1ZXN0SW5mbyhUUkFOU0lUX1RPX0ZST05ULCBob21lVGFzaywKKyAgICAgICAgICAgICAgICBtb2NrKFJlbW90ZVRyYW5zaXRpb24uY2xhc3MpKTsKKyAgICAgICAgSUJpbmRlciB0cmFuc2l0aW9uID0gbW9jayhJQmluZGVyLmNsYXNzKTsKKyAgICAgICAgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24gcmVzdWx0ID0gbVN0YWdlQ29vcmRpbmF0b3IuaGFuZGxlUmVxdWVzdCh0cmFuc2l0aW9uLCByZXF1ZXN0KTsKKyAgICAgICAgLy8gRG9uJ3QgaGFuZGxlIHJlY2VudHMgb3BlbmluZworICAgICAgICBhc3NlcnROdWxsKHJlc3VsdCk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWFkZSBhbnkgbG9jYWwgY2hhbmdlcyB5ZXQgKG5lZWQgdG8gd2FpdCB1bnRpbCB0cmFuc2l0aW9uIGlzIHJlYWR5KQorICAgICAgICBhc3NlcnRUcnVlKG1TdGFnZUNvb3JkaW5hdG9yLmlzU3BsaXRTY3JlZW5WaXNpYmxlKCkpOworCisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSBzdGFydCBvZiByZWNlbnRzIHRyYW5zaXRpb24KKyAgICAgICAgbU1haW5TdGFnZS5vblRhc2tWYW5pc2hlZChtTWFpbkNoaWxkKTsKKyAgICAgICAgbVNpZGVTdGFnZS5vblRhc2tWYW5pc2hlZChtU2lkZUNoaWxkKTsKKyAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvblN0YXJ0KG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgcmVtYWluIGluIHNwbGl0IGFmdGVyIHJlY2VudHMgcmVzdG9yZXMuCisgICAgICAgIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uIHJlc3RvcmVXQ1QgPSBuZXcgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgcmVzdG9yZVdDVC5yZW9yZGVyKG1NYWluQ2hpbGQudG9rZW4sIHRydWUgLyogdG9Ub3AgKi8pOworICAgICAgICByZXN0b3JlV0NULnJlb3JkZXIobVNpZGVDaGlsZC50b2tlbiwgdHJ1ZSAvKiB0b1RvcCAqLyk7CisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSByZXN0b3JlV0NUIGJlaW5nIGFwcGxpZWQ6CisgICAgICAgIG1NYWluU3RhZ2Uub25UYXNrQXBwZWFyZWQobU1haW5DaGlsZCwgbW9jayhTdXJmYWNlQ29udHJvbC5jbGFzcykpOworICAgICAgICBtU2lkZVN0YWdlLm9uVGFza0FwcGVhcmVkKG1TaWRlQ2hpbGQsIG1vY2soU3VyZmFjZUNvbnRyb2wuY2xhc3MpKTsKKyAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvbkZpbmlzaChyZXN0b3JlV0NULAorICAgICAgICAgICAgICAgIG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmNwcCBiL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmNwcAppbmRleCBiMDg5NmRhLi45ZGY2ODIyIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvUHJvcGVydGllcy5jcHAKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuY3BwCkBAIC05MSw2ICs5MSw4IEBACiBib29sIFByb3BlcnRpZXM6OmlzTG93UmFtID0gZmFsc2U7CiBib29sIFByb3BlcnRpZXM6OmlzU3lzdGVtT3JQZXJzaXN0ZW50ID0gZmFsc2U7CiAKK2Zsb2F0IFByb3BlcnRpZXM6Om1heEhkckhlYWRyb29tT244Yml0ID0gNS5mOyAgLy8gVE9ETzogUmVmaW5lIHRoaXMgbnVtYmVyCisKIFN0cmV0Y2hFZmZlY3RCZWhhdmlvciBQcm9wZXJ0aWVzOjpzdHJldGNoRWZmZWN0QmVoYXZpb3IgPSBTdHJldGNoRWZmZWN0QmVoYXZpb3I6OlNoYWRlckhXVUk7CiAKIERyYXdpbmdFbmFibGVkIFByb3BlcnRpZXM6OmRyYXdpbmdFbmFibGVkID0gRHJhd2luZ0VuYWJsZWQ6Ok5vdEluaXRpYWxpemVkOwpAQCAtMTUwLDYgKzE1MiwxMSBAQAogCiAgICAgZW5hYmxlV2ViVmlld092ZXJsYXlzID0gYmFzZTo6R2V0Qm9vbFByb3BlcnR5KFBST1BFUlRZX1dFQlZJRVdfT1ZFUkxBWVNfRU5BQkxFRCwgdHJ1ZSk7CiAKKyAgICBhdXRvIGhkckhlYWRyb29tID0gKGZsb2F0KWF0b2YoYmFzZTo6R2V0UHJvcGVydHkoUFJPUEVSVFlfOEJJVF9IRFJfSEVBRFJPT00sICIiKS5jX3N0cigpKTsKKyAgICBpZiAoaGRySGVhZHJvb20gPj0gMS5mKSB7CisgICAgICAgIG1heEhkckhlYWRyb29tT244Yml0ID0gc3RkOjptaW4oaGRySGVhZHJvb20sIDEwMC5mKTsKKyAgICB9CisKICAgICAvLyBjYWxsIGlzRHJhd2luZ0VuYWJsZWQgdG8gZm9yY2UgbG9hZGluZyBvZiB0aGUgcHJvcGVydHkKICAgICBpc0RyYXdpbmdFbmFibGVkKCk7CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCmluZGV4IGVkNzE3NWUuLjI0ZTIwNmIgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMjE4LDYgKzIxOCw4IEBACiAKICNkZWZpbmUgUFJPUEVSVFlfTUVNT1JZX1BPTElDWSAiZGVidWcuaHd1aS5hcHBfbWVtb3J5X3BvbGljeSIKIAorI2RlZmluZSBQUk9QRVJUWV84QklUX0hEUl9IRUFEUk9PTSAiZGVidWcuaHd1aS44Yml0X2hkcl9oZWFkcm9vbSIKKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWlzYwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMzIxLDYgKzMyMyw4IEBACiAgICAgc3RhdGljIGJvb2wgaXNMb3dSYW07CiAgICAgc3RhdGljIGJvb2wgaXNTeXN0ZW1PclBlcnNpc3RlbnQ7CiAKKyAgICBzdGF0aWMgZmxvYXQgbWF4SGRySGVhZHJvb21PbjhiaXQ7CisKICAgICBzdGF0aWMgU3RyZXRjaEVmZmVjdEJlaGF2aW9yIGdldFN0cmV0Y2hFZmZlY3RCZWhhdmlvcigpIHsKICAgICAgICAgcmV0dXJuIHN0cmV0Y2hFZmZlY3RCZWhhdmlvcjsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvZWZmZWN0cy9HYWlubWFwUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmNwcAppbmRleCA4OTc3ZDNjLi5iZmU0ZWFmIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvZWZmZWN0cy9HYWlubWFwUmVuZGVyZXIuY3BwCisrKyBiL2xpYnMvaHd1aS9lZmZlY3RzL0dhaW5tYXBSZW5kZXJlci5jcHAKQEAgLTIzLDIxICsyMyw1NSBAQAogI2luY2x1ZGUgInV0aWxzL1RyYWNlLmgiCiAKICNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgImluY2x1ZGUvY29yZS9Ta0NvbG9yU3BhY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2NvcmUvU2tJbWFnZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvY29yZS9Ta1NoYWRlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvZWZmZWN0cy9Ta1J1bnRpbWVFZmZlY3QuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3ByaXZhdGUvU2tHYWlubWFwSW5mby5oIgogI2luY2x1ZGUgInJlbmRlcnRocmVhZC9DYW52YXNDb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvU2tDb2xvckZpbHRlclByaXYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9Ta0ltYWdlSW5mb1ByaXYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9Ta1J1bnRpbWVFZmZlY3RQcml2LmgiCiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXIgewogCiB1c2luZyBuYW1lc3BhY2UgcmVuZGVydGhyZWFkOwogCitzdGF0aWMgZmxvYXQgZ2V0VGFyZ2V0SGRyU2RyUmF0aW8oY29uc3QgU2tDb2xvclNwYWNlKiBkZXN0Q29sb3JzcGFjZSkgeworICAgIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhIGtub3duIGRlc3RpbmF0aW9uIGNvbG9yc3BhY2UuIElmIHdlIGRvbid0IHdlIG11c3QgYmUgaW4gc29tZQorICAgIC8vIGxlZ2FjeSBtb2RlIHdoZXJlIHdlJ3JlIGxvc3QgYW5kIGFsc28gZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gSERSCisgICAgaWYgKGRlc3RDb2xvcnNwYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDEuZjsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgZmxvYXQgR2VuZXJpY1NkcldoaXRlTml0cyA9IDIwMy5mOworICAgIGNvbnN0ZXhwciBmbG9hdCBtYXhQUUx1eCA9IDEwMDAwLmY7CisgICAgY29uc3RleHByIGZsb2F0IG1heEhMR0x1eCA9IDEwMDAuZjsKKyAgICBza2Ntc19UcmFuc2ZlckZ1bmN0aW9uIGRlc3RURjsKKyAgICBkZXN0Q29sb3JzcGFjZS0+dHJhbnNmZXJGbigmZGVzdFRGKTsKKyAgICBpZiAoc2tjbXNfVHJhbnNmZXJGdW5jdGlvbl9pc1BRaXNoKCZkZXN0VEYpKSB7CisgICAgICAgIHJldHVybiBtYXhQUUx1eCAvIEdlbmVyaWNTZHJXaGl0ZU5pdHM7CisgICAgfSBlbHNlIGlmIChza2Ntc19UcmFuc2ZlckZ1bmN0aW9uX2lzSExHaXNoKCZkZXN0VEYpKSB7CisgICAgICAgIHJldHVybiBtYXhITEdMdXggLyBHZW5lcmljU2RyV2hpdGVOaXRzOworICAgIH0gZWxzZSB7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgQ2FudmFzQ29udGV4dCogY29udGV4dCA9IENhbnZhc0NvbnRleHQ6OmdldEFjdGl2ZUNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQgPyBjb250ZXh0LT50YXJnZXRTZHJIZHJSYXRpbygpIDogMS5mOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDEuZjsKKyNlbmRpZgorICAgIH0KK30KKwogdm9pZCBEcmF3R2Fpbm1hcEJpdG1hcChTa0NhbnZhcyogYywgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLCBjb25zdCBTa1JlY3QmIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSZWN0JiBkc3QsIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZywgY29uc3QgU2tQYWludCogcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzOjpTcmNSZWN0Q29uc3RyYWludCBjb25zdHJhaW50LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLCBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAjaWZkZWYgX19BTkRST0lEX18KLSAgICBDYW52YXNDb250ZXh0KiBjb250ZXh0ID0gQ2FudmFzQ29udGV4dDo6Z2V0QWN0aXZlQ29udGV4dCgpOwotICAgIGZsb2F0IHRhcmdldFNkckhkclJhdGlvID0gY29udGV4dCA/IGNvbnRleHQtPnRhcmdldFNkckhkclJhdGlvKCkgOiAxLmY7CisgICAgYXV0byBkZXN0Q29sb3JzcGFjZSA9IGMtPmltYWdlSW5mbygpLnJlZkNvbG9yU3BhY2UoKTsKKyAgICBmbG9hdCB0YXJnZXRTZHJIZHJSYXRpbyA9IGdldFRhcmdldEhkclNkclJhdGlvKGRlc3RDb2xvcnNwYWNlLmdldCgpKTsKICAgICBpZiAodGFyZ2V0U2RySGRyUmF0aW8gPiAxLmYgJiYgZ2Fpbm1hcEltYWdlKSB7CiAgICAgICAgIFNrUGFpbnQgZ2Fpbm1hcFBhaW50ID0gKnBhaW50OwogICAgICAgICBmbG9hdCBzWCA9IGdhaW5tYXBJbWFnZS0+d2lkdGgoKSAvIChmbG9hdClpbWFnZS0+d2lkdGgoKTsKQEAgLTQ4LDkgKzgyLDkgQEAKICAgICAgICAgZ2Fpbm1hcFNyYy5mUmlnaHQgKj0gc1g7CiAgICAgICAgIGdhaW5tYXBTcmMuZlRvcCAqPSBzWTsKICAgICAgICAgZ2Fpbm1hcFNyYy5mQm90dG9tICo9IHNZOwotICAgICAgICBhdXRvIHNoYWRlciA9IFNrR2Fpbm1hcFNoYWRlcjo6TWFrZShpbWFnZSwgc3JjLCBzYW1wbGluZywgZ2Fpbm1hcEltYWdlLCBnYWlubWFwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZywgZ2Fpbm1hcEluZm8sIGRzdCwgdGFyZ2V0U2RySGRyUmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmltYWdlSW5mbygpLnJlZkNvbG9yU3BhY2UoKSk7CisgICAgICAgIGF1dG8gc2hhZGVyID0KKyAgICAgICAgICAgICAgICBTa0dhaW5tYXBTaGFkZXI6Ok1ha2UoaW1hZ2UsIHNyYywgc2FtcGxpbmcsIGdhaW5tYXBJbWFnZSwgZ2Fpbm1hcFNyYywgc2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5tYXBJbmZvLCBkc3QsIHRhcmdldFNkckhkclJhdGlvLCBkZXN0Q29sb3JzcGFjZSk7CiAgICAgICAgIGdhaW5tYXBQYWludC5zZXRTaGFkZXIoc2hhZGVyKTsKICAgICAgICAgYy0+ZHJhd1JlY3QoZHN0LCBnYWlubWFwUGFpbnQpOwogICAgIH0gZWxzZQpAQCAtNTgsNCArOTIsMjEzIEBACiAgICAgICAgIGMtPmRyYXdJbWFnZVJlY3QoaW1hZ2UuZ2V0KCksIHNyYywgZHN0LCBzYW1wbGluZywgcGFpbnQsIGNvbnN0cmFpbnQpOwogfQogCisjaWZkZWYgX19BTkRST0lEX18KKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIGdHYWlubWFwU0tTTFtdID0gUiJTS1NMKAorICAgIHVuaWZvcm0gc2hhZGVyIGJhc2U7CisgICAgdW5pZm9ybSBzaGFkZXIgZ2Fpbm1hcDsKKyAgICB1bmlmb3JtIGNvbG9yRmlsdGVyIHdvcmtpbmdTcGFjZVRvTGluZWFyU3JnYjsKKyAgICB1bmlmb3JtIGhhbGY0IGxvZ1JhdGlvTWluOworICAgIHVuaWZvcm0gaGFsZjQgbG9nUmF0aW9NYXg7CisgICAgdW5pZm9ybSBoYWxmNCBnYWlubWFwR2FtbWE7CisgICAgdW5pZm9ybSBoYWxmNCBlcHNpbG9uU2RyOworICAgIHVuaWZvcm0gaGFsZjQgZXBzaWxvbkhkcjsKKyAgICB1bmlmb3JtIGhhbGYgVzsKKyAgICB1bmlmb3JtIGludCBnYWlubWFwSXNBbHBoYTsKKyAgICB1bmlmb3JtIGludCBnYWlubWFwSXNSZWQ7CisgICAgdW5pZm9ybSBpbnQgc2luZ2xlQ2hhbm5lbDsKKyAgICB1bmlmb3JtIGludCBub0dhbW1hOworCisgICAgaGFsZjQgdG9EZXN0KGhhbGY0IHdvcmtpbmcpIHsKKyAgICAgICAgaGFsZjQgbHMgPSB3b3JraW5nU3BhY2VUb0xpbmVhclNyZ2IuZXZhbCh3b3JraW5nKTsKKyAgICAgICAgdmVjMyBkZXN0ID0gZnJvbUxpbmVhclNyZ2IobHMucmdiKTsKKyAgICAgICAgcmV0dXJuIGhhbGY0KGRlc3QuciwgZGVzdC5nLCBkZXN0LmIsIGxzLmEpOworICAgIH0KKworICAgIGhhbGY0IG1haW4oZmxvYXQyIGNvb3JkKSB7CisgICAgICAgIGhhbGY0IFMgPSBiYXNlLmV2YWwoY29vcmQpOworICAgICAgICBoYWxmNCBHID0gZ2Fpbm1hcC5ldmFsKGNvb3JkKTsKKyAgICAgICAgaWYgKGdhaW5tYXBJc0FscGhhID09IDEpIHsKKyAgICAgICAgICAgIEcgPSBoYWxmNChHLmEsIEcuYSwgRy5hLCAxLjApOworICAgICAgICB9CisgICAgICAgIGlmIChnYWlubWFwSXNSZWQgPT0gMSkgeworICAgICAgICAgICAgRyA9IGhhbGY0KEcuciwgRy5yLCBHLnIsIDEuMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpbmdsZUNoYW5uZWwgPT0gMSkgeworICAgICAgICAgICAgaGFsZiBMOworICAgICAgICAgICAgaWYgKG5vR2FtbWEgPT0gMSkgeworICAgICAgICAgICAgICAgIEwgPSBtaXgobG9nUmF0aW9NaW4uciwgbG9nUmF0aW9NYXguciwgRy5yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTCA9IG1peChsb2dSYXRpb01pbi5yLCBsb2dSYXRpb01heC5yLCBwb3coRy5yLCBnYWlubWFwR2FtbWEucikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFsZjMgSCA9IChTLnJnYiArIGVwc2lsb25TZHIucmdiKSAqIGV4cChMICogVykgLSBlcHNpbG9uSGRyLnJnYjsKKyAgICAgICAgICAgIHJldHVybiB0b0Rlc3QoaGFsZjQoSC5yLCBILmcsIEguYiwgUy5hKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYWxmMyBMOworICAgICAgICAgICAgaWYgKG5vR2FtbWEgPT0gMSkgeworICAgICAgICAgICAgICAgIEwgPSBtaXgobG9nUmF0aW9NaW4ucmdiLCBsb2dSYXRpb01heC5yZ2IsIEcucmdiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTCA9IG1peChsb2dSYXRpb01pbi5yZ2IsIGxvZ1JhdGlvTWF4LnJnYiwgcG93KEcucmdiLCBnYWlubWFwR2FtbWEucmdiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYWxmMyBIID0gKFMucmdiICsgZXBzaWxvblNkci5yZ2IpICogZXhwKEwgKiBXKSAtIGVwc2lsb25IZHIucmdiOworICAgICAgICAgICAgcmV0dXJuIHRvRGVzdChoYWxmNChILnIsIEguZywgSC5iLCBTLmEpKTsKKyAgICAgICAgfQorICAgIH0KKylTS1NMIjsKKworc3RhdGljIHNrX3NwPFNrUnVudGltZUVmZmVjdD4gZ2Fpbm1hcF9hcHBseV9lZmZlY3QoKSB7CisgICAgc3RhdGljIGNvbnN0IFNrUnVudGltZUVmZmVjdCogZWZmZWN0ID0gW10oKSAtPiBTa1J1bnRpbWVFZmZlY3QqIHsKKyAgICAgICAgYXV0byBidWlsZFJlc3VsdCA9IFNrUnVudGltZUVmZmVjdDo6TWFrZUZvclNoYWRlcihTa1N0cmluZyhnR2Fpbm1hcFNLU0wpLCB7fSk7CisgICAgICAgIGlmIChidWlsZFJlc3VsdC5lZmZlY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBidWlsZFJlc3VsdC5lZmZlY3QucmVsZWFzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiRmFpbGVkIHRvIGJ1aWxkIGdhaW5tYXAgc2hhZGVyOiAlcyIsIGJ1aWxkUmVzdWx0LmVycm9yVGV4dC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0oKTsKKyAgICBTa0FTU0VSVChlZmZlY3QpOworICAgIHJldHVybiBza19yZWZfc3AoZWZmZWN0KTsKK30KKworc3RhdGljIGJvb2wgYWxsX2NoYW5uZWxzX2VxdWFsKGNvbnN0IFNrQ29sb3I0ZiYgYykgeworICAgIHJldHVybiBjLmZSID09IGMuZkcgJiYgYy5mUiA9PSBjLmZCOworfQorCitjbGFzcyBEZWZlcnJlZEdhaW5tYXBTaGFkZXIgeworcHJpdmF0ZToKKyAgICBza19zcDxTa1J1bnRpbWVFZmZlY3Q+IG1TaGFkZXJ7Z2Fpbm1hcF9hcHBseV9lZmZlY3QoKX07CisgICAgU2tSdW50aW1lU2hhZGVyQnVpbGRlciBtQnVpbGRlcnttU2hhZGVyfTsKKyAgICBTa0dhaW5tYXBJbmZvIG1HYWlubWFwSW5mbzsKKyAgICBzdGQ6Om11dGV4IG1Vbmlmb3JtR3VhcmQ7CisKKyAgICB2b2lkIHNldHVwQ2hpbGRyZW4oY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGJhc2VJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGdhaW5tYXBJbWFnZSwgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmdPcHRpb25zKSB7CisgICAgICAgIHNrX3NwPFNrQ29sb3JTcGFjZT4gYmFzZUNvbG9yU3BhY2UgPQorICAgICAgICAgICAgICAgIGJhc2VJbWFnZS0+Y29sb3JTcGFjZSgpID8gYmFzZUltYWdlLT5yZWZDb2xvclNwYWNlKCkgOiBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjb2xvciBzcGFjZSBpbiB3aGljaCB0aGUgZ2Fpbm1hcCBtYXRoIGlzIHRvIGJlIGFwcGxpZWQuCisgICAgICAgIHNrX3NwPFNrQ29sb3JTcGFjZT4gZ2Fpbm1hcE1hdGhDb2xvclNwYWNlID0gYmFzZUNvbG9yU3BhY2UtPm1ha2VMaW5lYXJHYW1tYSgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGNvbG9yIGZpbHRlciB0byB0cmFuc2Zvcm0gZnJvbSB0aGUgYmFzZSBpbWFnZSdzIGNvbG9yIHNwYWNlIHRvIHRoZSBjb2xvciBzcGFjZQorICAgICAgICAvLyBpbiB3aGljaCB0aGUgZ2Fpbm1hcCBpcyB0byBiZSBhcHBsaWVkLgorICAgICAgICBhdXRvIGNvbG9yWGZvcm1TZHJUb0dhaW5tYXAgPQorICAgICAgICAgICAgICAgIFNrQ29sb3JGaWx0ZXJQcml2OjpNYWtlQ29sb3JTcGFjZVhmb3JtKGJhc2VDb2xvclNwYWNlLCBnYWlubWFwTWF0aENvbG9yU3BhY2UpOworCisgICAgICAgIC8vIFRoZSBiYXNlIGltYWdlIHNoYWRlciB3aWxsIGNvbnZlcnQgaW50byB0aGUgY29sb3Igc3BhY2UgaW4gd2hpY2ggdGhlIGdhaW5tYXAgaXMgYXBwbGllZC4KKyAgICAgICAgYXV0byBiYXNlSW1hZ2VTaGFkZXIgPSBiYXNlSW1hZ2UtPm1ha2VSYXdTaGFkZXIodGlsZU1vZGVYLCB0aWxlTW9kZVksIHNhbXBsaW5nT3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWFrZVdpdGhDb2xvckZpbHRlcihjb2xvclhmb3JtU2RyVG9HYWlubWFwKTsKKworICAgICAgICAvLyBUaGUgZ2Fpbm1hcCBpbWFnZSBzaGFkZXIgd2lsbCBpZ25vcmUgYW55IGNvbG9yIHNwYWNlIHRoYXQgdGhlIGdhaW5tYXAgaGFzLgorICAgICAgICBjb25zdCBTa01hdHJpeCBnYWlubWFwUmVjdFRvRHN0UmVjdCA9CisgICAgICAgICAgICAgICAgU2tNYXRyaXg6OlJlY3RUb1JlY3QoU2tSZWN0OjpNYWtlV0goZ2Fpbm1hcEltYWdlLT53aWR0aCgpLCBnYWlubWFwSW1hZ2UtPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1JlY3Q6Ok1ha2VXSChiYXNlSW1hZ2UtPndpZHRoKCksIGJhc2VJbWFnZS0+aGVpZ2h0KCkpKTsKKyAgICAgICAgYXV0byBnYWlubWFwSW1hZ2VTaGFkZXIgPSBnYWlubWFwSW1hZ2UtPm1ha2VSYXdTaGFkZXIodGlsZU1vZGVYLCB0aWxlTW9kZVksIHNhbXBsaW5nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhaW5tYXBSZWN0VG9Ec3RSZWN0KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjb2xvciBmaWx0ZXIgdG8gdHJhbnNmb3JtIGZyb20gdGhlIGNvbG9yIHNwYWNlIGluIHdoaWNoIHRoZSBnYWlubWFwIGlzIGFwcGxpZWQKKyAgICAgICAgLy8gdG8gdGhlIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZS4KKyAgICAgICAgYXV0byBjb2xvclhmb3JtR2Fpbm1hcFRvRHN0ID0gU2tDb2xvckZpbHRlclByaXY6Ok1ha2VDb2xvclNwYWNlWGZvcm0oCisgICAgICAgICAgICAgICAgZ2Fpbm1hcE1hdGhDb2xvclNwYWNlLCBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCTGluZWFyKCkpOworCisgICAgICAgIG1CdWlsZGVyLmNoaWxkKCJiYXNlIikgPSBzdGQ6Om1vdmUoYmFzZUltYWdlU2hhZGVyKTsKKyAgICAgICAgbUJ1aWxkZXIuY2hpbGQoImdhaW5tYXAiKSA9IHN0ZDo6bW92ZShnYWlubWFwSW1hZ2VTaGFkZXIpOworICAgICAgICBtQnVpbGRlci5jaGlsZCgid29ya2luZ1NwYWNlVG9MaW5lYXJTcmdiIikgPSBzdGQ6Om1vdmUoY29sb3JYZm9ybUdhaW5tYXBUb0RzdCk7CisgICAgfQorCisgICAgdm9pZCBzZXR1cEdlbmVyaWNVbmlmb3Jtcyhjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tHYWlubWFwSW5mbyYgZ2Fpbm1hcEluZm8pIHsKKyAgICAgICAgY29uc3QgU2tDb2xvcjRmIGxvZ1JhdGlvTWluKHtza19mbG9hdF9sb2coZ2Fpbm1hcEluZm8uZkdhaW5tYXBSYXRpb01pbi5mUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKGdhaW5tYXBJbmZvLmZHYWlubWFwUmF0aW9NaW4uZkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX2Zsb2F0X2xvZyhnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWluLmZCKSwgMS5mfSk7CisgICAgICAgIGNvbnN0IFNrQ29sb3I0ZiBsb2dSYXRpb01heCh7c2tfZmxvYXRfbG9nKGdhaW5tYXBJbmZvLmZHYWlubWFwUmF0aW9NYXguZlIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX2Zsb2F0X2xvZyhnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWF4LmZHKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza19mbG9hdF9sb2coZ2Fpbm1hcEluZm8uZkdhaW5tYXBSYXRpb01heC5mQiksIDEuZn0pOworICAgICAgICBjb25zdCBpbnQgbm9HYW1tYSA9IGdhaW5tYXBJbmZvLmZHYWlubWFwR2FtbWEuZlIgPT0gMS5mICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbm1hcEluZm8uZkdhaW5tYXBHYW1tYS5mRyA9PSAxLmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWlubWFwSW5mby5mR2Fpbm1hcEdhbW1hLmZCID09IDEuZjsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY29sb3JUeXBlRmxhZ3MgPSBTa0NvbG9yVHlwZUNoYW5uZWxGbGFncyhnYWlubWFwSW1hZ2UtPmNvbG9yVHlwZSgpKTsKKyAgICAgICAgY29uc3QgaW50IGdhaW5tYXBJc0FscGhhID0gY29sb3JUeXBlRmxhZ3MgPT0ga0FscGhhX1NrQ29sb3JDaGFubmVsRmxhZzsKKyAgICAgICAgY29uc3QgaW50IGdhaW5tYXBJc1JlZCA9IGNvbG9yVHlwZUZsYWdzID09IGtSZWRfU2tDb2xvckNoYW5uZWxGbGFnOworICAgICAgICBjb25zdCBpbnQgc2luZ2xlQ2hhbm5lbCA9IGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcEdhbW1hKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWluKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWF4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclR5cGVGbGFncyA9PSBrR3JheV9Ta0NvbG9yQ2hhbm5lbEZsYWcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JUeXBlRmxhZ3MgPT0ga0FscGhhX1NrQ29sb3JDaGFubmVsRmxhZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclR5cGVGbGFncyA9PSBrUmVkX1NrQ29sb3JDaGFubmVsRmxhZyk7CisgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oImxvZ1JhdGlvTWluIikgPSBsb2dSYXRpb01pbjsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgibG9nUmF0aW9NYXgiKSA9IGxvZ1JhdGlvTWF4OworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJnYWlubWFwR2FtbWEiKSA9IGdhaW5tYXBJbmZvLmZHYWlubWFwR2FtbWE7CisgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oImVwc2lsb25TZHIiKSA9IGdhaW5tYXBJbmZvLmZFcHNpbG9uU2RyOworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJlcHNpbG9uSGRyIikgPSBnYWlubWFwSW5mby5mRXBzaWxvbkhkcjsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgibm9HYW1tYSIpID0gbm9HYW1tYTsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgic2luZ2xlQ2hhbm5lbCIpID0gc2luZ2xlQ2hhbm5lbDsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgiZ2Fpbm1hcElzQWxwaGEiKSA9IGdhaW5tYXBJc0FscGhhOworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJnYWlubWFwSXNSZWQiKSA9IGdhaW5tYXBJc1JlZDsKKyAgICB9CisKKyAgICBza19zcDxjb25zdCBTa0RhdGE+IGJ1aWxkKGZsb2F0IHRhcmdldEhkclNkclJhdGlvKSB7CisgICAgICAgIHNrX3NwPGNvbnN0IFNrRGF0YT4gdW5pZm9ybXM7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjYWxsZWQgY29uY3VycmVudGx5IGZyb20gbXVsdGlwbGUgdGhyZWFkcywgd2UgbmVlZCB0byBndWFyZCB0aGUgY2FsbAorICAgICAgICAgICAgLy8gdG8gd3JpdGFibGVVbmlmb3JtcygpIHdoaWNoIG11dGF0ZXMgbVVuaWZvcm0uIFRoaXMgaXMgb3RoZXJ3aXNlIHNhZmUgYmVjYXVzZQorICAgICAgICAgICAgLy8gd3JpdGVhYmxlVW5pZm9ybXMoKSB3aWxsIG1ha2UgYSBjb3B5IGlmIGl0J3Mgbm90IHVuaXF1ZSBiZWZvcmUgbXV0YXRpbmcKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIEJpdG1hcFNoYWRlciBpcyB1c2VkIG9uIG11bHRpcGxlIGNhbnZhcycsIHN1Y2ggYXMgYQorICAgICAgICAgICAgLy8gc29mdHdhcmUgKyBoYXJkd2FyZSBjYW52YXMsIHdoaWNoIGlzIG90aGVyd2lzZSB2YWxpZCBhcyBTa1NoYWRlciBpcyAiaW1tdXRhYmxlIgorICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIF9sb2NrKG1Vbmlmb3JtR3VhcmQpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgV3VuY2xhbXBlZCA9IChza19mbG9hdF9sb2codGFyZ2V0SGRyU2RyUmF0aW8pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKG1HYWlubWFwSW5mby5mRGlzcGxheVJhdGlvU2RyKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza19mbG9hdF9sb2cobUdhaW5tYXBJbmZvLmZEaXNwbGF5UmF0aW9IZHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKG1HYWlubWFwSW5mby5mRGlzcGxheVJhdGlvU2RyKSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBXID0gc3RkOjptYXgoc3RkOjptaW4oV3VuY2xhbXBlZCwgMS5mKSwgMC5mKTsKKyAgICAgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oIlciKSA9IFc7CisgICAgICAgICAgICB1bmlmb3JtcyA9IG1CdWlsZGVyLnVuaWZvcm1zKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVuaWZvcm1zOworICAgIH0KKworcHVibGljOgorICAgIGV4cGxpY2l0IERlZmVycmVkR2Fpbm1hcFNoYWRlcihjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvLCBTa1RpbGVNb2RlIHRpbGVNb2RlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tUaWxlTW9kZSB0aWxlTW9kZVksIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZykgeworICAgICAgICBtR2Fpbm1hcEluZm8gPSBnYWlubWFwSW5mbzsKKyAgICAgICAgc2V0dXBDaGlsZHJlbihpbWFnZSwgZ2Fpbm1hcEltYWdlLCB0aWxlTW9kZVgsIHRpbGVNb2RlWSwgc2FtcGxpbmcpOworICAgICAgICBzZXR1cEdlbmVyaWNVbmlmb3JtcyhnYWlubWFwSW1hZ2UsIGdhaW5tYXBJbmZvKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc2tfc3A8U2tTaGFkZXI+IE1ha2UoY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbywgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmcpIHsKKyAgICAgICAgYXV0byBkZWZlcnJlZEhhbmRsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPERlZmVycmVkR2Fpbm1hcFNoYWRlcj4oCisgICAgICAgICAgICAgICAgaW1hZ2UsIGdhaW5tYXBJbWFnZSwgZ2Fpbm1hcEluZm8sIHRpbGVNb2RlWCwgdGlsZU1vZGVZLCBzYW1wbGluZyk7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgIFtkZWZlcnJlZEhhbmRsZXJdKGNvbnN0IFNrUnVudGltZUVmZmVjdFByaXY6OlVuaWZvcm1zQ2FsbGJhY2tDb250ZXh0JiByZW5kZXJDb250ZXh0KQorICAgICAgICAgICAgICAgIC0+IHNrX3NwPGNvbnN0IFNrRGF0YT4geworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkSGFuZGxlci0+YnVpbGQoZ2V0VGFyZ2V0SGRyU2RyUmF0aW8ocmVuZGVyQ29udGV4dC5mRHN0Q29sb3JTcGFjZSkpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gU2tSdW50aW1lRWZmZWN0UHJpdjo6TWFrZURlZmVycmVkU2hhZGVyKGRlZmVycmVkSGFuZGxlci0+bVNoYWRlci5nZXQoKSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRIYW5kbGVyLT5tQnVpbGRlci5jaGlsZHJlbigpKTsKKyAgICB9Cit9OworCitza19zcDxTa1NoYWRlcj4gTWFrZUdhaW5tYXBTaGFkZXIoY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tHYWlubWFwSW5mbyYgZ2Fpbm1hcEluZm8sIFNrVGlsZU1vZGUgdGlsZU1vZGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmcpIHsKKyAgICByZXR1cm4gRGVmZXJyZWRHYWlubWFwU2hhZGVyOjpNYWtlKGltYWdlLCBnYWlubWFwSW1hZ2UsIGdhaW5tYXBJbmZvLCB0aWxlTW9kZVgsIHRpbGVNb2RlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nKTsKK30KKworI2Vsc2UgIC8vIF9fQU5EUk9JRF9fCisKK3NrX3NwPFNrU2hhZGVyPiBNYWtlR2Fpbm1hcFNoYWRlcihjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGdhaW5tYXBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbywgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tUaWxlTW9kZSB0aWxlTW9kZVksIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKK30KKworI2VuZGlmICAvLyBfX0FORFJPSURfXworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9lZmZlY3RzL0dhaW5tYXBSZW5kZXJlci5oIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKaW5kZXggN2M1NmQ5NC4uNGVkMjQ0NSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKKysrIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKQEAgLTMwLDQgKzMwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXM6OlNyY1JlY3RDb25zdHJhaW50IGNvbnN0cmFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvKTsKIAorc2tfc3A8U2tTaGFkZXI+IE1ha2VHYWlubWFwU2hhZGVyKGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvLCBTa1RpbGVNb2RlIHRpbGVNb2RlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1RpbGVNb2RlIHRpbGVNb2RlWSwgY29uc3QgU2tTYW1wbGluZ09wdGlvbnMmIHNhbXBsaW5nKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXIKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9qbmkvU2hhZGVyLmNwcCBiL2xpYnMvaHd1aS9qbmkvU2hhZGVyLmNwcAppbmRleCA3NWQ0NWU1Li43ZWI3OWJlIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvam5pL1NoYWRlci5jcHAKKysrIGIvbGlicy9od3VpL2puaS9TaGFkZXIuY3BwCkBAIC0xLDYgKzEsOSBAQAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiU2hhZGVySk5JIgogCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiR2Fpbm1hcC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzSk5JLmgiCiAjaW5jbHVkZSAiU2tCaXRtYXAuaCIKICNpbmNsdWRlICJTa0JsZW5kTW9kZS5oIgpAQCAtMTcsMTAgKzIwLDkgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrU3RyaW5nLmgiCiAjaW5jbHVkZSAiU2tUaWxlTW9kZS5oIgorI2luY2x1ZGUgImVmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9lZmZlY3RzL1NrUnVudGltZUVmZmVjdC5oIgogCi0jaW5jbHVkZSA8dmVjdG9yPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcjsKIAogLyoqCkBAIC03NCw3ICs3NiwyMCBAQAogICAgIGlmIChiaXRtYXBIYW5kbGUpIHsKICAgICAgICAgLy8gT25seSBwYXNzIGEgdmFsaWQgU2tCaXRtYXAgb2JqZWN0IHRvIHRoZSBjb25zdHJ1Y3RvciBpZiB0aGUgQml0bWFwIGV4aXN0cy4gT3RoZXJ3aXNlLAogICAgICAgICAvLyB3ZSdsbCBwYXNzIGFuIGVtcHR5IFNrQml0bWFwIHRvIGF2b2lkIGNyYXNoaW5nL2V4Y2VwdGluZyBmb3IgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgaW1hZ2UgPSBhbmRyb2lkOjpiaXRtYXA6OnRvQml0bWFwKGJpdG1hcEhhbmRsZSkubWFrZUltYWdlKCk7CisgICAgICAgIGF1dG8mIGJpdG1hcCA9IGFuZHJvaWQ6OmJpdG1hcDo6dG9CaXRtYXAoYml0bWFwSGFuZGxlKTsKKyAgICAgICAgaW1hZ2UgPSBiaXRtYXAubWFrZUltYWdlKCk7CisKKyAgICAgICAgaWYgKCFpc0RpcmVjdFNhbXBsZWQgJiYgYml0bWFwLmhhc0dhaW5tYXAoKSkgeworICAgICAgICAgICAgc2tfc3A8U2tTaGFkZXI+IGdhaW5tYXBTaGFkZXIgPSBNYWtlR2Fpbm1hcFNoYWRlcigKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UsIGJpdG1hcC5nYWlubWFwKCktPmJpdG1hcC0+bWFrZUltYWdlKCksIGJpdG1hcC5nYWlubWFwKCktPmluZm8sCisgICAgICAgICAgICAgICAgICAgIChTa1RpbGVNb2RlKXRpbGVNb2RlWCwgKFNrVGlsZU1vZGUpdGlsZU1vZGVZLCBzYW1wbGluZyk7CisgICAgICAgICAgICBpZiAoZ2Fpbm1hcFNoYWRlcikgeworICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2Fpbm1hcFNoYWRlciA9IGdhaW5tYXBTaGFkZXItPm1ha2VXaXRoTG9jYWxNYXRyaXgoKm1hdHJpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGpsb25nPihnYWlubWFwU2hhZGVyLnJlbGVhc2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIWltYWdlLmdldCgpKSB7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvcmVuZGVydGhyZWFkL0NhbnZhc0NvbnRleHQuY3BwIGIvbGlicy9od3VpL3JlbmRlcnRocmVhZC9DYW52YXNDb250ZXh0LmNwcAppbmRleCBmMTBiMmIyLi5kZDc4MWJiIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvcmVuZGVydGhyZWFkL0NhbnZhc0NvbnRleHQuY3BwCisrKyBiL2xpYnMvaHd1aS9yZW5kZXJ0aHJlYWQvQ2FudmFzQ29udGV4dC5jcHAKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIH0KICAgICBzd2l0Y2ggKG1Db2xvck1vZGUpIHsKICAgICAgICAgY2FzZSBDb2xvck1vZGU6OkhkcjoKLSAgICAgICAgICAgIHJldHVybiAzLmY7ICAvLyBUT0RPOiBSZWZpbmUgdGhpcyBudW1iZXIKKyAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzOjptYXhIZHJIZWFkcm9vbU9uOGJpdDsKICAgICAgICAgY2FzZSBDb2xvck1vZGU6OkhkcjEwOgogICAgICAgICAgICAgcmV0dXJuIDEwLmY7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9saWJzL2lucHV0L01vdXNlQ3Vyc29yQ29udHJvbGxlci5jcHAgYi9saWJzL2lucHV0L01vdXNlQ3Vyc29yQ29udHJvbGxlci5jcHAKaW5kZXggMjRjZmM5ZC4uYzM5ODQwNSAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Nb3VzZUN1cnNvckNvbnRyb2xsZXIuY3BwCisrKyBiL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmNwcApAQCAtNjMsMjQgKzYzLDIzIEBACiAgICAgbUxvY2tlZC5wb2ludGVyU3ByaXRlLmNsZWFyKCk7CiB9CiAKLWJvb2wgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRCb3VuZHMoZmxvYXQqIG91dE1pblgsIGZsb2F0KiBvdXRNaW5ZLCBmbG9hdCogb3V0TWF4WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG91dE1heFkpIGNvbnN0IHsKK3N0ZDo6b3B0aW9uYWw8RmxvYXRSZWN0PiBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldEJvdW5kcygpIGNvbnN0IHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobUxvY2spOwogCi0gICAgcmV0dXJuIGdldEJvdW5kc0xvY2tlZChvdXRNaW5YLCBvdXRNaW5ZLCBvdXRNYXhYLCBvdXRNYXhZKTsKKyAgICByZXR1cm4gZ2V0Qm91bmRzTG9ja2VkKCk7CiB9CiAKLWJvb2wgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRCb3VuZHNMb2NrZWQoZmxvYXQqIG91dE1pblgsIGZsb2F0KiBvdXRNaW5ZLCBmbG9hdCogb3V0TWF4WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG91dE1heFkpIGNvbnN0IFJFUVVJUkVTKG1Mb2NrKSB7CitzdGQ6Om9wdGlvbmFsPEZsb2F0UmVjdD4gTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRCb3VuZHNMb2NrZWQoKSBjb25zdCBSRVFVSVJFUyhtTG9jaykgewogICAgIGlmICghbUxvY2tlZC52aWV3cG9ydC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4ge307CiAgICAgfQogCi0gICAgKm91dE1pblggPSBtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxMZWZ0OwotICAgICpvdXRNaW5ZID0gbUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsVG9wOwotICAgICpvdXRNYXhYID0gbUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsUmlnaHQgLSAxOwotICAgICpvdXRNYXhZID0gbUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsQm90dG9tIC0gMTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gRmxvYXRSZWN0eworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1Mb2NrZWQudmlld3BvcnQubG9naWNhbExlZnQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1Mb2NrZWQudmlld3BvcnQubG9naWNhbFRvcCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsUmlnaHQgLSAxKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxCb3R0b20gLSAxKSwKKyAgICB9OwogfQogCiB2b2lkIE1vdXNlQ3Vyc29yQ29udHJvbGxlcjo6bW92ZShmbG9hdCBkZWx0YVgsIGZsb2F0IGRlbHRhWSkgewpAQCAtMTIxLDMxICsxMjAsMTkgQEAKIH0KIAogdm9pZCBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OnNldFBvc2l0aW9uTG9ja2VkKGZsb2F0IHgsIGZsb2F0IHkpIFJFUVVJUkVTKG1Mb2NrKSB7Ci0gICAgZmxvYXQgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKLSAgICBpZiAoZ2V0Qm91bmRzTG9ja2VkKCZtaW5YLCAmbWluWSwgJm1heFgsICZtYXhZKSkgewotICAgICAgICBpZiAoeCA8PSBtaW5YKSB7Ci0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJYID0gbWluWDsKLSAgICAgICAgfSBlbHNlIGlmICh4ID49IG1heFgpIHsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclggPSBtYXhYOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWCA9IHg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgPD0gbWluWSkgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWSA9IG1pblk7Ci0gICAgICAgIH0gZWxzZSBpZiAoeSA+PSBtYXhZKSB7Ci0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJZID0gbWF4WTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclkgPSB5OwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKLSAgICB9CisgICAgY29uc3QgYXV0byBib3VuZHMgPSBnZXRCb3VuZHNMb2NrZWQoKTsKKyAgICBpZiAoIWJvdW5kcykgcmV0dXJuOworCisgICAgbUxvY2tlZC5wb2ludGVyWCA9IHN0ZDo6bWF4KGJvdW5kcy0+bGVmdCwgc3RkOjptaW4oYm91bmRzLT5yaWdodCwgeCkpOworICAgIG1Mb2NrZWQucG9pbnRlclkgPSBzdGQ6Om1heChib3VuZHMtPnRvcCwgc3RkOjptaW4oYm91bmRzLT5ib3R0b20sIHkpKTsKKworICAgIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKIH0KIAotdm9pZCBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldFBvc2l0aW9uKGZsb2F0KiBvdXRYLCBmbG9hdCogb3V0WSkgY29uc3QgeworRmxvYXRQb2ludCBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldFBvc2l0aW9uKCkgY29uc3QgewogICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICAqb3V0WCA9IG1Mb2NrZWQucG9pbnRlclg7Ci0gICAgKm91dFkgPSBtTG9ja2VkLnBvaW50ZXJZOworICAgIHJldHVybiB7bUxvY2tlZC5wb2ludGVyWCwgbUxvY2tlZC5wb2ludGVyWX07CiB9CiAKIGludDMyX3QgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXREaXNwbGF5SWQoKSBjb25zdCB7CkBAIC0yMzUsMTAgKzIyMiw5IEBACiAgICAgLy8gUmVzZXQgY3Vyc29yIHBvc2l0aW9uIHRvIGNlbnRlciBpZiBzaXplIG9yIGRpc3BsYXkgY2hhbmdlZC4KICAgICBpZiAob2xkVmlld3BvcnQuZGlzcGxheUlkICE9IHZpZXdwb3J0LmRpc3BsYXlJZCB8fCBvbGREaXNwbGF5V2lkdGggIT0gbmV3RGlzcGxheVdpZHRoIHx8CiAgICAgICAgIG9sZERpc3BsYXlIZWlnaHQgIT0gbmV3RGlzcGxheUhlaWdodCkgewotICAgICAgICBmbG9hdCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZOwotICAgICAgICBpZiAoZ2V0Qm91bmRzTG9ja2VkKCZtaW5YLCAmbWluWSwgJm1heFgsICZtYXhZKSkgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWCA9IChtaW5YICsgbWF4WCkgKiAwLjVmOwotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWSA9IChtaW5ZICsgbWF4WSkgKiAwLjVmOworICAgICAgICBpZiAoY29uc3QgYXV0byBib3VuZHMgPSBnZXRCb3VuZHNMb2NrZWQoKTsgYm91bmRzKSB7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJYID0gKGJvdW5kcy0+bGVmdCArIGJvdW5kcy0+cmlnaHQpICogMC41ZjsKKyAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclkgPSAoYm91bmRzLT50b3AgKyBib3VuZHMtPmJvdHRvbSkgKiAwLjVmOwogICAgICAgICAgICAgLy8gUmVsb2FkIGljb24gcmVzb3VyY2VzIGZvciBkZW5zaXR5IG1heSBiZSBjaGFuZ2VkLgogICAgICAgICAgICAgbG9hZFJlc291cmNlc0xvY2tlZChnZXRBZGRpdGlvbmFsTW91c2VSZXNvdXJjZXMpOwogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbGlicy9pbnB1dC9Nb3VzZUN1cnNvckNvbnRyb2xsZXIuaCBiL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmgKaW5kZXggZGIwYWI1Ni4uMjZiZTJhOCAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Nb3VzZUN1cnNvckNvbnRyb2xsZXIuaAorKysgYi9saWJzL2lucHV0L01vdXNlQ3Vyc29yQ29udHJvbGxlci5oCkBAIC00MywxMiArNDMsMTIgQEAKICAgICBNb3VzZUN1cnNvckNvbnRyb2xsZXIoUG9pbnRlckNvbnRyb2xsZXJDb250ZXh0JiBjb250ZXh0KTsKICAgICB+TW91c2VDdXJzb3JDb250cm9sbGVyKCk7CiAKLSAgICBib29sIGdldEJvdW5kcyhmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLCBmbG9hdCogb3V0TWF4WSkgY29uc3Q7CisgICAgc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IGdldEJvdW5kcygpIGNvbnN0OwogICAgIHZvaWQgbW92ZShmbG9hdCBkZWx0YVgsIGZsb2F0IGRlbHRhWSk7CiAgICAgdm9pZCBzZXRCdXR0b25TdGF0ZShpbnQzMl90IGJ1dHRvblN0YXRlKTsKICAgICBpbnQzMl90IGdldEJ1dHRvblN0YXRlKCkgY29uc3Q7CiAgICAgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KTsKLSAgICB2b2lkIGdldFBvc2l0aW9uKGZsb2F0KiBvdXRYLCBmbG9hdCogb3V0WSkgY29uc3Q7CisgICAgRmxvYXRQb2ludCBnZXRQb3NpdGlvbigpIGNvbnN0OwogICAgIGludDMyX3QgZ2V0RGlzcGxheUlkKCkgY29uc3Q7CiAgICAgdm9pZCBmYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwogICAgIHZvaWQgdW5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAKICAgICB9IG1Mb2NrZWQgR1VBUkRFRF9CWShtTG9jayk7CiAKLSAgICBib29sIGdldEJvdW5kc0xvY2tlZChmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLCBmbG9hdCogb3V0TWF4WSkgY29uc3Q7CisgICAgc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IGdldEJvdW5kc0xvY2tlZCgpIGNvbnN0OwogICAgIHZvaWQgc2V0UG9zaXRpb25Mb2NrZWQoZmxvYXQgeCwgZmxvYXQgeSk7CiAKICAgICB2b2lkIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuY3BwIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKaW5kZXggZmVkZjU4ZC4uNTQ0ZWRjMiAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKKysrIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKQEAgLTExNCwxNiArMTE0LDE1IEBACiBQb2ludGVyQ29udHJvbGxlcjo6flBvaW50ZXJDb250cm9sbGVyKCkgewogICAgIG1EaXNwbGF5SW5mb0xpc3RlbmVyLT5vblBvaW50ZXJDb250cm9sbGVyRGVzdHJveWVkKCk7CiAgICAgbVVucmVnaXN0ZXJXaW5kb3dJbmZvc0xpc3RlbmVyKG1EaXNwbGF5SW5mb0xpc3RlbmVyKTsKLSAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChBRElTUExBWV9JRF9OT05FLCAwLCAwKTsKKyAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChBRElTUExBWV9JRF9OT05FLCBGbG9hdFBvaW50ezAsIDB9KTsKIH0KIAogc3RkOjptdXRleCYgUG9pbnRlckNvbnRyb2xsZXI6OmdldExvY2soKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EaXNwbGF5SW5mb0xpc3RlbmVyLT5tTG9jazsKIH0KIAotYm9vbCBQb2ludGVyQ29udHJvbGxlcjo6Z2V0Qm91bmRzKGZsb2F0KiBvdXRNaW5YLCBmbG9hdCogb3V0TWluWSwgZmxvYXQqIG91dE1heFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG91dE1heFkpIGNvbnN0IHsKLSAgICByZXR1cm4gbUN1cnNvckNvbnRyb2xsZXIuZ2V0Qm91bmRzKG91dE1pblgsIG91dE1pblksIG91dE1heFgsIG91dE1heFkpOworc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IFBvaW50ZXJDb250cm9sbGVyOjpnZXRCb3VuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DdXJzb3JDb250cm9sbGVyLmdldEJvdW5kcygpOwogfQogCiB2b2lkIFBvaW50ZXJDb250cm9sbGVyOjptb3ZlKGZsb2F0IGRlbHRhWCwgZmxvYXQgZGVsdGFZKSB7CkBAIC0xNTYsMTUgKzE1NSwxMyBAQAogICAgIG1DdXJzb3JDb250cm9sbGVyLnNldFBvc2l0aW9uKHRyYW5zZm9ybWVkLngsIHRyYW5zZm9ybWVkLnkpOwogfQogCi12b2lkIFBvaW50ZXJDb250cm9sbGVyOjpnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0IHsKK0Zsb2F0UG9pbnQgUG9pbnRlckNvbnRyb2xsZXI6OmdldFBvc2l0aW9uKCkgY29uc3QgewogICAgIGNvbnN0IGludDMyX3QgZGlzcGxheUlkID0gbUN1cnNvckNvbnRyb2xsZXIuZ2V0RGlzcGxheUlkKCk7Ci0gICAgbUN1cnNvckNvbnRyb2xsZXIuZ2V0UG9zaXRpb24ob3V0WCwgb3V0WSk7CisgICAgY29uc3QgYXV0byBwID0gbUN1cnNvckNvbnRyb2xsZXIuZ2V0UG9zaXRpb24oKTsKICAgICB7CiAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhnZXRMb2NrKCkpOwogICAgICAgICBjb25zdCBhdXRvJiB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1Gb3JEaXNwbGF5TG9ja2VkKGRpc3BsYXlJZCk7Ci0gICAgICAgIGNvbnN0IGF1dG8geHkgPSB0cmFuc2Zvcm0uaW52ZXJzZSgpLnRyYW5zZm9ybSgqb3V0WCwgKm91dFkpOwotICAgICAgICAqb3V0WCA9IHh5Lng7Ci0gICAgICAgICpvdXRZID0geHkueTsKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnR7dHJhbnNmb3JtLmludmVyc2UoKS50cmFuc2Zvcm0ocC54LCBwLnkpfTsKICAgICB9CiB9CiAKQEAgLTI2MiwxOSArMjU5LDMxIEBACiB9CiAKIHZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnNldERpc3BsYXlWaWV3cG9ydChjb25zdCBEaXNwbGF5Vmlld3BvcnQmIHZpZXdwb3J0KSB7Ci0gICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKGdldExvY2soKSk7CisgICAgc3RydWN0IFBvaW50ZXJEaXNwbGF5Q2hhbmdlQXJncyB7CisgICAgICAgIGludDMyX3QgZGlzcGxheUlkOworICAgICAgICBGbG9hdFBvaW50IGN1cnNvclBvc2l0aW9uOworICAgIH07CisgICAgc3RkOjpvcHRpb25hbDxQb2ludGVyRGlzcGxheUNoYW5nZUFyZ3M+IHBvaW50ZXJEaXNwbGF5Q2hhbmdlZDsKIAotICAgIGJvb2wgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzID0gZmFsc2U7Ci0gICAgaWYgKG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlBPSU5URVIgfHwKLSAgICAgICAgbUxvY2tlZC5wcmVzZW50YXRpb24gPT0gUG9pbnRlckNvbnRyb2xsZXI6OlByZXNlbnRhdGlvbjo6U1RZTFVTX0hPVkVSKSB7Ci0gICAgICAgIGdldEFkZGl0aW9uYWxNb3VzZVJlc291cmNlcyA9IHRydWU7Ci0gICAgfQotICAgIG1DdXJzb3JDb250cm9sbGVyLnNldERpc3BsYXlWaWV3cG9ydCh2aWV3cG9ydCwgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzKTsKLSAgICBpZiAodmlld3BvcnQuZGlzcGxheUlkICE9IG1Mb2NrZWQucG9pbnRlckRpc3BsYXlJZCkgewotICAgICAgICBmbG9hdCB4UG9zLCB5UG9zOwotICAgICAgICBtQ3Vyc29yQ29udHJvbGxlci5nZXRQb3NpdGlvbigmeFBvcywgJnlQb3MpOwotICAgICAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZCh2aWV3cG9ydC5kaXNwbGF5SWQsIHhQb3MsIHlQb3MpOwotICAgICAgICBtTG9ja2VkLnBvaW50ZXJEaXNwbGF5SWQgPSB2aWV3cG9ydC5kaXNwbGF5SWQ7CisgICAgeyAvLyBhY3F1aXJlIGxvY2sKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKGdldExvY2soKSk7CisKKyAgICAgICAgYm9vbCBnZXRBZGRpdGlvbmFsTW91c2VSZXNvdXJjZXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlBPSU5URVIgfHwKKyAgICAgICAgICAgIG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlNUWUxVU19IT1ZFUikgeworICAgICAgICAgICAgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQ3Vyc29yQ29udHJvbGxlci5zZXREaXNwbGF5Vmlld3BvcnQodmlld3BvcnQsIGdldEFkZGl0aW9uYWxNb3VzZVJlc291cmNlcyk7CisgICAgICAgIGlmICh2aWV3cG9ydC5kaXNwbGF5SWQgIT0gbUxvY2tlZC5wb2ludGVyRGlzcGxheUlkKSB7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJEaXNwbGF5SWQgPSB2aWV3cG9ydC5kaXNwbGF5SWQ7CisgICAgICAgICAgICBwb2ludGVyRGlzcGxheUNoYW5nZWQgPSB7dmlld3BvcnQuZGlzcGxheUlkLCBtQ3Vyc29yQ29udHJvbGxlci5nZXRQb3NpdGlvbigpfTsKKyAgICAgICAgfQorICAgIH0gLy8gcmVsZWFzZSBsb2NrCisKKyAgICBpZiAocG9pbnRlckRpc3BsYXlDaGFuZ2VkKSB7CisgICAgICAgIC8vIE5vdGlmeSB0aGUgcG9saWN5IHdpdGhvdXQgaG9sZGluZyB0aGUgcG9pbnRlciBjb250cm9sbGVyIGxvY2suCisgICAgICAgIG1Db250ZXh0LmdldFBvbGljeSgpLT5vblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKHBvaW50ZXJEaXNwbGF5Q2hhbmdlZC0+ZGlzcGxheUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyRGlzcGxheUNoYW5nZWQtPmN1cnNvclBvc2l0aW9uKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaCBiL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaAppbmRleCA0OGQ1YTU3Li42ZDM1NTdjIDEwMDY0NAotLS0gYS9saWJzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmgKKysrIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5oCkBAIC01MCwxMiArNTAsMTIgQEAKIAogICAgIH5Qb2ludGVyQ29udHJvbGxlcigpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBib29sIGdldEJvdW5kcyhmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLCBmbG9hdCogb3V0TWF4WSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPEZsb2F0UmVjdD4gZ2V0Qm91bmRzKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIG1vdmUoZmxvYXQgZGVsdGFYLCBmbG9hdCBkZWx0YVkpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRCdXR0b25TdGF0ZShpbnQzMl90IGJ1dHRvblN0YXRlKTsKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnV0dG9uU3RhdGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSk7Ci0gICAgdmlydHVhbCB2b2lkIGdldFBvc2l0aW9uKGZsb2F0KiBvdXRYLCBmbG9hdCogb3V0WSkgY29uc3Q7CisgICAgdmlydHVhbCBGbG9hdFBvaW50IGdldFBvc2l0aW9uKCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldERpc3BsYXlJZCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7CiAgICAgdmlydHVhbCB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwpkaWZmIC0tZ2l0IGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlckNvbnRleHQuaCBiL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXJDb250ZXh0LmgKaW5kZXggOTZkODNhNS4uZjZmNWQzYiAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlckNvbnRleHQuaAorKysgYi9saWJzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyQ29udGV4dC5oCkBAIC04MSw3ICs4MSw3IEBACiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRQb2ludGVySWNvbklkKCkgPSAwOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0U3R5bHVzSWNvbklkKCkgPSAwOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXRDdXN0b21Qb2ludGVySWNvbklkKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKGludDMyX3QgZGlzcGxheUlkLCBmbG9hdCB4UG9zLCBmbG9hdCB5UG9zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uKSA9IDA7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvbGlicy9pbnB1dC90ZXN0cy9Qb2ludGVyQ29udHJvbGxlcl90ZXN0LmNwcCBiL2xpYnMvaW5wdXQvdGVzdHMvUG9pbnRlckNvbnRyb2xsZXJfdGVzdC5jcHAKaW5kZXggYzgyMGQwMC4uMjM3OGQ0MiAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC90ZXN0cy9Qb2ludGVyQ29udHJvbGxlcl90ZXN0LmNwcAorKysgYi9saWJzL2lucHV0L3Rlc3RzL1BvaW50ZXJDb250cm9sbGVyX3Rlc3QuY3BwCkBAIC02MCw3ICs2MCw3IEBACiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRQb2ludGVySWNvbklkKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRTdHlsdXNJY29uSWQoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIFBvaW50ZXJJY29uU3R5bGUgZ2V0Q3VzdG9tUG9pbnRlckljb25JZCgpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgdm9pZCBvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKGludDMyX3QgZGlzcGxheUlkLCBmbG9hdCB4UG9zLCBmbG9hdCB5UG9zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IGRpc3BsYXlJZCwgY29uc3QgRmxvYXRQb2ludCYgcG9zaXRpb24pIG92ZXJyaWRlOwogCiAgICAgYm9vbCBhbGxSZXNvdXJjZXNBcmVMb2FkZWQoKTsKICAgICBib29sIG5vUmVzb3VyY2VzQXJlTG9hZGVkKCk7CkBAIC0xNDMsOCArMTQzLDggQEAKIH0KIAogdm9pZCBNb2NrUG9pbnRlckNvbnRyb2xsZXJQb2xpY3lJbnRlcmZhY2U6Om9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKnhQb3MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qeVBvcyovKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiAvKnBvc2l0aW9uKi8KKykgewogICAgIGxhdGVzdFBvaW50ZXJEaXNwbGF5SWQgPSBkaXNwbGF5SWQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5qYXZhCmluZGV4IDIzZjg3YWIuLmY4NmI5YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuamF2YQpAQCAtMTU2Niw3ICsxNTY2LDcgQEAKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBsb2FkQXR0cmlidXRlcyhpbik7CisgICAgICAgICAgICBsb2FkQXR0cmlidXRlcyhpbiwgZmlsZURlc2NyaXB0b3IpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgY2xvc2VRdWlldGx5KGluKTsKICAgICAgICAgICAgIGlmIChpc0ZkRHVwZWQpIHsKQEAgLTE2MzcsNyArMTYzNyw3IEBACiAgICAgICAgICAgICAgICAgbVNlZWthYmxlRmlsZURlc2NyaXB0b3IgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGxvYWRBdHRyaWJ1dGVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgbG9hZEF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0sIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk2Myw3ICsxOTYzLDcgQEAKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGRlY2lkZXMgd2hpY2ggcGFyc2VyIHRvIHJlYWQgdGhlIGltYWdlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0KICAgICAgKiB0eXBlIGFuZCB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgc3RyZWFtLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkQXR0cmlidXRlcyhATm9uTnVsbCBJbnB1dFN0cmVhbSBpbikgeworICAgIHByaXZhdGUgdm9pZCBsb2FkQXR0cmlidXRlcyhATm9uTnVsbCBJbnB1dFN0cmVhbSBpbiwgQE51bGxhYmxlIEZpbGVEZXNjcmlwdG9yIGZkKSB7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImlucHV0c3RyZWFtIHNob3VsZG4ndCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE5OTMsNyArMTk5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjYXNlIElNQUdFX1RZUEVfSEVJRjogewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZkF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZkF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0sIGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU1BR0VfVFlQRV9PUkY6IHsKQEAgLTI1ODAsNyArMjU4MCw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2Vla2FibGVGRChpbi5nZXRGRCgpKSkgewogICAgICAgICAgICAgICAgIG1TZWVrYWJsZUZpbGVEZXNjcmlwdG9yID0gaW4uZ2V0RkQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGVzKGluKTsKKyAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGVzKGluLCBudWxsKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGNsb3NlUXVpZXRseShpbik7CiAgICAgICAgICAgICBpZiAobW9kZXJuRmQgIT0gbnVsbCkgewpAQCAtMzA2OCw1OSArMzA2OCw2NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGdldEhlaWZBdHRyaWJ1dGVzKEJ5dGVPcmRlcmVkRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBnZXRIZWlmQXR0cmlidXRlcyhCeXRlT3JkZXJlZERhdGFJbnB1dFN0cmVhbSBpbiwgQE51bGxhYmxlIEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlciByZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UobmV3IE1lZGlhRGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgICAgICBsb25nIG1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoZmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShuZXcgTWVkaWFEYXRhU291cmNlKCkgeworICAgICAgICAgICAgICAgICAgICBsb25nIG1Qb3NpdGlvbjsKIAotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkQXQobG9uZyBwb3NpdGlvbiwgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWRBdChsb25nIHBvc2l0aW9uLCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbiAhPSBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyBzZWVrIHRvIHBvc2l0aW9ucyBhZnRlciB0aGUgYXZhaWxhYmxlIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgc3RyZWFtIHdvbid0IGJlIGFibGUgdG8gc2VlayBiYWNrIHRoZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGhpdCBhbiBleGNlcHRpb24gYmVmb3JlIChtUG9zaXRpb24gc2V0IHRvIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGl0IHRyeSB0aGUgc2VlayBpbiBob3BlIGl0IG1pZ2h0IHJlY292ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9zaXRpb24gPj0gMCAmJiBwb3NpdGlvbiA+PSBtUG9zaXRpb24gKyBpbi5hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLnNlZWsocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVhZCB3aWxsIGNhdXNlIHVzIHRvIGdvIG92ZXIgdGhlIGF2YWlsYWJsZSBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgdGhlIHNpemUgc28gdGhhdCB3ZSBzdGF5IGluIHRoZSBhdmFpbGFibGUgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBpbnB1dCBzdHJlYW0gbWF5IG5vdCBiZSBhYmxlIHRvIHNlZWsgYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGluLmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbi5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaW4ucmVhZChidWZmZXIsIG9mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFic29yYiB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsIHRocm91Z2ggdG8gdGhlICdmYWlsZWQgcmVhZCcgcGF0aCBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uID0gLTE7IC8vIG5lZWQgdG8gc2VlayBvbiBuZXh0IHJlYWQKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbiAhPSBwb3NpdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHNlZWsgdG8gcG9zaXRpb25zIGFmdGVyIHRoZSBhdmFpbGFibGUgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IHN0cmVhbSB3b24ndCBiZSBhYmxlIHRvIHNlZWsgYmFjayB0aGVuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGhpdCBhbiBleGNlcHRpb24gYmVmb3JlIChtUG9zaXRpb24gc2V0IHRvIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaXQgdHJ5IHRoZSBzZWVrIGluIGhvcGUgaXQgbWlnaHQgcmVjb3Zlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPj0gbVBvc2l0aW9uICsgaW4uYXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zZWVrKHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlYWQgd2lsbCBjYXVzZSB1cyB0byBnbyBvdmVyIHRoZSBhdmFpbGFibGUgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgdGhlIHNpemUgc28gdGhhdCB3ZSBzdGF5IGluIHRoZSBhdmFpbGFibGUgcmFuZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIGFibGUgdG8gc2VlayBiYWNrLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBpbi5hdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbi5hdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyLCBvZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uICs9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSAtMTsgLy8gbmVlZCB0byBzZWVrIG9uIG5leHQgcmVhZAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBleGlmT2Zmc2V0U3RyID0gcmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2SW5wdXRNYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dE1hbmFnZXIuamF2YQppbmRleCA3ZDZhOGI0Li5lZjJiNWE1IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dE1hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dE1hbmFnZXIuamF2YQpAQCAtMTQ5LDEwICsxNDksNDUgQEAKICAgICAvKioKICAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgYXMgYSB7QGxpbmsgQnVuZGxlfSBrZXkgZm9yIFRWIG1lc3NhZ2VzLiBUaGUgdmFsdWUgb2YgdGhlIGtleQogICAgICAqIGlkZW50aWZpZXMgdGhlIHN0cmVhbSBvbiB0aGUgVFYgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgd2F0ZXJtYXJrIGV2ZW50IGlzIHJlbGV2YW50IHRvLgorICAgICAqCisgICAgICogPHA+IFR5cGU6IFN0cmluZwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRWX01FU1NBR0VfS0VZX1NUUkVBTV9JRCA9CiAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS50di5UdklucHV0TWFuYWdlci5zdHJlYW1faWQiOwogCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdGFudCBpcyB1c2VkIGFzIGEge0BsaW5rIEJ1bmRsZX0ga2V5IGZvciBUViBtZXNzYWdlcy4gVGhlIHZhbHVlIG9mIHRoZSBrZXkKKyAgICAgKiBpZGVudGlmaWVzIHRoZSBzdWJ0eXBlIG9mIHRoZSBkYXRhLCBzdWNoIGFzIHRoZSBmb3JtYXQgb2YgdGhlIENDIGRhdGEuIFRoZSBmb3JtYXQKKyAgICAgKiBmb3VuZCBhdCB0aGlzIGtleSBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IGhvdyB0byBwYXJzZSB0aGUgZGF0YSBhdAorICAgICAqIHtAbGluayAjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAqCisgICAgICogVG8gcGFyc2UgdGhlIHJhdyBkYXRhIGJzZWQgb24gdGhlIHN1YnR5cGUsIHBsZWFzZSByZWZlciB0byB0aGUgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBjb25jZXJuaW5nIHN1YnR5cGUuIEZvciBleGFtcGxlLCBmb3IgdGhlIHN1YnR5cGUgIkFUU0MgQS8zMzUiIGZvciB3YXRlcm1hcmtpbmcsIHRoZQorICAgICAqIGRvY3VtZW50IGZvciBBLzMzNSBmcm9tIHRoZSBBVFNDIHN0YW5kYXJkIGRldGFpbHMgaG93IHRoaXMgZGF0YSBpcyBmb3JtYXR0ZWQuCisgICAgICoKKyAgICAgKiBTb21lIG90aGVyIGV4YW1wbGVzIG9mIGNvbW1vbiBmb3JtYXRzIGluY2x1ZGU6CisgICAgICogPHVsPgorICAgICAqICAgICA8bGk+V2F0ZXJtYXJraW5nIC0gQVRTQyBBLzMzNjwvbGk+CisgICAgICogICAgIDxsaT5DbG9zZWQgQ2FwdGlvbmluZyAtIENUQSA2MDgtRTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxwPiBUeXBlOiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVl9NRVNTQUdFX0tFWV9TVUJUWVBFID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnR2LlR2SW5wdXRNYW5hZ2VyLnN1YnR5cGUiOworCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdGFudCBpcyB1c2VkIGFzIGEge0BsaW5rIEJ1bmRsZX0ga2V5IGZvciBUViBtZXNzYWdlcy4gVGhlIHZhbHVlIG9mIHRoZSBrZXkKKyAgICAgKiBzdG9yZXMgdGhlIHJhdyBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFRWIE1lc3NhZ2UuIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhIGlzIGRldGVybWluZWQKKyAgICAgKiBieSB0aGUgZm9ybWF0IGRlZmluZWQgYnkgdGhlIHN1YnR5cGUsIGZvdW5kIHVzaW5nIHRoZSBrZXkgYXQKKyAgICAgKiB7QGxpbmsgI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LiBTZWUge0BsaW5rICNUVl9NRVNTQUdFX0tFWV9TVUJUWVBFfSBmb3IgbW9yZQorICAgICAqIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCisgICAgICoKKyAgICAgKiA8cD4gVHlwZTogYnl0ZVtdCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEEgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIucmF3X2RhdGEiOworCiAgICAgc3RhdGljIGZpbmFsIGludCBWSURFT19VTkFWQUlMQUJMRV9SRUFTT05fU1RBUlQgPSAwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fVU5BVkFJTEFCTEVfUkVBU09OX0VORCA9IDE4OwogCkBAIC04MDIsNyArODM3LDEzIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uIEEge0BsaW5rIFR2SW5wdXRNYW5hZ2VyLlNlc3Npb259IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbGxiYWNrLgogICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBtZXNzYWdlIHJlY2VpdmVkLCBzdWNoIGFzIHtAbGluayAjVFZfTUVTU0FHRV9UWVBFX1dBVEVSTUFSS30KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZS4gVGhlIGJ1bmRsZSBrZXlzIGFyZToKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NUUkVBTV9JRH0sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVUJUWVBFfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1JBV19EQVRBfS4KKyAgICAgICAgICogICAgICAgICAgICAgU2VlIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVUJUWVBFfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorICAgICAgICAgKiAgICAgICAgICAgICBob3cgdG8gcGFyc2UgdGhpcyBkYXRhLgorICAgICAgICAgKgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgb25Udk1lc3NhZ2UoU2Vzc2lvbiBzZXNzaW9uLCBAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2SW5wdXRTZXJ2aWNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dFNlcnZpY2UuamF2YQppbmRleCAzYzZlZDkxLi40ZTM4MGM0IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dFNlcnZpY2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dFNlcnZpY2UuamF2YQpAQCAtMTAzMCw3ICsxMDMwLDEyIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIFRoZSBvZiBtZXNzYWdlIHRoYXQgd2FzIHNlbnQsIHN1Y2ggYXMKICAgICAgICAgICoge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfVFlQRV9XQVRFUk1BUkt9Ci0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHNlbnQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlLiBUaGUgYnVuZGxlIGtleXMgYXJlOgorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAqICAgICAgICAgICAgIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlUdk1lc3NhZ2UoQFR2SW5wdXRNYW5hZ2VyLlR2TWVzc2FnZVR5cGUgaW50IHR5cGUsCiAgICAgICAgICAgICAgICAgQE5vbk51bGwgQnVuZGxlIGRhdGEpIHsKQEAgLTE1MDAsNyArMTUwNSwxMiBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBtZXNzYWdlIHJlY2VpdmVkLCBzdWNoIGFzCiAgICAgICAgICAqIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlLiBUaGUgYnVuZGxlIGtleXMgYXJlOgorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAqICAgICAgICAgICAgIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvblR2TWVzc2FnZShATm9uTnVsbCBAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBTdHJpbmcgdHlwZSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhCmluZGV4IDE5YTJlNWQuLjhhODg2ODMyIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZWaWV3LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhCkBAIC0xMjU0LDcgKzEyNTQsMTIgQEAKICAgICAgICAgICogQHBhcmFtIGlucHV0SWQgVGhlIElEIG9mIHRoZSBUViBpbnB1dCBib3VuZCB0byB0aGlzIHZpZXcuCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgcmVjZWl2ZWQsIHN1Y2ggYXMKICAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfVFlQRV9XQVRFUk1BUkt9Ci0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZQorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UuIFRoZSBidW5kbGUga2V5cyBhcmU6CisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVFJFQU1fSUR9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9SQVdfREFUQX0uCisgICAgICAgICAqICAgICAgICAgICAgIFNlZSB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uVHZNZXNzYWdlKEBOb25OdWxsIFN0cmluZyBpbnB1dElkLAogICAgICAgICAgICAgICAgIEBUdklucHV0TWFuYWdlci5Udk1lc3NhZ2VUeXBlIGludCB0eXBlLCBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L2ludGVyYWN0aXZlL1R2SW50ZXJhY3RpdmVBcHBTZXJ2aWNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQppbmRleCA3ZGZlMTZhLi42OWZmOWM2IDEwMDc1NQotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQpAQCAtOTE5LDcgKzkxOSwxMiBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBtZXNzYWdlIHJlY2VpdmVkLCBzdWNoIGFzCiAgICAgICAgICAqIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlLiBUaGUgYnVuZGxlIGtleXMgYXJlOgorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAqICAgICAgICAgICAgIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvblR2TWVzc2FnZShAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L2ludGVyYWN0aXZlL1R2SW50ZXJhY3RpdmVBcHBWaWV3LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQppbmRleCAxYTAzMTliLi44MGExNDM1IDEwMDc1NQotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQpAQCAtOTQ0LDcgKzk0NCwxMiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSByZWNlaXZlZCwgc3VjaCBhcwogICAgICAqIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZS4gVGhlIGJ1bmRsZSBrZXlzIGFyZToKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1JBV19EQVRBfS4KKyAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlUdk1lc3NhZ2UoQE5vbk51bGwgQFR2SW5wdXRNYW5hZ2VyLlR2TWVzc2FnZVR5cGUgaW50IHR5cGUsCiAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuY3BwCmluZGV4IDdmNGMwM2IuLjZmNjdkNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX3R2X1R1bmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5jcHAKQEAgLTYxNyw4ICs2MTcsNiBAQAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6OmdldFNlY3Rpb25FdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvU2VjdGlvbkV2ZW50Iik7Ci0gICAgam1ldGhvZElEIGV2ZW50SW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoZXZlbnRDbGF6eiwgIjxpbml0PiIsICIoSUlJSilWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25FdmVudCAmc2VjdGlvbkV2ZW50ID0gZXZlbnQuZ2V0PERlbXV4RmlsdGVyRXZlbnQ6OlRhZzo6c2VjdGlvbj4oKTsKICAgICBqaW50IHRhYmxlSWQgPSBzZWN0aW9uRXZlbnQudGFibGVJZDsKQEAgLTYyNiwyMyArNjI0LDE1IEBACiAgICAgamludCBzZWN0aW9uTnVtID0gc2VjdGlvbkV2ZW50LnNlY3Rpb25OdW07CiAgICAgamxvbmcgZGF0YUxlbmd0aCA9IHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoOwogCi0gICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChldmVudENsYXp6LCBldmVudEluaXQsIHRhYmxlSWQsIHZlcnNpb24sIHNlY3Rpb25OdW0sIGRhdGFMZW5ndGgpOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobVNlY3Rpb25FdmVudENsYXNzLCBtU2VjdGlvbkV2ZW50SW5pdElELCB0YWJsZUlkLCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbk51bSwgZGF0YUxlbmd0aCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6Z2V0TWVkaWFFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL01lZGlhRXZlbnQiKTsKLSAgICBqbWV0aG9kSUQgZXZlbnRJbml0ID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIGV2ZW50Q2xhenosCi0gICAgICAgICAgICAiPGluaXQ+IiwKLSAgICAgICAgICAgICIoSVpKWkpKSkxhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMkTGluZWFyQmxvY2s7IgotICAgICAgICAgICAgIlpKSVpJTGFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0F1ZGlvRGVzY3JpcHRvcjsiCi0gICAgICAgICAgICAiTGphdmEvdXRpbC9MaXN0OylWIik7Ci0gICAgamZpZWxkSUQgZXZlbnRDb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGV2ZW50Q2xhenosICJtTmF0aXZlQ29udGV4dCIsICJKIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlck1lZGlhRXZlbnQgJm1lZGlhRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjptZWRpYT4oKTsKICAgICBqb2JqZWN0IGF1ZGlvRGVzY3JpcHRvciA9IG51bGxwdHI7CkBAIC02NTAsOCArNjQwLDYgQEAKICAgICBqb2JqZWN0IHByZXNlbnRhdGlvbnNKT2JqID0gSkF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YXNKb2JqZWN0KGVudiwgZ0F1ZGlvUHJlc2VudGF0aW9uRmllbGRzKTsKICAgICBzd2l0Y2ggKG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5nZXRUYWcoKSkgewogICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWVkaWFFdmVudEV4dHJhTWV0YURhdGE6OlRhZzo6YXVkaW86IHsKLSAgICAgICAgICAgIGpjbGFzcyBhZENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0F1ZGlvRGVzY3JpcHRvciIpOwotICAgICAgICAgICAgam1ldGhvZElEIGFkSW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoYWRDbGF6eiwgIjxpbml0PiIsICIoQkJDQkJCKVYiKTsKIAogICAgICAgICAgICAgY29uc3QgQXVkaW9FeHRyYU1ldGFEYXRhICZhZCA9CiAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5nZXQ8RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTo6VGFnOjphdWRpbz4oKTsKQEAgLTY2Miw5ICs2NTAsOSBAQAogICAgICAgICAgICAgamJ5dGUgYWRHYWluRnJvbnQgPSBhZC5hZEdhaW5Gcm9udDsKICAgICAgICAgICAgIGpieXRlIGFkR2FpblN1cnJvdW5kID0gYWQuYWRHYWluU3Vycm91bmQ7CiAKLSAgICAgICAgICAgIGF1ZGlvRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGFkQ2xhenosIGFkSW5pdCwgYWRGYWRlLCBhZFBhbiwgdmVyc2lvblRleHRUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEdhaW5DZW50ZXIsIGFkR2FpbkZyb250LCBhZEdhaW5TdXJyb3VuZCk7Ci0gICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFkQ2xhenopOworICAgICAgICAgICAgYXVkaW9EZXNjcmlwdG9yID0gZW52LT5OZXdPYmplY3QobUF1ZGlvRGVzY3JpcHRvckNsYXNzLCBtQXVkaW9EZXNjcmlwdG9ySW5pdElELCBhZEZhZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFBhbiwgdmVyc2lvblRleHRUYWcsIGFkR2FpbkNlbnRlciwgYWRHYWluRnJvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEdhaW5TdXJyb3VuZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWVkaWFFdmVudEV4dHJhTWV0YURhdGE6OlRhZzo6YXVkaW9QcmVzZW50YXRpb25zOiB7CkBAIC03MDUsMTAgKzY5MywxMCBAQAogICAgICAgICBzYyA9IG1lZGlhRXZlbnQuc2NJbmRleE1hc2suZ2V0PERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OlRhZzo6c2NWdmM+KCk7CiAgICAgfQogCi0gICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChldmVudENsYXp6LCBldmVudEluaXQsIHN0cmVhbUlkLCBpc1B0c1ByZXNlbnQsIHB0cywgaXNEdHNQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzLCBkYXRhTGVuZ3RoLCBvZmZzZXQsIG51bGxwdHIsIGlzU2VjdXJlTWVtb3J5LCBhdkRhdGFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wdVNlcXVlbmNlTnVtYmVyLCBpc1Blc1ByaXZhdGVEYXRhLCBzYywgYXVkaW9EZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uc0pPYmopOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobU1lZGlhRXZlbnRDbGFzcywgbU1lZGlhRXZlbnRJbml0SUQsIHN0cmVhbUlkLCBpc1B0c1ByZXNlbnQsIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHRzUHJlc2VudCwgZHRzLCBkYXRhTGVuZ3RoLCBvZmZzZXQsIG51bGxwdHIsIGlzU2VjdXJlTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZEYXRhSWQsIG1wdVNlcXVlbmNlTnVtYmVyLCBpc1Blc1ByaXZhdGVEYXRhLCBzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVzY3JpcHRvciwgcHJlc2VudGF0aW9uc0pPYmopOwogCiAgICAgdWludDY0X3QgYXZTaGFyZWRNZW1TaXplID0gbUZpbHRlckNsaWVudC0+Z2V0QXZTaGFyZWRIYW5kbGVJbmZvKCkuc2l6ZTsKICAgICBpZiAobWVkaWFFdmVudC5hdk1lbW9yeS5mZHMuc2l6ZSgpID4gMCB8fCBtZWRpYUV2ZW50LmF2RGF0YUlkICE9IDAgfHwKQEAgLTcxNyw3ICs3MDUsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBNZWRpYUV2ZW50KG1GaWx0ZXJDbGllbnQsIGR1cEZyb21BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuYXZEYXRhSWQsIGRhdGFMZW5ndGggKyBvZmZzZXQsIG9iaik7CiAgICAgICAgIG1lZGlhRXZlbnRTcC0+bUF2SGFuZGxlUmVmQ250Kys7Ci0gICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKG9iaiwgZXZlbnRDb250ZXh0LCAoamxvbmcpbWVkaWFFdmVudFNwLmdldCgpKTsKKyAgICAgICAgZW52LT5TZXRMb25nRmllbGQob2JqLCBtTWVkaWFFdmVudEZpZWxkQ29udGV4dElELCAoamxvbmcpbWVkaWFFdmVudFNwLmdldCgpKTsKICAgICAgICAgbWVkaWFFdmVudFNwLT5pbmNTdHJvbmcob2JqKTsKICAgICB9CiAKQEAgLTcyNiwzMiArNzE0LDI3IEBACiAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYXVkaW9EZXNjcmlwdG9yKTsKICAgICB9CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihwcmVzZW50YXRpb25zSk9iaik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRQZXNFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9QZXNFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlclBlc0V2ZW50ICZwZXNFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnBlcz4oKTsKICAgICBqaW50IHN0cmVhbUlkID0gcGVzRXZlbnQuc3RyZWFtSWQ7CiAgICAgamludCBkYXRhTGVuZ3RoID0gcGVzRXZlbnQuZGF0YUxlbmd0aDsKICAgICBqaW50IG1wdVNlcXVlbmNlTnVtYmVyID0gcGVzRXZlbnQubXB1U2VxdWVuY2VOdW1iZXI7CiAKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc3RyZWFtSWQsIGRhdGFMZW5ndGgsIG1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1QZXNFdmVudENsYXNzLCBtUGVzRXZlbnRJbml0SUQsIHN0cmVhbUlkLCBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIpOwogICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFyciwgc2l6ZSwgb2JqKTsKICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihldmVudENsYXp6KTsKIH0KIAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6OmdldFRzUmVjb3JkRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9Uc1JlY29yZEV2ZW50Iik7Ci0gICAgam1ldGhvZElEIGV2ZW50SW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoZXZlbnRDbGF6eiwgIjxpbml0PiIsICIoSUlJSkpJKVYiKTsKIAogICAgIGNvbnN0IERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudCAmdHNSZWNvcmRFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnRzUmVjb3JkPigpOwogICAgIERlbXV4UGlkIHBpZCA9IHRzUmVjb3JkRXZlbnQucGlkOwpAQCAtNzgxLDE4ICs3NjQsMTUgQEAKICAgICBqbG9uZyBwdHMgPSB0c1JlY29yZEV2ZW50LnB0czsKICAgICBqaW50IGZpcnN0TWJJblNsaWNlID0gdHNSZWNvcmRFdmVudC5maXJzdE1iSW5TbGljZTsKIAotICAgIGpvYmplY3Qgb2JqID0KLSAgICAgICAgICAgIGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwganBpZCwgdHMsIHNjLCBieXRlTnVtYmVyLCBwdHMsIGZpcnN0TWJJblNsaWNlKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1Uc1JlY29yZEV2ZW50Q2xhc3MsIG1Uc1JlY29yZEV2ZW50SW5pdElELCBqcGlkLCB0cywgc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlTnVtYmVyLCBwdHMsIGZpcnN0TWJJblNsaWNlKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRNbXRwUmVjb3JkRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL01tdHBSZWNvcmRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElKSUpJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCAmbW10cFJlY29yZEV2ZW50ID0KICAgICAgICAgICAgIGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6Om1tdHBSZWNvcmQ+KCk7CkBAIC04MDMsMTggKzc4MywxNSBAQAogICAgIGppbnQgZmlyc3RNYkluU2xpY2UgPSBtbXRwUmVjb3JkRXZlbnQuZmlyc3RNYkluU2xpY2U7CiAgICAgamxvbmcgdHNJbmRleE1hc2sgPSBtbXRwUmVjb3JkRXZlbnQudHNJbmRleE1hc2s7CiAKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc2NIZXZjSW5kZXhNYXNrLCBieXRlTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIsIHB0cywgZmlyc3RNYkluU2xpY2UsIHRzSW5kZXhNYXNrKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1NbXRwUmVjb3JkRXZlbnRDbGFzcywgbU1tdHBSZWNvcmRFdmVudEluaXRJRCwgc2NIZXZjSW5kZXhNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZU51bWJlciwgbXB1U2VxdWVuY2VOdW1iZXIsIHB0cywgZmlyc3RNYkluU2xpY2UsIHRzSW5kZXhNYXNrKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXREb3dubG9hZEV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvRG93bmxvYWRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElJSUlJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgJmRvd25sb2FkRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjpkb3dubG9hZD4oKTsKICAgICBqaW50IGl0ZW1JZCA9IGRvd25sb2FkRXZlbnQuaXRlbUlkOwpAQCAtODI0LDMyICs4MDEsMjcgQEAKICAgICBqaW50IGxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IGRvd25sb2FkRXZlbnQubGFzdEl0ZW1GcmFnbWVudEluZGV4OwogICAgIGppbnQgZGF0YUxlbmd0aCA9IGRvd25sb2FkRXZlbnQuZGF0YUxlbmd0aDsKIAotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBpdGVtSWQsIGRvd25sb2FkSWQsIG1wdVNlcXVlbmNlTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUZyYWdtZW50SW5kZXgsIGxhc3RJdGVtRnJhZ21lbnRJbmRleCwgZGF0YUxlbmd0aCk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtRG93bmxvYWRFdmVudENsYXNzLCBtRG93bmxvYWRFdmVudEluaXRJRCwgaXRlbUlkLCBkb3dubG9hZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIsIGl0ZW1GcmFnbWVudEluZGV4LCBsYXN0SXRlbUZyYWdtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRJcFBheWxvYWRFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9JcFBheWxvYWRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudCAmaXBQYXlsb2FkRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjppcFBheWxvYWQ+KCk7CiAgICAgamludCBkYXRhTGVuZ3RoID0gaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aDsKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgZGF0YUxlbmd0aCk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtSXBQYXlsb2FkRXZlbnRDbGFzcywgbUlwUGF5bG9hZEV2ZW50SW5pdElELCBkYXRhTGVuZ3RoKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRUZW1pRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1RlbWlFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEpCW0IpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJUZW1pRXZlbnQgJnRlbWlFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnRlbWk+KCk7CiAgICAgamxvbmcgcHRzID0gdGVtaUV2ZW50LnB0czsKQEAgLTg1OSw2MyArODMxLDUzIEBACiAgICAgamJ5dGVBcnJheSBhcnJheSA9IGVudi0+TmV3Qnl0ZUFycmF5KGRlc2NyRGF0YS5zaXplKCkpOwogICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFycmF5LCAwLCBkZXNjckRhdGEuc2l6ZSgpLCByZWludGVycHJldF9jYXN0PGpieXRlICo+KCZkZXNjckRhdGFbMF0pKTsKIAotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBwdHMsIGRlc2NyVGFnLCBhcnJheSk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtVGVtaUV2ZW50Q2xhc3MsIG1UZW1pRXZlbnRJbml0SUQsIHB0cywgZGVzY3JUYWcsIGFycmF5KTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRTY3JhbWJsaW5nU3RhdHVzRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1NjcmFtYmxpbmdTdGF0dXNFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQgJnNjcmFtYmxpbmdTdGF0dXMgPQogICAgICAgICAgICAgZXZlbnQuZ2V0PERlbXV4RmlsdGVyRXZlbnQ6OlRhZzo6bW9uaXRvckV2ZW50PigpCiAgICAgICAgICAgICAgICAgICAgIC5nZXQ8RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OlRhZzo6c2NyYW1ibGluZ1N0YXR1cz4oKTsKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc2NyYW1ibGluZ1N0YXR1cyk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtU2NyYW1ibGluZ1N0YXR1c0V2ZW50Q2xhc3MsIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRJbml0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhbWJsaW5nU3RhdHVzKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRJcENpZENoYW5nZUV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvSXBDaWRDaGFuZ2VFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQgJmNpZCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6Om1vbml0b3JFdmVudD4oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQ8RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OlRhZzo6Y2lkPigpOwotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBjaWQpOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobUlwQ2lkQ2hhbmdlRXZlbnRDbGFzcywgbUlwQ2lkQ2hhbmdlRXZlbnRJbml0SUQsIGNpZCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6Z2V0UmVzdGFydEV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9SZXN0YXJ0RXZlbnQiKTsKLSAgICBqbWV0aG9kSUQgZXZlbnRJbml0ID0gZW52LT5HZXRNZXRob2RJRChldmVudENsYXp6LCAiPGluaXQ+IiwgIihJKVYiKTsKIAogICAgIGNvbnN0IGludDMyX3QgJnN0YXJ0SWQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjpzdGFydElkPigpOwotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBzdGFydElkKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1SZXN0YXJ0RXZlbnRDbGFzcywgbVJlc3RhcnRFdmVudEluaXRJRCwgc3RhcnRJZCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6b25GaWx0ZXJFdmVudChjb25zdCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4gJmV2ZW50cykgewogICAgIEFMT0dWKCJGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6Om9uRmlsdGVyRXZlbnQiKTsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9GaWx0ZXJFdmVudCIpOwogICAgIGpvYmplY3RBcnJheSBhcnJheTsKIAogICAgIGlmICghZXZlbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgYXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KGV2ZW50cy5zaXplKCksIGV2ZW50Q2xhenosIG51bGxwdHIpOworICAgICAgICBhcnJheSA9IGVudi0+TmV3T2JqZWN0QXJyYXkoZXZlbnRzLnNpemUoKSwgbUV2ZW50Q2xhc3MsIG51bGxwdHIpOwogICAgIH0KIAogICAgIGZvciAoaW50IGkgPSAwLCBhcnJheVNpemUgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDA0LDcgKzk2Niw2IEBACiAgICAgICAgICAgICAgICJGaWx0ZXIgb2JqZWN0IGhhcyBiZWVuIGZyZWVkLiBJZ25vcmluZyBjYWxsYmFjay4iKTsKICAgICB9CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihldmVudENsYXp6KTsKIH0KIAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6Om9uRmlsdGVyU3RhdHVzKGNvbnN0IERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cykgewpAQCAtMTA0MCw2ICsxMDAxLDY3IEBACiAgICAgbVNoYXJlZEZpbHRlciA9IHRydWU7CiB9CiAKK0ZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6RmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIFNjb3BlZExvY2FsUmVmIGV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9GaWx0ZXJFdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiBzZWN0aW9uRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1NlY3Rpb25FdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiBtZWRpYUV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9NZWRpYUV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGF1ZGlvRGVzY3JpcHRvckNsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvQXVkaW9EZXNjcmlwdG9yIikpOworICAgIFNjb3BlZExvY2FsUmVmIHBlc0V2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9QZXNFdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiB0c1JlY29yZEV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9Uc1JlY29yZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIG1tdHBSZWNvcmRFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvTW10cFJlY29yZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGRvd25sb2FkRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0Rvd25sb2FkRXZlbnQiKSk7CisgICAgU2NvcGVkTG9jYWxSZWYgaXBQYXlsb2FkRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0lwUGF5bG9hZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIHRlbWlFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvVGVtaUV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIHNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvU2NyYW1ibGluZ1N0YXR1c0V2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGlwQ2lkQ2hhbmdlRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0lwQ2lkQ2hhbmdlRXZlbnQiKSk7CisgICAgU2NvcGVkTG9jYWxSZWYgcmVzdGFydEV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9SZXN0YXJ0RXZlbnQiKSk7CisgICAgbUV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihldmVudENsYXNzLmdldCgpKTsKKyAgICBtU2VjdGlvbkV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihzZWN0aW9uRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbU1lZGlhRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKG1lZGlhRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbUF1ZGlvRGVzY3JpcHRvckNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoYXVkaW9EZXNjcmlwdG9yQ2xhc3MuZ2V0KCkpOworICAgIG1QZXNFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYocGVzRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVRzUmVjb3JkRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKHRzUmVjb3JkRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbU1tdHBSZWNvcmRFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYobW10cFJlY29yZEV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1Eb3dubG9hZEV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihkb3dubG9hZEV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1JcFBheWxvYWRFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoaXBQYXlsb2FkRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVRlbWlFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYodGVtaUV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKHNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzLmdldCgpKTsKKyAgICBtSXBDaWRDaGFuZ2VFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoaXBDaWRDaGFuZ2VFdmVudENsYXNzLmdldCgpKTsKKyAgICBtUmVzdGFydEV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihyZXN0YXJ0RXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVNlY3Rpb25FdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQobVNlY3Rpb25FdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUlKKVYiKTsKKyAgICBtTWVkaWFFdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtTWVkaWFFdmVudENsYXNzLAorICAgICAgICAgICAgIjxpbml0PiIsCisgICAgICAgICAgICAiKElaSlpKSkpMYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjJExpbmVhckJsb2NrOyIKKyAgICAgICAgICAgICJaSklaSUxhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9BdWRpb0Rlc2NyaXB0b3I7IgorICAgICAgICAgICAgIkxqYXZhL3V0aWwvTGlzdDspViIpOworICAgIG1BdWRpb0Rlc2NyaXB0b3JJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb0Rlc2NyaXB0b3JDbGFzcywgIjxpbml0PiIsICIoQkJDQkJCKVYiKTsKKyAgICBtUGVzRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1QZXNFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUkpViIpOworICAgIG1Uc1JlY29yZEV2ZW50SW5pdElEID0gZW52LT5HZXRNZXRob2RJRChtVHNSZWNvcmRFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUlKSkkpViIpOworICAgIG1NbXRwUmVjb3JkRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1NbXRwUmVjb3JkRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSUpJSklJKVYiKTsKKyAgICBtRG93bmxvYWRFdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQobURvd25sb2FkRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSUlJSUlJKVYiKTsKKyAgICBtSXBQYXlsb2FkRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1JcFBheWxvYWRFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJKVYiKTsKKyAgICBtVGVtaUV2ZW50SW5pdElEID0gZW52LT5HZXRNZXRob2RJRChtVGVtaUV2ZW50Q2xhc3MsICI8aW5pdD4iLCAiKEpCW0IpViIpOworICAgIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSSlWIik7CisgICAgbUlwQ2lkQ2hhbmdlRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1JcENpZENoYW5nZUV2ZW50Q2xhc3MsICI8aW5pdD4iLCAiKEkpViIpOworICAgIG1SZXN0YXJ0RXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1SZXN0YXJ0RXZlbnRDbGFzcywgIjxpbml0PiIsICIoSSlWIik7CisgICAgbU1lZGlhRXZlbnRGaWVsZENvbnRleHRJRCA9IGVudi0+R2V0RmllbGRJRChtTWVkaWFFdmVudENsYXNzLCAibU5hdGl2ZUNvbnRleHQiLCAiSiIpOworfQorCiBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6On5GaWx0ZXJDbGllbnRDYWxsYmFja0ltcGwoKSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CiAgICAgaWYgKG1GaWx0ZXJPYmogIT0gbnVsbHB0cikgewpAQCAtMTA0Nyw2ICsxMDY5LDE5IEBACiAgICAgICAgIG1GaWx0ZXJPYmogPSBudWxscHRyOwogICAgIH0KICAgICBtRmlsdGVyQ2xpZW50ID0gbnVsbHB0cjsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVNlY3Rpb25FdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWFFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9EZXNjcmlwdG9yQ2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1QZXNFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtVHNSZWNvcmRFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTW10cFJlY29yZEV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1Eb3dubG9hZEV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1JcFBheWxvYWRFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtVGVtaUV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUlwQ2lkQ2hhbmdlRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVJlc3RhcnRFdmVudENsYXNzKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vIEZyb250ZW5kQ2xpZW50Q2FsbGJhY2tJbXBsIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5oIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuaAppbmRleCAyYmIxNGY2Li42YjFiNmIxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5oCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX3R2X1R1bmVyLmgKQEAgLTEyNSw2ICsxMjUsNyBAQAogfTsKIAogc3RydWN0IEZpbHRlckNsaWVudENhbGxiYWNrSW1wbCA6IHB1YmxpYyBGaWx0ZXJDbGllbnRDYWxsYmFjayB7CisgICAgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsKCk7CiAgICAgfkZpbHRlckNsaWVudENhbGxiYWNrSW1wbCgpOwogICAgIHZpcnR1YWwgdm9pZCBvbkZpbHRlckV2ZW50KGNvbnN0IHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgZXZlbnRzKTsKICAgICB2aXJ0dWFsIHZvaWQgb25GaWx0ZXJTdGF0dXMoY29uc3QgRGVtdXhGaWx0ZXJTdGF0dXMgc3RhdHVzKTsKQEAgLTEzNSw2ICsxMzYsMzIgQEAKIHByaXZhdGU6CiAgICAgandlYWsgbUZpbHRlck9iajsKICAgICBzcDxGaWx0ZXJDbGllbnQ+IG1GaWx0ZXJDbGllbnQ7CisgICAgamNsYXNzIG1FdmVudENsYXNzOworICAgIGpjbGFzcyBtU2VjdGlvbkV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1NZWRpYUV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1BdWRpb0Rlc2NyaXB0b3JDbGFzczsKKyAgICBqY2xhc3MgbVBlc0V2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1Uc1JlY29yZEV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1NbXRwUmVjb3JkRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbURvd25sb2FkRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbUlwUGF5bG9hZEV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1UZW1pRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbVNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzOworICAgIGpjbGFzcyBtSXBDaWRDaGFuZ2VFdmVudENsYXNzOworICAgIGpjbGFzcyBtUmVzdGFydEV2ZW50Q2xhc3M7CisgICAgam1ldGhvZElEIG1TZWN0aW9uRXZlbnRJbml0SUQ7CisgICAgam1ldGhvZElEIG1NZWRpYUV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtQXVkaW9EZXNjcmlwdG9ySW5pdElEOworICAgIGptZXRob2RJRCBtUGVzRXZlbnRJbml0SUQ7CisgICAgam1ldGhvZElEIG1Uc1JlY29yZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtTW10cFJlY29yZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtRG93bmxvYWRFdmVudEluaXRJRDsKKyAgICBqbWV0aG9kSUQgbUlwUGF5bG9hZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtVGVtaUV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtU2NyYW1ibGluZ1N0YXR1c0V2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtSXBDaWRDaGFuZ2VFdmVudEluaXRJRDsKKyAgICBqbWV0aG9kSUQgbVJlc3RhcnRFdmVudEluaXRJRDsKKyAgICBqZmllbGRJRCBtTWVkaWFFdmVudEZpZWxkQ29udGV4dElEOwogICAgIGJvb2wgbVNoYXJlZEZpbHRlcjsKICAgICB2b2lkIGdldFNlY3Rpb25FdmVudChqb2JqZWN0QXJyYXkmIGFyciwgY29uc3QgaW50IHNpemUsIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGV2ZW50KTsKICAgICB2b2lkIGdldE1lZGlhRXZlbnQoam9iamVjdEFycmF5JiBhcnIsIGNvbnN0IGludCBzaXplLCBjb25zdCBEZW11eEZpbHRlckV2ZW50JiBldmVudCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9DYXJyaWVyRGVmYXVsdEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvQ2FycmllckRlZmF1bHRBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBlOTFkMzViLi5mNGU4OWExNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvQ2FycmllckRlZmF1bHRBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9DYXJyaWVyRGVmYXVsdEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+Q2FycmllckRlZmF1bHRBcHA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5DYXJyaWVyIENvbW11bmljYXRpb25zPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhbmRyb2lkX3N5c3RlbV9sYWJlbCI+TW9iaWxlIENhcnJpZXI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvcnRhbF9ub3RpZmljYXRpb25faWQiPk1vYmlsZSBkYXRhIGhhcyBydW4gb3V0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJub19kYXRhX25vdGlmaWNhdGlvbl9pZCI+WW91ciBtb2JpbGUgZGF0YSBoYXMgYmVlbiBkZWFjdGl2YXRlZDwvc3RyaW5nPgpAQCAtMTcsOSArMTcsOSBAQAogICAgIDwhLS0gVGVsZXBob255IG5vdGlmaWNhdGlvbiBjaGFubmVsIG5hbWUgZm9yIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX2NoYW5uZWwiPlBlcmZvcm1hbmNlIGJvb3N0PC9zdHJpbmc+CiAgICAgPCEtLSBOb3RpZmljYXRpb24gdGl0bGUgdGV4dCBmb3IgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJmb3JtYW5jZV9ib29zdF9ub3RpZmljYXRpb25fdGl0bGUiPkltcHJvdmUgeW91ciBhcHAgZXhwZXJpZW5jZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX3RpdGxlIj41RyBvcHRpb25zIGZyb20geW91ciBjYXJyaWVyPC9zdHJpbmc+CiAgICAgPCEtLSBOb3RpZmljYXRpb24gZGV0YWlsIHRleHQgZm9yIHRoZSBwZXJmb3JtYW5jZSBib29zdCBub3RpZmljYXRpb24uIC0tPgotICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX2RldGFpbCI+VGFwIHRvIHZpc2l0ICVzXCdzIHdlYnNpdGUgYW5kIGxlYXJuIG1vcmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcmZvcm1hbmNlX2Jvb3N0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlZpc2l0ICVzXCdzIHdlYnNpdGUgdG8gc2VlIG9wdGlvbnMgZm9yIHlvdXIgYXBwIGV4cGVyaWVuY2U8L3N0cmluZz4KICAgICA8IS0tIE5vdGlmaWNhdGlvbiBidXR0b24gdGV4dCB0byBjYW5jZWwgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJmb3JtYW5jZV9ib29zdF9ub3RpZmljYXRpb25fYnV0dG9uX25vdF9ub3ciPk5vdCBub3c8L3N0cmluZz4KICAgICA8IS0tIE5vdGlmaWNhdGlvbiBidXR0b24gdGV4dCB0byBtYW5hZ2UgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9DcmVkZW50aWFsTWFuYWdlci9zcmMvY29tL2FuZHJvaWQvY3JlZGVudGlhbG1hbmFnZXIvZ2V0Zmxvdy9HZXRDcmVkZW50aWFsQ29tcG9uZW50cy5rdCBiL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CmluZGV4IGRkNjA3NjMuLjU2MzI0NTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CisrKyBiL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICBsZWZ0QnV0dG9uID0gaWYgKHRvdGFsRW50cmllc0NvdW50ID4gMSkgewogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25CdXR0b24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2UoUi5zdHJpbmcuZ2V0X2RpYWxvZ191c2Vfc2F2ZWRfcGFzc2tleV9mb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlKFIuc3RyaW5nLmdldF9kaWFsb2dfdGl0bGVfc2lnbl9pbl9vcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vcmVPcHRpb25TZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYXJhYmljLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCmluZGV4IDE2MTQxODguLjljMjA2NGMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCkBAIC0yMiw4OSArMjIsODkgQEAKIAoga2V5IEdSQVZFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjMwJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzAnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MScKIH0KIAoga2V5IDEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjEnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyEnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyEnCiB9CiAKIGtleSAyIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjYyJwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCiBrZXkgMyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2MycKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KIAoga2V5IDQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjQnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiB9CiAKIGtleSA1IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjY1JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogfQogCiBrZXkgNiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2NicKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKIH0KIAoga2V5IDcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjcnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKIGtleSA4IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjY4JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogfQogCiBrZXkgOSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2OScKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnOScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKIH0KIAoga2V5IDAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjAnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiB9CiAKIGtleSBNSU5VUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ18nCiB9CiAKIGtleSBFUVVBTFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc9JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrJwogfQogCkBAIC0xMTIsNzkgKzExMiw3OSBAQAogCiBrZXkgUSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NGUnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0YicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRmJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQyJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NGMnCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQxJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1ZmVmOScKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2M2EnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzYScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI1JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM5JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMTgnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNycKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmUnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJkJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MWInCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmYnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CiAKQEAgLTE5Miw2NyArMTkyLDY3IEBACiAKIGtleSBBIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM0JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MCcKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRkJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0YScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRhJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyOCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI4JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ0JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdWZlZjcnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyMycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmEnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQwJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MGMnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CiAKQEAgLTI2MCw2MCArMjYwLDYwIEBACiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI2JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjIxJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MicKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MjQnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzEnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdWZlZmInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1ZmVmYicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHVmZWY1JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0OScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ5JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjInCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI5JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjAxOScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ4JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiB9CiAKIGtleSBQRVJJT0QgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKIH0KIAoga2V5IFNMQVNIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM4JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYxZicKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hemVyYmFpamFuaS5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYXplcmJhaWphbmkua2NtCmluZGV4IDY5NDkwY2MuLjNmNWU4OTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hemVyYmFpamFuaS5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2F6ZXJiYWlqYW5pLmtjbQpAQCAtMTA3LDcyICsxMDcsODQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMTg3LDY2ICsxOTksNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxOGYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDI1OScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMThmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAyNTknCiB9CiAKICMjIyBST1cgNApAQCAtMjU1LDU0ICsyNzgsNjMgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTVlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNWYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTVmJwogfQogCiBrZXkgU0xBU0ggewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGFydXNpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGFydXNpYW4ua2NtCmluZGV4IDNkZWI5ZGQuLjY3NTFlMWQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9iZWxhcnVzaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYmVsYXJ1c2lhbi5rY20KQEAgLTI0LDYgKzI0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd+JwogfQpAQCAtMTA2LDE2MyArMTA3LDIwMyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdFJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdlJwogfQoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdZJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd5JwogfQoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDBFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NUUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDVFJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdPJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdvJwogfQoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwMjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDAyNycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMDI3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQogIyMjIFJPVyAzCiBrZXkgQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdTJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdzJwogfQoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdHJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdnJwogfQoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdLJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdrJwogfQoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwpAQCAtMjc1LDY5ICszMTYsODUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3gnCiB9CiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndicKIH0KIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbScKIH0KIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIGtleSBQRVJJT0QgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCisgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiBrZXkgU0xBU0ggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc/JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc/JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGdpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGdpYW4ua2NtCmluZGV4IGYyYzM5Y2UuLmQ1MjkzMTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9iZWxnaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYmVsZ2lhbi5rY20KQEAgLTEyMiwxOCArMTIyLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTE0MSw0MiArMTQ0LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTk5LDYwICsyMDksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjgyLDM2ICszMDIsNDIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYnJhemlsaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCmluZGV4IDE0MGM3YWMuLmFkMzE5OWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCkBAIC0xMTUsNiArMTE1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKIH0KIApAQCAtMTIyLDYgKzEyMyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CiAKQEAgLTEyOSw2ICsxMzEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNiw0MiArMTM5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkzLDYwICsyMDMsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI1OCw3ICsyNzgsNyBAQAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ30nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiYScKIH0KIApAQCAtMjc0LDE4ICsyOTQsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhMicKIH0KIApAQCAtMjkzLDI0ICszMTYsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9idWxnYXJpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KaW5kZXggYzU2MzY3ZS4uOTRmZmJkMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KQEAgLTI3LDcgKzI3LDcgQEAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ34nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjMsODkgKzEyMywxMDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwotICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdFJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdlJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdZJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdPJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAneycKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewpAQCAtMjEzLDcgKzIzMyw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAogIyMjIFJPVyAzCkBAIC0yMjIsNzggKzI0Miw5NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdTJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdHJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdLJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMwMiw2ICszNDEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzI4LDYyICszNjgsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTIsNiArNDQ3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpAQCAtNDAwLDYgKzQ1Niw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPycKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9idWxnYXJpYW5fcGhvbmV0aWMua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KaW5kZXggODg3ODgwNy4uNjMxNDE1OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KQEAgLTI4LDYgKzI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KQEAgLTEyMiw4OCArMTIzLDEwOCBAQAoga2V5IFEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JwotICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjExLDcgKzIzMiw4IEBACiBrZXkgUklHSFRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjE5LDkgKzI0MSw4IEBACiBrZXkgQkFDS1NMQVNIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKLSAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwotICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MGQnCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KQEAgLTIzMiw3OCArMjUzLDk2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMxMSw3ICszNTAsNyBAQAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJyInCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzIyLDYgKzM2MSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDVkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MGQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CkBAIC0zMzAsNjIgKzM3MCw3NiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MjAxZScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMDFlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc8JwogfQpAQCAtMzkzLDcgKzQ0Nyw3IEBACiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUyMDFjJworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMWMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CkBAIC00MDEsNyArNDU1LDcgQEAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJz8nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3JvYXRpYW5fYW5kX3Nsb3Zlbmlhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3JvYXRpYW5fYW5kX3Nsb3Zlbmlhbi5rY20KaW5kZXggOTY0NDVhNC4uMWM3NzRjYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2Nyb2F0aWFuX2FuZF9zbG92ZW5pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jcm9hdGlhbl9hbmRfc2xvdmVuaWFuLmtjbQpAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMjksNiArMTMwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTM2LDYgKzEzOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQzLDQ4ICsxNDYsNTYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY3JwogfQogCkBAIC0xOTIsNiArMjAzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDcnCiB9CiAKQEAgLTIwMSwyNCArMjEzLDI4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiB9CiAKQEAgLTIyNiw2ICsyNDIsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCkBAIC0yMzMsNDAgKzI1MCw0OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjY4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxOTcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE5NycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjY4JwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0MicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQxJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0MicKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMDYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTA2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZicKIH0KIApAQCAtMjc0LDYgKzI5OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE0JwogfQogCkBAIC0yODksMjQgKzMxNSwyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMTQsNiArMzQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIApAQCAtMzIxLDYgKzM1Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTMyOCw2ICszNjAsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3plY2gua2NtCmluZGV4IDMyNzUwZTAuLjA4YjAxMmUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2N6ZWNoLmtjbQpAQCAtMTMxLDE4ICsxMzEsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTUwLDQyICsxNTMsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0yMTEsNTQgKzIyMSw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0zMDAsMjQgKzMxOSwyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMjUsMTggKzM0OCwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3plY2hfcXdlcnR5LmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCmluZGV4IDQ1N2Q0ZGEuLmNhZDI2MmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCkBAIC0xMzEsMTggKzEzMSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNTAsNDIgKzE1Myw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIxMSw1NCArMjIxLDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTMwMCwyNCArMzE5LDI4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTMyNSwxOCArMzQ4LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9kYW5pc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KaW5kZXggOTE2OGQxMi4uODNlZThjMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KQEAgLTExNSw3NiArMTE1LDkwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlMicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlMicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKLSAgICByYWx0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTY3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTY3JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGNmJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZWYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTIwMCw4NCArMjE0LDEwNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTUnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTUnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU3JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDIxZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAyMWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDIxZicKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlOScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlOScKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTQnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQ2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMjk5LDUzICszMzMsNjUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdlJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTBkJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlZicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyOTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWI3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyOTInCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTRiJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE0YScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTRiJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCi0gICAgcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgJ1x1MDBiNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKKyAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdWsua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdWsua2NtCmluZGV4IDZkOWMyZTUuLjkzYTUwODIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91ay5rY20KQEAgLTEwOCw2OCArMTA4LDgyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjOScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTknCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwotICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGZhJwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlZCcKLSAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGNkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwY2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlZCcKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjMnCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkMycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjMnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTAsNTYgKzIwNCw2NiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI3NCw0MiArMjk4LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91cy5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91cy5rY20KaW5kZXggMDUwYjE0OS4uZGE3NjQ0OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VzLmtjbQpAQCAtMTA2LDYwICsxMDYsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xODYsNTQgKzE5Niw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNTQsNDIgKzI3Myw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfY29sZW1hay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQppbmRleCA3MmU2ZDA0Li5lNTJjY2YwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQpAQCAtMTI1LDYwICsxMjUsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc6JwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwNSw1NCArMjE1LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CkBAIC0yNzMsNDIgKzI5Miw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfZHZvcmFrLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VzX2R2b3Jhay5rY20KaW5kZXggZGY2YTNmZC4uNmZmNjI3YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfZHZvcmFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19kdm9yYWsua2NtCkBAIC0xNjAsNDIgKzE2MCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0xBU0ggewpAQCAtMjIyLDYwICsyMjksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IE1JTlVTIHsKQEAgLTI5Niw1MiArMzEzLDYxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfaW50bC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQppbmRleCBhYTMxNDkzLi5kZmYxN2IzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQpAQCAtMTIxLDMwICsxMjEsMzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlNCcKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlOScKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTknCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFlJwogfQogCkBAIC0xNTIsNDggKzE1OSw2MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmUnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkZScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGZlJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmYScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWQnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVkJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjMnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0yMjQsMTQgKzI0MywxNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRmJwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CkBAIC0yNDAsNDYgKzI2Miw1NSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjAnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkMCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGYwJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY4JwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTMxMiwyMCArMzQzLDI0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTknCiAgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhMicKIH0KQEAgLTMzNCwyNiArMzY5LDMxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGYxJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIApAQCAtMzYzLDYgKzQwMyw3IEBACiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBQRVJJT0QgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfd29ya21hbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQppbmRleCBmZTgyYzhkLi43MTNhZmJhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQpAQCAtMTI5LDYwICsxMjksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc6JwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwOSw0OCArMjE5LDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IE8gewpAQCAtMjYzLDYgKzI4MSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3Nyw0MiArMjk2LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZXN0b25pYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VzdG9uaWFuLmtjbQppbmRleCBlZjU0NWI4Li4yN2EwM2RhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZXN0b25pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lc3Rvbmlhbi5rY20KQEAgLTExNiwxOCArMTE2LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNSw1NCArMTM4LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKQEAgLTE5Miw2OCArMjA0LDgwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDInCiB9CiAKQEAgLTI3Nyw0NCArMzAxLDUyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9maW5uaXNoLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9maW5uaXNoLmtjbQppbmRleCBiNGRlZWQ0Li43OTA5NmFkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZmlubmlzaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2Zpbm5pc2gua2NtCkBAIC0xMTUsNzYgKzExNSw5MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTInCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCi0gICAgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2NycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTY2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2NycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVmJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwY2YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVmJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgUklHSFRfQlJBQ0tFVCB7CkBAIC0yMDAsODQgKzIxNCwxMDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGUxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2MScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTEnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU1JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlNycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlNycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyMWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDIxZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyMWYnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTknCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTknCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY4JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU2JwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI5OSw1MyArMzMzLDY1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZWYnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjkyJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxYjcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjkyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0YicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTRhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0YicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJwotICAgIHJhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICdcdTAwYjUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCisgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KaW5kZXggODllODNkYS4uNDkwNjMwNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KQEAgLTEyMywxOCArMTIzLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTE0Miw0MiArMTQ1LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTk5LDYwICsyMDksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjc5LDM2ICsyOTksNDIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZnJlbmNoX2NhLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCmluZGV4IDU1ZGRkNjAuLjAzYjVjMTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCkBAIC0xMTksNTQgKzExOSw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE3JwogfQogCkBAIC0xNzQsNiArMTgzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI2JwogfQogCkBAIC0xOTYsNTQgKzIwNiw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNzksNDIgKzI5OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKQEAgLTMzNSw1ICszNjEsNiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZW9yZ2lhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ2VvcmdpYW4ua2NtCmluZGV4IDM1YjY2YTMuLmE4ZjIyOWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZW9yZ2lhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2dlb3JnaWFuLmtjbQpAQCAtMjgsNiArMjgsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjAxZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUyMDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTIwMWUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjgsNzkgKzEyOSw5MiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZWMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUxMGVkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTEwZWMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGUwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZDcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ3snCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMDgsNyArMjIyLDcgQEAKIGtleSBSSUdIVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnfScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyNyw3MiArMjQxLDg0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBmMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUxMGRmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTEwZWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGRhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MjBiZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGRhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMwMCw3ICszMjYsNyBAQAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJyInCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzExLDU3ICszMzcsNjYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGVlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGVhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnPCcKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM2OSw3ICs0MDQsNyBAQAoga2V5IFBFUklPRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJz4nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ2VybWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCmluZGV4IGQ5Y2FhMzIuLjIzY2NjOWEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCkBAIC0xOCw3ICsxOCw3IEBACiAKIHR5cGUgT1ZFUkxBWQogCi1tYXAga2V5IDEyIFNMQVNIICAgICAgICAgICAgIyCnID8gXAorbWFwIGtleSAxMiBTTEFTSCAgICAgICAgICAgICMgwqcgPyBcCiBtYXAga2V5IDIxIFoKIG1hcCBrZXkgNDQgWQogbWFwIGtleSA1MyBNSU5VUyAgICAgICAgICAgICMgLSBfCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KIApAQCAtMTI0LDEyICsxMjUsMTQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNyw0OCArMTQwLDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTE5NCw2NiArMjA1LDc3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNCcKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CkBAIC0yNzUsNDIgKzI5Nyw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ncmVlay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ3JlZWsua2NtCmluZGV4IGE3Njg0ZTEuLjZlZmYxMTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ncmVlay5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2dyZWVrLmtjbQpAQCAtMjQsODggKzI0LDg4IEBACiAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2AnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CiAKIGtleSAxIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnMScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIScKIH0KIAoga2V5IDIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICcyJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjInCiB9CiAKIGtleSAzIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnMycKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGIzJwogfQogCiBrZXkgNCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzQnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhMycKIH0KIAoga2V5IDUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKIGtleSA2IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnNicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI2JwogfQogCiBrZXkgNyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzcnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKIGtleSA4IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE0JwogfQogCiBrZXkgOSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzknCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNicKIH0KIAoga2V5IDAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICcwJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjAnCiB9CiAKIGtleSBNSU5VUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ18nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiMScKIH0KIAoga2V5IEVRVUFMUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJz0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJysnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiZCcKIH0KQEAgLTExNCwxMyArMTE0LDEzIEBACiAKIGtleSBRIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOycKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzg1JwogfQogCkBAIC0xMjgsNiArMTI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xMzUsNiArMTM2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2MxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFlJwogfQogCkBAIC0xNDIsMTIgKzE0NCwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2E1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNScKIH0KIApAQCAtMTU1LDM2ICsxNTksNDAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiOCcKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5OScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2I5JwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmYnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2MwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1snCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICddJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYmInCiB9CkBAIC0xOTUsNTkgKzIwMyw2OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5MScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2IxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2EzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzMnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M2JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzkzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYjMnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYmUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5ZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2JlJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmEnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2JiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYicKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAxJwogI3Nob3VsZCBiZSBcdTAzODQgKGdyZWVrIHRvbm9zKQogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDM4NScKQEAgLTI1NSwxMyArMjcyLDEzIEBACiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1wnJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYycKIH0KQEAgLTI3MCw3ICsyODcsNyBAQAogCiBrZXkgUExVUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzwnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwpAQCAtMjgwLDE4ICsyOTcsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M3JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjOCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2E4JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhOScKIH0KIApAQCAtMjk5LDQwICszMTksNDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2M5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjOScKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5MicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2IyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmQnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2JjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYycKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnLCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IFBFUklPRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy4nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy8nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaGVicmV3LmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCmluZGV4IDI4M2NiNGUuLjExYWRlNDIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCkBAIC0xMjEsMTggKzEyMSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDAyNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQwLDI0ICsxNDMsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWU4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkMCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQ1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZjAnCiB9CiAKQEAgLTE2NSwyOSArMTcyLDMyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdbJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQogCkBAIC0xOTcsMzYgKzIwNyw0MiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWUyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWYyJwogfQogCkBAIC0yMzQsNiArMjUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZjEnCiB9CiAKQEAgLTI0MSwxMiArMjU4LDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewpAQCAtMjU0LDYgKzI3Myw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjYxLDYgKzI4MSw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICciJwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI3Myw3ICsyOTQsNyBAQAogCiBrZXkgUExVUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CiAKQEAgLTI4MSw0MiArMzAyLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWRlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKQEAgLTMyNCw2ICszNTIsNyBAQAogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZWEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKIGtleSBQRVJJT0QgewpAQCAtMzMxLDYgKzM2MCw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlNScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IFNMQVNIIHsKQEAgLTMzOCw0ICszNjgsNSBAQAogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc/JwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc/JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2h1bmdhcmlhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQppbmRleCBkYWZiNTBiLi42Yzk0N2M3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQpAQCAtMTAxLDYgKzEwMSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzBiJwogfQogCkBAIC0xMDgsNiArMTA5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGZjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiB9CiAKQEAgLTExNSw2ICsxMTcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMyNycKIH0KIApAQCAtMTI0LDYgKzEyNyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMzEsNiArMTM1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTM4LDYgKzE0Myw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKIH0KIApAQCAtMTQ1LDI0ICsxNTEsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNzAsNiArMTgwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGNkJwogfQogCkBAIC0xNzcsMTggKzE4OCwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNTAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTUwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNycKIH0KIApAQCAtMTk2LDYgKzIxMCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCkBAIC0yMDUsNiArMjIwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogfQogCkBAIC0yMTIsNiArMjI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogfQogCkBAIC0yMTksNiArMjM2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogfQogCkBAIC0yMjYsNiArMjQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIApAQCAtMjMzLDYgKzI1Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiB9CiAKQEAgLTI0MCwxMiArMjYwLDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVkJwogfQogCkBAIC0yNTMsNiArMjc1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTk3JwogfQogCkBAIC0yNjAsNiArMjgzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTQxJwogfQogCkBAIC0yNjcsNiArMjkxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICckJwogfQogCkBAIC0yNzQsNiArMjk5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKQEAgLTI4MSw2ICszMDcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNzAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTcwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNCcKIH0KIApAQCAtMjkwLDYgKzMxNyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwY2QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIApAQCAtMjk3LDYgKzMyNSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKQEAgLTMwNCw2ICszMzMsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjJwogfQogCkBAIC0zMTEsNiArMzQxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJicKIH0KIApAQCAtMzE4LDYgKzM0OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTMyNSw2ICszNTcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQogCkBAIC0zMzIsNiArMzY1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIApAQCAtMzM5LDYgKzM3Myw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaWNlbGFuZGljLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCmluZGV4IDExN2Y1OGIuLjUxMzFiNGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCkBAIC05OSw2ICs5OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiB9CiAKQEAgLTExNCw2ICsxMTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0xMjEsMTIgKzEyMywxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM0LDQ4ICsxMzgsNTYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewpAQCAtMTkxLDYwICsyMDMsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3NCw0MiArMjk2LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIApAQCAtMzI5LDQgKzM1OCw1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZGUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmZScKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pdGFsaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pdGFsaWFuLmtjbQppbmRleCBiZDJkMjVhLi4zMDlkOGIyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaXRhbGlhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2l0YWxpYW4ua2NtCkBAIC0xMDksMTggKzEwOSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xMjgsNDIgKzEzMSw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTE4OCw1NCArMTk4LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI3MCw0MiArMjg5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGF0dmlhbl9xd2VydHkua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xhdHZpYW5fcXdlcnR5LmtjbQppbmRleCBkNGJjMGMwLi4zYjc3Y2IxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGF0dmlhbl9xd2VydHkua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9sYXR2aWFuX3F3ZXJ0eS5rY20KQEAgLTExOSw3MCArMTE5LDg1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTMnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDExMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTMnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTU3JwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxNTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE1NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTU3JwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNmInCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE2YScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTZhJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNmInCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTJiJwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMmEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEyYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTJiJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwNCw2NCArMjE5LDc4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwMScKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTAwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMDAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwMScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNjEnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNjEnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEyMycKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTIyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMjInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEyMycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTM3JwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMzYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEzNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTM3JwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzYycKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTNiJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxM2InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEzYycKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yOTgsNDggKzMyNyw1OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxN2UnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxN2UnCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMGQnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMGQnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0NicKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0NicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xpdGh1YW5pYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xpdGh1YW5pYW4ua2NtCmluZGV4IDcyY2EzMzMuLmJjZmRiMTIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9saXRodWFuaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGl0aHVhbmlhbi5rY20KQEAgLTMyLDYgKzMyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTA1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMDQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIScKIH0KQEAgLTQwLDYgKzQxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTE5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KQEAgLTU2LDYgKzU5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTE3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNCcKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnJCcKIH0KQEAgLTY0LDYgKzY4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTJmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMmUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEyZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnJScKIH0KQEAgLTcyLDYgKzc3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAyJwogfQpAQCAtODAsNiArODYsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDE3MicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTczJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICcmJwogfQpAQCAtODgsNiArOTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNmInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDE2YScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTZiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogfQpAQCAtMTE2LDYgKzEyNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxN2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJysnCiB9CkBAIC0xMjYsMTggKzEzNSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNDUsNDIgKzE1Nyw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwMSw1NCArMjIwLDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI4MSw0MiArMzA5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbW9uZ29saWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCmluZGV4IDNkNGE4YzYuLjc3Y2M2NzIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJysnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJysnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjIsODYgKzEyMywxMDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0YWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDRhZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNGFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0YWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjEwLDYgKzIzMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyMCw3OCArMjQzLDk3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDRlOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNGU5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0ZTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDRlOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQpAQCAtMzAwLDYgKzM0Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CkBAIC0zMTgsNjIgKzM2MSw3NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM4Miw2ICs0NDAsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbm9yd2VnaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCmluZGV4IDU2MGRkMTYuLmNhZTFjOTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCkBAIC0xMTUsNzYgKzExNSw5MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTInCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCi0gICAgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2NycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTY2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2NycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVmJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwY2YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVmJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgUklHSFRfQlJBQ0tFVCB7CkBAIC0yMDAsODQgKzIxNCwxMDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGUxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2MScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTEnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU1JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlNycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlNycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyMWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDIxZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyMWYnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTknCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTknCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY2JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU0JwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI5OCw1MyArMzMyLDY1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZWYnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjkyJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxYjcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjkyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0YicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTRhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0YicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJwotICAgIHJhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICdcdTAwYjUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCisgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wZXJzaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wZXJzaWFuLmtjbQppbmRleCBiZmU3ODIxLi42NzQ0OTIyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcGVyc2lhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BlcnNpYW4ua2NtCkBAIC0yMiwyMzEgKzIyLDIyMiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjI0JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM0JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTIwMEMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzAnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY5OCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMicKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2Q0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZDQycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRBJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNkNDJwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJCJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MkInCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyOCcKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjIzJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ0JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2MjInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MjcnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MkEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjI5JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjJBJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwQUInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDYnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBCQicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NScKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2N0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY3RScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjIxJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjdFJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJGJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NTQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MkYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MkUnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ10nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJEJwotICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdbJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIAoga2V5IFEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjUyJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM2JwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDInCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMycKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRGJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQxJwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEUnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzknCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY3MCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRDJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM1JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NTMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzcnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjNBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2M0EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzQScKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjQzJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM4JwogfQogCiBrZXkgMCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYwJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IDEgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSAyIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjInCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiAKIH0KIGtleSAzIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjMnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA0IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1RkRGQycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA1IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA2IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBENycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIApAQCAtMjU0LDI0OCArMjQ1LDgyIEBACiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY3JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MEMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgOCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY4JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IDkgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGOScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBTUEFDRSB7Ci0gICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgRU5URVIgewotICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgVEFCIHsKLSAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHQnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x0JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYxRicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBGNycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKLQoga2V5IE1JTlVTIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBFUVVBTFMgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJDJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2ODYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY4NicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBCQUNLU0xBU0ggewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcXCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkE5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2QTknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzonCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi0jIyMgTnVtZXJpYyBrZXlwYWQgIyMjCi0KLWtleSBOVU1QQURfMCB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzAnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgSU5TRVJUCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzEgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcxJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIE1PVkVfRU5ECi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzIgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfRE9XTgotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF8zIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayBQQUdFX0RPV04KLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfNCB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgRFBBRF9MRUZUCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzUgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc1JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfQ0VOVEVSCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzUnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzYgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc2JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfUklHSFQKLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfNyB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgTU9WRV9IT01FCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzggewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc4JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfVVAKLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfOSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzknCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgUEFHRV9VUAotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9MRUZUX1BBUkVOIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfUklHSFRfUEFSRU4gewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9ESVZJREUgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9NVUxUSVBMWSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJyonCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX1NVQlRSQUNUIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLScKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfQUREIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnKycKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfRE9UIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLicKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayBGT1JXQVJEX0RFTAotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9DT01NQSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX0VRVUFMUyB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX0VOVEVSIHsKLSAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJyBmYWxsYmFjayBFTlRFUgotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUgZmFsbGJhY2sgRU5URVIKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wb2xpc2gua2NtCmluZGV4IDU1OWVjMDcuLjY2ZmJlZmMxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbQpAQCAtMTA0LDY0ICsxMDQsNzYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExOScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTE4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExOScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMEYzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwRDMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBEMycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMEYzJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTg4LDYwICsyMDAsNzIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTA1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMDQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTA1JwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1YicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTVhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNWEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE1YicKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDInCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE0MScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTQxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNDInCiB9CiAKIGtleSBTRU1JQ09MT04gewpAQCAtMjYyLDUwICsyODYsNjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdjJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxN2InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3YicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdjJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3YScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTc5JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNzknCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3YScKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMDcnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEwNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTA2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMDcnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0NCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQzJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0NCcKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BvcnR1Z3Vlc2Uua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BvcnR1Z3Vlc2Uua2NtCmluZGV4IDQ3ZWU4NjcuLjZmZTBlNDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wb3J0dWd1ZXNlLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9ydHVndWVzZS5rY20KQEAgLTExNSwxOCArMTE1LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNCw0MiArMTM3LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkxLDYwICsyMDEsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3Miw0MiArMjkyLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbi5rY20KaW5kZXggNDFjNmJiMy4uZWNhZGE0OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3J1c3NpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ydXNzaWFuLmtjbQpAQCAtMjgsNiArMjgsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjQsODYgKzEyNSwxMDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjEyLDYgKzIzNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyMiw3OCArMjQ1LDk3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMyJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQpAQCAtMzAyLDYgKzM0NCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CkBAIC0zMTksNjIgKzM2Miw3NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM4Myw2ICs0NDEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbl9tYWMua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3J1c3NpYW5fbWFjLmtjbQppbmRleCAxMWMyYWQ0Li41NDE3YmMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbl9tYWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ydXNzaWFuX21hYy5rY20KQEAgLTEyNiw4NiArMTI2LDEwNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdXJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdUJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdJJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMTQsNiArMjM1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjI0LDc4ICsyNDYsOTcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdGJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdKJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzonCiB9CkBAIC0zMDQsNiArMzQ1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KQEAgLTMxMiw2ICszNTQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwogfQpAQCAtMzMwLDYyICszNzMsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDExJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTQsNiArNDUyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3Nsb3Zhay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQppbmRleCAyZWIwZjYzLi41MDY1YWE4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQpAQCAtMTE4LDYgKzExOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMjUsNiArMTI2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTMyLDYgKzEzNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM5LDQyICsxNDIsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiB9CiAKQEAgLTE5OCwxMiArMjA4LDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogfQogCkBAIC0yMTEsNiArMjIzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogfQogCkBAIC0yMTgsNiArMjMxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIApAQCAtMjI1LDYgKzIzOSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiB9CiAKQEAgLTIzMiwxOCArMjQ3LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDInCiB9CiAKQEAgLTI1MSw2ICsyNjksNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDEnCiB9CiAKQEAgLTI4OCw2ICszMDcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQogCkBAIC0yOTUsNiArMzE1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KIApAQCAtMzAyLDYgKzMyMyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKQEAgLTMwOSw2ICszMzEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMTYsNiArMzM5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIApAQCAtMzIzLDYgKzM0Nyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTMzMCw2ICszNTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2gua2NtCmluZGV4IGRhOTE1OWIuLjZhNjNlNzAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zcGFuaXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaC5rY20KQEAgLTExMywxOCArMTEzLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzMiw0MiArMTM1LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkwLDYwICsyMDAsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI1Nyw2ICsyNzcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTI3Miw0MiArMjkzLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaF9sYXRpbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaF9sYXRpbi5rY20KaW5kZXggMTZlYjUzZi4uMjlhYWI5NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2hfbGF0aW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zcGFuaXNoX2xhdGluLmtjbQpAQCAtMTA5LDYgKzEwOSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTExNiw1NCArMTE3LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTE4Niw2MCArMTk2LDcwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGYxJwogfQogCiBrZXkgQVBPU1RST1BIRSB7CkBAIC0yNjgsNDIgKzI4OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3ZWRpc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3ZWRpc2gua2NtCmluZGV4IDhhNGU5YTUuLmYxMjgwNGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zd2VkaXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dlZGlzaC5rY20KQEAgLTExNSw3NiArMTE1LDkwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlMicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlMicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKLSAgICByYWx0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTY3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTY3JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGNmJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZWYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTIwMCw4NCArMjE0LDEwNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTUnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTUnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU3JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDIxZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAyMWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDIxZicKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlOScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlOScKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQ4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjgnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMjk5LDUzICszMzMsNjUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdlJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTBkJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlZicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyOTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWI3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyOTInCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTRiJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE0YScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTRiJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCi0gICAgcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgJ1x1MDBiNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKKyAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3aXNzX2ZyZW5jaC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQppbmRleCA5ZTIwNDYyLi42NDc2NzkzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQpAQCAtMTE5LDE4ICsxMTksMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM4LDQyICsxNDEsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTYsNTQgKzIwNiw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNzksNDIgKzI5OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3aXNzX2dlcm1hbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQppbmRleCA3ZmJkMWE5Li45ZDZmMzY3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQpAQCAtMTE5LDE4ICsxMTksMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM4LDQyICsxNDEsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTgsNTQgKzIwOCw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yODUsNDIgKzMwNCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3R1cmtpc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3R1cmtpc2gua2NtCmluZGV4IGUxOTNkMzQuLjJhOGZjZWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdHVya2lzaC5rY20KQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0xMzEsMTIgKzEzMiwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQ0LDUwICsxNDcsNTkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEzMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTFmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzA4JwogfQogCkBAIC0xOTUsNiArMjA3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGZjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDMnCiB9CiAKQEAgLTIwNCwxNCArMjE3LDE3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlNicKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKQEAgLTIxOSw0OCArMjM1LDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTVlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKIH0KIApAQCAtMjY4LDYgKzI5Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgQ09NTUEgewpAQCAtMjkwLDU0ICszMTUsNjMgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEVRVUFMUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKIH0KIAoga2V5IFBFUklPRCB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdHVya2lzaF9mLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCmluZGV4IDViOTZkYTAuLmIyN2Y2ZmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCkBAIC0xMjUsNiArMTI1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KIApAQCAtMTMyLDMyICsxMzMsMzggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBiNicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNScKIH0KIApAQCAtMTY1LDI2ICsxNzIsMzEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmOCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGQ4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmOCcKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTMnCiB9CiAKQEAgLTE5Miw2ICsyMDQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQogCkBAIC0xOTksNiArMjEyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KIApAQCAtMjA4LDIyICsyMjIsMjcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMDc1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwNzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDA1NScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMDc1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBhNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGE3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0yMzEsNiArMjUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFhJwogfQogCkBAIC0yMzgsMTIgKzI1OCwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGJhJwogfQogCkBAIC0yNTEsMjQgKzI3MywyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNCcKIH0KIApAQCAtMjc2LDYgKzMwMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTVmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKIH0KIAoga2V5IENPTU1BIHsKQEAgLTI5Miw2MyArMzE5LDc2IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBhNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGE2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd8JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnPCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnPCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGFiJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGJiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICc+JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICc+JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwYmInCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGEyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwYTknCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBhOScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGEyJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwYmEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBiYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgRVFVQUxTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCkBAIC0zNTYsNiArMzk2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY3JwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdWtyYWluaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCmluZGV4IGE4MDI0NjAuLjEzNDZiYmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQwMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KQEAgLTEyNCw4NiArMTI1LDEwNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdXJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdUJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdJJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMTIsNiArMjM0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjIyLDc4ICsyNDUsOTcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDU2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdGJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdKJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzonCiB9CkBAIC0zMDIsNiArMzQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KQEAgLTMxOSw2ICszNjIsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0OTAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ5MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDkwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0OTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwogfQpAQCAtMzI3LDYyICszNzEsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDExJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTEsNiArNDUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZy5qYXZhCmluZGV4IGJkOWU3NjAuLmM4YmNhYmYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9hcHBsaWNhdGlvbnMvU2VydmljZUxpc3RpbmcuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvYXBwbGljYXRpb25zL1NlcnZpY2VMaXN0aW5nLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIC8qKgogICogQ2xhc3MgZm9yIG1hbmFnaW5nIHNlcnZpY2VzIG1hdGNoaW5nIGEgZ2l2ZW4gaW50ZW50IGFuZCByZXF1ZXN0aW5nIGEgZ2l2ZW4gcGVybWlzc2lvbi4KQEAgLTUxLDEyICs1MiwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxDb21wb25lbnROYW1lPiBtRW5hYmxlZFNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxTZXJ2aWNlSW5mbz4gbVNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENhbGxiYWNrPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgbVZhbGlkYXRvcjsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdGVuaW5nOwogCiAgICAgcHJpdmF0ZSBTZXJ2aWNlTGlzdGluZyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0YWcsCiAgICAgICAgICAgICBTdHJpbmcgc2V0dGluZywgU3RyaW5nIGludGVudEFjdGlvbiwgU3RyaW5nIHBlcm1pc3Npb24sIFN0cmluZyBub3VuLAotICAgICAgICAgICAgYm9vbGVhbiBhZGREZXZpY2VMb2NrZWRGbGFncykgeworICAgICAgICAgICAgYm9vbGVhbiBhZGREZXZpY2VMb2NrZWRGbGFncywgUHJlZGljYXRlIHZhbGlkYXRvcikgewogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVGFnID0gdGFnOwpAQCAtNjUsNiArNjcsNyBAQAogICAgICAgICBtUGVybWlzc2lvbiA9IHBlcm1pc3Npb247CiAgICAgICAgIG1Ob3VuID0gbm91bjsKICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzID0gYWRkRGV2aWNlTG9ja2VkRmxhZ3M7CisgICAgICAgIG1WYWxpZGF0b3IgPSB2YWxpZGF0b3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKQEAgLTEzNyw3ICsxNDAsNiBAQAogICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbVdyYXBwZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBpbnN0YWxsZWRTZXJ2aWNlcyA9IHBtV3JhcHBlci5xdWVyeUludGVudFNlcnZpY2VzQXNVc2VyKAogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQobUludGVudEFjdGlvbiksIGZsYWdzLCB1c2VyKTsKLQogICAgICAgICBmb3IgKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvIDogaW5zdGFsbGVkU2VydmljZXMpIHsKICAgICAgICAgICAgIFNlcnZpY2VJbmZvIGluZm8gPSByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbzsKIApAQCAtMTQ4LDYgKzE1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIG1QZXJtaXNzaW9uKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmFsaWRhdG9yICE9IG51bGwgJiYgIW1WYWxpZGF0b3IudGVzdChpbmZvKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNlcnZpY2VzLmFkZChpbmZvKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKENhbGxiYWNrIGNhbGxiYWNrIDogbUNhbGxiYWNrcykgewpAQCAtMTk0LDYgKzE5OSw3IEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1QZXJtaXNzaW9uOwogICAgICAgICBwcml2YXRlIFN0cmluZyBtTm91bjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BZGREZXZpY2VMb2NrZWRGbGFncyA9IGZhbHNlOworICAgICAgICBwcml2YXRlIFByZWRpY2F0ZSBtVmFsaWRhdG9yOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMjI0LDYgKzIzMCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWYWxpZGF0b3IoUHJlZGljYXRlPFNlcnZpY2VJbmZvPiB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIG1WYWxpZGF0b3IgPSB2YWxpZGF0b3I7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhZGQgc3VwcG9ydCBmb3IgYm90aCBNQVRDSF9ESVJFQ1RfQk9PVF9BV0FSRSBhbmQKICAgICAgICAgICogTUFUQ0hfRElSRUNUX0JPT1RfVU5BV0FSRSBmbGFncyB3aGVuIHF1ZXJ5aW5nIFBhY2thZ2VNYW5hZ2VyLiBSZXF1aXJlZCB0byBnZXQgcmVzdWx0cwpAQCAtMjM2LDcgKzI0Nyw3IEBACiAKICAgICAgICAgcHVibGljIFNlcnZpY2VMaXN0aW5nIGJ1aWxkKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlTGlzdGluZyhtQ29udGV4dCwgbVRhZywgbVNldHRpbmcsIG1JbnRlbnRBY3Rpb24sIG1QZXJtaXNzaW9uLCBtTm91biwKLSAgICAgICAgICAgICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzLCBtVmFsaWRhdG9yKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kcmVhbS9EcmVhbUJhY2tlbmQuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kcmVhbS9EcmVhbUJhY2tlbmQuamF2YQppbmRleCA2ODhmYzcyLi5jNGYwOWNlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2RyZWFtL0RyZWFtQmFja2VuZC5qYXZhCkBAIC0zMSwxMyArMzEsMTUgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuRHJlYW1TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuSURyZWFtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0xMTYsNyArMTE4LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbURyZWFtc0FjdGl2YXRlZE9uU2xlZXBCeURlZmF1bHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EcmVhbXNBY3RpdmF0ZWRPbkRvY2tCeURlZmF1bHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q29tcG9uZW50TmFtZT4gbURpc2FibGVkRHJlYW1zOwotICAgIHByaXZhdGUgZmluYWwgU2V0PEludGVnZXI+IG1TdXBwb3J0ZWRDb21wbGljYXRpb25zOworICAgIHByaXZhdGUgU2V0PEludGVnZXI+IG1TdXBwb3J0ZWRDb21wbGljYXRpb25zOwogICAgIHByaXZhdGUgc3RhdGljIERyZWFtQmFja2VuZCBzSW5zdGFuY2U7CiAKICAgICBwdWJsaWMgc3RhdGljIERyZWFtQmFja2VuZCBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKQEAgLTI4MSw3ICsyODMsMTggQEAKIAogICAgIC8qKiBHZXRzIGFsbCBjb21wbGljYXRpb25zIHdoaWNoIGhhdmUgYmVlbiBlbmFibGVkIGJ5IHRoZSB1c2VyLiAqLwogICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0RW5hYmxlZENvbXBsaWNhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb21wbGljYXRpb25zRW5hYmxlZCgpID8gbVN1cHBvcnRlZENvbXBsaWNhdGlvbnMgOiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICBmaW5hbCBTZXQ8SW50ZWdlcj4gZW5hYmxlZENvbXBsaWNhdGlvbnMgPQorICAgICAgICAgICAgICAgIGdldENvbXBsaWNhdGlvbnNFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEFycmF5U2V0PD4obVN1cHBvcnRlZENvbXBsaWNhdGlvbnMpIDogbmV3IEFycmF5U2V0PD4oKTsKKworICAgICAgICBpZiAoIWdldEhvbWVDb250cm9sc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZW5hYmxlZENvbXBsaWNhdGlvbnMucmVtb3ZlKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICB9IGVsc2UgaWYgKG1TdXBwb3J0ZWRDb21wbGljYXRpb25zLmNvbnRhaW5zKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpKSB7CisgICAgICAgICAgICAvLyBBZGQgaG9tZSBjb250cm9sIHR5cGUgdG8gbGlzdCBvZiBlbmFibGVkIGNvbXBsaWNhdGlvbnMsIGV2ZW4gaWYgb3RoZXIgY29tcGxpY2F0aW9ucworICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIGRpc2FibGVkLgorICAgICAgICAgICAgZW5hYmxlZENvbXBsaWNhdGlvbnMuYWRkKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbmFibGVkQ29tcGxpY2F0aW9uczsKICAgICB9CiAKICAgICAvKiogU2V0cyBjb21wbGljYXRpb24gZW5hYmxlZCBzdGF0ZS4gKi8KQEAgLTI5MCw2ICszMDMsMTggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUExJQ0FUSU9OU19FTkFCTEVELCBlbmFibGVkID8gMSA6IDApOwogICAgIH0KIAorICAgIC8qKiBTZXRzIHdoZXRoZXIgaG9tZSBjb250cm9scyBhcmUgZW5hYmxlZCBieSB0aGUgdXNlciBvbiB0aGUgZHJlYW0gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb21lQ29udHJvbHNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9IT01FX0NPTlRST0xTX0VOQUJMRUQsIGVuYWJsZWQgPyAxIDogMCk7CisgICAgfQorCisgICAgLyoqIEdldHMgd2hldGhlciBob21lIGNvbnRyb2xzIGJ1dHRvbiBpcyBlbmFibGVkIG9uIHRoZSBkcmVhbSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRIb21lQ29udHJvbHNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfSE9NRV9DT05UUk9MU19FTkFCTEVELCAxKSA9PSAxOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldHMgd2hldGhlciBjb21wbGljYXRpb25zIGFyZSBlbmFibGVkIG9uIHRoaXMgZGV2aWNlCiAgICAgICovCkBAIC0zMDQsNiArMzI5LDE0IEBACiAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkQ29tcGxpY2F0aW9uczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb21wbGljYXRpb25zLiBTaG91bGQgb25seSBiZSB1c2VkIGluIHRlc3RzLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRlZENvbXBsaWNhdGlvbnMoU2V0PEludGVnZXI+IGNvbXBsaWNhdGlvbnMpIHsKKyAgICAgICAgbVN1cHBvcnRlZENvbXBsaWNhdGlvbnMgPSBjb21wbGljYXRpb25zOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0VOQUJMRUQsIG1EcmVhbXNFbmFibGVkQnlEZWZhdWx0KTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvSW5mb01lZGlhTWFuYWdlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXIuamF2YQppbmRleCA2ODRhOWFhLi5jOWU4MzEyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvSW5mb01lZGlhTWFuYWdlci5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9tZWRpYS9JbmZvTWVkaWFNYW5hZ2VyLmphdmEKQEAgLTMxLDcgKzMxLDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlMkluZm8uVFlQRV9VU0JfSEVBRFNFVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlMkluZm8uVFlQRV9XSVJFRF9IRUFEUEhPTkVTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGUySW5mby5UWVBFX1dJUkVEX0hFQURTRVQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZTJQcm92aWRlclNlcnZpY2UuUkVBU09OX1VOS05PV05fRVJST1I7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIubWVkaWEuTG9jYWxNZWRpYU1hbmFnZXIuTWVkaWFEZXZpY2VTdGF0ZS5TVEFURV9TRUxFQ1RFRDsKIApAQCAtNjIxLDkgKzYyMCwxMSBAQAogICAgICAgICAgICAgZGlzcGF0Y2hDb25uZWN0ZWREZXZpY2VDaGFuZ2VkKGlkKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgY2FsbGJhY2sgaGVyZSBzaW5jZSB3ZSdsbCBhbHNvIHJlY2VpdmUge0BsaW5rIG9uUmVxdWVzdEZhaWxlZH0gd2l0aCByZWFzb24gY29kZS4KKyAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblRyYW5zZmVyRmFpbGVkKFJvdXRpbmdTZXNzaW9uSW5mbyBzZXNzaW9uLCBNZWRpYVJvdXRlMkluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoT25SZXF1ZXN0RmFpbGVkKFJFQVNPTl9VTktOT1dOX0VSUk9SKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL01lZGlhRGV2aWNlLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvTWVkaWFEZXZpY2UuamF2YQppbmRleCA2Yjk4NjZiLi4wNzFhYjI3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvTWVkaWFEZXZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvTWVkaWFEZXZpY2UuamF2YQpAQCAtMzMsNyArMzMsNiBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5GTEFHX09OR09JTkdfU0VTU0lPTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uRkxBR19PTkdPSU5HX1NFU1NJT05fTUFOQUdFRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uRkxBR19TVUdHRVNURUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNFTEVDVElPTl9CRUhBVklPUl9UUkFOU0ZFUjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU1VCVEVYVF9BRF9ST1VUSU5HX0RJU0FMTE9XRUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfQ1VTVE9NOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0RFVklDRV9MT1dfUE9XRVI7CkBAIC00NSw2ICs0NCw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfVU5BVVRIT1JJWkVEOwogCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLkxvY2FsTWVkaWFNYW5hZ2VyLk1lZGlhRGV2aWNlU3RhdGUuU1RBVEVfU0VMRUNURUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLk1lZGlhRGV2aWNlLlNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9UUkFOU0ZFUjsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC05NSw2ICs5NSwxNyBAQAogICAgICAgICBpbnQgVFlQRV9DQVNUX0dST1VQX0RFVklDRSA9IDc7CiAgICAgfQogCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIEBJbnREZWYoe1NlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9OT05FLAorICAgICAgICAgICAgU0VMRUNUSU9OX0JFSEFWSU9SX1RSQU5TRkVSLAorICAgICAgICAgICAgU2VsZWN0aW9uQmVoYXZpb3IuU0VMRUNUSU9OX0JFSEFWSU9SX0dPX1RPX0FQUAorICAgIH0pCisgICAgcHVibGljIEBpbnRlcmZhY2UgU2VsZWN0aW9uQmVoYXZpb3IgeworICAgICAgICBpbnQgU0VMRUNUSU9OX0JFSEFWSU9SX05PTkUgPSAwOworICAgICAgICBpbnQgU0VMRUNUSU9OX0JFSEFWSU9SX1RSQU5TRkVSID0gMTsKKyAgICAgICAgaW50IFNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFAgPSAyOworICAgIH0KKwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGludCBtVHlwZTsKIApAQCAtMjEzLDcgKzIyNCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHNlbGVjdGlvbiBiZWhhdmlvciBvZiBkZXZpY2UKICAgICAgKi8KLSAgICBAUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlN1YlRleHQKKyAgICBAU2VsZWN0aW9uQmVoYXZpb3IKICAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkJlaGF2aW9yKCkgewogICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuVVBTSURFX0RPV05fQ0FLRSAmJiBtSXRlbSAhPSBudWxsCiAgICAgICAgICAgICAgICAgPyBtSXRlbS5nZXRTZWxlY3Rpb25CZWhhdmlvcigpIDogU0VMRUNUSU9OX0JFSEFWSU9SX1RSQU5TRkVSOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvdGVzdHMvcm9ib3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9hcHBsaWNhdGlvbnMvU2VydmljZUxpc3RpbmdUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQppbmRleCBmN2ZkMjViLi43ZmYwOTg4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQpAQCAtMTgsMjAgKzE4LDM1IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55TGlzdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmNvcmUuYXBwLkFwcGxpY2F0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIGltcG9ydCBvcmcucm9ib2xlY3RyaWMuUm9ib2xlY3RyaWNUZXN0UnVubmVyOwogaW1wb3J0IG9yZy5yb2JvbGVjdHJpYy5SdW50aW1lRW52aXJvbm1lbnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogQFJ1bldpdGgoUm9ib2xlY3RyaWNUZXN0UnVubmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFNlcnZpY2VMaXN0aW5nVGVzdCB7CiAKQEAgLTM5LDEwICs1NCwxNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lOVEVOVCA9ICJjb20uZXhhbXBsZS5pbnRlbnQiOwogCiAgICAgcHJpdmF0ZSBTZXJ2aWNlTGlzdGluZyBtU2VydmljZUxpc3Rpbmc7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBtOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBtU2VydmljZUxpc3RpbmcgPSBuZXcgU2VydmljZUxpc3RpbmcuQnVpbGRlcihSdW50aW1lRW52aXJvbm1lbnQuYXBwbGljYXRpb24pCisgICAgICAgIG1QbSA9IG1vY2soUGFja2FnZU1hbmFnZXIuY2xhc3MpOworICAgICAgICBtQ29udGV4dCA9IHNweShBcHBsaWNhdGlvblByb3ZpZGVyLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgd2hlbihtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpKS50aGVuUmV0dXJuKG1QbSk7CisKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nID0gbmV3IFNlcnZpY2VMaXN0aW5nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgLnNldFRhZygidGVzdFRhZyIpCiAgICAgICAgICAgICAgICAgLnNldFNldHRpbmcoVEVTVF9TRVRUSU5HKQogICAgICAgICAgICAgICAgIC5zZXROb3VuKCJ0ZXN0Tm91biIpCkBAIC01Miw2ICs3Myw4MSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRvcigpIHsKKyAgICAgICAgU2VydmljZUluZm8gczEgPSBuZXcgU2VydmljZUluZm8oKTsKKyAgICAgICAgczEucGVybWlzc2lvbiA9ICJ0ZXN0UGVybWlzc2lvbiI7CisgICAgICAgIHMxLnBhY2thZ2VOYW1lID0gInBrZyI7CisgICAgICAgIFNlcnZpY2VJbmZvIHMyID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHMyLnBlcm1pc3Npb24gPSAidGVzdFBlcm1pc3Npb24iOworICAgICAgICBzMi5wYWNrYWdlTmFtZSA9ICJwa2cyIjsKKyAgICAgICAgUmVzb2x2ZUluZm8gcjEgPSBuZXcgUmVzb2x2ZUluZm8oKTsKKyAgICAgICAgcjEuc2VydmljZUluZm8gPSBzMTsKKyAgICAgICAgUmVzb2x2ZUluZm8gcjIgPSBuZXcgUmVzb2x2ZUluZm8oKTsKKyAgICAgICAgcjIuc2VydmljZUluZm8gPSBzMjsKKworICAgICAgICB3aGVuKG1QbS5xdWVyeUludGVudFNlcnZpY2VzQXNVc2VyKGFueSgpLCBhbnlJbnQoKSwgYW55SW50KCkpKS50aGVuUmV0dXJuKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YocjEsIHIyKSk7CisKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nID0gbmV3IFNlcnZpY2VMaXN0aW5nLkJ1aWxkZXIobUNvbnRleHQpCisgICAgICAgICAgICAgICAgLnNldFRhZygidGVzdFRhZyIpCisgICAgICAgICAgICAgICAgLnNldFNldHRpbmcoVEVTVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC5zZXROb3VuKCJ0ZXN0Tm91biIpCisgICAgICAgICAgICAgICAgLnNldEludGVudEFjdGlvbihURVNUX0lOVEVOVCkKKyAgICAgICAgICAgICAgICAuc2V0VmFsaWRhdG9yKGluZm8gLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5wYWNrYWdlTmFtZS5lcXVhbHMoInBrZyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuc2V0UGVybWlzc2lvbigidGVzdFBlcm1pc3Npb24iKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBTZXJ2aWNlTGlzdGluZy5DYWxsYmFjayBjYWxsYmFjayA9IG1vY2soU2VydmljZUxpc3RpbmcuQ2FsbGJhY2suY2xhc3MpOworICAgICAgICBtU2VydmljZUxpc3RpbmcuYWRkQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICBtU2VydmljZUxpc3RpbmcucmVsb2FkKCk7CisKKyAgICAgICAgdmVyaWZ5KG1QbSkucXVlcnlJbnRlbnRTZXJ2aWNlc0FzVXNlcihhbnkoKSwgYW55SW50KCksIGFueUludCgpKTsKKyAgICAgICAgQXJndW1lbnRDYXB0b3I8TGlzdDxTZXJ2aWNlSW5mbz4+IGNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKExpc3QuY2xhc3MpOworICAgICAgICB2ZXJpZnkoY2FsbGJhY2ssIHRpbWVzKDEpKS5vblNlcnZpY2VzUmVsb2FkZWQoY2FwdG9yLmNhcHR1cmUoKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjYXB0b3IuZ2V0VmFsdWUoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjYXB0b3IuZ2V0VmFsdWUoKS5nZXQoMCkpLmlzRXF1YWxUbyhzMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0b3IoKSB7CisgICAgICAgIFNlcnZpY2VJbmZvIHMxID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHMxLnBlcm1pc3Npb24gPSAidGVzdFBlcm1pc3Npb24iOworICAgICAgICBzMS5wYWNrYWdlTmFtZSA9ICJwa2ciOworICAgICAgICBTZXJ2aWNlSW5mbyBzMiA9IG5ldyBTZXJ2aWNlSW5mbygpOworICAgICAgICBzMi5wZXJtaXNzaW9uID0gInRlc3RQZXJtaXNzaW9uIjsKKyAgICAgICAgczIucGFja2FnZU5hbWUgPSAicGtnMiI7CisgICAgICAgIFJlc29sdmVJbmZvIHIxID0gbmV3IFJlc29sdmVJbmZvKCk7CisgICAgICAgIHIxLnNlcnZpY2VJbmZvID0gczE7CisgICAgICAgIFJlc29sdmVJbmZvIHIyID0gbmV3IFJlc29sdmVJbmZvKCk7CisgICAgICAgIHIyLnNlcnZpY2VJbmZvID0gczI7CisKKyAgICAgICAgd2hlbihtUG0ucXVlcnlJbnRlbnRTZXJ2aWNlc0FzVXNlcihhbnkoKSwgYW55SW50KCksIGFueUludCgpKSkudGhlblJldHVybigKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHIxLCByMikpOworCisgICAgICAgIG1TZXJ2aWNlTGlzdGluZyA9IG5ldyBTZXJ2aWNlTGlzdGluZy5CdWlsZGVyKG1Db250ZXh0KQorICAgICAgICAgICAgICAgIC5zZXRUYWcoInRlc3RUYWciKQorICAgICAgICAgICAgICAgIC5zZXRTZXR0aW5nKFRFU1RfU0VUVElORykKKyAgICAgICAgICAgICAgICAuc2V0Tm91bigidGVzdE5vdW4iKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnRBY3Rpb24oVEVTVF9JTlRFTlQpCisgICAgICAgICAgICAgICAgLnNldFBlcm1pc3Npb24oInRlc3RQZXJtaXNzaW9uIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgU2VydmljZUxpc3RpbmcuQ2FsbGJhY2sgY2FsbGJhY2sgPSBtb2NrKFNlcnZpY2VMaXN0aW5nLkNhbGxiYWNrLmNsYXNzKTsKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nLmFkZENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nLnJlbG9hZCgpOworCisgICAgICAgIHZlcmlmeShtUG0pLnF1ZXJ5SW50ZW50U2VydmljZXNBc1VzZXIoYW55KCksIGFueUludCgpLCBhbnlJbnQoKSk7CisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPExpc3Q8U2VydmljZUluZm8+PiBjYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhMaXN0LmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KGNhbGxiYWNrLCB0aW1lcygxKSkub25TZXJ2aWNlc1JlbG9hZGVkKGNhcHRvci5jYXB0dXJlKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoY2FwdG9yLmdldFZhbHVlKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMik7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2soKSB7CiAgICAgICAgIFNlcnZpY2VMaXN0aW5nLkNhbGxiYWNrIGNhbGxiYWNrID0gbW9jayhTZXJ2aWNlTGlzdGluZy5DYWxsYmFjay5jbGFzcyk7CiAgICAgICAgIG1TZXJ2aWNlTGlzdGluZy5hZGRDYWxsYmFjayhjYWxsYmFjayk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2RyZWFtL0RyZWFtQmFja2VuZFRlc3QuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCmluZGV4IDUyYjkyMjcuLjIyZWMxMmQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5kcmVhbTsKIAogCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmRyZWFtLkRyZWFtQmFja2VuZC5DT01QTElDQVRJT05fVFlQRV9EQVRFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5kcmVhbS5EcmVhbUJhY2tlbmQuQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZHJlYW0uRHJlYW1CYWNrZW5kLkNPTVBMSUNBVElPTl9UWVBFX1RJTUU7CisKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CkBAIC0zNiwxMyArNDAsMTYgQEAKIGltcG9ydCBvcmcucm9ib2xlY3RyaWMuc2hhZG93cy5TaGFkb3dTZXR0aW5nczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogQFJ1bldpdGgoUm9ib2xlY3RyaWNUZXN0UnVubmVyLmNsYXNzKQogQENvbmZpZyhzaGFkb3dzID0ge1NoYWRvd1NldHRpbmdzLlNoYWRvd1NlY3VyZS5jbGFzc30pCiBwdWJsaWMgZmluYWwgY2xhc3MgRHJlYW1CYWNrZW5kVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlMgPSB7MSwgMiwgM307CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlMgPQorICAgICAgICAgICAge0NPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMsIENPTVBMSUNBVElPTl9UWVBFX0RBVEUsCisgICAgICAgICAgICAgICAgICAgIENPTVBMSUNBVElPTl9UWVBFX1RJTUV9OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8SW50ZWdlcj4gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlNfTElTVCA9IEFycmF5cy5zdHJlYW0oCiAgICAgICAgICAgICBTVVBQT1JURURfRFJFQU1fQ09NUExJQ0FUSU9OUykuYm94ZWQoKS5jb2xsZWN0KAogICAgICAgICAgICAgQ29sbGVjdG9ycy50b0xpc3QoKSk7CkBAIC05Myw4ICsxMDAsNTIgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQ29tcGxpY2F0aW9ucygpIHsKICAgICAgICAgbUJhY2tlbmQuc2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoZmFsc2UpOwotICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHkoQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUyk7CiAgICAgICAgIGFzc2VydFRoYXQobUJhY2tlbmQuZ2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoKSkuaXNGYWxzZSgpOwogICAgIH0KLX0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvbWVDb250cm9sc0Rpc2FibGVkX0NvbXBsaWNhdGlvbnNFbmFibGVkKCkgeworICAgICAgICBtQmFja2VuZC5zZXRDb21wbGljYXRpb25zRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbUJhY2tlbmQuc2V0SG9tZUNvbnRyb2xzRW5hYmxlZChmYWxzZSk7CisgICAgICAgIC8vIEhvbWUgY29udHJvbHMgc2hvdWxkIG5vdCBiZSBlbmFibGVkLCBvbmx5IGRhdGUgYW5kIHRpbWUuCisgICAgICAgIGZpbmFsIExpc3Q8SW50ZWdlcj4gZW5hYmxlZENvbXBsaWNhdGlvbnMgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQ09NUExJQ0FUSU9OX1RZUEVfREFURSwgQ09NUExJQ0FUSU9OX1RZUEVfVElNRSk7CisgICAgICAgIGFzc2VydFRoYXQobUJhY2tlbmQuZ2V0RW5hYmxlZENvbXBsaWNhdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5RWxlbWVudHNJbihlbmFibGVkQ29tcGxpY2F0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9tZUNvbnRyb2xzRGlzYWJsZWRfQ29tcGxpY2F0aW9uc0Rpc2FibGVkKCkgeworICAgICAgICBtQmFja2VuZC5zZXRDb21wbGljYXRpb25zRW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1CYWNrZW5kLnNldEhvbWVDb250cm9sc0VuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb21lQ29udHJvbHNFbmFibGVkX0NvbXBsaWNhdGlvbnNEaXNhYmxlZCgpIHsKKyAgICAgICAgbUJhY2tlbmQuc2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoZmFsc2UpOworICAgICAgICBtQmFja2VuZC5zZXRIb21lQ29udHJvbHNFbmFibGVkKHRydWUpOworICAgICAgICAvLyBIb21lIGNvbnRyb2xzIHNob3VsZCBub3QgYmUgZW5hYmxlZCwgb25seSBkYXRlIGFuZCB0aW1lLgorICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGVuYWJsZWRDb21wbGljYXRpb25zID0KKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oZW5hYmxlZENvbXBsaWNhdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvbWVDb250cm9sc0VuYWJsZWRfQ29tcGxpY2F0aW9uc0VuYWJsZWQoKSB7CisgICAgICAgIG1CYWNrZW5kLnNldENvbXBsaWNhdGlvbnNFbmFibGVkKHRydWUpOworICAgICAgICBtQmFja2VuZC5zZXRIb21lQ29udHJvbHNFbmFibGVkKHRydWUpOworICAgICAgICAvLyBIb21lIGNvbnRyb2xzIHNob3VsZCBub3QgYmUgZW5hYmxlZCwgb25seSBkYXRlIGFuZCB0aW1lLgorICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGVuYWJsZWRDb21wbGljYXRpb25zID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUywKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMSUNBVElPTl9UWVBFX0RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QTElDQVRJT05fVFlQRV9USU1FCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHlFbGVtZW50c0luKGVuYWJsZWRDb21wbGljYXRpb25zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXJUZXN0LmphdmEKaW5kZXggZjYzYzA2YS4uMjcwZmRhOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvdGVzdHMvcm9ib3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9tZWRpYS9JbmZvTWVkaWFNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvSW5mb01lZGlhTWFuYWdlclRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKQEAgLTc5OSwxMiArODAwLDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBvblRyYW5zZmVyRmFpbGVkX3Nob3VsZERpc3BhdGNoT25SZXF1ZXN0RmFpbGVkKCkgeworICAgIHB1YmxpYyB2b2lkIG9uVHJhbnNmZXJGYWlsZWRfbm90RGlzcGF0Y2hPblJlcXVlc3RGYWlsZWQoKSB7CiAgICAgICAgIG1JbmZvTWVkaWFNYW5hZ2VyLnJlZ2lzdGVyQ2FsbGJhY2sobUNhbGxiYWNrKTsKIAogICAgICAgICBtSW5mb01lZGlhTWFuYWdlci5tTWVkaWFSb3V0ZXJDYWxsYmFjay5vblRyYW5zZmVyRmFpbGVkKG51bGwsIG51bGwpOwogCi0gICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uUmVxdWVzdEZhaWxlZChSRUFTT05fVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2ssIG5ldmVyKCkpLm9uUmVxdWVzdEZhaWxlZChSRUFTT05fVU5LTk9XTl9FUlJPUik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL0dsb2JhbFNldHRpbmdzLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9HbG9iYWxTZXR0aW5ncy5qYXZhCmluZGV4IDA5YTFiYTIuLmU1MGY1MjIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL0dsb2JhbFNldHRpbmdzLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy9iYWNrdXAvR2xvYmFsU2V0dGluZ3MuamF2YQpAQCAtNDksNiArNDksNyBAQAogICAgICAgICBTZXR0aW5ncy5HbG9iYWwuQ0hBUkdJTkdfU09VTkRTX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5VU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRXT1JLX1JFQ09NTUVOREFUSU9OU19FTkFCTEVELAorICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUV09SS19BVk9JRF9CQURfV0lGSSwKICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLldJRklfV0FLRVVQX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5VU0VfT1BFTl9XSUZJX1BBQ0tBR0UsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9TZWN1cmVTZXR0aW5ncy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy9iYWNrdXAvU2VjdXJlU2V0dGluZ3MuamF2YQppbmRleCBmNjZmY2JhLi4zZWZiNDFkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9TZWN1cmVTZXR0aW5ncy5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL1NlY3VyZVNldHRpbmdzLmphdmEKQEAgLTEzOSw2ICsxMzksNyBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUE9ORU5UUywKICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0FDVElWQVRFX09OX0RPQ0ssCiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9TTEVFUCwKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0hPTUVfQ09OVFJPTFNfRU5BQkxFRCwKICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNIT1dfRklSU1RfQ1JBU0hfRElBTE9HX0RFVl9PUFRJT04sCiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5WT0xVTUVfSFVTSF9HRVNUVVJFLAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUuTUFOVUFMX1JJTkdFUl9UT0dHTEVfQ09VTlQsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvR2xvYmFsU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvR2xvYmFsU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEKaW5kZXggZTU3Y2YzYi4uOGQwN2ZiNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL0dsb2JhbFNldHRpbmdzVmFsaWRhdG9ycy5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvdmFsaWRhdG9ycy9HbG9iYWxTZXR0aW5nc1ZhbGlkYXRvcnMuamF2YQpAQCAtMjAsNiArMjAsOSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuSGRyQ29udmVyc2lvbk1vZGUuSERSX0NPTlZFUlNJT05fUEFTU1RIUk9VR0g7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5IZHJDb252ZXJzaW9uTW9kZS5IRFJfQ09OVkVSU0lPTl9TWVNURU07CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQuU1VSUk9VTkRfU09VTkRfRU5DT0RJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eVNldHRpbmdzTWFuYWdlci5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJX0FWT0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlTZXR0aW5nc01hbmFnZXIuTkVUV09SS19BVk9JRF9CQURfV0lGSV9JR05PUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eVNldHRpbmdzTWFuYWdlci5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJX1BST01QVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5zZXR0aW5ncy52YWxpZGF0b3JzLlNldHRpbmdzVmFsaWRhdG9ycy5BTllfSU5URUdFUl9WQUxJREFUT1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuc2V0dGluZ3MudmFsaWRhdG9ycy5TZXR0aW5nc1ZhbGlkYXRvcnMuQU5ZX1NUUklOR19WQUxJREFUT1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuc2V0dGluZ3MudmFsaWRhdG9ycy5TZXR0aW5nc1ZhbGlkYXRvcnMuQk9PTEVBTl9WQUxJREFUT1I7CkBAIC0xMDMsNiArMTA2LDE0IEBACiAgICAgICAgIFZBTElEQVRPUlMucHV0KAogICAgICAgICAgICAgICAgIEdsb2JhbC5ORVRXT1JLX1JFQ09NTUVOREFUSU9OU19FTkFCTEVELAogICAgICAgICAgICAgICAgIG5ldyBEaXNjcmV0ZVZhbHVlVmFsaWRhdG9yKG5ldyBTdHJpbmdbXSB7Ii0xIiwgIjAiLCAiMSJ9KSk7CisgICAgICAgIFZBTElEQVRPUlMucHV0KAorICAgICAgICAgICAgICAgIEdsb2JhbC5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJLAorICAgICAgICAgICAgICAgIG5ldyBEaXNjcmV0ZVZhbHVlVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTkVUV09SS19BVk9JRF9CQURfV0lGSV9JR05PUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihORVRXT1JLX0FWT0lEX0JBRF9XSUZJX1BST01QVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE5FVFdPUktfQVZPSURfQkFEX1dJRklfQVZPSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICBWQUxJREFUT1JTLnB1dChHbG9iYWwuV0lGSV9XQUtFVVBfRU5BQkxFRCwgQk9PTEVBTl9WQUxJREFUT1IpOwogICAgICAgICBWQUxJREFUT1JTLnB1dChHbG9iYWwuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL1NlY3VyZVNldHRpbmdzVmFsaWRhdG9ycy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL1NlY3VyZVNldHRpbmdzVmFsaWRhdG9ycy5qYXZhCmluZGV4IDU1OGUxOWYuLmFiZDJjNzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvdmFsaWRhdG9ycy9TZWN1cmVTZXR0aW5nc1ZhbGlkYXRvcnMuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvU2VjdXJlU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEKQEAgLTIwNiw2ICsyMDYsNyBAQAogICAgICAgICBWQUxJREFUT1JTLnB1dChTZWN1cmUuU0NSRUVOU0FWRVJfQ09NUE9ORU5UUywgQ09NTUFfU0VQQVJBVEVEX0NPTVBPTkVOVF9MSVNUX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9ET0NLLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9TTEVFUCwgQk9PTEVBTl9WQUxJREFUT1IpOworICAgICAgICBWQUxJREFUT1JTLnB1dChTZWN1cmUuU0NSRUVOU0FWRVJfSE9NRV9DT05UUk9MU19FTkFCTEVELCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TSE9XX0ZJUlNUX0NSQVNIX0RJQUxPR19ERVZfT1BUSU9OLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5WT0xVTUVfSFVTSF9HRVNUVVJFLCBOT05fTkVHQVRJVkVfSU5URUdFUl9WQUxJREFUT1IpOwogICAgICAgICBWQUxJREFUT1JTLnB1dCgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnkuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnkuamF2YQppbmRleCBkYjZjYzFhLi5hOGVlZWMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvR2VuZXJhdGlvblJlZ2lzdHJ5LmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0dlbmVyYXRpb25SZWdpc3RyeS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CiBpbXBvcnQgYW5kcm9pZC51dGlsLk1lbW9yeUludEFycmF5OwpAQCAtMzAsNyArMzEsNyBAQAogCiAvKioKICAqIFRoaXMgY2xhc3MgdHJhY2tzIGNoYW5nZXMgZm9yIGNvbmZpZy9nbG9iYWwvc2VjdXJlL3N5c3RlbSB0YWJsZXMKLSAqIG9uIGEgcGVyIHVzZXIgYmFzaXMgYW5kIHVwZGF0ZXMgc2hhcmVkIG1lbW9yeSByZWdpb25zIHdoaWNoCisgKiBvbiBhIHBlci11c2VyIGJhc2lzIGFuZCB1cGRhdGVzIHNoYXJlZCBtZW1vcnkgcmVnaW9ucyB3aGljaAogICogY2xpZW50IHByb2Nlc3NlcyBjYW4gcmVhZCB0byBkZXRlcm1pbmUgaWYgdGhlaXIgbG9jYWwgY2FjaGVzIGFyZQogICogc3RhbGUuCiAgKi8KQEAgLTgxLDYgKzgyLDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudEdlbmVyYXRpb25JbnRlcm5hbChpbnQga2V5LCBATm9uTnVsbCBTdHJpbmcgaW5kZXhNYXBLZXkpIHsKKyAgICAgICAgaWYgKFNldHRpbmdzU3RhdGUuaXNHbG9iYWxTZXR0aW5nc0tleShrZXkpKSB7CisgICAgICAgICAgICAvLyBHbG9iYWwgc2V0dGluZ3MgYXJlIHNoYXJlZCBhY3Jvc3MgdXNlcnMsIHNvIGlnbm9yZSB0aGUgdXNlcklkIGluIHRoZSBrZXkKKyAgICAgICAgICAgIGtleSA9IFNldHRpbmdzU3RhdGUubWFrZUtleShTZXR0aW5nc1N0YXRlLlNFVFRJTkdTX1RZUEVfR0xPQkFMLCBVc2VySGFuZGxlLlVTRVJfU1lTVEVNKTsKKyAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBmaW5hbCBNZW1vcnlJbnRBcnJheSBiYWNraW5nU3RvcmUgPSBnZXRCYWNraW5nU3RvcmVMb2NrZWQoa2V5LAogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGVJZk5vdEV4aXN0PSAqLyBmYWxzZSk7CkBAIC0xMjYsNiArMTMxLDEwIEBACiAgICAgICogIHJldHVybmluZyB0aGUgcmVzdWx0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEdlbmVyYXRpb25EYXRhKEJ1bmRsZSBidW5kbGUsIGludCBrZXksIFN0cmluZyBpbmRleE1hcEtleSkgeworICAgICAgICBpZiAoU2V0dGluZ3NTdGF0ZS5pc0dsb2JhbFNldHRpbmdzS2V5KGtleSkpIHsKKyAgICAgICAgICAgIC8vIEdsb2JhbCBzZXR0aW5ncyBhcmUgc2hhcmVkIGFjcm9zcyB1c2Vycywgc28gaWdub3JlIHRoZSB1c2VySWQgaW4gdGhlIGtleQorICAgICAgICAgICAga2V5ID0gU2V0dGluZ3NTdGF0ZS5tYWtlS2V5KFNldHRpbmdzU3RhdGUuU0VUVElOR1NfVFlQRV9HTE9CQUwsIFVzZXJIYW5kbGUuVVNFUl9TWVNURU0pOworICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGZpbmFsIE1lbW9yeUludEFycmF5IGJhY2tpbmdTdG9yZSA9IGdldEJhY2tpbmdTdG9yZUxvY2tlZChrZXksCiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZUlmTm90RXhpc3Q9ICovIHRydWUpOwpAQCAtMTQwLDExICsxNDksOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgaGF2aW5nIGVycm9yIGFjY2Vzc2luZyB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKFNldHRpbmdzLkNBTExfTUVUSE9EX1RSQUNLX0dFTkVSQVRJT05fS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShTZXR0aW5ncy5DQUxMX01FVEhPRF9UUkFDS19HRU5FUkFUSU9OX0tFWSwgYmFja2luZ1N0b3JlKTsKICAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KFNldHRpbmdzLkNBTExfTUVUSE9EX0dFTkVSQVRJT05fSU5ERVhfS0VZLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgYnVuZGxlLnB1dEludChTZXR0aW5ncy5DQUxMX01FVEhPRF9HRU5FUkFUSU9OX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZS5nZXQoaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KFNldHRpbmdzLkNBTExfTUVUSE9EX0dFTkVSQVRJT05fS0VZLCBiYWNraW5nU3RvcmUuZ2V0KGluZGV4KSk7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShMT0dfVEFHLCAiRXhwb3J0ZWQgaW5kZXg6IiArIGluZGV4ICsgIiBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGluZGV4TWFwS2V5LmlzRW1wdHkoKSA/ICJ1bnNldCBzZXR0aW5ncyIgOiAic2V0dGluZzoiICsgaW5kZXhNYXBLZXkpCkBAIC0xODksNyArMTk2LDkgQEAKICAgICAgICAgaWYgKGJhY2tpbmdTdG9yZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChtTnVtQmFja2luZ1N0b3JlID49IE5VTV9NQVhfQkFDS0lOR19TVE9SRSkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIGNyZWF0aW5nIGJhY2tpbmcgc3RvcmUgLSBhdCBjYXBhY2l0eSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgY3JlYXRpbmcgYmFja2luZyBzdG9yZSAtIGF0IGNhcGFjaXR5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IG5ldyBNZW1vcnlJbnRBcnJheShNQVhfQkFDS0lOR19TVE9SRV9TSVpFKTsKQEAgLTI0OSw3ICsyNTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvbiB1c2VyOiIgKyBTZXR0aW5nc1N0YXRlLmdldFVzZXJJZEZyb21LZXkoa2V5KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBnZW5lcmF0aW9uIGluZGV4Iik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiQ291bGQgbm90IGFsbG9jYXRlIGdlbmVyYXRpb24gaW5kZXgiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGluZGV4OwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKaW5kZXggZTY0MDhiZi4uNzYwNzkwOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NQcm92aWRlci5qYXZhCkBAIC0zNSw2ICszNSwxMyBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlTaG9ydGN1dENvbnRyb2xsZXIuTUFHTklGSUNBVElPTl9DT05UUk9MTEVSX05BTUU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFjY2Vzc2liaWxpdHkudXRpbC5BY2Nlc3NpYmlsaXR5VXRpbHMuQUNDRVNTSUJJTElUWV9NRU5VX0lOX1NZU1RFTTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLlNldHRpbmdzU3RhdGUuRkFMTEJBQ0tfRklMRV9TVUZGSVg7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLmdldFR5cGVGcm9tS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5nZXRVc2VySWRGcm9tS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc0NvbmZpZ1NldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc0dsb2JhbFNldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc1NlY3VyZVNldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc1NzYWlkU2V0dGluZ3NLZXk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLmlzU3lzdGVtU2V0dGluZ3NLZXk7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLm1ha2VLZXk7CiAKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwpAQCAtMzc2LDE0ICszODMsNiBAQAogICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKICAgICBwcml2YXRlIGJvb2xlYW4gbVN5bmNDb25maWdEaXNhYmxlZFVudGlsUmVib290OwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZUZyb21LZXkoaW50IGtleSkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3NTdGF0ZS5nZXRUeXBlRnJvbUtleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFVzZXJJZEZyb21LZXkoaW50IGtleSkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3NTdGF0ZS5nZXRVc2VySWRGcm9tS2V5KGtleSk7Ci0gICAgfQotCiAgICAgQENoYW5nZUlkCiAgICAgQEVuYWJsZWRTaW5jZSh0YXJnZXRTZGtWZXJzaW9uPWFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5TKQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5GT1JDRV9SRUFEX1BFUk1JU1NJT05fRk9SX01VTFRJX1NJTV9EQVRBX0NBTEwgPSAxNzI2NzA2NzlMOwpAQCAtMzYyMCwyNiArMzYxOSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNDb25maWdTZXR0aW5nc0tleShpbnQga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX0NPTkZJRzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0dsb2JhbFNldHRpbmdzS2V5KGludCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfR0xPQkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtU2V0dGluZ3NLZXkoaW50IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9TWVNURU07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTZWN1cmVTZXR0aW5nc0tleShpbnQga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NFQ1VSRTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NzYWlkU2V0dGluZ3NLZXkoaW50IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9TU0FJRDsKLSAgICAgICAgfQotCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCYW4oaW50IHR5cGUpIHsKICAgICAgICAgICAgIGlmIChTRVRUSU5HU19UWVBFX0NPTkZJRyAhPSB0eXBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzU3RhdGUuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1N0YXRlLmphdmEKaW5kZXggNGQ4NzA1Zi4uZTMxNTNlMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzU3RhdGUuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NTdGF0ZS5qYXZhCkBAIC0yNTUsNiArMjU1LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25maWdTZXR0aW5nc0tleShpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfQ09ORklHOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dsb2JhbFNldHRpbmdzS2V5KGludCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9HTE9CQUw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtU2V0dGluZ3NLZXkoaW50IGtleSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NZU1RFTTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWN1cmVTZXR0aW5nc0tleShpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfU0VDVVJFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NzYWlkU2V0dGluZ3NLZXkoaW50IGtleSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NTQUlEOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGtleVRvU3RyaW5nKGludCBrZXkpIHsKICAgICAgICAgcmV0dXJuICJLZXlbdXNlcj0iICsgZ2V0VXNlcklkRnJvbUtleShrZXkpICsgIjt0eXBlPSIKICAgICAgICAgICAgICAgICArIHNldHRpbmdUeXBlVG9TdHJpbmcoZ2V0VHlwZUZyb21LZXkoa2V5KSkgKyAiXSI7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L0FuZHJvaWRUZXN0LnhtbAppbmRleCA5ZDIzNTI2Li4wYmY1M2NjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDEyIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVuIFNldHRpbmdzIFByb3ZpZGVyIFRlc3RzLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5EZXZpY2VTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LWdsb2JhbC1zZXR0aW5nIiBrZXk9InZlcmlmaWVyX3ZlcmlmeV9hZGJfaW5zdGFsbHMiIHZhbHVlPSIwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJlc3RvcmUtc2V0dGluZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImZvcmNlLXNraXAtc3lzdGVtLXByb3BzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKwogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJTZXR0aW5nc1Byb3ZpZGVyVGVzdC5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NCYWNrdXBUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NCYWNrdXBUZXN0LmphdmEKaW5kZXggMjc4Y2ViOS4uMWYxNDcyMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzQmFja3VwVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc0JhY2t1cFRlc3QuamF2YQpAQCAtMzcyLDcgKzM3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRQT0xJQ1lfUVVPVEFfRlJBQ19KT0JTLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUUE9MSUNZX1FVT1RBX0ZSQUNfTVVMVElQQVRILAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUUE9MSUNZX09WRVJSSURFX0VOQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUV09SS19ERUZBVUxUX0RBSUxZX01VTFRJUEFUSF9RVU9UQV9CWVRFUywKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLk5FVFdPUktfTUVURVJFRF9NVUxUSVBBVEhfUFJFRkVSRU5DRSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLk5FVFdPUktfV0FUQ0hMSVNUX0xBU1RfUkVQT1JUX1RJTUUsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnlUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnlUZXN0LmphdmEKaW5kZXggNmVjODE0Ni4uNTg2ZDZmNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvR2VuZXJhdGlvblJlZ2lzdHJ5VGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0dlbmVyYXRpb25SZWdpc3RyeVRlc3QuamF2YQpAQCAtMTcwLDYgKzE3MCwyMyBAQAogICAgICAgICBjaGVja0J1bmRsZShiLCAxLCAyLCBmYWxzZSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsU2V0dGluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBHZW5lcmF0aW9uUmVnaXN0cnkgZ2VuZXJhdGlvblJlZ2lzdHJ5ID0gbmV3IEdlbmVyYXRpb25SZWdpc3RyeShuZXcgT2JqZWN0KCkpOworICAgICAgICBmaW5hbCBpbnQgZ2xvYmFsS2V5ID0gU2V0dGluZ3NTdGF0ZS5tYWtlS2V5KFNldHRpbmdzU3RhdGUuU0VUVElOR1NfVFlQRV9HTE9CQUwsIDApOworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdEdsb2JhbFNldHRpbmcgPSAidGVzdF9nbG9iYWxfc2V0dGluZyI7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBnZW5lcmF0aW9uUmVnaXN0cnkuYWRkR2VuZXJhdGlvbkRhdGEoYiwgZ2xvYmFsS2V5LCB0ZXN0R2xvYmFsU2V0dGluZyk7CisgICAgICAgIGNoZWNrQnVuZGxlKGIsIDAsIDEsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgTWVtb3J5SW50QXJyYXkgYXJyYXkgPSBnZXRBcnJheShiKTsKKyAgICAgICAgZmluYWwgaW50IGdsb2JhbEtleTIgPSBTZXR0aW5nc1N0YXRlLm1ha2VLZXkoU2V0dGluZ3NTdGF0ZS5TRVRUSU5HU19UWVBFX0dMT0JBTCwgMTApOworICAgICAgICBiLmNsZWFyKCk7CisgICAgICAgIGdlbmVyYXRpb25SZWdpc3RyeS5hZGRHZW5lcmF0aW9uRGF0YShiLCBnbG9iYWxLZXkyLCB0ZXN0R2xvYmFsU2V0dGluZyk7CisgICAgICAgIGNoZWNrQnVuZGxlKGIsIDAsIDEsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgTWVtb3J5SW50QXJyYXkgYXJyYXkyID0gZ2V0QXJyYXkoYik7CisgICAgICAgIC8vIENoZWNrIHRoYXQgdXNlcjEwIGFuZCB1c2VyMCB1c2UgdGhlIHNhbWUgYXJyYXkgdG8gc3RvcmUgZ2xvYmFsIHNldHRpbmdzJyBnZW5lcmF0aW9ucworICAgICAgICBhc3NlcnRUaGF0KGFycmF5KS5pc0VxdWFsVG8oYXJyYXkyKTsKKyAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tCdW5kbGUoQnVuZGxlIGIsIGludCBleHBlY3RlZEluZGV4LCBpbnQgZXhwZWN0ZWRHZW5lcmF0aW9uLCBib29sZWFuIGlzTnVsbCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxMTM2YzExLi40MjkwY2EwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTkyNCw3ICs5MjQsNyBAQAogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93Rm9yQWxsVXNlcnM9InRydWUiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmZpbmlzaE9uVGFza0xhdW5jaD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9InNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dHxrZXlib2FyZHxrZXlib2FyZEhpZGRlbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ic2NyZWVuTGF5b3V0fGtleWJvYXJkfGtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9uIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmxlVG9JbnN0YW50QXBwcz0idHJ1ZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKQEAgLTk0Niw3ICs5NDYsNyBAQAogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd0ZvckFsbFVzZXJzPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpmaW5pc2hPblRhc2tMYXVuY2g9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxvY2tUYXNrTW9kZT0iaWZfd2hpdGVsaXN0ZWQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxvY2tUYXNrTW9kZT0iYWx3YXlzIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXR8b3JpZW50YXRpb258a2V5Ym9hcmR8a2V5Ym9hcmRIaWRkZW4iCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2libGVUb0luc3RhbnRBcHBzPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0NDBjNmU1Li5jYTg0MjY1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHltZW51L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC01OCw4ICs1OCw1IEBACiAgICAgICAgIDxpbnRlbnQ+CiAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZPSUNFX0NPTU1BTkQiIC8+CiAgICAgICAgIDwvaW50ZW50PgotICAgICAgICA8IS0taW50ZW50PgotICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2V0dGluZ3MuQUNDRVNTSUJJTElUWV9TRVRUSU5HUyIgLz4KLSAgICAgICAgPC9pbnRlbnQtLT4KICAgICA8L3F1ZXJpZXM+CiA8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL0ZvbnRWYXJpYXRpb25VdGlscy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL0ZvbnRWYXJpYXRpb25VdGlscy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFlNGFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vRm9udFZhcmlhdGlvblV0aWxzLmt0CkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uCisKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19XR0hUID0gIndnaHQiCitwcml2YXRlIGNvbnN0IHZhbCBUQUdfV0RUSCA9ICJ3ZHRoIgorcHJpdmF0ZSBjb25zdCB2YWwgVEFHX09QU1ogPSAib3BzeiIKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19ST05EID0gIlJPTkQiCisKK2NsYXNzIEZvbnRWYXJpYXRpb25VdGlscyB7CisgICAgcHJpdmF0ZSB2YXIgbVdlaWdodCA9IC0xCisgICAgcHJpdmF0ZSB2YXIgbVdpZHRoID0gLTEKKyAgICBwcml2YXRlIHZhciBtT3B0aWNhbFNpemUgPSAtMQorICAgIHByaXZhdGUgdmFyIG1Sb3VuZG5lc3MgPSAtMQorICAgIHByaXZhdGUgdmFyIGlzVXBkYXRlZCA9IGZhbHNlCisKKyAgICAvKgorICAgICAqIGdlbmVyYXRlIGZvbnRWYXJpYXRpb25TZXR0aW5ncyBzdHJpbmcsIHVzZWQgZm9yIGtleSBpbiB0eXBlZmFjZUNhY2hlIGluIFRleHRBbmltYXRvcgorICAgICAqIHRoZSBvcmRlciBvZiBheGVzIHNob3VsZCBhbGlnbiB0byB0aGUgb3JkZXIgb2YgcGFyYW1ldGVycworICAgICAqIGlmIGV2ZXJ5IGF4aXMgcmVtYWlucyB1bmNoYW5nZWQsIHJldHVybiAiIgorICAgICAqLworICAgIGZ1biB1cGRhdGVGb250VmFyaWF0aW9uKAorICAgICAgICB3ZWlnaHQ6IEludCA9IC0xLAorICAgICAgICB3aWR0aDogSW50ID0gLTEsCisgICAgICAgIG9wdGljYWxTaXplOiBJbnQgPSAtMSwKKyAgICAgICAgcm91bmRuZXNzOiBJbnQgPSAtMQorICAgICk6IFN0cmluZyB7CisgICAgICAgIGlzVXBkYXRlZCA9IGZhbHNlCisgICAgICAgIGlmICh3ZWlnaHQgPj0gMCAmJiBtV2VpZ2h0ICE9IHdlaWdodCkgeworICAgICAgICAgICAgaXNVcGRhdGVkID0gdHJ1ZQorICAgICAgICAgICAgbVdlaWdodCA9IHdlaWdodAorICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA+PSAwICYmIG1XaWR0aCAhPSB3aWR0aCkgeworICAgICAgICAgICAgaXNVcGRhdGVkID0gdHJ1ZQorICAgICAgICAgICAgbVdpZHRoID0gd2lkdGgKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aWNhbFNpemUgPj0gMCAmJiBtT3B0aWNhbFNpemUgIT0gb3B0aWNhbFNpemUpIHsKKyAgICAgICAgICAgIGlzVXBkYXRlZCA9IHRydWUKKyAgICAgICAgICAgIG1PcHRpY2FsU2l6ZSA9IG9wdGljYWxTaXplCisgICAgICAgIH0KKworICAgICAgICBpZiAocm91bmRuZXNzID49IDAgJiYgbVJvdW5kbmVzcyAhPSByb3VuZG5lc3MpIHsKKyAgICAgICAgICAgIGlzVXBkYXRlZCA9IHRydWUKKyAgICAgICAgICAgIG1Sb3VuZG5lc3MgPSByb3VuZG5lc3MKKyAgICAgICAgfQorICAgICAgICB2YXIgcmVzdWx0U3RyaW5nID0gIiIKKyAgICAgICAgaWYgKG1XZWlnaHQgPj0gMCkgeworICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9ICInJFRBR19XR0hUJyAkbVdlaWdodCIKKyAgICAgICAgfQorICAgICAgICBpZiAobVdpZHRoID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFN0cmluZyArPSAoaWYgKHJlc3VsdFN0cmluZy5pc0JsYW5rKCkpICIiIGVsc2UgIiwgIikgKyAiJyRUQUdfV0RUSCcgJG1XaWR0aCIKKyAgICAgICAgfQorICAgICAgICBpZiAobU9wdGljYWxTaXplID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFN0cmluZyArPSAoaWYgKHJlc3VsdFN0cmluZy5pc0JsYW5rKCkpICIiIGVsc2UgIiwgIikgKyAiJyRUQUdfT1BTWicgJG1PcHRpY2FsU2l6ZSIKKyAgICAgICAgfQorICAgICAgICBpZiAobVJvdW5kbmVzcyA+PSAwKSB7CisgICAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gKGlmIChyZXN1bHRTdHJpbmcuaXNCbGFuaygpKSAiIiBlbHNlICIsICIpICsgIickVEFHX1JPTkQnICRtUm91bmRuZXNzIgorICAgICAgICB9CisgICAgICAgIHJldHVybiBpZiAoaXNVcGRhdGVkKSByZXN1bHRTdHJpbmcgZWxzZSAiIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvci5rdAppbmRleCA3ZmU5NGQzLi45ZTk5MjllIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9hbmltYXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3Iua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vVGV4dEFuaW1hdG9yLmt0CkBAIC0yMywxMSArMjMsOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZQogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZm9udHMuRm9udAotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZm9udHMuRm9udFZhcmlhdGlvbkF4aXMKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5CiAKLXByaXZhdGUgY29uc3QgdmFsIFRBR19XR0hUID0gIndnaHQiCiBwcml2YXRlIGNvbnN0IHZhbCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTjogTG9uZyA9IDMwMAogCiB0eXBlYWxpYXMgR2x5cGhDYWxsYmFjayA9IChUZXh0QW5pbWF0b3IuUG9zaXRpb25lZEdseXBoLCBGbG9hdCkgLT4gVW5pdApAQCAtNTEsNyArNDgsNyBAQAogICoKICAqICAgICAgICAgLy8gQ2hhbmdlIHRoZSB0ZXh0IHNpemUgd2l0aCBhbmltYXRpb24uCiAgKiAgICAgICAgIGZ1biBzZXRUZXh0U2l6ZShzaXplUHg6IEZsb2F0LCBhbmltYXRlOiBCb29sZWFuKSB7Ci0gKiAgICAgICAgICAgICBhbmltYXRvci5zZXRUZXh0U3R5bGUoLTEgLyogdW5jaGFuZ2VkIHdlaWdodCAqLywgc2l6ZVB4LCBhbmltYXRlKQorICogICAgICAgICAgICAgYW5pbWF0b3Iuc2V0VGV4dFN0eWxlKCIiIC8qIHVuY2hhbmdlZCBmdmFyLi4uICovLCBzaXplUHgsIGFuaW1hdGUpCiAgKiAgICAgICAgIH0KICAqICAgICB9CiAgKiBgYGAKQEAgLTExNSw3ICsxMTIsOSBAQAogICAgICAgICAgICAgcHJvdGVjdGVkIHNldAogICAgIH0KIAotICAgIHByaXZhdGUgdmFsIHR5cGVmYWNlQ2FjaGUgPSBTcGFyc2VBcnJheTxUeXBlZmFjZT8+KCkKKyAgICBwcml2YXRlIHZhbCBmb250VmFyaWF0aW9uVXRpbHMgPSBGb250VmFyaWF0aW9uVXRpbHMoKQorCisgICAgcHJpdmF0ZSB2YWwgdHlwZWZhY2VDYWNoZSA9IEhhc2hNYXA8U3RyaW5nLCBUeXBlZmFjZT8+KCkKIAogICAgIGZ1biB1cGRhdGVMYXlvdXQobGF5b3V0OiBMYXlvdXQpIHsKICAgICAgICAgdGV4dEludGVycG9sYXRvci5sYXlvdXQgPSBsYXlvdXQKQEAgLTE4Niw3ICsxODUsNyBAQAogICAgICAqIEJ1IHBhc3NpbmcgLTEgdG8gZHVyYXRpb24sIHRoZSBkZWZhdWx0IHRleHQgYW5pbWF0aW9uLCAxMDAwbXMsIGlzIHVzZWQuCiAgICAgICogQnkgcGFzc2luZyBmYWxzZSB0byBhbmltYXRlLCB0aGUgdGV4dCB3aWxsIGJlIHVwZGF0ZWQgd2l0aG91dCBhbmltYXRpb24uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gd2VpZ2h0IGFuIG9wdGlvbmFsIHRleHQgd2VpZ2h0LgorICAgICAqIEBwYXJhbSBmdmFyIGFuIG9wdGlvbmFsIHRleHQgZm9udFZhcmlhdGlvblNldHRpbmdzLgogICAgICAqIEBwYXJhbSB0ZXh0U2l6ZSBhbiBvcHRpb25hbCBmb250IHNpemUuCiAgICAgICogQHBhcmFtIGNvbG9ycyBhbiBvcHRpb25hbCBjb2xvcnMgYXJyYXkgdGhhdCBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgbnVtTGluZXMgcGFzc2VkIHRvCiAgICAgICogICAgICAgICAgICAgICB0aGUgVGV4dEludGVycG9sYXRvcgpAQCAtMTk5LDcgKzE5OCw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQuIFRoaXMgaXMgaWdub3JlZCBpZiBhbmltYXRlIGlzIGZhbHNlLgogICAgICAqLwogICAgIGZ1biBzZXRUZXh0U3R5bGUoCi0gICAgICAgIHdlaWdodDogSW50ID0gLTEsCisgICAgICAgIGZ2YXI6IFN0cmluZz8gPSAiIiwKICAgICAgICAgdGV4dFNpemU6IEZsb2F0ID0gLTFmLAogICAgICAgICBjb2xvcjogSW50PyA9IG51bGwsCiAgICAgICAgIHN0cm9rZVdpZHRoOiBGbG9hdCA9IC0xZiwKQEAgLTIxNyw0MiArMjE2LDE2IEBACiAgICAgICAgIGlmICh0ZXh0U2l6ZSA+PSAwKSB7CiAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnRleHRTaXplID0gdGV4dFNpemUKICAgICAgICAgfQotICAgICAgICBpZiAod2VpZ2h0ID49IDApIHsKLSAgICAgICAgICAgIHZhbCBmb250VmFyaWF0aW9uQXJyYXkgPQotICAgICAgICAgICAgICAgICAgICBGb250VmFyaWF0aW9uQXhpcy5mcm9tRm9udFZhcmlhdGlvblNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgaWYgKGZvbnRWYXJpYXRpb25BcnJheS5pc051bGxPckVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlID0KLSAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2VDYWNoZS5nZXRPckVsc2Uod2VpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmZvbnRWYXJpYXRpb25TZXR0aW5ncyA9ICInJFRBR19XR0hUJyAkd2VpZ2h0IgotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbCBpZHggPSBmb250VmFyaWF0aW9uQXJyYXkuaW5kZXhPZkZpcnN0IHsgaXQudGFnID09ICIkVEFHX1dHSFQiIH0KLSAgICAgICAgICAgICAgICBpZiAoaWR4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCB1cGRhdGVkRm9udFZhcmlhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmZvbnRWYXJpYXRpb25TZXR0aW5ncyArICIsJyRUQUdfV0dIVCcgJHdlaWdodCIKLSAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlZmFjZUNhY2hlLmdldE9yRWxzZSh3ZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmZvbnRWYXJpYXRpb25TZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRm9udFZhcmlhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQudHlwZWZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb250VmFyaWF0aW9uQXJyYXlbaWR4XSA9IEZvbnRWYXJpYXRpb25BeGlzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkVEFHX1dHSFQiLCB3ZWlnaHQudG9GbG9hdCgpKQotICAgICAgICAgICAgICAgICAgICB2YWwgdXBkYXRlZEZvbnRWYXJpYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRWYXJpYXRpb25BeGlzLnRvRm9udFZhcmlhdGlvblNldHRpbmdzKGZvbnRWYXJpYXRpb25BcnJheSkKLSAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlZmFjZUNhY2hlLmdldE9yRWxzZSh3ZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmZvbnRWYXJpYXRpb25TZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRm9udFZhcmlhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQudHlwZWZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoIWZ2YXIuaXNOdWxsT3JCbGFuaygpKSB7CisgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlID0KKyAgICAgICAgICAgICAgICB0eXBlZmFjZUNhY2hlLmdldE9yRWxzZShmdmFyKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQuZm9udFZhcmlhdGlvblNldHRpbmdzID0gZnZhcgorICAgICAgICAgICAgICAgICAgICB0eXBlZmFjZUNhY2hlLnB1dChmdmFyLCB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlKQorICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwpIHsKICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQuY29sb3IgPSBjb2xvcgogICAgICAgICB9CkBAIC0yOTEsMTMgKzI2NCw1NiBAQAogICAgICAgICAgICAgaW52YWxpZGF0ZUNhbGxiYWNrKCkKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0ZXh0IHN0eWxlIHdpdGggYW5pbWF0aW9uLiBTaW1pbGFyIGFzCisgICAgICogZnVuIHNldFRleHRTdHlsZSgKKyAgICAgKiAgICAgIGZ2YXI6IFN0cmluZz8gPSAiIiwKKyAgICAgKiAgICAgIHRleHRTaXplOiBGbG9hdCA9IC0xZiwKKyAgICAgKiAgICAgIGNvbG9yOiBJbnQ/ID0gbnVsbCwKKyAgICAgKiAgICAgIHN0cm9rZVdpZHRoOiBGbG9hdCA9IC0xZiwKKyAgICAgKiAgICAgIGFuaW1hdGU6IEJvb2xlYW4gPSB0cnVlLAorICAgICAqICAgICAgZHVyYXRpb246IExvbmcgPSAtMUwsCisgICAgICogICAgICBpbnRlcnBvbGF0b3I6IFRpbWVJbnRlcnBvbGF0b3I/ID0gbnVsbCwKKyAgICAgKiAgICAgIGRlbGF5OiBMb25nID0gMCwKKyAgICAgKiAgICAgIG9uQW5pbWF0aW9uRW5kOiBSdW5uYWJsZT8gPSBudWxsCisgICAgICogKQorICAgICAqCisgICAgICogQHBhcmFtIHdlaWdodCBhbiBvcHRpb25hbCBzdHlsZSB2YWx1ZSBmb3IgYHdnaHRgIGluIGZvbnRWYXJpYXRpb25TZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gd2lkdGggYW4gb3B0aW9uYWwgc3R5bGUgdmFsdWUgZm9yIGB3ZHRoYCBpbiBmb250VmFyaWF0aW9uU2V0dGluZ3MuCisgICAgICogQHBhcmFtIG9wdGljYWxTaXplIGFuIG9wdGlvbmFsIHN0eWxlIHZhbHVlIGZvciBgb3BzemAgaW4gZm9udFZhcmlhdGlvblNldHRpbmdzLgorICAgICAqIEBwYXJhbSByb3VuZG5lc3MgYW4gb3B0aW9uYWwgc3R5bGUgdmFsdWUgZm9yIGBST05EYCBpbiBmb250VmFyaWF0aW9uU2V0dGluZ3MuCisgICAgICovCisgICAgZnVuIHNldFRleHRTdHlsZSgKKyAgICAgICAgd2VpZ2h0OiBJbnQgPSAtMSwKKyAgICAgICAgd2lkdGg6IEludCA9IC0xLAorICAgICAgICBvcHRpY2FsU2l6ZTogSW50ID0gLTEsCisgICAgICAgIHJvdW5kbmVzczogSW50ID0gLTEsCisgICAgICAgIHRleHRTaXplOiBGbG9hdCA9IC0xZiwKKyAgICAgICAgY29sb3I6IEludD8gPSBudWxsLAorICAgICAgICBzdHJva2VXaWR0aDogRmxvYXQgPSAtMWYsCisgICAgICAgIGFuaW1hdGU6IEJvb2xlYW4gPSB0cnVlLAorICAgICAgICBkdXJhdGlvbjogTG9uZyA9IC0xTCwKKyAgICAgICAgaW50ZXJwb2xhdG9yOiBUaW1lSW50ZXJwb2xhdG9yPyA9IG51bGwsCisgICAgICAgIGRlbGF5OiBMb25nID0gMCwKKyAgICAgICAgb25BbmltYXRpb25FbmQ6IFJ1bm5hYmxlPyA9IG51bGwKKyAgICApIHsKKyAgICAgICAgdmFsIGZ2YXIgPSBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigKKyAgICAgICAgICAgIHdlaWdodCA9IHdlaWdodCwKKyAgICAgICAgICAgIHdpZHRoID0gd2lkdGgsCisgICAgICAgICAgICBvcHRpY2FsU2l6ZSA9IG9wdGljYWxTaXplLAorICAgICAgICAgICAgcm91bmRuZXNzID0gcm91bmRuZXNzLCkKKyAgICAgICAgc2V0VGV4dFN0eWxlKAorICAgICAgICAgICAgZnZhciA9IGZ2YXIsCisgICAgICAgICAgICB0ZXh0U2l6ZSA9IHRleHRTaXplLAorICAgICAgICAgICAgY29sb3IgPSBjb2xvciwKKyAgICAgICAgICAgIHN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGgsCisgICAgICAgICAgICBhbmltYXRlID0gYW5pbWF0ZSwKKyAgICAgICAgICAgIGR1cmF0aW9uID0gZHVyYXRpb24sCisgICAgICAgICAgICBpbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3IsCisgICAgICAgICAgICBkZWxheSA9IGRlbGF5LAorICAgICAgICAgICAgb25BbmltYXRpb25FbmQgPSBvbkFuaW1hdGlvbkVuZCwKKyAgICAgICAgKQorICAgIH0KIH0KIAotcHJpdmF0ZSBmdW4gPFY+IFNwYXJzZUFycmF5PFY+LmdldE9yRWxzZShrZXk6IEludCwgZGVmYXVsdFZhbHVlOiAoKSAtPiBWKTogViB7Ci0gICAgdmFyIHYgPSBnZXQoa2V5KQotICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgdiA9IGRlZmF1bHRWYWx1ZSgpCi0gICAgICAgIHB1dChrZXksIHYpCi0gICAgfQotICAgIHJldHVybiB2Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jaGVja3Mvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5rdAppbmRleCA0NTlhMzhlLi4wOTc2MmIwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9jaGVja3Mvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NoZWNrcy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3lzdGVtdWkvbGludC9EZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3Iua3QKQEAgLTI1LDEwICsyNSwxMiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlNjb3BlCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuU2V2ZXJpdHkKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5Tb3VyY2VDb2RlU2Nhbm5lcgoraW1wb3J0IGphdmEudXRpbC5FbnVtU2V0CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KIGltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3QuVUFubm90YXRpb24KIGltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3QuVUVsZW1lbnQKIAorQFN1cHByZXNzKCJVbnN0YWJsZUFwaVVzYWdlIikgLy8gRm9yIGxpbnRlciBhcGkKIGNsYXNzIERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3RvciA6IERldGVjdG9yKCksIFNvdXJjZUNvZGVTY2FubmVyIHsKICAgICBvdmVycmlkZSBmdW4gZ2V0QXBwbGljYWJsZVVhc3RUeXBlcygpOiBMaXN0PENsYXNzPG91dCBVRWxlbWVudD4+IHsKICAgICAgICAgcmV0dXJuIGxpc3RPZihVQW5ub3RhdGlvbjo6Y2xhc3MuamF2YSkKQEAgLTM5LDE4ICs0MSwxNSBAQAogICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIHZpc2l0QW5ub3RhdGlvbihub2RlOiBVQW5ub3RhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIEFubm90YXRpb25zIGhhdmluZyBpbnQgYnVnSWQgZmllbGQKICAgICAgICAgICAgICAgICBpZiAobm9kZS5xdWFsaWZpZWROYW1lIGluIERFTU9USU5HX0FOTk9UQVRJT05fQlVHX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCBidWdJZCA9IG5vZGUuZmluZEF0dHJpYnV0ZVZhbHVlKCJidWdJZCIpISEuZXZhbHVhdGUoKSBhcyBJbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Z0lkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc0J1Z0lkKG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgbG9jYXRpb24gPSBjb250ZXh0LmdldExvY2F0aW9uKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgbWVzc2FnZSA9ICJQbGVhc2UgYXR0YWNoIGEgYnVnIGlkIHRvIHRyYWNrIGRlbW90ZWQgdGVzdCIKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KElTU1VFLCBub2RlLCBsb2NhdGlvbiwgbWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBASWdub3JlIGhhcyBhIFN0cmluZyBmaWVsZCBmb3IgcmVhc29uCisgICAgICAgICAgICAgICAgLy8gQElnbm9yZSBoYXMgYSBTdHJpbmcgZmllbGQgZm9yIHNwZWNpZnlpbmcgcmVhc29ucwogICAgICAgICAgICAgICAgIGlmIChub2RlLnF1YWxpZmllZE5hbWUgPT0gREVNT1RJTkdfQU5OT1RBVElPTl9JR05PUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsIHJlYXNvbiA9IG5vZGUuZmluZEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpISEuZXZhbHVhdGUoKSBhcyBTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgdmFsIGJ1Z1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoImIvXFxkKyIpCi0gICAgICAgICAgICAgICAgICAgIGlmICghYnVnUGF0dGVybi5tYXRjaGVyKHJlYXNvbikuZmluZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNCdWdTdHJpbmcobm9kZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBsb2NhdGlvbiA9IGNvbnRleHQuZ2V0TG9jYXRpb24obm9kZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBtZXNzYWdlID0gIlBsZWFzZSBhdHRhY2ggYSBidWcgKGUuZy4gYi8xMjMpIHRvIHRyYWNrIGRlbW90ZWQgdGVzdCIKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KElTU1VFLCBub2RlLCBsb2NhdGlvbiwgbWVzc2FnZSkKQEAgLTYwLDYgKzU5LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIGZ1biBjb250YWluc0J1Z0lkKG5vZGU6IFVBbm5vdGF0aW9uKTogQm9vbGVhbiB7CisgICAgICAgIHZhbCBidWdJZCA9IG5vZGUuZmluZEF0dHJpYnV0ZVZhbHVlKCJidWdJZCIpPy5ldmFsdWF0ZSgpIGFzIEludD8KKyAgICAgICAgcmV0dXJuIGJ1Z0lkICE9IG51bGwgJiYgYnVnSWQgPiAwCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gY29udGFpbnNCdWdTdHJpbmcobm9kZTogVUFubm90YXRpb24pOiBCb29sZWFuIHsKKyAgICAgICAgdmFsIHJlYXNvbiA9IG5vZGUuZmluZEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpPy5ldmFsdWF0ZSgpIGFzIFN0cmluZz8KKyAgICAgICAgdmFsIGJ1Z1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoImIvXFxkKyIpCisgICAgICAgIHJldHVybiByZWFzb24gIT0gbnVsbCAmJiBidWdQYXR0ZXJuLm1hdGNoZXIocmVhc29uKS5maW5kKCkKKyAgICB9CisKICAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICAgdmFsIERFTU9USU5HX0FOTk9UQVRJT05fQlVHX0lEID0KICAgICAgICAgICAgIGxpc3RPZigKQEAgLTg3LDcgKzk3LDcgQEAKICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yOjpjbGFzcy5qYXZhLAotICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUuSkFWQV9GSUxFX1NDT1BFCisgICAgICAgICAgICAgICAgICAgICAgICBFbnVtU2V0Lm9mKFNjb3BlLkpBVkFfRklMRSwgU2NvcGUuVEVTVF9TT1VSQ0VTKQogICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICApCiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3Rlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NoZWNrcy90ZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3RvclRlc3Qua3QKaW5kZXggNjNlYjI2My4uYTFlNmY5MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3Rlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jaGVja3MvdGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3lzdGVtdWkvbGludC9EZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3JUZXN0Lmt0CkBAIC0yMCw4ICsyMCwxMSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuY2hlY2tzLmluZnJhc3RydWN0dXJlLlRlc3RGaWxlcwogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLkRldGVjdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuSXNzdWUKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5TY29wZQoraW1wb3J0IGphdmEudXRpbC5FbnVtU2V0CiBpbXBvcnQgb3JnLmp1bml0LlRlc3QKIAorQFN1cHByZXNzKCJVbnN0YWJsZUFwaVVzYWdlIikKIGNsYXNzIERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3RvclRlc3QgOiBTeXN0ZW1VSUxpbnREZXRlY3RvclRlc3QoKSB7CiAKICAgICBvdmVycmlkZSBmdW4gZ2V0RGV0ZWN0b3IoKTogRGV0ZWN0b3IgPSBEZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3IoKQpAQCAtNDUsNiArNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKQEAgLTY1LDYgKzY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLmluZGVudGVkKCksCiAgICAgICAgICAgICAgICAgKnN0dWJzCiAgICAgICAgICAgICApCisgICAgICAgICAgICAuY3VzdG9tU2NvcGUodGVzdFNjb3BlKQogICAgICAgICAgICAgLmlzc3VlcyhEZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3IuSVNTVUUpCiAgICAgICAgICAgICAucnVuKCkKICAgICAgICAgICAgIC5leHBlY3RDbGVhbigpCkBAIC04OCw2ICs5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0KApAQCAtMTE1LDYgKzEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0KApAQCAtMTQ1LDYgKzE1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0Q2xlYW4oKQpAQCAtMTY4LDYgKzE3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0KApAQCAtMTk4LDYgKzIwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0Q2xlYW4oKQpAQCAtMjIxLDYgKzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0KApAQCAtMjQ4LDYgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0KApAQCAtMjYwLDYgKzI3Miw3IEBACiAgICAgICAgICAgICApCiAgICAgfQogCisgICAgcHJpdmF0ZSB2YWwgdGVzdFNjb3BlID0gRW51bVNldC5vZihTY29wZS5KQVZBX0ZJTEUsIFNjb3BlLlRFU1RfU09VUkNFUykKICAgICBwcml2YXRlIHZhbCBmaWx0ZXJzRmxha3lUZXN0U3R1YjogVGVzdEZpbGUgPQogICAgICAgICBqYXZhKAogICAgICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2Uvc3dpcGVhYmxlL1N3aXBlYWJsZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvY29yZS9zcmMvY29tL2FuZHJvaWQvY29tcG9zZS9zd2lwZWFibGUvU3dpcGVhYmxlLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NmU3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2Uvc3dpcGVhYmxlL1N3aXBlYWJsZS5rdApAQCAtMCwwICsxLDg0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlCisKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmFuaW1hdGlvbi5jb3JlLkFuaW1hdGFibGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmFuaW1hdGlvbi5jb3JlLkFuaW1hdGlvblNwZWMKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmFuaW1hdGlvbi5jb3JlLlNwcmluZ1NwZWMKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uZ2VzdHVyZXMuRHJhZ2dhYmxlU3RhdGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uZ2VzdHVyZXMuT3JpZW50YXRpb24KK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uZ2VzdHVyZXMuZHJhZ2dhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmludGVyYWN0aW9uLk11dGFibGVJbnRlcmFjdGlvblNvdXJjZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5Db21wb3NhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkRpc3Bvc2FibGVFZmZlY3QKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuSW1tdXRhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkxhdW5jaGVkRWZmZWN0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLlN0YWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5TdGF0ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5nZXRWYWx1ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5tdXRhYmxlU3RhdGVPZgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5yZW1lbWJlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zYXZlYWJsZS5TYXZlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zYXZlYWJsZS5yZW1lbWJlclNhdmVhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLnNldFZhbHVlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLnNuYXBzaG90RmxvdworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuTW9kaWZpZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmNvbXBvc2VkCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5nZW9tZXRyeS5PZmZzZXQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmlucHV0Lm5lc3RlZHNjcm9sbC5OZXN0ZWRTY3JvbGxDb25uZWN0aW9uCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5pbnB1dC5uZXN0ZWRzY3JvbGwuTmVzdGVkU2Nyb2xsU291cmNlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5wbGF0Zm9ybS5Mb2NhbERlbnNpdHkKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnBsYXRmb3JtLmRlYnVnSW5zcGVjdG9ySW5mbworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5EZW5zaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LkRwCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LlZlbG9jaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LmRwCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5zd2lwZWFibGUuU3dpcGVhYmxlRGVmYXVsdHMuQW5pbWF0aW9uU3BlYworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlN3aXBlYWJsZURlZmF1bHRzLlN0YW5kYXJkUmVzaXN0YW5jZUZhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlN3aXBlYWJsZURlZmF1bHRzLlZlbG9jaXR5VGhyZXNob2xkCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5zd2lwZWFibGUuU3dpcGVhYmxlRGVmYXVsdHMucmVzaXN0YW5jZUNvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2UudWkudXRpbC5sZXJwCitpbXBvcnQga290bGluLm1hdGguUEkKK2ltcG9ydCBrb3RsaW4ubWF0aC5hYnMKK2ltcG9ydCBrb3RsaW4ubWF0aC5zaWduCitpbXBvcnQga290bGluLm1hdGguc2luCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNhbmNlbGxhdGlvbkV4Y2VwdGlvbgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5maWx0ZXIKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy50YWtlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmxhdW5jaAorCisvKioKKyAqIFN0YXRlIG9mIHRoZSBbc3dpcGVhYmxlXSBtb2RpZmllci4KKyAqCisgKiBUaGlzIGNvbnRhaW5zIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBhbnkgb25nb2luZyBzd2lwZSBvciBhbmltYXRpb24gYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8KKyAqIGNoYW5nZSB0aGUgc3RhdGUgZWl0aGVyIGltbWVkaWF0ZWx5IG9yIGJ5IHN0YXJ0aW5nIGFuIGFuaW1hdGlvbi4gVG8gY3JlYXRlIGFuZCByZW1lbWJlciBhCisgKiBbU3dpcGVhYmxlU3RhdGVdIHdpdGggdGhlIGRlZmF1bHQgYW5pbWF0aW9uIGNsb2NrLCB1c2UgW3JlbWVtYmVyU3dpcGVhYmxlU3RhdGVdLgorICoKKyAqIEBwYXJhbSBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHN0YXRlLgorICogQHBhcmFtIGFuaW1hdGlvblNwZWMgVGhlIGRlZmF1bHQgYW5pbWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuaW1hdGUgdG8gYSBuZXcgc3RhdGUuCisgKiBAcGFyYW0gY29uZmlybVN0YXRlQ2hhbmdlIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgdG8gY29uZmlybSBvciB2ZXRvIGEgcGVuZGluZyBzdGF0ZSBjaGFuZ2UuCisgKgorICogVE9ETyhiLzI3MjMxMTEwNik6IHRoaXMgaXMgYSBmb3JrIGZyb20gbWF0ZXJpYWwuIFVuZm9yayBpdCB3aGVuIFN3aXBlYWJsZS5rdCByZWFjaGVzIG1hdGVyaWFsMy4KKyAqLworQFN0YWJsZQorb3BlbiBjbGFzcyBTd2lwZWFibGVTdGF0ZTxUPigKKyAgICBpbml0aWFsVmFsdWU6IFQsCisgICAgaW50ZXJuYWwgdmFsIGFuaW1hdGlvblNwZWM6IEFuaW1hdGlvblNwZWM8RmxvYXQ+ID0gQW5pbWF0aW9uU3BlYywKKyAgICBpbnRlcm5hbCB2YWwgY29uZmlybVN0YXRlQ2hhbmdlOiAobmV3VmFsdWU6IFQpIC0+IEJvb2xlYW4gPSB7IHRydWUgfQorKSB7CisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0YXRlLgorICAgICAqCisgICAgICogSWYgbm8gc3dpcGUgb3IgYW5pbWF0aW9uIGlzIGluIHByb2dyZXNzLCB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBhbmNob3IgYXQgd2hpY2ggdGhlCisgICAgICogW3N3aXBlYWJsZV0gaXMgY3VycmVudGx5IHNldHRsZWQuIElmIGEgc3dpcGUgb3IgYW5pbWF0aW9uIGlzIGluIHByb2dyZXNzLCB0aGlzIGNvcnJlc3BvbmRzCisgICAgICogdGhlIGxhc3QgYW5jaG9yIGF0IHdoaWNoIHRoZSBbc3dpcGVhYmxlXSB3YXMgc2V0dGxlZCBiZWZvcmUgdGhlIHN3aXBlIG9yIGFuaW1hdGlvbiBzdGFydGVkLgorICAgICAqLworICAgIHZhciBjdXJyZW50VmFsdWU6IFQgYnkgbXV0YWJsZVN0YXRlT2YoaW5pdGlhbFZhbHVlKQorICAgICAgICBwcml2YXRlIHNldAorCisgICAgLyoqIFdoZXRoZXIgdGhlIHN0YXRlIGlzIGN1cnJlbnRseSBhbmltYXRpbmcuICovCisgICAgdmFyIGlzQW5pbWF0aW9uUnVubmluZzogQm9vbGVhbiBieSBtdXRhYmxlU3RhdGVPZihmYWxzZSkKKyAgICAgICAgcHJpdmF0ZSBzZXQKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIChpbiBwaXhlbHMpIG9mIHRoZSBbc3dpcGVhYmxlXS4KKyAgICAgKgorICAgICAqIFlvdSBzaG91bGQgdXNlIHRoaXMgc3RhdGUgdG8gb2Zmc2V0IHlvdXIgY29udGVudCBhY2NvcmRpbmdseS4gVGhlIHJlY29tbWVuZGVkIHdheSBpcyB0byB1c2UKKyAgICAgKiBgTW9kaWZpZXIub2Zmc2V0UHhgLiBUaGlzIGluY2x1ZGVzIHRoZSByZXNpc3RhbmNlIGJ5IGRlZmF1bHQsIGlmIHJlc2lzdGFuY2UgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICB2YWwgb2Zmc2V0OiBTdGF0ZTxGbG9hdD4KKyAgICAgICAgZ2V0KCkgPSBvZmZzZXRTdGF0ZQorCisgICAgLyoqIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIFtzd2lwZWFibGVdIGhhcyBiZWVuIHN3aXBlZCBwYXN0IGl0cyBib3VuZHMuICovCisgICAgdmFsIG92ZXJmbG93OiBTdGF0ZTxGbG9hdD4KKyAgICAgICAgZ2V0KCkgPSBvdmVyZmxvd1N0YXRlCisKKyAgICAvLyBVc2UgYEZsb2F0Lk5hTmAgYXMgYSBwbGFjZWhvbGRlciB3aGlsZSB0aGUgc3RhdGUgaXMgdW5pbml0aWFsaXNlZC4KKyAgICBwcml2YXRlIHZhbCBvZmZzZXRTdGF0ZSA9IG11dGFibGVTdGF0ZU9mKDBmKQorICAgIHByaXZhdGUgdmFsIG92ZXJmbG93U3RhdGUgPSBtdXRhYmxlU3RhdGVPZigwZikKKworICAgIC8vIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSAicmVhbCIobm9uIHVpKSBwb3NpdGlvbgorICAgIC8vIGJhc2ljYWxseSBwb3NpdGlvbiBpbiBib3VuZHMgKyBvdmVyZmxvdworICAgIHByaXZhdGUgdmFsIGFic29sdXRlT2Zmc2V0ID0gbXV0YWJsZVN0YXRlT2YoMGYpCisKKyAgICAvLyBjdXJyZW50IGFuaW1hdGlvbiB0YXJnZXQsIGlmIGFuaW1hdGluZywgb3RoZXJ3aXNlIG51bGwKKyAgICBwcml2YXRlIHZhbCBhbmltYXRpb25UYXJnZXQgPSBtdXRhYmxlU3RhdGVPZjxGbG9hdD8+KG51bGwpCisKKyAgICBpbnRlcm5hbCB2YXIgYW5jaG9ycyBieSBtdXRhYmxlU3RhdGVPZihlbXB0eU1hcDxGbG9hdCwgVD4oKSkKKworICAgIHByaXZhdGUgdmFsIGxhdGVzdE5vbkVtcHR5QW5jaG9yc0Zsb3c6IEZsb3c8TWFwPEZsb2F0LCBUPj4gPQorICAgICAgICBzbmFwc2hvdEZsb3cgeyBhbmNob3JzIH0uZmlsdGVyIHsgaXQuaXNOb3RFbXB0eSgpIH0udGFrZSgxKQorCisgICAgaW50ZXJuYWwgdmFyIG1pbkJvdW5kID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkKKyAgICBpbnRlcm5hbCB2YXIgbWF4Qm91bmQgPSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWQorCisgICAgaW50ZXJuYWwgZnVuIGVuc3VyZUluaXQobmV3QW5jaG9yczogTWFwPEZsb2F0LCBUPikgeworICAgICAgICBpZiAoYW5jaG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gZG8gaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gc3luY2hyb25vdXNseSA6KAorICAgICAgICAgICAgdmFsIGluaXRpYWxPZmZzZXQgPSBuZXdBbmNob3JzLmdldE9mZnNldChjdXJyZW50VmFsdWUpCisgICAgICAgICAgICByZXF1aXJlTm90TnVsbChpbml0aWFsT2Zmc2V0KSB7ICJUaGUgaW5pdGlhbCB2YWx1ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBhbmNob3IuIiB9CisgICAgICAgICAgICBvZmZzZXRTdGF0ZS52YWx1ZSA9IGluaXRpYWxPZmZzZXQKKyAgICAgICAgICAgIGFic29sdXRlT2Zmc2V0LnZhbHVlID0gaW5pdGlhbE9mZnNldAorICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJuYWwgc3VzcGVuZCBmdW4gcHJvY2Vzc05ld0FuY2hvcnMob2xkQW5jaG9yczogTWFwPEZsb2F0LCBUPiwgbmV3QW5jaG9yczogTWFwPEZsb2F0LCBUPikgeworICAgICAgICBpZiAob2xkQW5jaG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhhdCB3ZSByZWNlaXZlIGFuY2hvcnMsIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXNlCisgICAgICAgICAgICAvLyB0aGUgc3RhdGUgc28gd2Ugc25hcCB0byB0aGUgb2Zmc2V0IGFzc29jaWF0ZWQgdG8gdGhlIGluaXRpYWwgdmFsdWUuCisgICAgICAgICAgICBtaW5Cb3VuZCA9IG5ld0FuY2hvcnMua2V5cy5taW5Pck51bGwoKSEhCisgICAgICAgICAgICBtYXhCb3VuZCA9IG5ld0FuY2hvcnMua2V5cy5tYXhPck51bGwoKSEhCisgICAgICAgICAgICB2YWwgaW5pdGlhbE9mZnNldCA9IG5ld0FuY2hvcnMuZ2V0T2Zmc2V0KGN1cnJlbnRWYWx1ZSkKKyAgICAgICAgICAgIHJlcXVpcmVOb3ROdWxsKGluaXRpYWxPZmZzZXQpIHsgIlRoZSBpbml0aWFsIHZhbHVlIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuY2hvci4iIH0KKyAgICAgICAgICAgIHNuYXBJbnRlcm5hbFRvT2Zmc2V0KGluaXRpYWxPZmZzZXQpCisgICAgICAgIH0gZWxzZSBpZiAobmV3QW5jaG9ycyAhPSBvbGRBbmNob3JzKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHJlY2VpdmVkIG5ldyBhbmNob3JzLCB0aGVuIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdmFsdWUgbWlnaHQKKyAgICAgICAgICAgIC8vIGhhdmUgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBhbmltYXRlIHRvIHRoZSBuZXcgb2Zmc2V0LiBJZiB0aGUgY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgLy8gaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhbmNob3JzIHRoZW4gd2UgYW5pbWF0ZSB0byB0aGUgY2xvc2VzdCBhbmNob3IKKyAgICAgICAgICAgIC8vIGluc3RlYWQuIE5vdGUgdGhhdCB0aGlzIHN0b3BzIGFueSBvbmdvaW5nIGFuaW1hdGlvbi4KKyAgICAgICAgICAgIG1pbkJvdW5kID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkKKyAgICAgICAgICAgIG1heEJvdW5kID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkKKyAgICAgICAgICAgIHZhbCBhbmltYXRpb25UYXJnZXRWYWx1ZSA9IGFuaW1hdGlvblRhcmdldC52YWx1ZQorICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gdGhlIGFuaW1hdGlvbiBhbHJlYWR5LCBsZXQncyBmaW5kIGl0IGEgbmV3IGhvbWUKKyAgICAgICAgICAgIHZhbCB0YXJnZXRPZmZzZXQgPQorICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25UYXJnZXRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0LCB0cnkgdG8gbWFwIG9sZCBzdGF0ZSB0byB0aGUgbmV3IHN0YXRlCisgICAgICAgICAgICAgICAgICAgIHZhbCBvbGRTdGF0ZSA9IG9sZEFuY2hvcnNbYW5pbWF0aW9uVGFyZ2V0VmFsdWVdCisgICAgICAgICAgICAgICAgICAgIHZhbCBuZXdTdGF0ZSA9IG5ld0FuY2hvcnMuZ2V0T2Zmc2V0KG9sZFN0YXRlKQorICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gbmV3IHN0YXRlIGlmIGV4aXN0cywgb3IgZmluZCB0aGUgY2xvc2VzIG9uZSBhbW9uZyBuZXcgYW5jaG9ycworICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA/OiBuZXdBbmNob3JzLmtleXMubWluQnlPck51bGwgeyBhYnMoaXQgLSBhbmltYXRpb25UYXJnZXRWYWx1ZSkgfSEhCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IGFuaW1hdGluZywgcHJvY2VlZCBieSBmaW5kaW5nIHRoZSBuZXcgYW5jaG9ycyBmb3IgYW4gb2xkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHZhbCBhY3R1YWxPbGRWYWx1ZSA9IG9sZEFuY2hvcnNbb2Zmc2V0LnZhbHVlXQorICAgICAgICAgICAgICAgICAgICB2YWwgdmFsdWUgPSBpZiAoYWN0dWFsT2xkVmFsdWUgPT0gY3VycmVudFZhbHVlKSBjdXJyZW50VmFsdWUgZWxzZSBhY3R1YWxPbGRWYWx1ZQorICAgICAgICAgICAgICAgICAgICBuZXdBbmNob3JzLmdldE9mZnNldCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgID86IG5ld0FuY2hvcnMua2V5cy5taW5CeU9yTnVsbCB7IGFicyhpdCAtIG9mZnNldC52YWx1ZSkgfSEhCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhbmltYXRlSW50ZXJuYWxUb09mZnNldCh0YXJnZXRPZmZzZXQsIGFuaW1hdGlvblNwZWMpCisgICAgICAgICAgICB9IGNhdGNoIChjOiBDYW5jZWxsYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBmb3IgYW55IHJlYXNvbiwgc25hcCBhcyBhIGxhc3QgcmVzb3J0LgorICAgICAgICAgICAgICAgIHNuYXBJbnRlcm5hbFRvT2Zmc2V0KHRhcmdldE9mZnNldCkKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gbmV3QW5jaG9ycy5nZXRWYWx1ZSh0YXJnZXRPZmZzZXQpCisgICAgICAgICAgICAgICAgbWluQm91bmQgPSBuZXdBbmNob3JzLmtleXMubWluT3JOdWxsKCkhIQorICAgICAgICAgICAgICAgIG1heEJvdW5kID0gbmV3QW5jaG9ycy5rZXlzLm1heE9yTnVsbCgpISEKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVybmFsIHZhciB0aHJlc2hvbGRzOiAoRmxvYXQsIEZsb2F0KSAtPiBGbG9hdCBieSBtdXRhYmxlU3RhdGVPZih7IF8sIF8gLT4gMGYgfSkKKworICAgIGludGVybmFsIHZhciB2ZWxvY2l0eVRocmVzaG9sZCBieSBtdXRhYmxlU3RhdGVPZigwZikKKworICAgIGludGVybmFsIHZhciByZXNpc3RhbmNlOiBSZXNpc3RhbmNlQ29uZmlnPyBieSBtdXRhYmxlU3RhdGVPZihudWxsKQorCisgICAgaW50ZXJuYWwgdmFsIGRyYWdnYWJsZVN0YXRlID0gRHJhZ2dhYmxlU3RhdGUgeworICAgICAgICB2YWwgbmV3QWJzb2x1dGUgPSBhYnNvbHV0ZU9mZnNldC52YWx1ZSArIGl0CisgICAgICAgIHZhbCBjbGFtcGVkID0gbmV3QWJzb2x1dGUuY29lcmNlSW4obWluQm91bmQsIG1heEJvdW5kKQorICAgICAgICB2YWwgb3ZlcmZsb3cgPSBuZXdBYnNvbHV0ZSAtIGNsYW1wZWQKKyAgICAgICAgdmFsIHJlc2lzdGFuY2VEZWx0YSA9IHJlc2lzdGFuY2U/LmNvbXB1dGVSZXNpc3RhbmNlKG92ZXJmbG93KSA/OiAwZgorICAgICAgICBvZmZzZXRTdGF0ZS52YWx1ZSA9IGNsYW1wZWQgKyByZXNpc3RhbmNlRGVsdGEKKyAgICAgICAgb3ZlcmZsb3dTdGF0ZS52YWx1ZSA9IG92ZXJmbG93CisgICAgICAgIGFic29sdXRlT2Zmc2V0LnZhbHVlID0gbmV3QWJzb2x1dGUKKyAgICB9CisKKyAgICBwcml2YXRlIHN1c3BlbmQgZnVuIHNuYXBJbnRlcm5hbFRvT2Zmc2V0KHRhcmdldDogRmxvYXQpIHsKKyAgICAgICAgZHJhZ2dhYmxlU3RhdGUuZHJhZyB7IGRyYWdCeSh0YXJnZXQgLSBhYnNvbHV0ZU9mZnNldC52YWx1ZSkgfQorICAgIH0KKworICAgIHByaXZhdGUgc3VzcGVuZCBmdW4gYW5pbWF0ZUludGVybmFsVG9PZmZzZXQodGFyZ2V0OiBGbG9hdCwgc3BlYzogQW5pbWF0aW9uU3BlYzxGbG9hdD4pIHsKKyAgICAgICAgZHJhZ2dhYmxlU3RhdGUuZHJhZyB7CisgICAgICAgICAgICB2YXIgcHJldlZhbHVlID0gYWJzb2x1dGVPZmZzZXQudmFsdWUKKyAgICAgICAgICAgIGFuaW1hdGlvblRhcmdldC52YWx1ZSA9IHRhcmdldAorICAgICAgICAgICAgaXNBbmltYXRpb25SdW5uaW5nID0gdHJ1ZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBbmltYXRhYmxlKHByZXZWYWx1ZSkuYW5pbWF0ZVRvKHRhcmdldCwgc3BlYykgeworICAgICAgICAgICAgICAgICAgICBkcmFnQnkodGhpcy52YWx1ZSAtIHByZXZWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJldlZhbHVlID0gdGhpcy52YWx1ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uVGFyZ2V0LnZhbHVlID0gbnVsbAorICAgICAgICAgICAgICAgIGlzQW5pbWF0aW9uUnVubmluZyA9IGZhbHNlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IHZhbHVlIG9mIHRoZSBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIGEgc3dpcGUgaXMgaW4gcHJvZ3Jlc3MsIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgdGhlIFtzd2lwZWFibGVdIHdvdWxkIGFuaW1hdGUgdG8gaWYgdGhlCisgICAgICogc3dpcGUgZmluaXNoZWQuIElmIGFuIGFuaW1hdGlvbiBpcyBydW5uaW5nLCB0aGlzIGlzIHRoZSB0YXJnZXQgdmFsdWUgb2YgdGhhdCBhbmltYXRpb24uCisgICAgICogRmluYWxseSwgaWYgbm8gc3dpcGUgb3IgYW5pbWF0aW9uIGlzIGluIHByb2dyZXNzLCB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBbY3VycmVudFZhbHVlXS4KKyAgICAgKi8KKyAgICB2YWwgdGFyZ2V0VmFsdWU6IFQKKyAgICAgICAgZ2V0KCkgeworICAgICAgICAgICAgLy8gVE9ETyhjYWxpbnRhdCk6IFRyYWNrIGN1cnJlbnQgdmVsb2NpdHkgKGIvMTQ5NTQ5NDgyKSBhbmQgdXNlIHRoYXQgaGVyZS4KKyAgICAgICAgICAgIHZhbCB0YXJnZXQgPQorICAgICAgICAgICAgICAgIGFuaW1hdGlvblRhcmdldC52YWx1ZQorICAgICAgICAgICAgICAgICAgICA/OiBjb21wdXRlVGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gYW5jaG9ycy5nZXRPZmZzZXQoY3VycmVudFZhbHVlKSA/OiBvZmZzZXQudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycy5rZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyA9IHRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eSA9IDBmLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUaHJlc2hvbGQgPSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gYW5jaG9yc1t0YXJnZXRdID86IGN1cnJlbnRWYWx1ZQorICAgICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgb25nb2luZyBzd2lwZSBvciBhbmltYXRpb24sIGlmIGFueS4gU2VlIFtTd2lwZVByb2dyZXNzXSBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIElmIG5vIHN3aXBlIG9yIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhpcyByZXR1cm5zIGBTd2lwZVByb2dyZXNzKHZhbHVlLCB2YWx1ZSwgMWYpYC4KKyAgICAgKi8KKyAgICB2YWwgcHJvZ3Jlc3M6IFN3aXBlUHJvZ3Jlc3M8VD4KKyAgICAgICAgZ2V0KCkgeworICAgICAgICAgICAgdmFsIGJvdW5kcyA9IGZpbmRCb3VuZHMob2Zmc2V0LnZhbHVlLCBhbmNob3JzLmtleXMpCisgICAgICAgICAgICB2YWwgZnJvbTogVAorICAgICAgICAgICAgdmFsIHRvOiBUCisgICAgICAgICAgICB2YWwgZnJhY3Rpb246IEZsb2F0CisgICAgICAgICAgICB3aGVuIChib3VuZHMuc2l6ZSkgeworICAgICAgICAgICAgICAgIDAgLT4geworICAgICAgICAgICAgICAgICAgICBmcm9tID0gY3VycmVudFZhbHVlCisgICAgICAgICAgICAgICAgICAgIHRvID0gY3VycmVudFZhbHVlCisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgMSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBhbmNob3JzLmdldFZhbHVlKGJvdW5kc1swXSkKKyAgICAgICAgICAgICAgICAgICAgdG8gPSBhbmNob3JzLmdldFZhbHVlKGJvdW5kc1swXSkKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAxZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIChhLCBiKSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID4gMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMF0gdG8gYm91bmRzWzFdCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1sxXSB0byBib3VuZHNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IGFuY2hvcnMuZ2V0VmFsdWUoYSkKKyAgICAgICAgICAgICAgICAgICAgdG8gPSBhbmNob3JzLmdldFZhbHVlKGIpCisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gKG9mZnNldC52YWx1ZSAtIGEpIC8gKGIgLSBhKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTd2lwZVByb2dyZXNzKGZyb20sIHRvLCBmcmFjdGlvbikKKyAgICAgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgW3N3aXBlYWJsZV0gaXMgbW92aW5nLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBbY3VycmVudFZhbHVlXS4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBiZSBlaXRoZXIgMWYgaWYgaXQgaXMgaXMgbW92aW5nIGZyb20gbGVmdCB0byByaWdodCBvciB0b3AgdG8gYm90dG9tLCAtMWYgaWYgaXQgaXMKKyAgICAgKiBtb3ZpbmcgZnJvbSByaWdodCB0byBsZWZ0IG9yIGJvdHRvbSB0byB0b3AsIG9yIDBmIGlmIG5vIHN3aXBlIG9yIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICB2YWwgZGlyZWN0aW9uOiBGbG9hdAorICAgICAgICBnZXQoKSA9IGFuY2hvcnMuZ2V0T2Zmc2V0KGN1cnJlbnRWYWx1ZSk/LmxldCB7IHNpZ24ob2Zmc2V0LnZhbHVlIC0gaXQpIH0gPzogMGYKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RhdGUgd2l0aG91dCBhbnkgYW5pbWF0aW9uIGFuZCBzdXNwZW5kIHVudGlsIGl0J3Mgc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgVGhlIG5ldyB0YXJnZXQgdmFsdWUgdG8gc2V0IFtjdXJyZW50VmFsdWVdIHRvLgorICAgICAqLworICAgIHN1c3BlbmQgZnVuIHNuYXBUbyh0YXJnZXRWYWx1ZTogVCkgeworICAgICAgICBsYXRlc3ROb25FbXB0eUFuY2hvcnNGbG93LmNvbGxlY3QgeyBhbmNob3JzIC0+CisgICAgICAgICAgICB2YWwgdGFyZ2V0T2Zmc2V0ID0gYW5jaG9ycy5nZXRPZmZzZXQodGFyZ2V0VmFsdWUpCisgICAgICAgICAgICByZXF1aXJlTm90TnVsbCh0YXJnZXRPZmZzZXQpIHsgIlRoZSB0YXJnZXQgdmFsdWUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5jaG9yLiIgfQorICAgICAgICAgICAgc25hcEludGVybmFsVG9PZmZzZXQodGFyZ2V0T2Zmc2V0KQorICAgICAgICAgICAgY3VycmVudFZhbHVlID0gdGFyZ2V0VmFsdWUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RhdGUgdG8gdGhlIHRhcmdldCB2YWx1ZSBieSBzdGFydGluZyBhbiBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgVGhlIG5ldyB2YWx1ZSB0byBhbmltYXRlIHRvLgorICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYW5pbWF0ZSB0byB0aGUgbmV3IHZhbHVlLgorICAgICAqLworICAgIHN1c3BlbmQgZnVuIGFuaW1hdGVUbyh0YXJnZXRWYWx1ZTogVCwgYW5pbTogQW5pbWF0aW9uU3BlYzxGbG9hdD4gPSBhbmltYXRpb25TcGVjKSB7CisgICAgICAgIGxhdGVzdE5vbkVtcHR5QW5jaG9yc0Zsb3cuY29sbGVjdCB7IGFuY2hvcnMgLT4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsIHRhcmdldE9mZnNldCA9IGFuY2hvcnMuZ2V0T2Zmc2V0KHRhcmdldFZhbHVlKQorICAgICAgICAgICAgICAgIHJlcXVpcmVOb3ROdWxsKHRhcmdldE9mZnNldCkgeyAiVGhlIHRhcmdldCB2YWx1ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBhbmNob3IuIiB9CisgICAgICAgICAgICAgICAgYW5pbWF0ZUludGVybmFsVG9PZmZzZXQodGFyZ2V0T2Zmc2V0LCBhbmltKQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB2YWwgZW5kT2Zmc2V0ID0gYWJzb2x1dGVPZmZzZXQudmFsdWUKKyAgICAgICAgICAgICAgICB2YWwgZW5kVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBhbmNob3JzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWdodGluZyByb3VuZGluZyBlcnJvciBvbmNlIGFnYWluLCBhbmNob3Igc2hvdWxkIGJlIGFzIGNsb3NlIGFzIDAuNQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyS2V5cyB7IGFuY2hvck9mZnNldCAtPiBhYnMoYW5jaG9yT2Zmc2V0IC0gZW5kT2Zmc2V0KSA8IDAuNWYgfQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0T3JOdWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID86IGN1cnJlbnRWYWx1ZQorICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGVuZFZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGZsaW5nIHdpdGggc2V0dGxpbmcgdG8gb25lIG9mIHRoZSBhbmNob3JzIHdoaWNoIGlzIGRldGVybWluZWQgYnkgdGhlIGdpdmVuCisgICAgICogW3ZlbG9jaXR5XS4gRmxpbmcgd2l0aCBzZXR0bGluZyBbc3dpcGVhYmxlXSB3aWxsIGFsd2F5cyBjb25zdW1lIGFsbCB0aGUgdmVsb2NpdHkgcHJvdmlkZWQKKyAgICAgKiBzaW5jZSBpdCB3aWxsIHNldHRsZSBhdCB0aGUgYW5jaG9yLgorICAgICAqCisgICAgICogSW4gZ2VuZXJhbCBjYXNlcywgW3N3aXBlYWJsZV0gZmxpbmdzIGJ5IGl0c2VsZiB3aGVuIGJlaW5nIHN3aXBlZC4gVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZAorICAgICAqIGZvciBuZXN0ZWQgc2Nyb2xsIGxvZ2ljIHRoYXQgd3JhcHMgdGhlIFtzd2lwZWFibGVdLiBJbiBuZXN0ZWQgc2Nyb2xsIGRldmVsb3BlciBtYXkgd2FudCB0bworICAgICAqIHRyaWdnZXIgc2V0dGxpbmcgZmxpbmcgd2hlbiB0aGUgY2hpbGQgc2Nyb2xsIGNvbnRhaW5lciByZWFjaGVzIHRoZSBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZWxvY2l0eSB2ZWxvY2l0eSB0byBmbGluZyBhbmQgc2V0dGxlIHdpdGgKKyAgICAgKiBAcmV0dXJuIHRoZSByZWFzb24gZmxpbmcgZW5kZWQKKyAgICAgKi8KKyAgICBzdXNwZW5kIGZ1biBwZXJmb3JtRmxpbmcodmVsb2NpdHk6IEZsb2F0KSB7CisgICAgICAgIGxhdGVzdE5vbkVtcHR5QW5jaG9yc0Zsb3cuY29sbGVjdCB7IGFuY2hvcnMgLT4KKyAgICAgICAgICAgIHZhbCBsYXN0QW5jaG9yID0gYW5jaG9ycy5nZXRPZmZzZXQoY3VycmVudFZhbHVlKSEhCisgICAgICAgICAgICB2YWwgdGFyZ2V0VmFsdWUgPQorICAgICAgICAgICAgICAgIGNvbXB1dGVUYXJnZXQoCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gbGFzdEFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgYW5jaG9ycyA9IGFuY2hvcnMua2V5cywKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyA9IHRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gdmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VGhyZXNob2xkID0gdmVsb2NpdHlUaHJlc2hvbGQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB2YWwgdGFyZ2V0U3RhdGUgPSBhbmNob3JzW3RhcmdldFZhbHVlXQorICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlICE9IG51bGwgJiYgY29uZmlybVN0YXRlQ2hhbmdlKHRhcmdldFN0YXRlKSkgYW5pbWF0ZVRvKHRhcmdldFN0YXRlKQorICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgdmV0b2VkIHRoZSBzdGF0ZSBjaGFuZ2UsIHJvbGxiYWNrIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4KKyAgICAgICAgICAgIGVsc2UgYW5pbWF0ZUludGVybmFsVG9PZmZzZXQobGFzdEFuY2hvciwgYW5pbWF0aW9uU3BlYykKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIFtzd2lwZWFibGVdIHRvIGNvbnN1bWUgZHJhZyBkZWx0YSBwcm92aWRlZCBmcm9tIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXIgW3N3aXBlYWJsZV0KKyAgICAgKiBnZXN0dXJlIGZsb3cuCisgICAgICoKKyAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBnZW5lcmljIGRyYWcgYW5kIGl0IHdvbid0IHNldHRsZSB0byBhbnkgcGFydGljdWxhciBhbmNob3IsICoKKyAgICAgKiBsZWF2aW5nIHN3aXBlYWJsZSBpbiBiZXR3ZWVuIGFuY2hvcnMuIFdoZW4gZG9uZSBkcmFnZ2luZywgW3BlcmZvcm1GbGluZ10gbXVzdCBiZSBjYWxsZWQgYXMKKyAgICAgKiB3ZWxsIHRvIGVuc3VyZSBzd2lwZWFibGUgd2lsbCBzZXR0bGUgYXQgdGhlIGFuY2hvci4KKyAgICAgKgorICAgICAqIEluIGdlbmVyYWwgY2FzZXMsIFtzd2lwZWFibGVdIGRyYWdzIGJ5IGl0c2VsZiB3aGVuIGJlaW5nIHN3aXBlZC4gVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZAorICAgICAqIGZvciBuZXN0ZWQgc2Nyb2xsIGxvZ2ljIHRoYXQgd3JhcHMgdGhlIFtzd2lwZWFibGVdLiBJbiBuZXN0ZWQgc2Nyb2xsIGRldmVsb3BlciBtYXkgd2FudCB0bworICAgICAqIGZvcmNlIGRyYWcgd2hlbiB0aGUgY2hpbGQgc2Nyb2xsIGNvbnRhaW5lciByZWFjaGVzIHRoZSBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWx0YSBkZWx0YSBpbiBwaXhlbHMgdG8gZHJhZyBieQorICAgICAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBbZGVsdGFdIGNvbnN1bWVkCisgICAgICovCisgICAgZnVuIHBlcmZvcm1EcmFnKGRlbHRhOiBGbG9hdCk6IEZsb2F0IHsKKyAgICAgICAgdmFsIHBvdGVudGlhbGx5Q29uc3VtZWQgPSBhYnNvbHV0ZU9mZnNldC52YWx1ZSArIGRlbHRhCisgICAgICAgIHZhbCBjbGFtcGVkID0gcG90ZW50aWFsbHlDb25zdW1lZC5jb2VyY2VJbihtaW5Cb3VuZCwgbWF4Qm91bmQpCisgICAgICAgIHZhbCBkZWx0YVRvQ29uc3VtZSA9IGNsYW1wZWQgLSBhYnNvbHV0ZU9mZnNldC52YWx1ZQorICAgICAgICBpZiAoYWJzKGRlbHRhVG9Db25zdW1lKSA+IDApIHsKKyAgICAgICAgICAgIGRyYWdnYWJsZVN0YXRlLmRpc3BhdGNoUmF3RGVsdGEoZGVsdGFUb0NvbnN1bWUpCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlbHRhVG9Db25zdW1lCisgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBbU2F2ZXJdIGltcGxlbWVudGF0aW9uIGZvciBbU3dpcGVhYmxlU3RhdGVdLiAqLworICAgICAgICBmdW4gPFQgOiBBbnk+IFNhdmVyKAorICAgICAgICAgICAgYW5pbWF0aW9uU3BlYzogQW5pbWF0aW9uU3BlYzxGbG9hdD4sCisgICAgICAgICAgICBjb25maXJtU3RhdGVDaGFuZ2U6IChUKSAtPiBCb29sZWFuCisgICAgICAgICkgPQorICAgICAgICAgICAgU2F2ZXI8U3dpcGVhYmxlU3RhdGU8VD4sIFQ+KAorICAgICAgICAgICAgICAgIHNhdmUgPSB7IGl0LmN1cnJlbnRWYWx1ZSB9LAorICAgICAgICAgICAgICAgIHJlc3RvcmUgPSB7IFN3aXBlYWJsZVN0YXRlKGl0LCBhbmltYXRpb25TcGVjLCBjb25maXJtU3RhdGVDaGFuZ2UpIH0KKyAgICAgICAgICAgICkKKyAgICB9Cit9CisKKy8qKgorICogQ29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9uZ29pbmcgc3dpcGUgb3IgYW5pbWF0aW9uIGluIFtzd2lwZWFibGVdLgorICoKKyAqIFRvIGFjY2VzcyB0aGlzIGluZm9ybWF0aW9uLCB1c2UgW1N3aXBlYWJsZVN0YXRlLnByb2dyZXNzXS4KKyAqCisgKiBAcGFyYW0gZnJvbSBUaGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgYW5jaG9yIHdlIGFyZSBtb3ZpbmcgYXdheSBmcm9tLgorICogQHBhcmFtIHRvIFRoZSBzdGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbmNob3Igd2UgYXJlIG1vdmluZyB0b3dhcmRzLgorICogQHBhcmFtIGZyYWN0aW9uIFRoZSBmcmFjdGlvbiB0aGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlcHJlc2VudHMgYmV0d2VlbiBbZnJvbV0gYW5kIFt0b10uIE11c3QKKyAqICAgYmUgYmV0d2VlbiBgMGAgYW5kIGAxYC4KKyAqLworQEltbXV0YWJsZQorY2xhc3MgU3dpcGVQcm9ncmVzczxUPigKKyAgICB2YWwgZnJvbTogVCwKKyAgICB2YWwgdG86IFQsCisgICAgLypARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkqLworICAgIHZhbCBmcmFjdGlvbjogRmxvYXQKKykgeworICAgIG92ZXJyaWRlIGZ1biBlcXVhbHMob3RoZXI6IEFueT8pOiBCb29sZWFuIHsKKyAgICAgICAgaWYgKHRoaXMgPT09IG90aGVyKSByZXR1cm4gdHJ1ZQorICAgICAgICBpZiAob3RoZXIgIWlzIFN3aXBlUHJvZ3Jlc3M8Kj4pIHJldHVybiBmYWxzZQorCisgICAgICAgIGlmIChmcm9tICE9IG90aGVyLmZyb20pIHJldHVybiBmYWxzZQorICAgICAgICBpZiAodG8gIT0gb3RoZXIudG8pIHJldHVybiBmYWxzZQorICAgICAgICBpZiAoZnJhY3Rpb24gIT0gb3RoZXIuZnJhY3Rpb24pIHJldHVybiBmYWxzZQorCisgICAgICAgIHJldHVybiB0cnVlCisgICAgfQorCisgICAgb3ZlcnJpZGUgZnVuIGhhc2hDb2RlKCk6IEludCB7CisgICAgICAgIHZhciByZXN1bHQgPSBmcm9tPy5oYXNoQ29kZSgpID86IDAKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodG8/Lmhhc2hDb2RlKCkgPzogMCkKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBmcmFjdGlvbi5oYXNoQ29kZSgpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICB9CisKKyAgICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuICJTd2lwZVByb2dyZXNzKGZyb209JGZyb20sIHRvPSR0bywgZnJhY3Rpb249JGZyYWN0aW9uKSIKKyAgICB9Cit9CisKKy8qKgorICogQ3JlYXRlIGFuZCBbcmVtZW1iZXJdIGEgW1N3aXBlYWJsZVN0YXRlXSB3aXRoIHRoZSBkZWZhdWx0IGFuaW1hdGlvbiBjbG9jay4KKyAqCisgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzdGF0ZS4KKyAqIEBwYXJhbSBhbmltYXRpb25TcGVjIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmltYXRlIHRvIGEgbmV3IHN0YXRlLgorICogQHBhcmFtIGNvbmZpcm1TdGF0ZUNoYW5nZSBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHRvIGNvbmZpcm0gb3IgdmV0byBhIHBlbmRpbmcgc3RhdGUgY2hhbmdlLgorICovCitAQ29tcG9zYWJsZQorZnVuIDxUIDogQW55PiByZW1lbWJlclN3aXBlYWJsZVN0YXRlKAorICAgIGluaXRpYWxWYWx1ZTogVCwKKyAgICBhbmltYXRpb25TcGVjOiBBbmltYXRpb25TcGVjPEZsb2F0PiA9IEFuaW1hdGlvblNwZWMsCisgICAgY29uZmlybVN0YXRlQ2hhbmdlOiAobmV3VmFsdWU6IFQpIC0+IEJvb2xlYW4gPSB7IHRydWUgfQorKTogU3dpcGVhYmxlU3RhdGU8VD4geworICAgIHJldHVybiByZW1lbWJlclNhdmVhYmxlKAorICAgICAgICBzYXZlciA9CisgICAgICAgICAgICBTd2lwZWFibGVTdGF0ZS5TYXZlcigKKyAgICAgICAgICAgICAgICBhbmltYXRpb25TcGVjID0gYW5pbWF0aW9uU3BlYywKKyAgICAgICAgICAgICAgICBjb25maXJtU3RhdGVDaGFuZ2UgPSBjb25maXJtU3RhdGVDaGFuZ2UKKyAgICAgICAgICAgICkKKyAgICApIHsKKyAgICAgICAgU3dpcGVhYmxlU3RhdGUoCisgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUsCisgICAgICAgICAgICBhbmltYXRpb25TcGVjID0gYW5pbWF0aW9uU3BlYywKKyAgICAgICAgICAgIGNvbmZpcm1TdGF0ZUNoYW5nZSA9IGNvbmZpcm1TdGF0ZUNoYW5nZQorICAgICAgICApCisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZSBhbmQgW3JlbWVtYmVyXSBhIFtTd2lwZWFibGVTdGF0ZV0gd2hpY2ggaXMga2VwdCBpbiBzeW5jIHdpdGggYW5vdGhlciBzdGF0ZSwgaS5lLjoKKyAqIDEuIFdoZW5ldmVyIHRoZSBbdmFsdWVdIGNoYW5nZXMsIHRoZSBbU3dpcGVhYmxlU3RhdGVdIHdpbGwgYmUgYW5pbWF0ZWQgdG8gdGhhdCBuZXcgdmFsdWUuCisgKiAyLiBXaGVuZXZlciB0aGUgdmFsdWUgb2YgdGhlIFtTd2lwZWFibGVTdGF0ZV0gY2hhbmdlcyAoZS5nLiBhZnRlciBhIHN3aXBlKSwgdGhlIG93bmVyIG9mIHRoZQorICogICAgW3ZhbHVlXSB3aWxsIGJlIG5vdGlmaWVkIHRvIHVwZGF0ZSB0aGVpciBzdGF0ZSB0byB0aGUgbmV3IHZhbHVlIG9mIHRoZSBbU3dpcGVhYmxlU3RhdGVdIGJ5CisgKiAgICBpbnZva2luZyBbb25WYWx1ZUNoYW5nZV0uIElmIHRoZSBvd25lciBkb2VzIG5vdCB1cGRhdGUgdGhlaXIgc3RhdGUgdG8gdGhlIHByb3ZpZGVkIHZhbHVlIGZvcgorICogICAgc29tZSByZWFzb24sIHRoZW4gdGhlIFtTd2lwZWFibGVTdGF0ZV0gd2lsbCBwZXJmb3JtIGEgcm9sbGJhY2sgdG8gdGhlIHByZXZpb3VzLCBjb3JyZWN0IHZhbHVlLgorICovCitAQ29tcG9zYWJsZQoraW50ZXJuYWwgZnVuIDxUIDogQW55PiByZW1lbWJlclN3aXBlYWJsZVN0YXRlRm9yKAorICAgIHZhbHVlOiBULAorICAgIG9uVmFsdWVDaGFuZ2U6IChUKSAtPiBVbml0LAorICAgIGFuaW1hdGlvblNwZWM6IEFuaW1hdGlvblNwZWM8RmxvYXQ+ID0gQW5pbWF0aW9uU3BlYworKTogU3dpcGVhYmxlU3RhdGU8VD4geworICAgIHZhbCBzd2lwZWFibGVTdGF0ZSA9IHJlbWVtYmVyIHsKKyAgICAgICAgU3dpcGVhYmxlU3RhdGUoCisgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSB2YWx1ZSwKKyAgICAgICAgICAgIGFuaW1hdGlvblNwZWMgPSBhbmltYXRpb25TcGVjLAorICAgICAgICAgICAgY29uZmlybVN0YXRlQ2hhbmdlID0geyB0cnVlIH0KKyAgICAgICAgKQorICAgIH0KKyAgICB2YWwgZm9yY2VBbmltYXRpb25DaGVjayA9IHJlbWVtYmVyIHsgbXV0YWJsZVN0YXRlT2YoZmFsc2UpIH0KKyAgICBMYXVuY2hlZEVmZmVjdCh2YWx1ZSwgZm9yY2VBbmltYXRpb25DaGVjay52YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gc3dpcGVhYmxlU3RhdGUuY3VycmVudFZhbHVlKSB7CisgICAgICAgICAgICBzd2lwZWFibGVTdGF0ZS5hbmltYXRlVG8odmFsdWUpCisgICAgICAgIH0KKyAgICB9CisgICAgRGlzcG9zYWJsZUVmZmVjdChzd2lwZWFibGVTdGF0ZS5jdXJyZW50VmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IHN3aXBlYWJsZVN0YXRlLmN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgb25WYWx1ZUNoYW5nZShzd2lwZWFibGVTdGF0ZS5jdXJyZW50VmFsdWUpCisgICAgICAgICAgICBmb3JjZUFuaW1hdGlvbkNoZWNrLnZhbHVlID0gIWZvcmNlQW5pbWF0aW9uQ2hlY2sudmFsdWUKKyAgICAgICAgfQorICAgICAgICBvbkRpc3Bvc2Uge30KKyAgICB9CisgICAgcmV0dXJuIHN3aXBlYWJsZVN0YXRlCit9CisKKy8qKgorICogRW5hYmxlIHN3aXBlIGdlc3R1cmVzIGJldHdlZW4gYSBzZXQgb2YgcHJlZGVmaW5lZCBzdGF0ZXMuCisgKgorICogVG8gdXNlIHRoaXMsIHlvdSBtdXN0IHByb3ZpZGUgYSBtYXAgb2YgYW5jaG9ycyAoaW4gcGl4ZWxzKSB0byBzdGF0ZXMgKG9mIHR5cGUgW1RdKS4gTm90ZSB0aGF0CisgKiB0aGlzIG1hcCBjYW5ub3QgYmUgZW1wdHkgYW5kIGNhbm5vdCBoYXZlIHR3byBhbmNob3JzIG1hcHBlZCB0byB0aGUgc2FtZSBzdGF0ZS4KKyAqCisgKiBXaGVuIGEgc3dpcGUgaXMgZGV0ZWN0ZWQsIHRoZSBvZmZzZXQgb2YgdGhlIFtTd2lwZWFibGVTdGF0ZV0gd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHN3aXBlCisgKiBkZWx0YS4gWW91IHNob3VsZCB1c2UgdGhpcyBvZmZzZXQgdG8gbW92ZSB5b3VyIGNvbnRlbnQgYWNjb3JkaW5nbHkgKHNlZSBgTW9kaWZpZXIub2Zmc2V0UHhgKS4KKyAqIFdoZW4gdGhlIHN3aXBlIGVuZHMsIHRoZSBvZmZzZXQgd2lsbCBiZSBhbmltYXRlZCB0byBvbmUgb2YgdGhlIGFuY2hvcnMgYW5kIHdoZW4gdGhhdCBhbmNob3IgaXMKKyAqIHJlYWNoZWQsIHRoZSB2YWx1ZSBvZiB0aGUgW1N3aXBlYWJsZVN0YXRlXSB3aWxsIGFsc28gYmUgdXBkYXRlZCB0byB0aGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIG5ldyBhbmNob3IuIFRoZSB0YXJnZXQgYW5jaG9yIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBvc2l0aW9uYWwgW3RocmVzaG9sZHNdLgorICoKKyAqIFN3aXBpbmcgaXMgY29uc3RyYWluZWQgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhbmNob3JzLiBJZiB0aGUgdXNlciBhdHRlbXB0cyB0byBzd2lwZQorICogcGFzdCB0aGVzZSBib3VuZHMsIGEgcmVzaXN0YW5jZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIGJ5IGRlZmF1bHQuIFRoZSBhbW91bnQgb2YgcmVzaXN0YW5jZSBhdAorICogZWFjaCBlZGdlIGlzIHNwZWNpZmllZCBieSB0aGUgW3Jlc2lzdGFuY2VdIGNvbmZpZy4gVG8gZGlzYWJsZSBhbGwgcmVzaXN0YW5jZSwgc2V0IGl0IHRvIGBudWxsYC4KKyAqCisgKiBGb3IgYW4gZXhhbXBsZSBvZiBhIFtzd2lwZWFibGVdIHdpdGggdGhyZWUgc3RhdGVzLCBzZWU6CisgKgorICogQHBhcmFtIFQgVGhlIHR5cGUgb2YgdGhlIHN0YXRlLgorICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSBvZiB0aGUgW3N3aXBlYWJsZV0uCisgKiBAcGFyYW0gYW5jaG9ycyBQYWlycyBvZiBhbmNob3JzIGFuZCBzdGF0ZXMsIHVzZWQgdG8gbWFwIGFuY2hvcnMgdG8gc3RhdGVzIGFuZCB2aWNlIHZlcnNhLgorICogQHBhcmFtIHRocmVzaG9sZHMgU3BlY2lmaWVzIHdoZXJlIHRoZSB0aHJlc2hvbGRzIGJldHdlZW4gdGhlIHN0YXRlcyBhcmUuIFRoZSB0aHJlc2hvbGRzIHdpbGwgYmUKKyAqICAgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgdG8gYW5pbWF0ZSB0byB3aGVuIHN3aXBpbmcgc3RvcHMuIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgYSBsYW1iZGEKKyAqICAgdGhhdCB0YWtlcyB0d28gc3RhdGVzIGFuZCByZXR1cm5zIHRoZSB0aHJlc2hvbGQgYmV0d2VlbiB0aGVtIGluIHRoZSBmb3JtIG9mIGEKKyAqICAgW1RocmVzaG9sZENvbmZpZ10uIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIHN0YXRlcyBjb3JyZXNwb25kcyB0byB0aGUgc3dpcGUgZGlyZWN0aW9uLgorICogQHBhcmFtIG9yaWVudGF0aW9uIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0aGUgW3N3aXBlYWJsZV0gY2FuIGJlIHN3aXBlZC4KKyAqIEBwYXJhbSBlbmFibGVkIFdoZXRoZXIgdGhpcyBbc3dpcGVhYmxlXSBpcyBlbmFibGVkIGFuZCBzaG91bGQgcmVhY3QgdG8gdGhlIHVzZXIncyBpbnB1dC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIFdoZXRoZXIgdG8gcmV2ZXJzZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzd2lwZSwgc28gYSB0b3AgdG8gYm90dG9tIHN3aXBlCisgKiAgIHdpbGwgYmVoYXZlIGxpa2UgYm90dG9tIHRvIHRvcCwgYW5kIGEgbGVmdCB0byByaWdodCBzd2lwZSB3aWxsIGJlaGF2ZSBsaWtlIHJpZ2h0IHRvIGxlZnQuCisgKiBAcGFyYW0gaW50ZXJhY3Rpb25Tb3VyY2UgT3B0aW9uYWwgW011dGFibGVJbnRlcmFjdGlvblNvdXJjZV0gdGhhdCB3aWxsIHBhc3NlZCBvbiB0byB0aGUgaW50ZXJuYWwKKyAqICAgW01vZGlmaWVyLmRyYWdnYWJsZV0uCisgKiBAcGFyYW0gcmVzaXN0YW5jZSBDb250cm9scyBob3cgbXVjaCByZXNpc3RhbmNlIHdpbGwgYmUgYXBwbGllZCB3aGVuIHN3aXBpbmcgcGFzdCB0aGUgYm91bmRzLgorICogQHBhcmFtIHZlbG9jaXR5VGhyZXNob2xkIFRoZSB0aHJlc2hvbGQgKGluIGRwIHBlciBzZWNvbmQpIHRoYXQgdGhlIGVuZCB2ZWxvY2l0eSBoYXMgdG8gZXhjZWVkIGluCisgKiAgIG9yZGVyIHRvIGFuaW1hdGUgdG8gdGhlIG5leHQgc3RhdGUsIGV2ZW4gaWYgdGhlIHBvc2l0aW9uYWwgW3RocmVzaG9sZHNdIGhhdmUgbm90IGJlZW4gcmVhY2hlZC4KKyAqIEBzYW1wbGUgYW5kcm9pZHguY29tcG9zZS5tYXRlcmlhbC5zYW1wbGVzLlN3aXBlYWJsZVNhbXBsZQorICovCitmdW4gPFQ+IE1vZGlmaWVyLnN3aXBlYWJsZSgKKyAgICBzdGF0ZTogU3dpcGVhYmxlU3RhdGU8VD4sCisgICAgYW5jaG9yczogTWFwPEZsb2F0LCBUPiwKKyAgICBvcmllbnRhdGlvbjogT3JpZW50YXRpb24sCisgICAgZW5hYmxlZDogQm9vbGVhbiA9IHRydWUsCisgICAgcmV2ZXJzZURpcmVjdGlvbjogQm9vbGVhbiA9IGZhbHNlLAorICAgIGludGVyYWN0aW9uU291cmNlOiBNdXRhYmxlSW50ZXJhY3Rpb25Tb3VyY2U/ID0gbnVsbCwKKyAgICB0aHJlc2hvbGRzOiAoZnJvbTogVCwgdG86IFQpIC0+IFRocmVzaG9sZENvbmZpZyA9IHsgXywgXyAtPiBGaXhlZFRocmVzaG9sZCg1Ni5kcCkgfSwKKyAgICByZXNpc3RhbmNlOiBSZXNpc3RhbmNlQ29uZmlnPyA9IHJlc2lzdGFuY2VDb25maWcoYW5jaG9ycy5rZXlzKSwKKyAgICB2ZWxvY2l0eVRocmVzaG9sZDogRHAgPSBWZWxvY2l0eVRocmVzaG9sZAorKSA9CisgICAgY29tcG9zZWQoCisgICAgICAgIGluc3BlY3RvckluZm8gPQorICAgICAgICAgICAgZGVidWdJbnNwZWN0b3JJbmZvIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gInN3aXBlYWJsZSIKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJzdGF0ZSJdID0gc3RhdGUKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJhbmNob3JzIl0gPSBhbmNob3JzCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1sib3JpZW50YXRpb24iXSA9IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1siZW5hYmxlZCJdID0gZW5hYmxlZAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbInJldmVyc2VEaXJlY3Rpb24iXSA9IHJldmVyc2VEaXJlY3Rpb24KKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJpbnRlcmFjdGlvblNvdXJjZSJdID0gaW50ZXJhY3Rpb25Tb3VyY2UKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJ0aHJlc2hvbGRzIl0gPSB0aHJlc2hvbGRzCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1sicmVzaXN0YW5jZSJdID0gcmVzaXN0YW5jZQorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbInZlbG9jaXR5VGhyZXNob2xkIl0gPSB2ZWxvY2l0eVRocmVzaG9sZAorICAgICAgICAgICAgfQorICAgICkgeworICAgICAgICByZXF1aXJlKGFuY2hvcnMuaXNOb3RFbXB0eSgpKSB7ICJZb3UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbmNob3IuIiB9CisgICAgICAgIHJlcXVpcmUoYW5jaG9ycy52YWx1ZXMuZGlzdGluY3QoKS5jb3VudCgpID09IGFuY2hvcnMuc2l6ZSkgeworICAgICAgICAgICAgIllvdSBjYW5ub3QgaGF2ZSB0d28gYW5jaG9ycyBtYXBwZWQgdG8gdGhlIHNhbWUgc3RhdGUuIgorICAgICAgICB9CisgICAgICAgIHZhbCBkZW5zaXR5ID0gTG9jYWxEZW5zaXR5LmN1cnJlbnQKKyAgICAgICAgc3RhdGUuZW5zdXJlSW5pdChhbmNob3JzKQorICAgICAgICBMYXVuY2hlZEVmZmVjdChhbmNob3JzLCBzdGF0ZSkgeworICAgICAgICAgICAgdmFsIG9sZEFuY2hvcnMgPSBzdGF0ZS5hbmNob3JzCisgICAgICAgICAgICBzdGF0ZS5hbmNob3JzID0gYW5jaG9ycworICAgICAgICAgICAgc3RhdGUucmVzaXN0YW5jZSA9IHJlc2lzdGFuY2UKKyAgICAgICAgICAgIHN0YXRlLnRocmVzaG9sZHMgPSB7IGEsIGIgLT4KKyAgICAgICAgICAgICAgICB2YWwgZnJvbSA9IGFuY2hvcnMuZ2V0VmFsdWUoYSkKKyAgICAgICAgICAgICAgICB2YWwgdG8gPSBhbmNob3JzLmdldFZhbHVlKGIpCisgICAgICAgICAgICAgICAgd2l0aCh0aHJlc2hvbGRzKGZyb20sIHRvKSkgeyBkZW5zaXR5LmNvbXB1dGVUaHJlc2hvbGQoYSwgYikgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2l0aChkZW5zaXR5KSB7IHN0YXRlLnZlbG9jaXR5VGhyZXNob2xkID0gdmVsb2NpdHlUaHJlc2hvbGQudG9QeCgpIH0KKyAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NOZXdBbmNob3JzKG9sZEFuY2hvcnMsIGFuY2hvcnMpCisgICAgICAgIH0KKworICAgICAgICBNb2RpZmllci5kcmFnZ2FibGUoCisgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uLAorICAgICAgICAgICAgZW5hYmxlZCA9IGVuYWJsZWQsCisgICAgICAgICAgICByZXZlcnNlRGlyZWN0aW9uID0gcmV2ZXJzZURpcmVjdGlvbiwKKyAgICAgICAgICAgIGludGVyYWN0aW9uU291cmNlID0gaW50ZXJhY3Rpb25Tb3VyY2UsCisgICAgICAgICAgICBzdGFydERyYWdJbW1lZGlhdGVseSA9IHN0YXRlLmlzQW5pbWF0aW9uUnVubmluZywKKyAgICAgICAgICAgIG9uRHJhZ1N0b3BwZWQgPSB7IHZlbG9jaXR5IC0+IGxhdW5jaCB7IHN0YXRlLnBlcmZvcm1GbGluZyh2ZWxvY2l0eSkgfSB9LAorICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZS5kcmFnZ2FibGVTdGF0ZQorICAgICAgICApCisgICAgfQorCisvKioKKyAqIEludGVyZmFjZSB0byBjb21wdXRlIGEgdGhyZXNob2xkIGJldHdlZW4gdHdvIGFuY2hvcnMvc3RhdGVzIGluIGEgW3N3aXBlYWJsZV0uCisgKgorICogVG8gZGVmaW5lIGEgW1RocmVzaG9sZENvbmZpZ10sIGNvbnNpZGVyIHVzaW5nIFtGaXhlZFRocmVzaG9sZF0gYW5kIFtGcmFjdGlvbmFsVGhyZXNob2xkXS4KKyAqLworQFN0YWJsZQoraW50ZXJmYWNlIFRocmVzaG9sZENvbmZpZyB7CisgICAgLyoqIENvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgKGluIHBpeGVscyksIG9uY2UgdGhlIHZhbHVlcyBvZiB0aGUgYW5jaG9ycyBhcmUga25vd24uICovCisgICAgZnVuIERlbnNpdHkuY29tcHV0ZVRocmVzaG9sZChmcm9tVmFsdWU6IEZsb2F0LCB0b1ZhbHVlOiBGbG9hdCk6IEZsb2F0Cit9CisKKy8qKgorICogQSBmaXhlZCB0aHJlc2hvbGQgd2lsbCBiZSBhdCBhbiBbb2Zmc2V0XSBhd2F5IGZyb20gdGhlIGZpcnN0IGFuY2hvci4KKyAqCisgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgKGluIGRwKSB0aGF0IHRoZSB0aHJlc2hvbGQgd2lsbCBiZSBhdC4KKyAqLworQEltbXV0YWJsZQorZGF0YSBjbGFzcyBGaXhlZFRocmVzaG9sZChwcml2YXRlIHZhbCBvZmZzZXQ6IERwKSA6IFRocmVzaG9sZENvbmZpZyB7CisgICAgb3ZlcnJpZGUgZnVuIERlbnNpdHkuY29tcHV0ZVRocmVzaG9sZChmcm9tVmFsdWU6IEZsb2F0LCB0b1ZhbHVlOiBGbG9hdCk6IEZsb2F0IHsKKyAgICAgICAgcmV0dXJuIGZyb21WYWx1ZSArIG9mZnNldC50b1B4KCkgKiBzaWduKHRvVmFsdWUgLSBmcm9tVmFsdWUpCisgICAgfQorfQorCisvKioKKyAqIEEgZnJhY3Rpb25hbCB0aHJlc2hvbGQgd2lsbCBiZSBhdCBhIFtmcmFjdGlvbl0gb2YgdGhlIHdheSBiZXR3ZWVuIHRoZSB0d28gYW5jaG9ycy4KKyAqCisgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIChiZXR3ZWVuIDAgYW5kIDEpIHRoYXQgdGhlIHRocmVzaG9sZCB3aWxsIGJlIGF0LgorICovCitASW1tdXRhYmxlCitkYXRhIGNsYXNzIEZyYWN0aW9uYWxUaHJlc2hvbGQoCisgICAgLypARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkqLworICAgIHByaXZhdGUgdmFsIGZyYWN0aW9uOiBGbG9hdAorKSA6IFRocmVzaG9sZENvbmZpZyB7CisgICAgb3ZlcnJpZGUgZnVuIERlbnNpdHkuY29tcHV0ZVRocmVzaG9sZChmcm9tVmFsdWU6IEZsb2F0LCB0b1ZhbHVlOiBGbG9hdCk6IEZsb2F0IHsKKyAgICAgICAgcmV0dXJuIGxlcnAoZnJvbVZhbHVlLCB0b1ZhbHVlLCBmcmFjdGlvbikKKyAgICB9Cit9CisKKy8qKgorICogU3BlY2lmaWVzIGhvdyByZXNpc3RhbmNlIGlzIGNhbGN1bGF0ZWQgaW4gW3N3aXBlYWJsZV0uCisgKgorICogVGhlcmUgYXJlIHR3byB0aGluZ3MgbmVlZGVkIHRvIGNhbGN1bGF0ZSByZXNpc3RhbmNlOiB0aGUgcmVzaXN0YW5jZSBiYXNpcyBkZXRlcm1pbmVzIGhvdyBtdWNoCisgKiBvdmVyZmxvdyB3aWxsIGJlIGNvbnN1bWVkIHRvIGFjaGlldmUgbWF4aW11bSByZXNpc3RhbmNlLCBhbmQgdGhlIHJlc2lzdGFuY2UgZmFjdG9yIGRldGVybWluZXMgdGhlCisgKiBhbW91bnQgb2YgcmVzaXN0YW5jZSAodGhlIGxhcmdlciB0aGUgcmVzaXN0YW5jZSBmYWN0b3IsIHRoZSBzdHJvbmdlciB0aGUgcmVzaXN0YW5jZSkuCisgKgorICogVGhlIHJlc2lzdGFuY2UgYmFzaXMgaXMgdXN1YWxseSBlaXRoZXIgdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCB3aGljaCBbc3dpcGVhYmxlXSBpcyBhcHBsaWVkIHRvLAorICogb3IgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYW5jaG9ycy4gRm9yIGEgY29uc3RydWN0b3IgaW4gd2hpY2ggdGhlCisgKiByZXNpc3RhbmNlIGJhc2lzIGRlZmF1bHRzIHRvIHRoZSBsYXR0ZXIsIGNvbnNpZGVyIHVzaW5nIFtyZXNpc3RhbmNlQ29uZmlnXS4KKyAqCisgKiBZb3UgbWF5IHNwZWNpZnkgZGlmZmVyZW50IHJlc2lzdGFuY2UgZmFjdG9ycyBmb3IgZWFjaCBib3VuZC4gQ29uc2lkZXIgdXNpbmcgb25lIG9mIHRoZSBkZWZhdWx0CisgKiByZXNpc3RhbmNlIGZhY3RvcnMgaW4gW1N3aXBlYWJsZURlZmF1bHRzXTogYFN0YW5kYXJkUmVzaXN0YW5jZUZhY3RvcmAgdG8gY29udmV5IHRoYXQgdGhlIHVzZXIgaGFzCisgKiBydW4gb3V0IG9mIHRoaW5ncyB0byBzZWUsIGFuZCBgU3RpZmZSZXNpc3RhbmNlRmFjdG9yYCB0byBjb252ZXkgdGhhdCB0aGUgdXNlciBjYW5ub3Qgc3dpcGUgdGhpcworICogcmlnaHQgbm93LiBBbHNvLCB5b3UgY2FuIHNldCBlaXRoZXIgZmFjdG9yIHRvIDAgdG8gZGlzYWJsZSByZXNpc3RhbmNlIGF0IHRoYXQgYm91bmQuCisgKgorICogQHBhcmFtIGJhc2lzIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygb3ZlcmZsb3cgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLiBNdXN0IGJlIHBvc2l0aXZlLgorICogQHBhcmFtIGZhY3RvckF0TWluIFRoZSBmYWN0b3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIHJlc2lzdGFuY2UgYXQgdGhlIG1pbmltdW0gYm91bmQuIE11c3Qgbm90IGJlCisgKiAgIG5lZ2F0aXZlLgorICogQHBhcmFtIGZhY3RvckF0TWF4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIHJlc2lzdGFuY2UgYXQgdGhlIG1heGltdW0gYm91bmQuIE11c3Qgbm90IGJlCisgKiAgIG5lZ2F0aXZlLgorICovCitASW1tdXRhYmxlCitjbGFzcyBSZXNpc3RhbmNlQ29uZmlnKAorICAgIC8qQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgZnJvbUluY2x1c2l2ZSA9IGZhbHNlKSovCisgICAgdmFsIGJhc2lzOiBGbG9hdCwKKyAgICAvKkBGbG9hdFJhbmdlKGZyb20gPSAwLjApKi8KKyAgICB2YWwgZmFjdG9yQXRNaW46IEZsb2F0ID0gU3RhbmRhcmRSZXNpc3RhbmNlRmFjdG9yLAorICAgIC8qQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCkqLworICAgIHZhbCBmYWN0b3JBdE1heDogRmxvYXQgPSBTdGFuZGFyZFJlc2lzdGFuY2VGYWN0b3IKKykgeworICAgIGZ1biBjb21wdXRlUmVzaXN0YW5jZShvdmVyZmxvdzogRmxvYXQpOiBGbG9hdCB7CisgICAgICAgIHZhbCBmYWN0b3IgPSBpZiAob3ZlcmZsb3cgPCAwKSBmYWN0b3JBdE1pbiBlbHNlIGZhY3RvckF0TWF4CisgICAgICAgIGlmIChmYWN0b3IgPT0gMGYpIHJldHVybiAwZgorICAgICAgICB2YWwgcHJvZ3Jlc3MgPSAob3ZlcmZsb3cgLyBiYXNpcykuY29lcmNlSW4oLTFmLCAxZikKKyAgICAgICAgcmV0dXJuIGJhc2lzIC8gZmFjdG9yICogc2luKHByb2dyZXNzICogUEkudG9GbG9hdCgpIC8gMikKKyAgICB9CisKKyAgICBvdmVycmlkZSBmdW4gZXF1YWxzKG90aGVyOiBBbnk/KTogQm9vbGVhbiB7CisgICAgICAgIGlmICh0aGlzID09PSBvdGhlcikgcmV0dXJuIHRydWUKKyAgICAgICAgaWYgKG90aGVyICFpcyBSZXNpc3RhbmNlQ29uZmlnKSByZXR1cm4gZmFsc2UKKworICAgICAgICBpZiAoYmFzaXMgIT0gb3RoZXIuYmFzaXMpIHJldHVybiBmYWxzZQorICAgICAgICBpZiAoZmFjdG9yQXRNaW4gIT0gb3RoZXIuZmFjdG9yQXRNaW4pIHJldHVybiBmYWxzZQorICAgICAgICBpZiAoZmFjdG9yQXRNYXggIT0gb3RoZXIuZmFjdG9yQXRNYXgpIHJldHVybiBmYWxzZQorCisgICAgICAgIHJldHVybiB0cnVlCisgICAgfQorCisgICAgb3ZlcnJpZGUgZnVuIGhhc2hDb2RlKCk6IEludCB7CisgICAgICAgIHZhciByZXN1bHQgPSBiYXNpcy5oYXNoQ29kZSgpCisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZmFjdG9yQXRNaW4uaGFzaENvZGUoKQorICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGZhY3RvckF0TWF4Lmhhc2hDb2RlKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKworICAgIG92ZXJyaWRlIGZ1biB0b1N0cmluZygpOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gIlJlc2lzdGFuY2VDb25maWcoYmFzaXM9JGJhc2lzLCBmYWN0b3JBdE1pbj0kZmFjdG9yQXRNaW4sIGZhY3RvckF0TWF4PSRmYWN0b3JBdE1heCkiCisgICAgfQorfQorCisvKioKKyAqIEdpdmVuIGFuIG9mZnNldCB4IGFuZCBhIHNldCBvZiBhbmNob3JzLCByZXR1cm4gYSBsaXN0IG9mIGFuY2hvcnM6CisgKiAxLiBbIF0gaWYgdGhlIHNldCBvZiBhbmNob3JzIGlzIGVtcHR5LAorICogMi4gWyB4JyBdIGlmIHggaXMgZXF1YWwgdG8gb25lIG9mIHRoZSBhbmNob3JzLCBhY2NvdW50aW5nIGZvciBhIHNtYWxsIHJvdW5kaW5nIGVycm9yLCB3aGVyZSB4JyBpcworICogICAgeCByb3VuZGVkIHRvIHRoZSBleGFjdCB2YWx1ZSBvZiB0aGUgbWF0Y2hpbmcgYW5jaG9yLAorICogMy4gWyBtaW4gXSBpZiBtaW4gaXMgdGhlIG1pbmltdW0gYW5jaG9yIGFuZCB4IDwgbWluLAorICogNC4gWyBtYXggXSBpZiBtYXggaXMgdGhlIG1heGltdW0gYW5jaG9yIGFuZCB4ID4gbWF4LCBvcgorICogNS4gWyBhICwgYiBdIGlmIGEgYW5kIGIgYXJlIGFuY2hvcnMgc3VjaCB0aGF0IGEgPCB4IDwgYiBhbmQgYiAtIGEgaXMgbWluaW1hbC4KKyAqLworcHJpdmF0ZSBmdW4gZmluZEJvdW5kcyhvZmZzZXQ6IEZsb2F0LCBhbmNob3JzOiBTZXQ8RmxvYXQ+KTogTGlzdDxGbG9hdD4geworICAgIC8vIEZpbmQgdGhlIGFuY2hvcnMgdGhlIHRhcmdldCBsaWVzIGJldHdlZW4gd2l0aCBhIGxpdHRsZSBiaXQgb2Ygcm91bmRpbmcgZXJyb3IuCisgICAgdmFsIGEgPSBhbmNob3JzLmZpbHRlciB7IGl0IDw9IG9mZnNldCArIDAuMDAxIH0ubWF4T3JOdWxsKCkKKyAgICB2YWwgYiA9IGFuY2hvcnMuZmlsdGVyIHsgaXQgPj0gb2Zmc2V0IC0gMC4wMDEgfS5taW5Pck51bGwoKQorCisgICAgcmV0dXJuIHdoZW4geworICAgICAgICBhID09IG51bGwgLT4KKyAgICAgICAgICAgIC8vIGNhc2UgMSBvciAzCisgICAgICAgICAgICBsaXN0T2ZOb3ROdWxsKGIpCisgICAgICAgIGIgPT0gbnVsbCAtPgorICAgICAgICAgICAgLy8gY2FzZSA0CisgICAgICAgICAgICBsaXN0T2YoYSkKKyAgICAgICAgYSA9PSBiIC0+CisgICAgICAgICAgICAvLyBjYXNlIDIKKyAgICAgICAgICAgIC8vIENhbid0IHJldHVybiBvZmZzZXQgaXRzZWxmIGhlcmUgc2luY2UgaXQgbWlnaHQgbm90IGJlIGV4YWN0bHkgZXF1YWwKKyAgICAgICAgICAgIC8vIHRvIHRoZSBhbmNob3IsIGRlc3BpdGUgYmVpbmcgY29uc2lkZXJlZCBhbiBleGFjdCBtYXRjaC4KKyAgICAgICAgICAgIGxpc3RPZihhKQorICAgICAgICBlbHNlIC0+CisgICAgICAgICAgICAvLyBjYXNlIDUKKyAgICAgICAgICAgIGxpc3RPZihhLCBiKQorICAgIH0KK30KKworcHJpdmF0ZSBmdW4gY29tcHV0ZVRhcmdldCgKKyAgICBvZmZzZXQ6IEZsb2F0LAorICAgIGxhc3RWYWx1ZTogRmxvYXQsCisgICAgYW5jaG9yczogU2V0PEZsb2F0PiwKKyAgICB0aHJlc2hvbGRzOiAoRmxvYXQsIEZsb2F0KSAtPiBGbG9hdCwKKyAgICB2ZWxvY2l0eTogRmxvYXQsCisgICAgdmVsb2NpdHlUaHJlc2hvbGQ6IEZsb2F0CispOiBGbG9hdCB7CisgICAgdmFsIGJvdW5kcyA9IGZpbmRCb3VuZHMob2Zmc2V0LCBhbmNob3JzKQorICAgIHJldHVybiB3aGVuIChib3VuZHMuc2l6ZSkgeworICAgICAgICAwIC0+IGxhc3RWYWx1ZQorICAgICAgICAxIC0+IGJvdW5kc1swXQorICAgICAgICBlbHNlIC0+IHsKKyAgICAgICAgICAgIHZhbCBsb3dlciA9IGJvdW5kc1swXQorICAgICAgICAgICAgdmFsIHVwcGVyID0gYm91bmRzWzFdCisgICAgICAgICAgICBpZiAobGFzdFZhbHVlIDw9IG9mZnNldCkgeworICAgICAgICAgICAgICAgIC8vIFN3aXBpbmcgZnJvbSBsb3dlciB0byB1cHBlciAocG9zaXRpdmUpLgorICAgICAgICAgICAgICAgIGlmICh2ZWxvY2l0eSA+PSB2ZWxvY2l0eVRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBwZXIKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWwgdGhyZXNob2xkID0gdGhyZXNob2xkcyhsb3dlciwgdXBwZXIpCisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCB0aHJlc2hvbGQpIGxvd2VyIGVsc2UgdXBwZXIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFN3aXBpbmcgZnJvbSB1cHBlciB0byBsb3dlciAobmVnYXRpdmUpLgorICAgICAgICAgICAgICAgIGlmICh2ZWxvY2l0eSA8PSAtdmVsb2NpdHlUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvd2VyCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIHRocmVzaG9sZCA9IHRocmVzaG9sZHModXBwZXIsIGxvd2VyKQorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gdGhyZXNob2xkKSB1cHBlciBlbHNlIGxvd2VyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitwcml2YXRlIGZ1biA8VD4gTWFwPEZsb2F0LCBUPi5nZXRPZmZzZXQoc3RhdGU6IFQpOiBGbG9hdD8geworICAgIHJldHVybiBlbnRyaWVzLmZpcnN0T3JOdWxsIHsgaXQudmFsdWUgPT0gc3RhdGUgfT8ua2V5Cit9CisKKy8qKiBDb250YWlucyB1c2VmdWwgZGVmYXVsdHMgZm9yIFtzd2lwZWFibGVdIGFuZCBbU3dpcGVhYmxlU3RhdGVdLiAqLworb2JqZWN0IFN3aXBlYWJsZURlZmF1bHRzIHsKKyAgICAvKiogVGhlIGRlZmF1bHQgYW5pbWF0aW9uIHVzZWQgYnkgW1N3aXBlYWJsZVN0YXRlXS4gKi8KKyAgICB2YWwgQW5pbWF0aW9uU3BlYyA9IFNwcmluZ1NwZWM8RmxvYXQ+KCkKKworICAgIC8qKiBUaGUgZGVmYXVsdCB2ZWxvY2l0eSB0aHJlc2hvbGQgKDEuOCBkcCBwZXIgbWlsbGlzZWNvbmQpIHVzZWQgYnkgW3N3aXBlYWJsZV0uICovCisgICAgdmFsIFZlbG9jaXR5VGhyZXNob2xkID0gMTI1LmRwCisKKyAgICAvKiogQSBzdGlmZiByZXNpc3RhbmNlIGZhY3RvciB3aGljaCBpbmRpY2F0ZXMgdGhhdCBzd2lwaW5nIGlzbid0IGF2YWlsYWJsZSByaWdodCBub3cuICovCisgICAgY29uc3QgdmFsIFN0aWZmUmVzaXN0YW5jZUZhY3RvciA9IDIwZgorCisgICAgLyoqIEEgc3RhbmRhcmQgcmVzaXN0YW5jZSBmYWN0b3Igd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgaGFzIHJ1biBvdXQgb2YgdGhpbmdzIHRvIHNlZS4gKi8KKyAgICBjb25zdCB2YWwgU3RhbmRhcmRSZXNpc3RhbmNlRmFjdG9yID0gMTBmCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCByZXNpc3RhbmNlIGNvbmZpZyB1c2VkIGJ5IFtzd2lwZWFibGVdLgorICAgICAqCisgICAgICogVGhpcyByZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBvbmUgYW5jaG9yLiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGFuY2hvcnMsIGl0IHJldHVybnMgYQorICAgICAqIFtSZXNpc3RhbmNlQ29uZmlnXSB3aXRoIHRoZSByZXNpc3RhbmNlIGJhc2lzIGVxdWFsIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gYm91bmRzLgorICAgICAqLworICAgIGZ1biByZXNpc3RhbmNlQ29uZmlnKAorICAgICAgICBhbmNob3JzOiBTZXQ8RmxvYXQ+LAorICAgICAgICBmYWN0b3JBdE1pbjogRmxvYXQgPSBTdGFuZGFyZFJlc2lzdGFuY2VGYWN0b3IsCisgICAgICAgIGZhY3RvckF0TWF4OiBGbG9hdCA9IFN0YW5kYXJkUmVzaXN0YW5jZUZhY3RvcgorICAgICk6IFJlc2lzdGFuY2VDb25maWc/IHsKKyAgICAgICAgcmV0dXJuIGlmIChhbmNob3JzLnNpemUgPD0gMSkgeworICAgICAgICAgICAgbnVsbAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsIGJhc2lzID0gYW5jaG9ycy5tYXhPck51bGwoKSEhIC0gYW5jaG9ycy5taW5Pck51bGwoKSEhCisgICAgICAgICAgICBSZXNpc3RhbmNlQ29uZmlnKGJhc2lzLCBmYWN0b3JBdE1pbiwgZmFjdG9yQXRNYXgpCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHRlbXAgZGVmYXVsdCBuZXN0ZWQgc2Nyb2xsIGNvbm5lY3Rpb24gZm9yIHN3aXBlYWJsZXMgd2hpY2ggZGVzaXJlIGFzIGFuIG9wdCBpbgorLy8gcmV2aXNpdCBpbiBiLzE3NDc1Njc0NCBhcyBhbGwgdHlwZXMgd2lsbCBoYXZlIHRoZWlyIG93biBzcGVjaWZpYyBjb25uZWN0aW9uIHByb2JhYmx5CitpbnRlcm5hbCB2YWwgPFQ+IFN3aXBlYWJsZVN0YXRlPFQ+LlByZVVwUG9zdERvd25OZXN0ZWRTY3JvbGxDb25uZWN0aW9uOiBOZXN0ZWRTY3JvbGxDb25uZWN0aW9uCisgICAgZ2V0KCkgPQorICAgICAgICBvYmplY3QgOiBOZXN0ZWRTY3JvbGxDb25uZWN0aW9uIHsKKyAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBvblByZVNjcm9sbChhdmFpbGFibGU6IE9mZnNldCwgc291cmNlOiBOZXN0ZWRTY3JvbGxTb3VyY2UpOiBPZmZzZXQgeworICAgICAgICAgICAgICAgIHZhbCBkZWx0YSA9IGF2YWlsYWJsZS50b0Zsb2F0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaWYgKGRlbHRhIDwgMCAmJiBzb3VyY2UgPT0gTmVzdGVkU2Nyb2xsU291cmNlLkRyYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybURyYWcoZGVsdGEpLnRvT2Zmc2V0KCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBPZmZzZXQuWmVybworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIG9uUG9zdFNjcm9sbCgKKyAgICAgICAgICAgICAgICBjb25zdW1lZDogT2Zmc2V0LAorICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogT2Zmc2V0LAorICAgICAgICAgICAgICAgIHNvdXJjZTogTmVzdGVkU2Nyb2xsU291cmNlCisgICAgICAgICAgICApOiBPZmZzZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpZiAoc291cmNlID09IE5lc3RlZFNjcm9sbFNvdXJjZS5EcmFnKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1EcmFnKGF2YWlsYWJsZS50b0Zsb2F0KCkpLnRvT2Zmc2V0KCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBPZmZzZXQuWmVybworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3ZlcnJpZGUgc3VzcGVuZCBmdW4gb25QcmVGbGluZyhhdmFpbGFibGU6IFZlbG9jaXR5KTogVmVsb2NpdHkgeworICAgICAgICAgICAgICAgIHZhbCB0b0ZsaW5nID0gT2Zmc2V0KGF2YWlsYWJsZS54LCBhdmFpbGFibGUueSkudG9GbG9hdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlmICh0b0ZsaW5nIDwgMCAmJiBvZmZzZXQudmFsdWUgPiBtaW5Cb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcodmVsb2NpdHkgPSB0b0ZsaW5nKQorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBnbyB0byB0aGUgYW5jaG9yIHdpdGggdHdlZW4gc2V0dGxpbmcsIGNvbnN1bWUgYWxsIGZvciB0aGUgYmVzdCBVWAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBWZWxvY2l0eS5aZXJvCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdmVycmlkZSBzdXNwZW5kIGZ1biBvblBvc3RGbGluZyhjb25zdW1lZDogVmVsb2NpdHksIGF2YWlsYWJsZTogVmVsb2NpdHkpOiBWZWxvY2l0eSB7CisgICAgICAgICAgICAgICAgcGVyZm9ybUZsaW5nKHZlbG9jaXR5ID0gT2Zmc2V0KGF2YWlsYWJsZS54LCBhdmFpbGFibGUueSkudG9GbG9hdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBmdW4gRmxvYXQudG9PZmZzZXQoKTogT2Zmc2V0ID0gT2Zmc2V0KDBmLCB0aGlzKQorCisgICAgICAgICAgICBwcml2YXRlIGZ1biBPZmZzZXQudG9GbG9hdCgpOiBGbG9hdCA9IHRoaXMueQorICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2UvdWkvdXRpbC9NYXRoSGVscGVycy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvY29yZS9zcmMvY29tL2FuZHJvaWQvY29tcG9zZS91aS91dGlsL01hdGhIZWxwZXJzLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZGVmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2UvdWkvdXRpbC9NYXRoSGVscGVycy5rdApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcG9zZS51aS51dGlsCisKK2ltcG9ydCBrb3RsaW4ubWF0aC5yb3VuZFRvSW50CitpbXBvcnQga290bGluLm1hdGgucm91bmRUb0xvbmcKKworLy8gVE9ETyhiLzI3MjMxMTEwNik6IHRoaXMgaXMgYSBmb3JrIGZyb20gbWF0ZXJpYWwuIFVuZm9yayBpdCB3aGVuIE1hdGhIZWxwZXJzLmt0IHJlYWNoZXMgbWF0ZXJpYWwzLgorCisvKiogTGluZWFybHkgaW50ZXJwb2xhdGUgYmV0d2VlbiBbc3RhcnRdIGFuZCBbc3RvcF0gd2l0aCBbZnJhY3Rpb25dIGZyYWN0aW9uIGJldHdlZW4gdGhlbS4gKi8KK2Z1biBsZXJwKHN0YXJ0OiBGbG9hdCwgc3RvcDogRmxvYXQsIGZyYWN0aW9uOiBGbG9hdCk6IEZsb2F0IHsKKyAgICByZXR1cm4gKDEgLSBmcmFjdGlvbikgKiBzdGFydCArIGZyYWN0aW9uICogc3RvcAorfQorCisvKiogTGluZWFybHkgaW50ZXJwb2xhdGUgYmV0d2VlbiBbc3RhcnRdIGFuZCBbc3RvcF0gd2l0aCBbZnJhY3Rpb25dIGZyYWN0aW9uIGJldHdlZW4gdGhlbS4gKi8KK2Z1biBsZXJwKHN0YXJ0OiBJbnQsIHN0b3A6IEludCwgZnJhY3Rpb246IEZsb2F0KTogSW50IHsKKyAgICByZXR1cm4gc3RhcnQgKyAoKHN0b3AgLSBzdGFydCkgKiBmcmFjdGlvbi50b0RvdWJsZSgpKS5yb3VuZFRvSW50KCkKK30KKworLyoqIExpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gW3N0YXJ0XSBhbmQgW3N0b3BdIHdpdGggW2ZyYWN0aW9uXSBmcmFjdGlvbiBiZXR3ZWVuIHRoZW0uICovCitmdW4gbGVycChzdGFydDogTG9uZywgc3RvcDogTG9uZywgZnJhY3Rpb246IEZsb2F0KTogTG9uZyB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKChzdG9wIC0gc3RhcnQpICogZnJhY3Rpb24udG9Eb3VibGUoKSkucm91bmRUb0xvbmcoKQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZGlzYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUZhY2FkZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2Rpc2FibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QKaW5kZXggZTI1M2ZiOS4uY2MzMzc0NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZGlzYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUZhY2FkZS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9kaXNhYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlRmFjYWRlLmt0CkBAIC0yMSw4ICsyMSwxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3CiBpbXBvcnQgYW5kcm9pZHguYWN0aXZpdHkuQ29tcG9uZW50QWN0aXZpdHkKIGltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUuTGlmZWN5Y2xlT3duZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbC5NdWx0aVNoYWRlVmlld01vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGVvcGxlLnVpLnZpZXdtb2RlbC5QZW9wbGVWaWV3TW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5mb290ZXIudWkudmlld21vZGVsLkZvb3RlckFjdGlvbnNWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2sKIAogLyoqIFRoZSBDb21wb3NlIGZhY2FkZSwgd2hlbiBDb21wb3NlIGlzICpub3QqIGF2YWlsYWJsZS4gKi8KIG9iamVjdCBDb21wb3NlRmFjYWRlIDogQmFzZUNvbXBvc2VGYWNhZGUgewpAQCAtNDgsNiArNTAsMTQgQEAKICAgICAgICAgdGhyb3dDb21wb3NlVW5hdmFpbGFibGVFcnJvcigpCiAgICAgfQogCisgICAgb3ZlcnJpZGUgZnVuIGNyZWF0ZU11bHRpU2hhZGVWaWV3KAorICAgICAgICBjb250ZXh0OiBDb250ZXh0LAorICAgICAgICB2aWV3TW9kZWw6IE11bHRpU2hhZGVWaWV3TW9kZWwsCisgICAgICAgIGNsb2NrOiBTeXN0ZW1DbG9jaywKKyAgICApOiBWaWV3IHsKKyAgICAgICAgdGhyb3dDb21wb3NlVW5hdmFpbGFibGVFcnJvcigpCisgICAgfQorCiAgICAgcHJpdmF0ZSBmdW4gdGhyb3dDb21wb3NlVW5hdmFpbGFibGVFcnJvcigpOiBOb3RoaW5nIHsKICAgICAgICAgZXJyb3IoCiAgICAgICAgICAgICAiQ29tcG9zZSBpcyBub3QgYXZhaWxhYmxlLiBNYWtlIHN1cmUgdG8gY2hlY2sgaXNDb21wb3NlQXZhaWxhYmxlKCkgYmVmb3JlIGNhbGxpbmcgYW55IiArCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QKaW5kZXggMWVhMThmZS4uMGU3OWIxOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZW5hYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlRmFjYWRlLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2VuYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUZhY2FkZS5rdApAQCAtMjMsMTAgKzIzLDEzIEBACiBpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5wbGF0Zm9ybS5Db21wb3NlVmlldwogaW1wb3J0IGFuZHJvaWR4LmxpZmVjeWNsZS5MaWZlY3ljbGVPd25lcgogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2UudGhlbWUuUGxhdGZvcm1UaGVtZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkuY29tcG9zYWJsZS5NdWx0aVNoYWRlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwuTXVsdGlTaGFkZVZpZXdNb2RlbAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBlb3BsZS51aS5jb21wb3NlLlBlb3BsZVNjcmVlbgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBlb3BsZS51aS52aWV3bW9kZWwuUGVvcGxlVmlld01vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuZm9vdGVyLnVpLmNvbXBvc2UuRm9vdGVyQWN0aW9ucwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmZvb3Rlci51aS52aWV3bW9kZWwuRm9vdGVyQWN0aW9uc1ZpZXdNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5TeXN0ZW1DbG9jawogCiAvKiogVGhlIENvbXBvc2UgZmFjYWRlLCB3aGVuIENvbXBvc2UgaXMgYXZhaWxhYmxlLiAqLwogb2JqZWN0IENvbXBvc2VGYWNhZGUgOiBCYXNlQ29tcG9zZUZhY2FkZSB7CkBAIC01MSw0ICs1NCwyMSBAQAogICAgICAgICAgICAgc2V0Q29udGVudCB7IFBsYXRmb3JtVGhlbWUgeyBGb290ZXJBY3Rpb25zKHZpZXdNb2RlbCwgcXNWaXNpYmlsaXR5TGlmZWN5Y2xlT3duZXIpIH0gfQogICAgICAgICB9CiAgICAgfQorCisgICAgb3ZlcnJpZGUgZnVuIGNyZWF0ZU11bHRpU2hhZGVWaWV3KAorICAgICAgICBjb250ZXh0OiBDb250ZXh0LAorICAgICAgICB2aWV3TW9kZWw6IE11bHRpU2hhZGVWaWV3TW9kZWwsCisgICAgICAgIGNsb2NrOiBTeXN0ZW1DbG9jaywKKyAgICApOiBWaWV3IHsKKyAgICAgICAgcmV0dXJuIENvbXBvc2VWaWV3KGNvbnRleHQpLmFwcGx5IHsKKyAgICAgICAgICAgIHNldENvbnRlbnQgeworICAgICAgICAgICAgICAgIFBsYXRmb3JtVGhlbWUgeworICAgICAgICAgICAgICAgICAgICBNdWx0aVNoYWRlKAorICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsID0gdmlld01vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgPSBjbG9jaywKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2VuYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUluaXRpYWxpemVySW1wbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2VuYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUluaXRpYWxpemVySW1wbC5rdAppbmRleCA3NzJjODkxLi5mYmQ3ZjgzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VJbml0aWFsaXplckltcGwua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZW5hYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlSW5pdGlhbGl6ZXJJbXBsLmt0CkBAIC00OSwxNCArNDksMTIgQEAKICAgICAgICAgLy8gaW5pdGlhbGl6ZXIgYXJlIGNyZWF0ZWQgb25jZSwgd2hlbiB0aGUgcHJvY2VzcyBpcyBzdGFydGVkLgogICAgICAgICB2YWwgc2F2ZWRTdGF0ZVJlZ2lzdHJ5T3duZXIgPQogICAgICAgICAgICAgb2JqZWN0IDogU2F2ZWRTdGF0ZVJlZ2lzdHJ5T3duZXIgewotICAgICAgICAgICAgICAgIHByaXZhdGUgdmFsIHNhdmVkU3RhdGVSZWdpc3RyeSA9CisgICAgICAgICAgICAgICAgcHJpdmF0ZSB2YWwgc2F2ZWRTdGF0ZVJlZ2lzdHJ5Q29udHJvbGxlciA9CiAgICAgICAgICAgICAgICAgICAgIFNhdmVkU3RhdGVSZWdpc3RyeUNvbnRyb2xsZXIuY3JlYXRlKHRoaXMpLmFwcGx5IHsgcGVyZm9ybVJlc3RvcmUobnVsbCkgfQogCi0gICAgICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIGdldExpZmVjeWNsZSgpOiBMaWZlY3ljbGUgPSBsaWZlY3ljbGVPd25lci5saWZlY3ljbGUKKyAgICAgICAgICAgICAgICBvdmVycmlkZSB2YWwgc2F2ZWRTdGF0ZVJlZ2lzdHJ5ID0gc2F2ZWRTdGF0ZVJlZ2lzdHJ5Q29udHJvbGxlci5zYXZlZFN0YXRlUmVnaXN0cnkKIAotICAgICAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBnZXRTYXZlZFN0YXRlUmVnaXN0cnkoKTogU2F2ZWRTdGF0ZVJlZ2lzdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkU3RhdGVSZWdpc3RyeS5zYXZlZFN0YXRlUmVnaXN0cnkKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIGdldExpZmVjeWNsZSgpOiBMaWZlY3ljbGUgPSBsaWZlY3ljbGVPd25lci5saWZlY3ljbGUKICAgICAgICAgICAgIH0KIAogICAgICAgICAvLyBXZSBtdXN0IGNhbGwgW1ZpZXdMaWZlY3ljbGVPd25lci5vbkNyZWF0ZV0gYWZ0ZXIgY3JlYXRpbmcgdGhlIFtTYXZlZFN0YXRlUmVnaXN0cnlPd25lcl0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9NdWx0aVNoYWRlLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS9jb21wb3NhYmxlL011bHRpU2hhZGUua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllMzhjZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9NdWx0aVNoYWRlLmt0CkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS5jb21wb3NhYmxlCisKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uYmFja2dyb3VuZAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5nZXN0dXJlcy5kZXRlY3RUYXBHZXN0dXJlcworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5nZXN0dXJlcy5kZXRlY3RWZXJ0aWNhbERyYWdHZXN0dXJlcworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuQm94CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5Cb3hXaXRoQ29uc3RyYWludHMKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LkNvbHVtbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuZmlsbE1heFNpemUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuQ29tcG9zYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5jb2xsZWN0QXNTdGF0ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5nZXRWYWx1ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5tdXRhYmxlU3RhdGVPZgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5yZW1lbWJlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zZXRWYWx1ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuQWxpZ25tZW50CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5Nb2RpZmllcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuZ3JhcGhpY3MuZ3JhcGhpY3NMYXllcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuaW5wdXQucG9pbnRlci5wb2ludGVySW5wdXQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmxheW91dC5vblNpemVDaGFuZ2VkCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5wbGF0Zm9ybS5Mb2NhbERlbnNpdHkKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnJlcy5jb2xvclJlc291cmNlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LkludFNpemUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbC5NdWx0aVNoYWRlVmlld01vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubm90aWZpY2F0aW9ucy51aS5jb21wb3NhYmxlLk5vdGlmaWNhdGlvbnMKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5mb290ZXIudWkuY29tcG9zZS5RdWlja1NldHRpbmdzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnVpLmNvbXBvc2FibGUuU3RhdHVzQmFyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLlN5c3RlbUNsb2NrCisKK0BDb21wb3NhYmxlCitmdW4gTXVsdGlTaGFkZSgKKyAgICB2aWV3TW9kZWw6IE11bHRpU2hhZGVWaWV3TW9kZWwsCisgICAgY2xvY2s6IFN5c3RlbUNsb2NrLAorICAgIG1vZGlmaWVyOiBNb2RpZmllciA9IE1vZGlmaWVyLAorKSB7CisgICAgdmFsIGlzU2NyaW1FbmFibGVkOiBCb29sZWFuIGJ5IHZpZXdNb2RlbC5pc1NjcmltRW5hYmxlZC5jb2xsZWN0QXNTdGF0ZSgpCisKKyAgICAvLyBUT0RPKGIvMjczMjk4MDMwKTogZmluZCBhIGRpZmZlcmVudCB3YXkgdG8gZ2V0IHRoZSBoZWlnaHQgY29uc3RyYWludCBmcm9tIGl0cyBwYXJlbnQuCisgICAgQm94V2l0aENvbnN0cmFpbnRzKG1vZGlmaWVyID0gbW9kaWZpZXIpIHsKKyAgICAgICAgdmFsIG1heEhlaWdodFB4ID0gd2l0aChMb2NhbERlbnNpdHkuY3VycmVudCkgeyBtYXhIZWlnaHQudG9QeCgpIH0KKworICAgICAgICBTY3JpbSgKKyAgICAgICAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXIuZmlsbE1heFNpemUoKSwKKyAgICAgICAgICAgIHJlbW90ZVRvdWNoID0gdmlld01vZGVsOjpvblNjcmltVG91Y2hlZCwKKyAgICAgICAgICAgIGFscGhhID0geyB2aWV3TW9kZWwuc2NyaW1BbHBoYS52YWx1ZSB9LAorICAgICAgICAgICAgaXNTY3JpbUVuYWJsZWQgPSBpc1NjcmltRW5hYmxlZCwKKyAgICAgICAgKQorICAgICAgICBTaGFkZSgKKyAgICAgICAgICAgIHZpZXdNb2RlbCA9IHZpZXdNb2RlbC5sZWZ0U2hhZGUsCisgICAgICAgICAgICBjdXJyZW50VGltZU1pbGxpcyA9IGNsb2NrOjplbGFwc2VkUmVhbHRpbWUsCisgICAgICAgICAgICBjb250YWluZXJIZWlnaHRQeCA9IG1heEhlaWdodFB4LAorICAgICAgICAgICAgbW9kaWZpZXIgPSBNb2RpZmllci5hbGlnbihBbGlnbm1lbnQuVG9wU3RhcnQpLAorICAgICAgICApIHsKKyAgICAgICAgICAgIENvbHVtbiB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyKCkKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTaGFkZSgKKyAgICAgICAgICAgIHZpZXdNb2RlbCA9IHZpZXdNb2RlbC5yaWdodFNoYWRlLAorICAgICAgICAgICAgY3VycmVudFRpbWVNaWxsaXMgPSBjbG9jazo6ZWxhcHNlZFJlYWx0aW1lLAorICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0UHggPSBtYXhIZWlnaHRQeCwKKyAgICAgICAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LlRvcEVuZCksCisgICAgICAgICkgeworICAgICAgICAgICAgQ29sdW1uIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXIoKQorICAgICAgICAgICAgICAgIFF1aWNrU2V0dGluZ3MoKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFNoYWRlKAorICAgICAgICAgICAgdmlld01vZGVsID0gdmlld01vZGVsLnNpbmdsZVNoYWRlLAorICAgICAgICAgICAgY3VycmVudFRpbWVNaWxsaXMgPSBjbG9jazo6ZWxhcHNlZFJlYWx0aW1lLAorICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0UHggPSBtYXhIZWlnaHRQeCwKKyAgICAgICAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXIsCisgICAgICAgICkgeworICAgICAgICAgICAgQ29sdW1uIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXIoKQorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMoKQorICAgICAgICAgICAgICAgIFF1aWNrU2V0dGluZ3MoKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitAQ29tcG9zYWJsZQorcHJpdmF0ZSBmdW4gU2NyaW0oCisgICAgcmVtb3RlVG91Y2g6IChQcm94aWVkSW5wdXRNb2RlbCkgLT4gVW5pdCwKKyAgICBhbHBoYTogKCkgLT4gRmxvYXQsCisgICAgaXNTY3JpbUVuYWJsZWQ6IEJvb2xlYW4sCisgICAgbW9kaWZpZXI6IE1vZGlmaWVyID0gTW9kaWZpZXIsCispIHsKKyAgICB2YXIgc2l6ZSBieSByZW1lbWJlciB7IG11dGFibGVTdGF0ZU9mKEludFNpemUuWmVybykgfQorCisgICAgQm94KAorICAgICAgICBtb2RpZmllciA9CisgICAgICAgICAgICBtb2RpZmllcgorICAgICAgICAgICAgICAgIC5ncmFwaGljc0xheWVyIHsgdGhpcy5hbHBoYSA9IGFscGhhKCkgfQorICAgICAgICAgICAgICAgIC5iYWNrZ3JvdW5kKGNvbG9yUmVzb3VyY2UoUi5jb2xvci5vcGFxdWVfc2NyaW0pKQorICAgICAgICAgICAgICAgIC5maWxsTWF4U2l6ZSgpCisgICAgICAgICAgICAgICAgLm9uU2l6ZUNoYW5nZWQgeyBzaXplID0gaXQgfQorICAgICAgICAgICAgICAgIC50aGVuKAorICAgICAgICAgICAgICAgICAgICBpZiAoaXNTY3JpbUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyLnBvaW50ZXJJbnB1dChVbml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdFRhcEdlc3R1cmVzKG9uVGFwID0geyByZW1vdGVUb3VjaChQcm94aWVkSW5wdXRNb2RlbC5PblRhcCkgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvaW50ZXJJbnB1dChVbml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdFZlcnRpY2FsRHJhZ0dlc3R1cmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WZXJ0aWNhbERyYWcgPSB7IGNoYW5nZSwgZHJhZ0Ftb3VudCAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVRvdWNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RnJhY3Rpb24gPSBjaGFuZ2UucG9zaXRpb24ueCAvIHNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5RHJhZ0Ftb3VudFB4ID0gZHJhZ0Ftb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRyYWdFbmQgPSB7IHJlbW90ZVRvdWNoKFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRHJhZ0NhbmNlbCA9IHsgcmVtb3RlVG91Y2goUHJveGllZElucHV0TW9kZWwuT25EcmFnQ2FuY2VsKSB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKQorICAgICkKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9TaGFkZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9TaGFkZS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGVmNTdmOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9TaGFkZS5rdApAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkuY29tcG9zYWJsZQorCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmdlc3R1cmVzLk9yaWVudGF0aW9uCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmludGVyYWN0aW9uLkRyYWdJbnRlcmFjdGlvbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvblNvdXJjZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5pbnRlcmFjdGlvbi5NdXRhYmxlSW50ZXJhY3Rpb25Tb3VyY2UKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmZpbGxNYXhXaWR0aAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQucGFkZGluZworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQud2lkdGgKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uc2hhcGUuUm91bmRlZENvcm5lclNoYXBlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5tYXRlcmlhbDMuU3VyZmFjZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5Db21wb3NhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkxhdW5jaGVkRWZmZWN0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLmNvbGxlY3RBc1N0YXRlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLmdldFZhbHVlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLnJlbWVtYmVyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLnNuYXBzaG90RmxvdworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuTW9kaWZpZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmdlb21ldHJ5Lk9mZnNldAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuZ3JhcGhpY3MuZ3JhcGhpY3NMYXllcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuaW5wdXQucG9pbnRlci51dGlsLlZlbG9jaXR5VHJhY2tlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uTG9jYWxEZW5zaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LkRlbnNpdHkKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnVuaXQuRHAKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnVuaXQuZHAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLm1vZGlmaWVycy5oZWlnaHQKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZS5GaXhlZFRocmVzaG9sZAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlN3aXBlYWJsZVN0YXRlCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5zd2lwZWFibGUuVGhyZXNob2xkQ29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5zd2lwZWFibGUucmVtZW1iZXJTd2lwZWFibGVTdGF0ZQoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLnN3aXBlYWJsZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwuU2hhZGVWaWV3TW9kZWwKK2ltcG9ydCBrb3RsaW4ubWF0aC5yb3VuZFRvSW50CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmxhdW5jaAorCisvKioKKyAqIFJlbmRlcnMgYSBzaGFkZSAoY29udGFpbmVyIGFuZCBjb250ZW50KS4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGdyb3cgdG8gZmlsbCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBpdHMgY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSB2aWV3TW9kZWwgVGhlIHZpZXctbW9kZWwgZm9yIHRoaXMgc2hhZGUuCisgKiBAcGFyYW0gY3VycmVudFRpbWVNaWxsaXMgQSBwcm92aWRlciBmb3IgdGhlIGN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICogQHBhcmFtIGNvbnRhaW5lckhlaWdodFB4IFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHRoaXMgc2hhZGUgaXMgYmVpbmcgc2hvd24gaW4sIGluCisgKiAgIHBpeGVscy4KKyAqIEBwYXJhbSBtb2RpZmllciBUaGUgTW9kaWZpZXIuCisgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCBvZiB0aGUgc2hhZGUuCisgKi8KK0BDb21wb3NhYmxlCitmdW4gU2hhZGUoCisgICAgdmlld01vZGVsOiBTaGFkZVZpZXdNb2RlbCwKKyAgICBjdXJyZW50VGltZU1pbGxpczogKCkgLT4gTG9uZywKKyAgICBjb250YWluZXJIZWlnaHRQeDogRmxvYXQsCisgICAgbW9kaWZpZXI6IE1vZGlmaWVyID0gTW9kaWZpZXIsCisgICAgY29udGVudDogQENvbXBvc2FibGUgKCkgLT4gVW5pdCA9IHt9LAorKSB7CisgICAgdmFsIGlzVmlzaWJsZTogQm9vbGVhbiBieSB2aWV3TW9kZWwuaXNWaXNpYmxlLmNvbGxlY3RBc1N0YXRlKCkKKyAgICBpZiAoIWlzVmlzaWJsZSkgeworICAgICAgICByZXR1cm4KKyAgICB9CisKKyAgICB2YWwgaW50ZXJhY3Rpb25Tb3VyY2U6IE11dGFibGVJbnRlcmFjdGlvblNvdXJjZSA9IHJlbWVtYmVyIHsgTXV0YWJsZUludGVyYWN0aW9uU291cmNlKCkgfQorICAgIFJlcG9ydE5vblByb3hpZWRJbnB1dCh2aWV3TW9kZWwsIGludGVyYWN0aW9uU291cmNlKQorCisgICAgdmFsIHN3aXBlYWJsZVN0YXRlID0gcmVtZW1iZXJTd2lwZWFibGVTdGF0ZShpbml0aWFsVmFsdWUgPSBTaGFkZVN0YXRlLkZ1bGx5Q29sbGFwc2VkKQorICAgIEhhbmRsZUZvcmNlZENvbGxhcHNlKHZpZXdNb2RlbCwgc3dpcGVhYmxlU3RhdGUpCisgICAgSGFuZGxlUHJveGllZElucHV0KHZpZXdNb2RlbCwgc3dpcGVhYmxlU3RhdGUsIGN1cnJlbnRUaW1lTWlsbGlzKQorICAgIFJlcG9ydFNoYWRlRXhwYW5zaW9uKHZpZXdNb2RlbCwgc3dpcGVhYmxlU3RhdGUsIGNvbnRhaW5lckhlaWdodFB4KQorCisgICAgdmFsIGlzU3dpcGluZ0VuYWJsZWQ6IEJvb2xlYW4gYnkgdmlld01vZGVsLmlzU3dpcGluZ0VuYWJsZWQuY29sbGVjdEFzU3RhdGUoKQorICAgIHZhbCBjb2xsYXBzZVRocmVzaG9sZDogRmxvYXQgYnkgdmlld01vZGVsLnN3aXBlQ29sbGFwc2VUaHJlc2hvbGQuY29sbGVjdEFzU3RhdGUoKQorICAgIHZhbCBleHBhbmRUaHJlc2hvbGQ6IEZsb2F0IGJ5IHZpZXdNb2RlbC5zd2lwZUV4cGFuZFRocmVzaG9sZC5jb2xsZWN0QXNTdGF0ZSgpCisKKyAgICB2YWwgd2lkdGg6IFNoYWRlVmlld01vZGVsLlNpemUgYnkgdmlld01vZGVsLndpZHRoLmNvbGxlY3RBc1N0YXRlKCkKKyAgICB2YWwgZGVuc2l0eSA9IExvY2FsRGVuc2l0eS5jdXJyZW50CisKKyAgICB2YWwgYW5jaG9yczogTWFwPEZsb2F0LCBTaGFkZVN0YXRlPiA9CisgICAgICAgIHJlbWVtYmVyKGNvbnRhaW5lckhlaWdodFB4KSB7IHN3aXBlYWJsZUFuY2hvcnMoY29udGFpbmVySGVpZ2h0UHgpIH0KKworICAgIFNoYWRlQ29udGVudCgKKyAgICAgICAgc2hhZGVIZWlnaHRQeCA9IHsgc3dpcGVhYmxlU3RhdGUub2Zmc2V0LnZhbHVlIH0sCisgICAgICAgIG92ZXJzdHJldGNoID0geyBzd2lwZWFibGVTdGF0ZS5vdmVyZmxvdy52YWx1ZSAvIGNvbnRhaW5lckhlaWdodFB4IH0sCisgICAgICAgIGlzU3dpcGluZ0VuYWJsZWQgPSBpc1N3aXBpbmdFbmFibGVkLAorICAgICAgICBzd2lwZWFibGVTdGF0ZSA9IHN3aXBlYWJsZVN0YXRlLAorICAgICAgICBpbnRlcmFjdGlvblNvdXJjZSA9IGludGVyYWN0aW9uU291cmNlLAorICAgICAgICBhbmNob3JzID0gYW5jaG9ycywKKyAgICAgICAgdGhyZXNob2xkcyA9IHsgXywgdG8gLT4KKyAgICAgICAgICAgIHN3aXBlYWJsZVRocmVzaG9sZHMoCisgICAgICAgICAgICAgICAgdG8gPSB0bywKKyAgICAgICAgICAgICAgICBzd2lwZUNvbGxhcHNlVGhyZXNob2xkID0gY29sbGFwc2VUaHJlc2hvbGQuZnJhY3Rpb25Ub0RwKGRlbnNpdHksIGNvbnRhaW5lckhlaWdodFB4KSwKKyAgICAgICAgICAgICAgICBzd2lwZUV4cGFuZFRocmVzaG9sZCA9IGV4cGFuZFRocmVzaG9sZC5mcmFjdGlvblRvRHAoZGVuc2l0eSwgY29udGFpbmVySGVpZ2h0UHgpLAorICAgICAgICAgICAgKQorICAgICAgICB9LAorICAgICAgICBtb2RpZmllciA9IG1vZGlmaWVyLnNoYWRlV2lkdGgod2lkdGgsIGRlbnNpdHkpLAorICAgICAgICBjb250ZW50ID0gY29udGVudCwKKyAgICApCit9CisKKy8qKgorICogRHJhd3MgdGhlIGNvbnRlbnQgb2YgdGhlIHNoYWRlLgorICoKKyAqIEBwYXJhbSBzaGFkZUhlaWdodFB4IFByb3ZpZGVyIGZvciB0aGUgY3VycmVudCBleHBhbnNpb24gb2YgdGhlIHNoYWRlLCBpbiBwaXhlbHMsIHdoZXJlIGAwYCBpcworICogICBmdWxseSBjb2xsYXBzZWQuCisgKiBAcGFyYW0gb3ZlcnN0cmV0Y2ggUHJvdmlkZXIgZm9yIHRoZSBjdXJyZW50IGFtb3VudCBvZiB2ZXJ0aWNhbCAib3ZlcnN0cmV0Y2giIHRoYXQgdGhlIHNoYWRlCisgKiAgIHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLiBUaGlzIGlzIGAwYCBvciBhIHBvc2l0aXZlIG51bWJlciB0aGF0IGlzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwKKyAqICAgaGVpZ2h0IG9mIHRoZSBzaGFkZSB3aGVuIGZ1bGx5IGV4cGFuZGVkLiBBIHZhbHVlIG9mIGAwYCBtZWFucyB0aGF0IHRoZSBzaGFkZSBpcyBub3Qgc3RyZXRjaGVkCisgKiAgIGF0IGFsbC4KKyAqIEBwYXJhbSBpc1N3aXBpbmdFbmFibGVkIFdoZXRoZXIgc3dpcGluZyBpbnNpZGUgdGhlIHNoYWRlIGlzIGVuYWJsZWQgb3Igbm90LgorICogQHBhcmFtIHN3aXBlYWJsZVN0YXRlIFRoZSBzdGF0ZSB0byB1c2UgZm9yIHRoZSBbc3dpcGVhYmxlXSBtb2RpZmllciwgYWxsb3dpbmcgZXh0ZXJuYWwgY29udHJvbCBpbgorICogICBhZGRpdGlvbiB0byBkaXJlY3QgY29udHJvbCAocHJveGllZCB1c2VyIGlucHV0IGluIGFkZGl0aW9uIHRvIG5vbi1wcm94aWVkL2RpcmVjdCB1c2VyIGlucHV0KS4KKyAqIEBwYXJhbSBhbmNob3JzIEEgbWFwIG9mIFtTaGFkZVN0YXRlXSBrZXllZCBieSB0aGUgdmVydGljYWwgcG9zaXRpb24sIGluIHBpeGVscywgd2hlcmUgdGhhdCBzdGF0ZQorICogICBvY2N1cnM7IHRoaXMgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIFtzd2lwZWFibGVdIG1vZGlmaWVyLgorICogQHBhcmFtIHRocmVzaG9sZHMgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBbVGhyZXNob2xkQ29uZmlnXSBmb3IgZ29pbmcgZnJvbSBvbmUgW1NoYWRlU3RhdGVdIHRvCisgKiAgIGFub3RoZXIuIFRoaXMgY29udHJvbHMgaG93IHRoZSBbc3dpcGVhYmxlXSBkZWNpZGVzIHdoaWNoIFtTaGFkZVN0YXRlXSB0byBhbmltYXRlIHRvIG9uY2UgdGhlCisgKiAgIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGU7IGUuZy4gZG9lcyBpdCBhbmltYXRlIHRvIGZ1bGx5IGNvbGxhcHNlZCBvciBmdWxseSBleHBhbmRlZC4KKyAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHJlbmRlciBpbnNpZGUgdGhlIHNoYWRlLgorICogQHBhcmFtIG1vZGlmaWVyIFRoZSBbTW9kaWZpZXJdLgorICovCitAQ29tcG9zYWJsZQorcHJpdmF0ZSBmdW4gU2hhZGVDb250ZW50KAorICAgIHNoYWRlSGVpZ2h0UHg6ICgpIC0+IEZsb2F0LAorICAgIG92ZXJzdHJldGNoOiAoKSAtPiBGbG9hdCwKKyAgICBpc1N3aXBpbmdFbmFibGVkOiBCb29sZWFuLAorICAgIHN3aXBlYWJsZVN0YXRlOiBTd2lwZWFibGVTdGF0ZTxTaGFkZVN0YXRlPiwKKyAgICBpbnRlcmFjdGlvblNvdXJjZTogTXV0YWJsZUludGVyYWN0aW9uU291cmNlLAorICAgIGFuY2hvcnM6IE1hcDxGbG9hdCwgU2hhZGVTdGF0ZT4sCisgICAgdGhyZXNob2xkczogKGZyb206IFNoYWRlU3RhdGUsIHRvOiBTaGFkZVN0YXRlKSAtPiBUaHJlc2hvbGRDb25maWcsCisgICAgbW9kaWZpZXI6IE1vZGlmaWVyID0gTW9kaWZpZXIsCisgICAgY29udGVudDogQENvbXBvc2FibGUgKCkgLT4gVW5pdCA9IHt9LAorKSB7CisgICAgU3VyZmFjZSgKKyAgICAgICAgc2hhcGUgPSBSb3VuZGVkQ29ybmVyU2hhcGUoMzIuZHApLAorICAgICAgICBtb2RpZmllciA9CisgICAgICAgICAgICBtb2RpZmllcgorICAgICAgICAgICAgICAgIC5wYWRkaW5nKDEyLmRwKQorICAgICAgICAgICAgICAgIC5maWxsTWF4V2lkdGgoKQorICAgICAgICAgICAgICAgIC5oZWlnaHQgeyBzaGFkZUhlaWdodFB4KCkucm91bmRUb0ludCgpIH0KKyAgICAgICAgICAgICAgICAuZ3JhcGhpY3NMYXllciB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpZXMgdGhlIHZlcnRpY2FsIG92ZXItc3RyZXRjaGluZyBvZiB0aGUgc2hhZGUgY29udGVudCB0aGF0IG1heSBoYXBwZW4gaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIga2VlcCBkcmFnZ2luZyBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGFscmVhZHkgZnVsbHktZXhwYW5kZWQuCisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbiA9IHRyYW5zZm9ybU9yaWdpbi5jb3B5KHBpdm90RnJhY3Rpb25ZID0gMGYpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gMSArIG92ZXJzdHJldGNoKCkuY29lcmNlQXRMZWFzdCgwZikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLnN3aXBlYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGlzU3dpcGluZ0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dpcGVhYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uU291cmNlID0gaW50ZXJhY3Rpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGFuY2hvcnMgPSBhbmNob3JzLAorICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzID0gdGhyZXNob2xkcywKKyAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBPcmllbnRhdGlvbi5WZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICBjb250ZW50ID0gY29udGVudCwKKyAgICApCit9CisKKy8qKiBGdW5uZWxzIGN1cnJlbnQgc2hhZGUgZXhwYW5zaW9uIHZhbHVlcyBpbnRvIHRoZSB2aWV3LW1vZGVsLiAqLworQENvbXBvc2FibGUKK3ByaXZhdGUgZnVuIFJlcG9ydFNoYWRlRXhwYW5zaW9uKAorICAgIHZpZXdNb2RlbDogU2hhZGVWaWV3TW9kZWwsCisgICAgc3dpcGVhYmxlU3RhdGU6IFN3aXBlYWJsZVN0YXRlPFNoYWRlU3RhdGU+LAorICAgIGNvbnRhaW5lckhlaWdodFB4OiBGbG9hdCwKKykgeworICAgIExhdW5jaGVkRWZmZWN0KHN3aXBlYWJsZVN0YXRlLm9mZnNldCwgY29udGFpbmVySGVpZ2h0UHgpIHsKKyAgICAgICAgc25hcHNob3RGbG93IHsgc3dpcGVhYmxlU3RhdGUub2Zmc2V0LnZhbHVlIC8gY29udGFpbmVySGVpZ2h0UHggfQorICAgICAgICAgICAgLmNvbGxlY3QgeyBleHBhbnNpb24gLT4gdmlld01vZGVsLm9uRXhwYW5zaW9uQ2hhbmdlZChleHBhbnNpb24pIH0KKyAgICB9Cit9CisKKy8qKiBGdW5uZWxzIGRyYWcgZ2VzdHVyZSBzdGFydCBhbmQgZW5kIGV2ZW50cyBpbnRvIHRoZSB2aWV3LW1vZGVsLiAqLworQENvbXBvc2FibGUKK3ByaXZhdGUgZnVuIFJlcG9ydE5vblByb3hpZWRJbnB1dCgKKyAgICB2aWV3TW9kZWw6IFNoYWRlVmlld01vZGVsLAorICAgIGludGVyYWN0aW9uU291cmNlOiBJbnRlcmFjdGlvblNvdXJjZSwKKykgeworICAgIExhdW5jaGVkRWZmZWN0KGludGVyYWN0aW9uU291cmNlKSB7CisgICAgICAgIGludGVyYWN0aW9uU291cmNlLmludGVyYWN0aW9ucy5jb2xsZWN0IHsKKyAgICAgICAgICAgIHdoZW4gKGl0KSB7CisgICAgICAgICAgICAgICAgaXMgRHJhZ0ludGVyYWN0aW9uLlN0YXJ0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsLm9uRHJhZ1N0YXJ0ZWQoKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcyBEcmFnSW50ZXJhY3Rpb24uU3RvcCAtPiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbC5vbkRyYWdFbmRlZCgpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiogV2hlbiB0b2xkIHRvIGZvcmNlIGNvbGxhcHNlLCBjb2xsYXBzZXMgdGhlIHNoYWRlLiAqLworQENvbXBvc2FibGUKK3ByaXZhdGUgZnVuIEhhbmRsZUZvcmNlZENvbGxhcHNlKAorICAgIHZpZXdNb2RlbDogU2hhZGVWaWV3TW9kZWwsCisgICAgc3dpcGVhYmxlU3RhdGU6IFN3aXBlYWJsZVN0YXRlPFNoYWRlU3RhdGU+LAorKSB7CisgICAgTGF1bmNoZWRFZmZlY3Qodmlld01vZGVsKSB7CisgICAgICAgIHZpZXdNb2RlbC5pc0ZvcmNlQ29sbGFwc2VkLmNvbGxlY3QgeworICAgICAgICAgICAgbGF1bmNoIHsgc3dpcGVhYmxlU3RhdGUuYW5pbWF0ZVRvKFNoYWRlU3RhdGUuRnVsbHlDb2xsYXBzZWQpIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBIYW5kbGVzIHByb3hpZWQgaW5wdXQgKGlucHV0IG9yaWdpbmF0aW5nIG91dHNpZGUgb2YgdGhlIFVJIG9mIHRoZSBzaGFkZSkgYnkgZHJpdmluZyB0aGUKKyAqIFtTd2lwZWFibGVTdGF0ZV0gYWNjb3JkaW5nbHkuCisgKi8KK0BDb21wb3NhYmxlCitwcml2YXRlIGZ1biBIYW5kbGVQcm94aWVkSW5wdXQoCisgICAgdmlld01vZGVsOiBTaGFkZVZpZXdNb2RlbCwKKyAgICBzd2lwZWFibGVTdGF0ZTogU3dpcGVhYmxlU3RhdGU8U2hhZGVTdGF0ZT4sCisgICAgY3VycmVudFRpbWVNaWxsaXM6ICgpIC0+IExvbmcsCispIHsKKyAgICB2YWwgdmVsb2NpdHlUcmFja2VyOiBWZWxvY2l0eVRyYWNrZXIgPSByZW1lbWJlciB7IFZlbG9jaXR5VHJhY2tlcigpIH0KKyAgICBMYXVuY2hlZEVmZmVjdCh2aWV3TW9kZWwpIHsKKyAgICAgICAgdmlld01vZGVsLnByb3hpZWRJbnB1dC5jb2xsZWN0IHsKKyAgICAgICAgICAgIHdoZW4gKGl0KSB7CisgICAgICAgICAgICAgICAgaXMgUHJveGllZElucHV0TW9kZWwuT25EcmFnIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmFkZFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1pbGxpcyA9IGN1cnJlbnRUaW1lTWlsbGlzLmludm9rZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBPZmZzZXQoMGYsIGl0LnlEcmFnQW1vdW50UHgpLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIHN3aXBlYWJsZVN0YXRlLnBlcmZvcm1EcmFnKGl0LnlEcmFnQW1vdW50UHgpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCAtPiB7CisgICAgICAgICAgICAgICAgICAgIGxhdW5jaCB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgdmVsb2NpdHkgPSB2ZWxvY2l0eVRyYWNrZXIuY2FsY3VsYXRlVmVsb2NpdHkoKS55CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIucmVzZXRUcmFja2luZygpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgYSBWZWxvY2l0eVRyYWNrZXIgdG8ga2VlcCBhIHJlY29yZCBvZiBob3cgZmFzdCB0aGUgcG9pbnRlciB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmluZyBzdWNoIHRoYXQgd2Uga25vdyBob3cgZmFyIHRvIGZsaW5nIHRoZSBzaGFkZSB3aGVuIHRoZSBnZXN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRzLiBGbGluZ2luZyB0aGUgU3dpcGVhYmxlU3RhdGUgdXNpbmcgcGVyZm9ybUZsaW5nIGlzIHJlcXVpcmVkIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgb3IgbW9yZSBjYWxscyB0byBwZXJmb3JtRHJhZyBzdWNoIHRoYXQgdGhlIHN3aXBlYWJsZSBzZXR0bGVzIGludG8gb25lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3RhdGVzLiBXaXRob3V0IGRvaW5nIHRoYXQsIHRoZSBzaGFkZSB3b3VsZCByZW1haW4gdW5tb3ZpbmcgaW4gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluLWJldHdlZW4gc3RhdGUgb24gdGhlIHNjcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXBlYWJsZVN0YXRlLnBlcmZvcm1GbGluZyh2ZWxvY2l0eSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcyBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdDYW5jZWwgLT4geworICAgICAgICAgICAgICAgICAgICBsYXVuY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLnJlc2V0VHJhY2tpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVhYmxlU3RhdGUuYW5pbWF0ZVRvKHN3aXBlYWJsZVN0YXRlLnByb2dyZXNzLmZyb20pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAtPiBVbml0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIFtGbG9hdF0gKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgYSBmcmFjdGlvbiBiZXR3ZWVuIGAwYCBhbmQgYDFgKSB0byBhIHZhbHVlIGluIGRwLgorICoKKyAqIEBwYXJhbSBkZW5zaXR5IFRoZSBbRGVuc2l0eV0gb2YgdGhlIGRpc3BsYXkuCisgKiBAcGFyYW0gd2hvbGVQeCBUaGUgd2hvbGUgYW1vdW50IHRoYXQgdGhlIGdpdmVuIFtGbG9hdF0gaXMgYSBmcmFjdGlvbiBvZi4KKyAqIEByZXR1cm4gVGhlIGRwIHNpemUgdGhhdCdzIGEgZnJhY3Rpb24gb2YgdGhlIHdob2xlIGFtb3VudC4KKyAqLworcHJpdmF0ZSBmdW4gRmxvYXQuZnJhY3Rpb25Ub0RwKGRlbnNpdHk6IERlbnNpdHksIHdob2xlUHg6IEZsb2F0KTogRHAgeworICAgIHJldHVybiB3aXRoKGRlbnNpdHkpIHsgKHRoaXNAZnJhY3Rpb25Ub0RwICogd2hvbGVQeCkudG9EcCgpIH0KK30KKworcHJpdmF0ZSBmdW4gTW9kaWZpZXIuc2hhZGVXaWR0aCgKKyAgICBzaXplOiBTaGFkZVZpZXdNb2RlbC5TaXplLAorICAgIGRlbnNpdHk6IERlbnNpdHksCispOiBNb2RpZmllciB7CisgICAgcmV0dXJuIHRoZW4oCisgICAgICAgIHdoZW4gKHNpemUpIHsKKyAgICAgICAgICAgIGlzIFNoYWRlVmlld01vZGVsLlNpemUuRnJhY3Rpb24gLT4gTW9kaWZpZXIuZmlsbE1heFdpZHRoKHNpemUuZnJhY3Rpb24pCisgICAgICAgICAgICBpcyBTaGFkZVZpZXdNb2RlbC5TaXplLlBpeGVscyAtPiBNb2RpZmllci53aWR0aCh3aXRoKGRlbnNpdHkpIHsgc2l6ZS5waXhlbHMudG9EcCgpIH0pCisgICAgICAgIH0KKyAgICApCit9CisKKy8qKiBSZXR1cm5zIHRoZSBwaXhlbCBwb3NpdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHN1cHBvcnRlZCBzaGFkZSBzdGF0ZXMuICovCitwcml2YXRlIGZ1biBzd2lwZWFibGVBbmNob3JzKGNvbnRhaW5lckhlaWdodFB4OiBGbG9hdCk6IE1hcDxGbG9hdCwgU2hhZGVTdGF0ZT4geworICAgIHJldHVybiBtYXBPZigKKyAgICAgICAgMGYgdG8gU2hhZGVTdGF0ZS5GdWxseUNvbGxhcHNlZCwKKyAgICAgICAgY29udGFpbmVySGVpZ2h0UHggdG8gU2hhZGVTdGF0ZS5GdWxseUV4cGFuZGVkLAorICAgICkKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBbVGhyZXNob2xkQ29uZmlnXSBmb3IgaG93IGZhciB0aGUgc2hhZGUgc2hvdWxkIGJlIGV4cGFuZGVkIG9yIGNvbGxhcHNlZCBzdWNoIHRoYXQgaXQKKyAqIGFjdHVhbGx5IGNvbXBsZXRlcyB0aGUgZXhwYW5zaW9uIG9yIGNvbGxhcHNlIGFmdGVyIHRoZSB1c2VyIGxpZnRzIHRoZWlyIHBvaW50ZXIuCisgKi8KK3ByaXZhdGUgZnVuIHN3aXBlYWJsZVRocmVzaG9sZHMoCisgICAgdG86IFNoYWRlU3RhdGUsCisgICAgc3dpcGVFeHBhbmRUaHJlc2hvbGQ6IERwLAorICAgIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQ6IERwLAorKTogVGhyZXNob2xkQ29uZmlnIHsKKyAgICByZXR1cm4gRml4ZWRUaHJlc2hvbGQoCisgICAgICAgIHdoZW4gKHRvKSB7CisgICAgICAgICAgICBTaGFkZVN0YXRlLkZ1bGx5RXhwYW5kZWQgLT4gc3dpcGVFeHBhbmRUaHJlc2hvbGQKKyAgICAgICAgICAgIFNoYWRlU3RhdGUuRnVsbHlDb2xsYXBzZWQgLT4gc3dpcGVDb2xsYXBzZVRocmVzaG9sZAorICAgICAgICB9CisgICAgKQorfQorCisvKiogRW51bWVyYXRlcyB0aGUgc2hhZGUgVUkgc3RhdGVzIGZvciBbU3dpcGVhYmxlU3RhdGVdLiAqLworcHJpdmF0ZSBlbnVtIGNsYXNzIFNoYWRlU3RhdGUgeworICAgIEZ1bGx5Q29sbGFwc2VkLAorICAgIEZ1bGx5RXhwYW5kZWQsCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RpZmljYXRpb25zL3VpL2NvbXBvc2FibGUvTm90aWZpY2F0aW9ucy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGlmaWNhdGlvbnMvdWkvY29tcG9zYWJsZS9Ob3RpZmljYXRpb25zLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTFiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RpZmljYXRpb25zL3VpL2NvbXBvc2FibGUvTm90aWZpY2F0aW9ucy5rdApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubm90aWZpY2F0aW9ucy51aS5jb21wb3NhYmxlCisKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LkNvbHVtbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuU3BhY2VyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5kZWZhdWx0TWluU2l6ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuZmlsbE1heFdpZHRoCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5wYWRkaW5nCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5tYXRlcmlhbDMuVGV4dAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5Db21wb3NhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5BbGlnbm1lbnQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLk1vZGlmaWVyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LmRwCisKK0BDb21wb3NhYmxlCitmdW4gTm90aWZpY2F0aW9ucygKKyAgICBtb2RpZmllcjogTW9kaWZpZXIgPSBNb2RpZmllciwKKykgeworICAgIC8vIFRPRE8oYi8yNzI3Nzk4MjgpOiBpbXBsZW1lbnQuCisgICAgQ29sdW1uKAorICAgICAgICBtb2RpZmllciA9IG1vZGlmaWVyLmZpbGxNYXhXaWR0aCgpLmRlZmF1bHRNaW5TaXplKG1pbkhlaWdodCA9IDMwMC5kcCkucGFkZGluZyg0LmRwKSwKKyAgICApIHsKKyAgICAgICAgVGV4dCgiTm90aWZpY2F0aW9ucyIsIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LkNlbnRlckhvcml6b250YWxseSkpCisgICAgICAgIFNwYWNlcihtb2RpZmllciA9IE1vZGlmaWVyLndlaWdodCgxZikpCisgICAgICAgIFRleHQoIlNoZWxmIiwgbW9kaWZpZXIgPSBNb2RpZmllci5hbGlnbihBbGlnbm1lbnQuQ2VudGVySG9yaXpvbnRhbGx5KSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9mb290ZXIvdWkvY29tcG9zZS9RdWlja1NldHRpbmdzLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZm9vdGVyL3VpL2NvbXBvc2UvUXVpY2tTZXR0aW5ncy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjVkNmRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZm9vdGVyL3VpL2NvbXBvc2UvUXVpY2tTZXR0aW5ncy5rdApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuZm9vdGVyLnVpLmNvbXBvc2UKKworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuQ29sdW1uCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5TcGFjZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmRlZmF1bHRNaW5TaXplCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5maWxsTWF4V2lkdGgKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LnBhZGRpbmcKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLm1hdGVyaWFsMy5UZXh0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkNvbXBvc2FibGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLkFsaWdubWVudAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuTW9kaWZpZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnVuaXQuZHAKKworQENvbXBvc2FibGUKK2Z1biBRdWlja1NldHRpbmdzKAorICAgIG1vZGlmaWVyOiBNb2RpZmllciA9IE1vZGlmaWVyLAorKSB7CisgICAgLy8gVE9ETyhiLzI3Mjc4MDA1OCk6IGltcGxlbWVudC4KKyAgICBDb2x1bW4oCisgICAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIuZmlsbE1heFdpZHRoKCkuZGVmYXVsdE1pblNpemUobWluSGVpZ2h0ID0gMzAwLmRwKS5wYWRkaW5nKDQuZHApLAorICAgICkgeworICAgICAgICBUZXh0KCJRdWljayBzZXR0aW5ncyIsIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LkNlbnRlckhvcml6b250YWxseSkpCisgICAgICAgIFNwYWNlcihtb2RpZmllciA9IE1vZGlmaWVyLndlaWdodCgxZikpCisgICAgICAgIFRleHQoIlFTIGZvb3RlciBhY3Rpb25zIiwgbW9kaWZpZXIgPSBNb2RpZmllci5hbGlnbihBbGlnbm1lbnQuQ2VudGVySG9yaXpvbnRhbGx5KSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdWkvY29tcG9zYWJsZS9TdGF0dXNCYXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdWkvY29tcG9zYWJsZS9TdGF0dXNCYXIua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxNGFiNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci91aS9jb21wb3NhYmxlL1N0YXR1c0Jhci5rdApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnVpLmNvbXBvc2FibGUKKworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuQXJyYW5nZW1lbnQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LlJvdworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuZGVmYXVsdE1pblNpemUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmZpbGxNYXhXaWR0aAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQucGFkZGluZworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UubWF0ZXJpYWwzLlRleHQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuQ29tcG9zYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuQWxpZ25tZW50CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5Nb2RpZmllcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5kcAorCitAQ29tcG9zYWJsZQorZnVuIFN0YXR1c0JhcigKKyAgICBtb2RpZmllcjogTW9kaWZpZXIgPSBNb2RpZmllciwKKykgeworICAgIC8vIFRPRE8oYi8yNzI3ODAxMDEpOiBpbXBsZW1lbnQuCisgICAgUm93KAorICAgICAgICBtb2RpZmllciA9IG1vZGlmaWVyLmZpbGxNYXhXaWR0aCgpLmRlZmF1bHRNaW5TaXplKG1pbkhlaWdodCA9IDQ4LmRwKS5wYWRkaW5nKDQuZHApLAorICAgICAgICBob3Jpem9udGFsQXJyYW5nZW1lbnQgPSBBcnJhbmdlbWVudC5DZW50ZXIsCisgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50ID0gQWxpZ25tZW50LkNlbnRlclZlcnRpY2FsbHksCisgICAgKSB7CisgICAgICAgIFRleHQoIlN0YXR1cyBiYXIiKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlci5qYXZhCmluZGV4IDcwYjVkNzMuLmI3MDg4ZDUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuamF2YQpAQCAtNTAsNiArNTAsMTMgQEAKICAgICBib29sZWFuIGlzUHVsc2luZygpOwogCiAgICAgLyoqCisgICAgICogSXMgZGV2aWNlIGRyZWFtaW5nLiBUaGlzIG1ldGhvZCBpcyBtb3JlIGluY2x1c2l2ZSB0aGFuCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmljZS5kcmVhbXMuSURyZWFtTWFuYWdlci5pc0RyZWFtaW5nfSwgYXMgaXQgd2lsbCByZXR1cm4gdHJ1ZSBkdXJpbmcgdGhlCisgICAgICogZHJlYW0ncyB3YWtlLXVwIHBoYXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNEcmVhbWluZygpOworCisgICAgLyoqCiAgICAgICogQWRkcyBhIHN0YXRlIGxpc3RlbmVyCiAgICAgICovCiAgICAgdm9pZCBhZGRDYWxsYmFjayhTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19pbXBvcnRhbnRfb3V0bGluZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfaW1wb3J0YW50X291dGxpbmUueG1sCmluZGV4IDdhNjI4YmIuLjY0MjU4MmMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19pbXBvcnRhbnRfb3V0bGluZS54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX2ltcG9ydGFudF9vdXRsaW5lLnhtbApAQCAtMjAsNiArMjAsNyBAQAogICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKICAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgogICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIgorICAgICAgICBhbmRyb2lkOmF1dG9NaXJyb3JlZD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDp0aW50PSI/YW5kcm9pZDphdHRyL2NvbG9yQ29udHJvbE5vcm1hbCI+CiAgICAgPHBhdGgKICAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IkBhbmRyb2lkOmNvbG9yL3doaXRlIgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9tZWRpYV9zZXNzaW9uX3ZpZXcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9tZWRpYV9zZXNzaW9uX3ZpZXcueG1sCmluZGV4IDlkOTE0MTkuLjg1YjZlOGQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvbWVkaWFfc2Vzc2lvbl92aWV3LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L21lZGlhX3Nlc3Npb25fdmlldy54bWwKQEAgLTk3LDcgKzk3LDggQEAKICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcXNfbWVkaWFfbGlnaHRfc291cmNlIgogICAgICAgICBhbmRyb2lkOmZvcmNlSGFzT3ZlcmxhcHBpbmdSZW5kZXJpbmc9ImZhbHNlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9taW5fY2xpY2thYmxlX2l0ZW1fc2l6ZSIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9taW5fY2xpY2thYmxlX2l0ZW1fc2l6ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSJAZGltZW4vcXNfY2VudGVyX2d1aWRlbGluZV9wYWRkaW5nIgogICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRFbmRfdG9FbmRPZj0icGFyZW50IgogICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRUb3BfdG9Ub3BPZj0icGFyZW50IgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9tdWx0aV9zaGFkZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L211bHRpX3NoYWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZmNWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9tdWx0aV9zaGFkZS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgfgorICAtLT4KKworPGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlldy5NdWx0aVNoYWRlVmlldworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdXBlcl9ub3RpZmljYXRpb25fc2hhZGUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdXBlcl9ub3RpZmljYXRpb25fc2hhZGUueG1sCmluZGV4IDRhYmMxNzYuLmZlOTU0MmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3VwZXJfbm90aWZpY2F0aW9uX3NoYWRlLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N1cGVyX25vdGlmaWNhdGlvbl9zaGFkZS54bWwKQEAgLTExMCw2ICsxMTAsMTMgQEAKICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIgogICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIiAvPgogCisgICAgPFZpZXdTdHViCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVsdGlfc2hhZGVfc3R1YiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9tdWx0aV9zaGFkZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvbXVsdGlfc2hhZGUiIC8+CisKICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuYmlvbWV0cmljcy5BdXRoUmlwcGxlVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2F1dGhfcmlwcGxlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDMxMTk5MGMuLmU1Y2QwYzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTg0NCw0ICs4NDQsNDQgQEAKIAogICAgIDwhLS0gQ29uZmlndXJhdGlvbiB0byBzZXQgTGVhcm4gbW9yZSBpbiBkZXZpY2UgbG9ncyBhcyBVUkwgbGluayAtLT4KICAgICA8Ym9vbCBuYW1lPSJsb2dfYWNjZXNzX2NvbmZpcm1hdGlvbl9sZWFybl9tb3JlX2FzX2xpbmsiPnRydWU8L2Jvb2w+CisKKyAgICA8IS0tIFtTVEFSVF0gTVVMVEkgU0hBREUgLS0+CisgICAgPCEtLSBXaGV0aGVyIHRoZSBkZXZpY2Ugc2hvdWxkIHVzZSBkdWFsIHNoYWRlLiBJZiBmYWxzZSwgdGhlIGRldmljZSB1c2VzIHNpbmdsZSBzaGFkZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iZHVhbF9zaGFkZV9lbmFibGVkIj50cnVlPC9ib29sPgorICAgIDwhLS0KKyAgICBXaGVuIGluIGR1YWwgc2hhZGUsIHdoZXJlIHNob3VsZCB0aGUgaG9yaXpvbnRhbCBzcGxpdCBiZSBvbiB0aGUgc2NyZWVuIHRvIGhlbHAgZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICB0aGUgdXNlciBpcyBwdWxsaW5nIGRvd24gdGhlIGxlZnQgc2hhZGUgb3IgdGhlIHJpZ2h0IHNoYWRlLiBNdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAsCisgICAgaW5jbHVzaXZlLiBJbiBvdGhlciB3b3JkczogaG93IG11Y2ggb2YgdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBzY3JlZW4sIHdoZW4gcHVsbGVkIGRvd24gb24sCisgICAgd291bGQgcmV2ZWFsIHRoZSBsZWZ0LWhhbmQgc2lkZSBzaGFkZS4KKworICAgIE1vcmUgY29uY3JldGVseToKKyAgICBBIHZhbHVlIG9mIDAuNjcgbWVhbnMgdGhhdCB0aGUgbGVmdCB0d28tdGhpcmRzIG9mIHRoZSBzY3JlZW4gYXJlIGRlZGljYXRlZCB0byB0aGUgbGVmdC1oYW5kIHNpZGUKKyAgICBzaGFkZSBhbmQgdGhlIHJlbWFpbmluZyBvbmUtdGhpcmQgb2YgdGhlIHNjcmVlbiBvbiB0aGUgcmlnaHQgaXMgZGVkaWNhdGVkIHRvIHRoZSByaWdodC1oYW5kIHNpZGUKKyAgICBzaGFkZS4KKyAgICAtLT4KKyAgICA8ZGltZW4gbmFtZT0iZHVhbF9zaGFkZV9zcGxpdF9mcmFjdGlvbiI+MC42NzwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBvZiB0aGUgbGVmdC1oYW5kIHNpZGUgc2hhZGUuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJsZWZ0X3NoYWRlX3dpZHRoIj40MzZkcDwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlIHNoYWRlLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icmlnaHRfc2hhZGVfd2lkdGgiPjQzNmRwPC9kaW1lbj4KKyAgICA8IS0tCisgICAgT3BhcXVlIHZlcnNpb24gb2YgdGhlIHNjcmltIHRoYXQgc2hvd3MgdXAgYmVoaW5kIGR1YWwgc2hhZGVzLiBUaGUgYWxwaGEgY2hhbm5lbCBpcyBkcml2ZW4KKyAgICBwcm9ncmFtbWF0aWNhbGx5LgorICAgIC0tPgorICAgIDxjb2xvciBuYW1lPSJvcGFxdWVfc2NyaW0iPiNEOUQ5RDk8L2NvbG9yPgorICAgIDwhLS0gTWF4aW11bSBvcGFjaXR5IHdoZW4gdGhlIHNjcmltIHRoYXQgc2hvd3MgdXAgYmVoaW5kIHRoZSBkdWFsIHNoYWRlcyBpcyBmdWxseSB2aXNpYmxlLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iZHVhbF9zaGFkZV9zY3JpbV9hbHBoYSI+MC4xPC9kaW1lbj4KKyAgICA8IS0tCisgICAgVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgZG93biB3aGVuIHRoZSBzaGFkZSBpcyBmdWxseSBjb2xsYXBzZWQgdG8gYXV0b21hdGljYWxseQorICAgIGV4cGFuZCBvbmNlIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNoYWRlLiBJZiB0aGUgdXNlciBzd2lwZXMgbGVzcyB0aGFuIHRoaXMgYW1vdW50LCB0aGUgc2hhZGUKKyAgICB3aWxsIGF1dG9tYXRpY2FsbHkgcmV2ZXJ0IGJhY2sgdG8gZnVsbHkgY29sbGFwc2VkIG9uY2UgdGhlIHVzZXIgc3RvcHMgc3dpcGluZy4KKyAgICAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2hhZGVfc3dpcGVfZXhwYW5kX3RocmVzaG9sZCI+MC41PC9kaW1lbj4KKyAgICA8IS0tCisgICAgVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgdXAgd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgZXhwYW5kZWQgdG8gYXV0b21hdGljYWxseQorICAgIGNvbGxhcHNlIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZSBzaGFkZQorICAgIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBleHBhbmRlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgLS0+CisgICAgPGRpbWVuIG5hbWU9InNoYWRlX3N3aXBlX2NvbGxhcHNlX3RocmVzaG9sZCI+MC41PC9kaW1lbj4KKyAgICA8IS0tIFtFTkRdIE1VTFRJIFNIQURFIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBhMDJjNDI5Li5lYmYwZjhlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTI0MzEsNyArMjQzMSw3IEBACiAKICAgICA8IS0tIFNob3dzIGluIGEgZGlhbG9nIHByZXNlbnRlZCB0byB0aGUgdXNlciB0byBhdXRob3JpemUgdGhpcyBhcHAgdG8gZGlzcGxheSBhIERldmljZSBjb250cm9scwogICAgICAgICAgcGFuZWwgKGVtYmVkZGVkIGFjdGl2aXR5KSBpbnN0ZWFkIG9mIGNvbnRyb2xzIHJlbmRlcmVkIGJ5IFN5c3RlbVVJIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29udHJvbHNfcGFuZWxfYXV0aG9yaXphdGlvbiI+PHhsaWZmOmcgaWQ9ImFwcE5hbWUiIGV4YW1wbGU9Ik15IGFwcCI+JXM8L3hsaWZmOmc+Y2FuIGNob29zZSB3aGljaCBjb250cm9scyBhbmQgY29udGVudCBzaG93IGhlcmUuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb250cm9sc19wYW5lbF9hdXRob3JpemF0aW9uIj48eGxpZmY6ZyBpZD0iYXBwTmFtZSIgZXhhbXBsZT0iTXkgYXBwIj4lczwveGxpZmY6Zz4gY2FuIGNob29zZSB3aGljaCBjb250cm9scyBhbmQgY29udGVudCBzaG93IGhlcmUuPC9zdHJpbmc+CiAKICAgICA8IS0tIFNob3dzIGluIGEgZGlhbG9nIHByZXNlbnRlZCB0byB0aGUgdXNlciB0byBhdXRob3JpemUgdGhpcyBhcHAgcmVtb3ZhbCBmcm9tIGEgRGV2aWNlCiAgICAgICAgICBjb250cm9scyBwYW5lbCBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYS5qYXZhCmluZGV4IDBlNWY4YzEuLjU1MzQ1M2QgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWEuamF2YQpAQCAtMTgsMTMgKzE4LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIApAQCAtMzMsMjIgKzI5LDEwIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlN5c3RlbUJhclV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KIC8qKioKICAqIE1hbmFnZXMgYSBudW1iZXIgb2Ygdmlld3MgaW5zaWRlIG9mIHRoZSBnaXZlbiBsYXlvdXQuIFNlZSBiZWxvdyBmb3IgYSBsaXN0IG9mIHdpZGdldHMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBLZXlndWFyZE1lc3NhZ2VBcmVhIGV4dGVuZHMgVGV4dFZpZXcgaW1wbGVtZW50cyBTZWN1cml0eU1lc3NhZ2VEaXNwbGF5IHsKLSAgICAvKiogSGFuZGxlciB0b2tlbiBwb3N0ZWQgd2l0aCBhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudCBydW5uYWJsZXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEFOTk9VTkNFX1RPS0VOID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogRGVsYXkgYmVmb3JlIHNwZWFraW5nIGFuIGFjY2Vzc2liaWxpdHkgYW5ub3VuY2VtZW50LiBVc2VkIHRvIHByZXZlbnQKLSAgICAgKiBsaWZ0LXRvLXR5cGUgZnJvbSBpbnRlcnJ1cHRpbmcgaXRzZWxmLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQU5OT1VOQ0VNRU5UX0RFTEFZID0gMjUwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbU1lc3NhZ2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Zpc2libGU7CkBAIC02NSw3ICs0OSw2IEBACiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKICAgICAgICAgc2V0TGF5ZXJUeXBlKExBWUVSX1RZUEVfSEFSRFdBUkUsIG51bGwpOyAvLyB3b3JrIGFyb3VuZCBuZXN0ZWQgdW5jbGlwcGVkIFNhdmVMYXllciBidWcKIAotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKICAgICAgICAgb25UaGVtZUNoYW5nZWQoKTsKICAgICB9CiAKQEAgLTEyNyw5ICsxMTAsNiBAQAogICAgIHByaXZhdGUgdm9pZCBzZWN1cml0eU1lc3NhZ2VDaGFuZ2VkKENoYXJTZXF1ZW5jZSBtZXNzYWdlKSB7CiAgICAgICAgIG1NZXNzYWdlID0gbWVzc2FnZTsKICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKEFOTk9VTkNFX1RPS0VOKTsKLSAgICAgICAgbUhhbmRsZXIucG9zdEF0VGltZShuZXcgQW5ub3VuY2VSdW5uYWJsZSh0aGlzLCBnZXRUZXh0KCkpLCBBTk5PVU5DRV9UT0tFTiwKLSAgICAgICAgICAgICAgICAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyBBTk5PVU5DRU1FTlRfREVMQVkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xlYXJNZXNzYWdlKCkgewpAQCAtMTU2LDI1ICsxMzYsNCBAQAogCiAgICAgLyoqIFNldCB0aGUgdGV4dCBjb2xvciAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHVwZGF0ZVRleHRDb2xvcigpOwotCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgdXNlZCB0byBkZWxheSBhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5ub3VuY2VSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXc+IG1Ib3N0OwotICAgICAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtVGV4dFRvQW5ub3VuY2U7Ci0KLSAgICAgICAgQW5ub3VuY2VSdW5uYWJsZShWaWV3IGhvc3QsIENoYXJTZXF1ZW5jZSB0ZXh0VG9Bbm5vdW5jZSkgewotICAgICAgICAgICAgbUhvc3QgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Pihob3N0KTsKLSAgICAgICAgICAgIG1UZXh0VG9Bbm5vdW5jZSA9IHRleHRUb0Fubm91bmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgaG9zdCA9IG1Ib3N0LmdldCgpOwotICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGhvc3QuYW5ub3VuY2VGb3JBY2Nlc3NpYmlsaXR5KG1UZXh0VG9Bbm5vdW5jZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlci5qYXZhCmluZGV4IDZhOTIxNjIuLmMxODk2ZmMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlci5qYXZhCkBAIC0xOCwxMSArMTgsMTcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Db25maWd1cmF0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LkNvbmZpZ3VyYXRpb25Db250cm9sbGVyLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLlZpZXdDb250cm9sbGVyOwogCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworCiBpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKIAogLyoqCkBAIC0zMSw4ICszNywxNCBAQAogICovCiBwdWJsaWMgY2xhc3MgS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXI8VCBleHRlbmRzIEtleWd1YXJkTWVzc2FnZUFyZWE+CiAgICAgICAgIGV4dGVuZHMgVmlld0NvbnRyb2xsZXI8VD4geworICAgIC8qKgorICAgICAqIERlbGF5IGJlZm9yZSBzcGVha2luZyBhbiBhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudC4gVXNlZCB0byBwcmV2ZW50CisgICAgICogbGlmdC10by10eXBlIGZyb20gaW50ZXJydXB0aW5nIGl0c2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFOTk9VTkNFTUVOVF9ERUxBWSA9IDI1MDsKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtS2V5Z3VhcmRVcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbkNvbnRyb2xsZXIgbUNvbmZpZ3VyYXRpb25Db250cm9sbGVyOworICAgIHByaXZhdGUgZmluYWwgQW5ub3VuY2VSdW5uYWJsZSBtQW5ub3VuY2VSdW5uYWJsZTsKIAogICAgIHByaXZhdGUgS2V5Z3VhcmRVcGRhdGVNb25pdG9yQ2FsbGJhY2sgbUluZm9DYWxsYmFjayA9IG5ldyBLZXlndWFyZFVwZGF0ZU1vbml0b3JDYWxsYmFjaygpIHsKICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZEdvaW5nVG9TbGVlcChpbnQgd2h5KSB7CkBAIC02OCw2ICs4MCw3IEBACiAKICAgICAgICAgbUtleWd1YXJkVXBkYXRlTW9uaXRvciA9IGtleWd1YXJkVXBkYXRlTW9uaXRvcjsKICAgICAgICAgbUNvbmZpZ3VyYXRpb25Db250cm9sbGVyID0gY29uZmlndXJhdGlvbkNvbnRyb2xsZXI7CisgICAgICAgIG1Bbm5vdW5jZVJ1bm5hYmxlID0gbmV3IEFubm91bmNlUnVubmFibGUobVZpZXcpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTAwLDYgKzExMywxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoQ2hhclNlcXVlbmNlIHMsIGJvb2xlYW4gYW5pbWF0ZSkgewogICAgICAgICBtVmlldy5zZXRNZXNzYWdlKHMsIGFuaW1hdGUpOworICAgICAgICBDaGFyU2VxdWVuY2UgbXNnID0gbVZpZXcuZ2V0VGV4dCgpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1zZykpIHsKKyAgICAgICAgICAgIG1WaWV3LnJlbW92ZUNhbGxiYWNrcyhtQW5ub3VuY2VSdW5uYWJsZSk7CisgICAgICAgICAgICBtQW5ub3VuY2VSdW5uYWJsZS5zZXRUZXh0VG9Bbm5vdW5jZShtc2cpOworICAgICAgICAgICAgbVZpZXcucG9zdERlbGF5ZWQobUFubm91bmNlUnVubmFibGUsIEFOTk9VTkNFTUVOVF9ERUxBWSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGludCByZXNJZCkgewpAQCAtMTM0LDQgKzE1MywzMCBAQAogICAgICAgICAgICAgICAgICAgICB2aWV3LCBtS2V5Z3VhcmRVcGRhdGVNb25pdG9yLCBtQ29uZmlndXJhdGlvbkNvbnRyb2xsZXIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogUnVubmFibGUgdXNlZCB0byBkZWxheSBhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudHMuCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdW5jZVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUhvc3Q7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UZXh0VG9Bbm5vdW5jZTsKKworICAgICAgICBBbm5vdW5jZVJ1bm5hYmxlKFZpZXcgaG9zdCkgeworICAgICAgICAgICAgbUhvc3QgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGhvc3QpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFNldHMgdGhlIHRleHQgdG8gYW5ub3VuY2UuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHRUb0Fubm91bmNlKENoYXJTZXF1ZW5jZSB0ZXh0VG9Bbm5vdW5jZSkgeworICAgICAgICAgICAgbVRleHRUb0Fubm91bmNlID0gdGV4dFRvQW5ub3VuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgZmluYWwgVmlldyBob3N0ID0gbUhvc3QuZ2V0KCk7CisgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaG9zdC5hbm5vdW5jZUZvckFjY2Vzc2liaWxpdHkobVRleHRUb0Fubm91bmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLmphdmEKaW5kZXggOTg4NjZjNi4uNzI1NTM4MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLmphdmEKQEAgLTEwNjYsMjMgKzEwNjYsMjggQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVsb2FkQ29sb3JzKCkgewotICAgICAgICByZWluZmxhdGVWaWV3RmxpcHBlcigpOwotICAgICAgICBtVmlldy5yZWxvYWRDb2xvcnMoKTsKKyAgICAgICAgcmVpbmZsYXRlVmlld0ZsaXBwZXIoKCkgLT4gbVZpZXcucmVsb2FkQ29sb3JzKCkpOwogICAgIH0KIAogICAgIC8qKiBIYW5kbGVzIGRlbnNpdHkgb3IgZm9udCBzY2FsZSBjaGFuZ2VzLiAqLwogICAgIHByaXZhdGUgdm9pZCBvbkRlbnNpdHlPckZvbnRTY2FsZUNoYW5nZWQoKSB7Ci0gICAgICAgIHJlaW5mbGF0ZVZpZXdGbGlwcGVyKCk7Ci0gICAgICAgIG1WaWV3Lm9uRGVuc2l0eU9yRm9udFNjYWxlQ2hhbmdlZCgpOworICAgICAgICByZWluZmxhdGVWaWV3RmxpcHBlcigoKSAtPiBtVmlldy5vbkRlbnNpdHlPckZvbnRTY2FsZUNoYW5nZWQoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVpbmZsYXRlIHRoZSB2aWV3IGZsaXBwZXIgY2hpbGQgdmlldy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWluZmxhdGVWaWV3RmxpcHBlcigpIHsKKyAgICBwdWJsaWMgdm9pZCByZWluZmxhdGVWaWV3RmxpcHBlcigKKyAgICAgICAgICAgIEtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuT25WaWV3SW5mbGF0ZWRMaXN0ZW5lciBvblZpZXdJbmZsYXRlZExpc3RlbmVyKSB7CiAgICAgICAgIG1TZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5jbGVhclZpZXdzKCk7Ci0gICAgICAgIG1TZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5nZXRTZWN1cml0eVZpZXcobUN1cnJlbnRTZWN1cml0eU1vZGUsCi0gICAgICAgICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDYWxsYmFjayk7CisgICAgICAgIGlmIChtRmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5BU1lOQ19JTkZMQVRFX0JPVU5DRVIpKSB7CisgICAgICAgICAgICBtU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuYXN5bmNocm9ub3VzbHlJbmZsYXRlVmlldyhtQ3VycmVudFNlY3VyaXR5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDYWxsYmFjaywgb25WaWV3SW5mbGF0ZWRMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuZ2V0U2VjdXJpdHlWaWV3KG1DdXJyZW50U2VjdXJpdHlNb2RlLAorICAgICAgICAgICAgICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrKTsKKyAgICAgICAgICAgIG9uVmlld0luZmxhdGVkTGlzdGVuZXIub25WaWV3SW5mbGF0ZWQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmphdmEKaW5kZXggMzliNTY3Zi4uNjhlMWRkNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5qYXZhCkBAIC0xOSwxMSArMTksMTYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYXN5bmNsYXlvdXRpbmZsYXRlci52aWV3LkFzeW5jTGF5b3V0SW5mbGF0ZXI7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5LZXlndWFyZElucHV0Vmlld0NvbnRyb2xsZXIuRmFjdG9yeTsKIGltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5LZXlndWFyZFNlY3VyaXR5TW9kZWwuU2VjdXJpdHlNb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLmRhZ2dlci5LZXlndWFyZEJvdW5jZXJTY29wZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZlYXR1cmVGbGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GbGFnczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLlZpZXdDb250cm9sbGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTQ0LDE4ICs0OSwyNCBAQAogICAgIHByaXZhdGUgZmluYWwgTGlzdDxLZXlndWFyZElucHV0Vmlld0NvbnRyb2xsZXI8S2V5Z3VhcmRJbnB1dFZpZXc+PiBtQ2hpbGRyZW4gPQogICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBMYXlvdXRJbmZsYXRlciBtTGF5b3V0SW5mbGF0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBBc3luY0xheW91dEluZmxhdGVyIG1Bc3luY0xheW91dEluZmxhdGVyOwogICAgIHByaXZhdGUgZmluYWwgRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlci5GYWN0b3J5IG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeTsKICAgICBwcml2YXRlIGZpbmFsIEZhY3RvcnkgbUtleWd1YXJkU2VjdXJpdHlWaWV3Q29udHJvbGxlckZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbUZlYXR1cmVGbGFnczsKIAogICAgIEBJbmplY3QKICAgICBwcm90ZWN0ZWQgS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcihLZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXIgdmlldywKICAgICAgICAgICAgIExheW91dEluZmxhdGVyIGxheW91dEluZmxhdGVyLAorICAgICAgICAgICAgQXN5bmNMYXlvdXRJbmZsYXRlciBhc3luY0xheW91dEluZmxhdGVyLAogICAgICAgICAgICAgS2V5Z3VhcmRJbnB1dFZpZXdDb250cm9sbGVyLkZhY3Rvcnkga2V5Z3VhcmRTZWN1cml0eVZpZXdDb250cm9sbGVyRmFjdG9yeSwKLSAgICAgICAgICAgIEVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXIuRmFjdG9yeSBlbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeSkgeworICAgICAgICAgICAgRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlci5GYWN0b3J5IGVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5LAorICAgICAgICAgICAgRmVhdHVyZUZsYWdzIGZlYXR1cmVGbGFncykgewogICAgICAgICBzdXBlcih2aWV3KTsKICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlWaWV3Q29udHJvbGxlckZhY3RvcnkgPSBrZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5OwogICAgICAgICBtTGF5b3V0SW5mbGF0ZXIgPSBsYXlvdXRJbmZsYXRlcjsKICAgICAgICAgbUVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5ID0gZW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlckZhY3Rvcnk7CisgICAgICAgIG1Bc3luY0xheW91dEluZmxhdGVyID0gYXN5bmNMYXlvdXRJbmZsYXRlcjsKKyAgICAgICAgbUZlYXR1cmVGbGFncyA9IGZlYXR1cmVGbGFnczsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTkyLDEzICsxMDMsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChjaGlsZENvbnRyb2xsZXIgPT0gbnVsbAorICAgICAgICBpZiAoIW1GZWF0dXJlRmxhZ3MuaXNFbmFibGVkKEZsYWdzLkFTWU5DX0lORkxBVEVfQk9VTkNFUikgJiYgY2hpbGRDb250cm9sbGVyID09IG51bGwKICAgICAgICAgICAgICAgICAmJiBzZWN1cml0eU1vZGUgIT0gU2VjdXJpdHlNb2RlLk5vbmUgJiYgc2VjdXJpdHlNb2RlICE9IFNlY3VyaXR5TW9kZS5JbnZhbGlkKSB7Ci0KICAgICAgICAgICAgIGludCBsYXlvdXRJZCA9IGdldExheW91dElkRm9yKHNlY3VyaXR5TW9kZSk7CiAgICAgICAgICAgICBLZXlndWFyZElucHV0VmlldyB2aWV3ID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXlvdXRJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJpbmZsYXRpbmcgaWQgPSAiICsgbGF5b3V0SWQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5mbGF0aW5nIG9uIG1haW4gdGhyZWFkIGlkID0gIiArIGxheW91dElkKTsKICAgICAgICAgICAgICAgICB2aWV3ID0gKEtleWd1YXJkSW5wdXRWaWV3KSBtTGF5b3V0SW5mbGF0ZXIuaW5mbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dElkLCBtVmlldywgZmFsc2UpOwogICAgICAgICAgICAgICAgIG1WaWV3LmFkZFZpZXcodmlldyk7CkBAIC0xMTksNiArMTI5LDM2IEBACiAgICAgICAgIHJldHVybiBjaGlsZENvbnRyb2xsZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzbHkgaW5mbGF0ZSB2aWV3IGFuZCB0aGVuIGFkZCBpdCB0byB2aWV3IGZsaXBwZXIgb24gdGhlIG1haW4gdGhyZWFkIHdoZW4gY29tcGxldGUuCisgICAgICoKKyAgICAgKiBPbkluZmxhdGVGaW5pc2hlZExpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWN1cml0eU1vZGUKKyAgICAgKiBAcGFyYW0ga2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXN5bmNocm9ub3VzbHlJbmZsYXRlVmlldyhTZWN1cml0eU1vZGUgc2VjdXJpdHlNb2RlLAorICAgICAgICAgICAgS2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrIGtleWd1YXJkU2VjdXJpdHlDYWxsYmFjaywKKyAgICAgICAgICAgIEBOdWxsYWJsZSBPblZpZXdJbmZsYXRlZExpc3RlbmVyIG9uVmlld0luZmxhdGVkTGlzdGVuZXIpIHsKKyAgICAgICAgaW50IGxheW91dElkID0gZ2V0TGF5b3V0SWRGb3Ioc2VjdXJpdHlNb2RlKTsKKyAgICAgICAgaWYgKGxheW91dElkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5mbGF0aW5nIG9uIGJnIHRocmVhZCBpZCA9ICIgKyBsYXlvdXRJZCk7CisgICAgICAgICAgICBtQXN5bmNMYXlvdXRJbmZsYXRlci5pbmZsYXRlKGxheW91dElkLCBtVmlldywKKyAgICAgICAgICAgICAgICAgICAgKHZpZXcsIHJlc0lkLCBwYXJlbnQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmFkZFZpZXcodmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlndWFyZElucHV0Vmlld0NvbnRyb2xsZXI8S2V5Z3VhcmRJbnB1dFZpZXc+IGNoaWxkQ29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS2V5Z3VhcmRJbnB1dFZpZXcpIHZpZXcsIHNlY3VyaXR5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRDb250cm9sbGVyLmluaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGlsZHJlbi5hZGQoY2hpbGRDb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvblZpZXdJbmZsYXRlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZpZXdJbmZsYXRlZExpc3RlbmVyLm9uVmlld0luZmxhdGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgZ2V0TGF5b3V0SWRGb3IoU2VjdXJpdHlNb2RlIHNlY3VyaXR5TW9kZSkgewogICAgICAgICBzd2l0Y2ggKHNlY3VyaXR5TW9kZSkgewogICAgICAgICAgICAgY2FzZSBQYXR0ZXJuOiByZXR1cm4gUi5sYXlvdXQua2V5Z3VhcmRfcGF0dGVybl92aWV3OwpAQCAtMTYyLDQgKzIwMiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKiogTGlzdGVuZXIgdG8gd2hlbiB2aWV3IGhhcyBmaW5pc2hlZCBpbmZsYXRpb24uICovCisgICAgcHVibGljIGludGVyZmFjZSBPblZpZXdJbmZsYXRlZExpc3RlbmVyIHsKKyAgICAgICAgLyoqIE5vdGlmaWVzIHRoYXQgdmlldyBoYXMgYmVlbiBpbmZsYXRlZCAqLworICAgICAgICB2b2lkIG9uVmlld0luZmxhdGVkKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL0V2ZW50TG9nVGFncy5sb2d0YWdzCmluZGV4IDljODQ3YmUuLjA4MjM2YjcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9FdmVudExvZ1RhZ3MubG9ndGFncworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKQEAgLTYxLDMgKzYxLDggQEAKICMjICAgICAgIDQ6IFNZU1RFTV9SRUdJU1RFUl9VU0VSICAgICBTeXN0ZW0gc3lzdWkgcmVnaXN0ZXJzIHVzZXIncyBjYWxsYmFja3MKICMjICAgICAgIDU6IFNZU1RFTV9VTlJFR0lTVEVSX1VTRVIgICBTeXN0ZW0gc3lzdWkgdW5yZWdpc3RlcnMgdXNlcidzIGNhbGxiYWNrcyAoYWZ0ZXIgZGVhdGgpCiAzNjA2MCBzeXN1aV9yZWNlbnRzX2Nvbm5lY3Rpb24gKHR5cGV8MSksKHVzZXJ8MSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzM2MDgwIHN5c3VpX2tleWd1YXJkIChpc09jY2x1ZGVkfDEpLChhbmltYXRlfDEpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvQXV0aENvbnRyb2xsZXIuamF2YQppbmRleCBjMzFkNDVmLi40YWE5ODViIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhDb250cm9sbGVyLmphdmEKQEAgLTE5OCwzMiArMTk4LDM2IEBACiAgICAgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50RGlhbG9nICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKCJyZWFzb24iKTsKICAgICAgICAgICAgICAgICByZWFzb24gPSAocmVhc29uICE9IG51bGwpID8gcmVhc29uIDogInVua25vd24iOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyByZWNlaXZlZCwgcmVhc29uOiAiICsgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50RGlhbG9nLmRpc21pc3NXaXRob3V0Q2FsbGJhY2sodHJ1ZSAvKiBhbmltYXRlICovKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudERpYWxvZyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKENhbGxiYWNrIGNiIDogbUNhbGxiYWNrcykgewotICAgICAgICAgICAgICAgICAgICBjYi5vbkJpb21ldHJpY1Byb21wdERpc21pc3NlZCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLm9uRGlhbG9nRGlzbWlzc2VkKEJpb21ldHJpY1Byb21wdC5ESVNNSVNTRURfUkVBU09OX1VTRVJfQ0FOQ0VMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGNyZWRlbnRpYWxBdHRlc3RhdGlvbiAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlIGV4Y2VwdGlvbiIsIGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZURpb2Fsb2cocmVhc29uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VEaW9hbG9nKFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDbG9zZSBCUCwgcmVhc29uIDoiICsgcmVhc29uKTsKKyAgICAgICAgICAgIG1DdXJyZW50RGlhbG9nLmRpc21pc3NXaXRob3V0Q2FsbGJhY2sodHJ1ZSAvKiBhbmltYXRlICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50RGlhbG9nID0gbnVsbDsKKworICAgICAgICAgICAgZm9yIChDYWxsYmFjayBjYiA6IG1DYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBjYi5vbkJpb21ldHJpY1Byb21wdERpc21pc3NlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChtUmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIub25EaWFsb2dEaXNtaXNzZWQoQmlvbWV0cmljUHJvbXB0LkRJU01JU1NFRF9SRUFTT05fVVNFUl9DQU5DRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBjcmVkZW50aWFsQXR0ZXN0YXRpb24gKi8pOworICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbElmT3duZXJJc05vdEluRm9yZWdyb3VuZCgpIHsKICAgICAgICAgbUV4ZWN1dGlvbi5hc3NlcnRJc01haW5UaHJlYWQoKTsKICAgICAgICAgaWYgKG1DdXJyZW50RGlhbG9nICE9IG51bGwpIHsKQEAgLTU0Niw2ICs1NTAsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZVNob3dHbG9iYWxBY3Rpb25zTWVudSgpIHsKKyAgICAgICAgY2xvc2VEaW9hbG9nKCJQb3dlck1lbnUgc2hvd24iKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHdoZXJlIHRoZSBVREZQUyBleGlzdHMgb24gdGhlIHNjcmVlbiBpbiBwaXhlbHMgaW4gcG9ydHJhaXQgbW9kZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0Jhc2VDb21wb3NlRmFjYWRlLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQmFzZUNvbXBvc2VGYWNhZGUua3QKaW5kZXggYzBmODU0OS4uNDE3M2JkYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQmFzZUNvbXBvc2VGYWNhZGUua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQmFzZUNvbXBvc2VGYWNhZGUua3QKQEAgLTIxLDggKzIxLDEwIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcKIGltcG9ydCBhbmRyb2lkeC5hY3Rpdml0eS5Db21wb25lbnRBY3Rpdml0eQogaW1wb3J0IGFuZHJvaWR4LmxpZmVjeWNsZS5MaWZlY3ljbGVPd25lcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsLk11bHRpU2hhZGVWaWV3TW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wZW9wbGUudWkudmlld21vZGVsLlBlb3BsZVZpZXdNb2RlbAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmZvb3Rlci51aS52aWV3bW9kZWwuRm9vdGVyQWN0aW9uc1ZpZXdNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5TeXN0ZW1DbG9jawogCiAvKioKICAqIEEgZmFjYWRlIHRvIGludGVyYWN0IHdpdGggQ29tcG9zZSwgd2hlbiBpdCBpcyBhdmFpbGFibGUuCkBAIC01Nyw0ICs1OSwxMSBAQAogICAgICAgICB2aWV3TW9kZWw6IEZvb3RlckFjdGlvbnNWaWV3TW9kZWwsCiAgICAgICAgIHFzVmlzaWJpbGl0eUxpZmVjeWNsZU93bmVyOiBMaWZlY3ljbGVPd25lciwKICAgICApOiBWaWV3CisKKyAgICAvKiogQ3JlYXRlIGEgW1ZpZXddIHRvIHJlcHJlc2VudCBbdmlld01vZGVsXSBvbiBzY3JlZW4uICovCisgICAgZnVuIGNyZWF0ZU11bHRpU2hhZGVWaWV3KAorICAgICAgICBjb250ZXh0OiBDb250ZXh0LAorICAgICAgICB2aWV3TW9kZWw6IE11bHRpU2hhZGVWaWV3TW9kZWwsCisgICAgICAgIGNsb2NrOiBTeXN0ZW1DbG9jaywKKyAgICApOiBWaWV3CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvc2V0dGluZ3MvQ29udHJvbHNTZXR0aW5nc0RpYWxvZ01hbmFnZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvc2V0dGluZ3MvQ29udHJvbHNTZXR0aW5nc0RpYWxvZ01hbmFnZXIua3QKaW5kZXggMDZkNGEwOC4uY2UwZjJlOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VyLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlci5rdApAQCAtMTU1LDE3ICsxNTUsMTggQEAKICAgICAgICAgZC5zaG93KCkKICAgICB9CiAKLSAgICBwcml2YXRlIGZ1biB0dXJuT25TZXR0aW5nU2VjdXJlbHkoc2V0dGluZ3M6IExpc3Q8U3RyaW5nPikgeworICAgIHByaXZhdGUgZnVuIHR1cm5PblNldHRpbmdTZWN1cmVseShzZXR0aW5nczogTGlzdDxTdHJpbmc+LCBvbkNvbXBsZXRlOiAoKSAtPiBVbml0KSB7CiAgICAgICAgIHZhbCBhY3Rpb24gPQogICAgICAgICAgICAgQWN0aXZpdHlTdGFydGVyLk9uRGlzbWlzc0FjdGlvbiB7CiAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZm9yRWFjaCB7IHNldHRpbmcgLT4KICAgICAgICAgICAgICAgICAgICAgc2VjdXJlU2V0dGluZ3MucHV0SW50Rm9yVXNlcihzZXR0aW5nLCAxLCB1c2VyVHJhY2tlci51c2VySWQpCiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKQogICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgIH0KICAgICAgICAgYWN0aXZpdHlTdGFydGVyLmRpc21pc3NLZXlndWFyZFRoZW5FeGVjdXRlKAogICAgICAgICAgICAgYWN0aW9uLAotICAgICAgICAgICAgLyogY2FuY2VsICovIG51bGwsCisgICAgICAgICAgICAvKiBjYW5jZWwgKi8gb25Db21wbGV0ZSwKICAgICAgICAgICAgIC8qIGFmdGVyS2V5Z3VhcmRHb25lICovIHRydWUKICAgICAgICAgKQogICAgIH0KQEAgLTE4Niw3ICsxODcsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNob3dEZXZpY2VDb250cm9sc0luTG9ja3NjcmVlbikgewogICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5hZGQoU2V0dGluZ3MuU2VjdXJlLkxPQ0tTQ1JFRU5fU0hPV19DT05UUk9MUykKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHVybk9uU2V0dGluZ1NlY3VyZWx5KHNldHRpbmdzKQorICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSB0b2dnbGluZyB0aGUgZmxhZywgd2Ugd2FudCB0byBjYWxsIG9uQ29tcGxldGUgYWZ0ZXIgdGhlIGtleWd1YXJkIGlzCisgICAgICAgICAgICAgICAgLy8gZGlzbWlzc2VkIChhbmQgdGhlIHNldHRpbmcgaXMgdHVybmVkIG9uKSwgdG8gcGFzcyB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgICAgICAgICAgICAgICB0dXJuT25TZXR0aW5nU2VjdXJlbHkoc2V0dGluZ3MsIG9uQ29tcGxldGUpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF0dGVtcHRzICE9IE1BWF9OVU1CRVJfQVRURU1QVFNfQ09OVFJPTFNfRElBTE9HKSB7CiAgICAgICAgICAgICAgICAgcHJlZnMKQEAgLTE5NCw3ICsxOTksNiBAQAogICAgICAgICAgICAgICAgICAgICAucHV0SW50KFBSRUZTX1NFVFRJTkdTX0RJQUxPR19BVFRFTVBUUywgTUFYX05VTUJFUl9BVFRFTVBUU19DT05UUk9MU19ESUFMT0cpCiAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbXBsZXRlKCkKICAgICAgICAgfQogCiAgICAgICAgIG92ZXJyaWRlIGZ1biBvbkNhbmNlbChkaWFsb2c6IERpYWxvZ0ludGVyZmFjZT8pIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc0FjdGl2aXR5Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzQWN0aXZpdHkua3QKaW5kZXggYmYwYTY5Mi4uMjI0ZWIxYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzQWN0aXZpdHkua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzQWN0aXZpdHkua3QKQEAgLTIwLDYgKzIwLDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbgogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlCiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuZHJlYW1zLklEcmVhbU1hbmFnZXIKQEAgLTU3LDkgKzU5LDExIEBACiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgcGFyZW50OiBWaWV3R3JvdXAKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBicm9hZGNhc3RSZWNlaXZlcjogQnJvYWRjYXN0UmVjZWl2ZXIKICAgICBwcml2YXRlIHZhciBtRXhpdFRvRHJlYW06IEJvb2xlYW4gPSBmYWxzZQorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGxhc3RDb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uCiAKICAgICBvdmVycmlkZSBmdW4gb25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlOiBCdW5kbGU/KSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICAgICAgbGFzdENvbmZpZ3VyYXRpb24gPSByZXNvdXJjZXMuY29uZmlndXJhdGlvbgogICAgICAgICBpZiAoZmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5VU0VfQVBQX1BBTkVMUykpIHsKICAgICAgICAgICAgIHdpbmRvdy5hZGRQcml2YXRlRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWSkKICAgICAgICAgfQpAQCAtOTIsNiArOTYsMTQgQEAKICAgICAgICAgaW5pdEJyb2FkY2FzdFJlY2VpdmVyKCkKICAgICB9CiAKKyAgICBvdmVycmlkZSBmdW4gb25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWc6IENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpCisgICAgICAgIGlmIChsYXN0Q29uZmlndXJhdGlvbi5kaWZmKG5ld0NvbmZpZykgYW5kIEFjdGl2aXR5SW5mby5DT05GSUdfT1JJRU5UQVRJT04gIT0gMCApIHsKKyAgICAgICAgICAgIHVpQ29udHJvbGxlci5vbk9yaWVudGF0aW9uQ2hhbmdlKCkKKyAgICAgICAgfQorICAgICAgICBsYXN0Q29uZmlndXJhdGlvbiA9IG5ld0NvbmZpZworICAgIH0KKwogICAgIG92ZXJyaWRlIGZ1biBvblN0YXJ0KCkgewogICAgICAgICBzdXBlci5vblN0YXJ0KCkKIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVyLmt0CmluZGV4IDBkNTMxMTcuLjNlY2Y0MjMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXIua3QKQEAgLTY0LDYgKzY0LDggQEAKICAgICAgKiBUaGlzIGVsZW1lbnQgd2lsbCBiZSB0aGUgb25lIHRoYXQgYXBwZWFycyB3aGVuIHRoZSB1c2VyIGZpcnN0IG9wZW5zIHRoZSBjb250cm9scyBhY3Rpdml0eS4KICAgICAgKi8KICAgICBmdW4gZ2V0UHJlZmVycmVkU2VsZWN0ZWRJdGVtKHN0cnVjdHVyZXM6IExpc3Q8U3RydWN0dXJlSW5mbz4pOiBTZWxlY3RlZEl0ZW0KKworICAgIGZ1biBvbk9yaWVudGF0aW9uQ2hhbmdlKCkKIH0KIAogc2VhbGVkIGNsYXNzIFNlbGVjdGVkSXRlbSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXJJbXBsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbC5rdAppbmRleCA1ZGE4NmRlOS4uZWUxMmRiOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXJJbXBsLmt0CkBAIC0xMjQsNiArMTI0LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZhciBzZWxlY3RlZEl0ZW06IFNlbGVjdGVkSXRlbSA9IFNlbGVjdGVkSXRlbS5FTVBUWV9TRUxFQ1RJT04KKyAgICBwcml2YXRlIHZhciBzZWxlY3Rpb25JdGVtOiBTZWxlY3Rpb25JdGVtPyA9IG51bGwKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBhbGxTdHJ1Y3R1cmVzOiBMaXN0PFN0cnVjdHVyZUluZm8+CiAgICAgcHJpdmF0ZSB2YWwgY29udHJvbHNCeUlkID0gbXV0YWJsZU1hcE9mPENvbnRyb2xLZXksIENvbnRyb2xXaXRoU3RhdGU+KCkKICAgICBwcml2YXRlIHZhbCBjb250cm9sVmlld3NCeUlkID0gbXV0YWJsZU1hcE9mPENvbnRyb2xLZXksIENvbnRyb2xWaWV3SG9sZGVyPigpCkBAIC0yMzAsNiArMjMxLDcgQEAKICAgICAgICAgdGhpcy5vdmVyZmxvd01lbnVBZGFwdGVyID0gbnVsbAogICAgICAgICBoaWRkZW4gPSBmYWxzZQogICAgICAgICByZXRhaW5DYWNoZSA9IGZhbHNlCisgICAgICAgIHNlbGVjdGlvbkl0ZW0gPSBudWxsCiAKICAgICAgICAgY29udHJvbEFjdGlvbkNvb3JkaW5hdG9yLmFjdGl2aXR5Q29udGV4dCA9IGFjdGl2aXR5Q29udGV4dAogCkBAIC0yNzIsNyArMjc0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZnVuIHJlbG9hZChwYXJlbnQ6IFZpZXdHcm91cCkgeworICAgIHByaXZhdGUgZnVuIHJlbG9hZChwYXJlbnQ6IFZpZXdHcm91cCwgZGlzbWlzc1Rhc2tWaWV3OiBCb29sZWFuID0gdHJ1ZSkgewogICAgICAgICBpZiAoaGlkZGVuKSByZXR1cm4KIAogICAgICAgICBjb250cm9sc0xpc3RpbmdDb250cm9sbGVyLmdldCgpLnJlbW92ZUNhbGxiYWNrKGxpc3RpbmdDYWxsYmFjaykKQEAgLTMyNyw4ICszMjksOCBAQAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGludGVybmFsIGZ1biBzdGFydFJlbW92aW5nQXBwKGNvbXBvbmVudE5hbWU6IENvbXBvbmVudE5hbWUsIGFwcE5hbWU6IENoYXJTZXF1ZW5jZSkgewogICAgICAgICByZW1vdmVBcHBEaWFsb2c/LmNhbmNlbCgpCi0gICAgICAgIHJlbW92ZUFwcERpYWxvZyA9IGRpYWxvZ3NGYWN0b3J5LmNyZWF0ZVJlbW92ZUFwcERpYWxvZyhjb250ZXh0LCBhcHBOYW1lKSB7Ci0gICAgICAgICAgICBpZiAoIWNvbnRyb2xzQ29udHJvbGxlci5nZXQoKS5yZW1vdmVGYXZvcml0ZXMoY29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgcmVtb3ZlQXBwRGlhbG9nID0gZGlhbG9nc0ZhY3RvcnkuY3JlYXRlUmVtb3ZlQXBwRGlhbG9nKGNvbnRleHQsIGFwcE5hbWUpIHsgc2hvdWxkUmVtb3ZlIC0+CisgICAgICAgICAgICBpZiAoIXNob3VsZFJlbW92ZSB8fCAhY29udHJvbHNDb250cm9sbGVyLmdldCgpLnJlbW92ZUZhdm9yaXRlcyhjb21wb25lbnROYW1lKSkgewogICAgICAgICAgICAgICAgIHJldHVybkBjcmVhdGVSZW1vdmVBcHBEaWFsb2cKICAgICAgICAgICAgIH0KIApAQCAtNDI1LDYgKzQyNyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cudyhDb250cm9sc1VpQ29udHJvbGxlci5UQUcsICJOb3QgVGFza1ZpZXdGYWN0b3J5IHRvIGRpc3BsYXkgcGFuZWwgJHNlbGVjdGlvbkl0ZW0iKQogICAgICAgICB9CisgICAgICAgIHRoaXMuc2VsZWN0aW9uSXRlbSA9IHNlbGVjdGlvbkl0ZW0KIAogICAgICAgICBiZ0V4ZWN1dG9yLmV4ZWN1dGUgewogICAgICAgICAgICAgdmFsIGludGVudCA9IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pCkBAIC02NTcsNiArNjYwLDcgQEAKICAgICAgICAgdmFsIG1heENvbHVtbnMgPSBDb250cm9sQWRhcHRlci5maW5kTWF4Q29sdW1ucyhhY3Rpdml0eUNvbnRleHQucmVzb3VyY2VzKQogCiAgICAgICAgIHZhbCBsaXN0VmlldyA9IHBhcmVudC5yZXF1aXJlVmlld0J5SWQoUi5pZC5nbG9iYWxfYWN0aW9uc19jb250cm9sc19saXN0KSBhcyBWaWV3R3JvdXAKKyAgICAgICAgbGlzdFZpZXcucmVtb3ZlQWxsVmlld3MoKQogICAgICAgICB2YXIgbGFzdFJvdzogVmlld0dyb3VwID0gY3JlYXRlUm93KGluZmxhdGVyLCBsaXN0VmlldykKICAgICAgICAgc2VsZWN0ZWRTdHJ1Y3R1cmUuY29udHJvbHMuZm9yRWFjaCB7CiAgICAgICAgICAgICB2YWwga2V5ID0gQ29udHJvbEtleShzZWxlY3RlZFN0cnVjdHVyZS5jb21wb25lbnROYW1lLCBpdC5jb250cm9sSWQpCkBAIC04MDQsNiArODA4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBvdmVycmlkZSBmdW4gb25PcmllbnRhdGlvbkNoYW5nZSgpIHsKKyAgICAgICAgc2VsZWN0aW9uSXRlbT8ubGV0IHsKKyAgICAgICAgICAgIHdoZW4gKHNlbGVjdGVkSXRlbSkgeworICAgICAgICAgICAgICAgIGlzIFNlbGVjdGVkSXRlbS5TdHJ1Y3R1cmVJdGVtIC0+IGNyZWF0ZUxpc3RWaWV3KGl0KQorICAgICAgICAgICAgICAgIGlzIFNlbGVjdGVkSXRlbS5QYW5lbEl0ZW0gLT4gdGFza1ZpZXdDb250cm9sbGVyPy5yZWZyZXNoQm91bmRzKCkgPzogcmVsb2FkKHBhcmVudCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSA/OiByZWxvYWQocGFyZW50KQorICAgIH0KKwogICAgIHByaXZhdGUgZnVuIGNyZWF0ZVJvdyhpbmZsYXRlcjogTGF5b3V0SW5mbGF0ZXIsIGxpc3RWaWV3OiBWaWV3R3JvdXApOiBWaWV3R3JvdXAgewogICAgICAgICB2YWwgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5jb250cm9sc19yb3csIGxpc3RWaWV3LCBmYWxzZSkgYXMgVmlld0dyb3VwCiAgICAgICAgIGxpc3RWaWV3LmFkZFZpZXcocm93KQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL1BhbmVsVGFza1ZpZXdDb250cm9sbGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL1BhbmVsVGFza1ZpZXdDb250cm9sbGVyLmt0CmluZGV4IDc4ZTg3Y2EuLjFmODljOTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvUGFuZWxUYXNrVmlld0NvbnRyb2xsZXIua3QKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBwcml2YXRlIHZhbCBhY3Rpdml0eUNvbnRleHQ6IENvbnRleHQsCiAgICAgcHJpdmF0ZSB2YWwgdWlFeGVjdXRvcjogRXhlY3V0b3IsCiAgICAgcHJpdmF0ZSB2YWwgcGVuZGluZ0ludGVudDogUGVuZGluZ0ludGVudCwKLSAgICBwcml2YXRlIHZhbCB0YXNrVmlldzogVGFza1ZpZXcsCisgICAgdmFsIHRhc2tWaWV3OiBUYXNrVmlldywKICAgICBwcml2YXRlIHZhbCBoaWRlOiAoKSAtPiBVbml0ID0ge30KICkgewogCkBAIC0xMDgsNiArMTA4LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgIGZ1biByZWZyZXNoQm91bmRzKCkgeworICAgICAgICB0YXNrVmlldy5vbkxvY2F0aW9uQ2hhbmdlZCgpCisgICAgfQorCiAgICAgZnVuIGRpc21pc3MoKSB7CiAgICAgICAgIHRhc2tWaWV3LnJlbGVhc2UoKQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kYWdnZXIvRnJhbWV3b3JrU2VydmljZXNNb2R1bGUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kYWdnZXIvRnJhbWV3b3JrU2VydmljZXNNb2R1bGUuamF2YQppbmRleCBiMDU0YzdlLi4wYmUzYmI2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZGFnZ2VyL0ZyYW1ld29ya1NlcnZpY2VzTW9kdWxlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RhZ2dlci9GcmFtZXdvcmtTZXJ2aWNlc01vZHVsZS5qYXZhCkBAIC05OCw2ICs5OCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcudGV4dGNsYXNzaWZpZXIuVGV4dENsYXNzaWZpY2F0aW9uTWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LmFzeW5jbGF5b3V0aW5mbGF0ZXIudmlldy5Bc3luY0xheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWR4LmNvcmUuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXJDb21wYXQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKQEAgLTM5NSw2ICszOTYsMTMgQEAKICAgICAgICAgcmV0dXJuIExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CiAgICAgfQogCisgICAgLyoqICovCisgICAgQFByb3ZpZGVzCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBBc3luY0xheW91dEluZmxhdGVyIHByb3ZpZGVBc3luY0xheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gbmV3IEFzeW5jTGF5b3V0SW5mbGF0ZXIoY29udGV4dCk7CisgICAgfQorCiAgICAgQFByb3ZpZGVzCiAgICAgc3RhdGljIE1lZGlhUHJvamVjdGlvbk1hbmFnZXIgcHJvdmlkZU1lZGlhUHJvamVjdGlvbk1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoTWVkaWFQcm9qZWN0aW9uTWFuYWdlci5jbGFzcyk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL2NvbXBsaWNhdGlvbi9Db21wbGljYXRpb25UeXBlc1VwZGF0ZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCmluZGV4IDI0NDIxMmIuLjE3MDJlYWMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCkBAIC03NSw2ICs3NSwxMCBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9DT01QTElDQVRJT05TX0VOQUJMRUQsCiAgICAgICAgICAgICAgICAgc2V0dGluZ3NPYnNlcnZlciwKICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLm15VXNlcklkKCkpOworICAgICAgICBtU2VjdXJlU2V0dGluZ3MucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJGb3JVc2VyKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9IT01FX0NPTlRST0xTX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgc2V0dGluZ3NPYnNlcnZlciwKKyAgICAgICAgICAgICAgICBVc2VySGFuZGxlLm15VXNlcklkKCkpOwogICAgICAgICBzZXR0aW5nc09ic2VydmVyLm9uQ2hhbmdlKGZhbHNlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9jb21wbGljYXRpb24vZGFnZ2VyL1JlZ2lzdGVyZWRDb21wbGljYXRpb25zTW9kdWxlLmphdmEKaW5kZXggOWI5NTRmNWYuLjYxNmJkODEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c3RlbVVJQmluZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLk1haW47CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLmNvbXBsaWNhdGlvbi5Db21wbGljYXRpb25MYXlvdXRQYXJhbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzOwogCiBpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOwogCkBAIC00NywxNyArNDksMjcgQEAKICAgICBTdHJpbmcgRFJFQU1fTUVESUFfRU5UUllfTEFZT1VUX1BBUkFNUyA9ICJtZWRpYV9lbnRyeV9sYXlvdXRfcGFyYW1zIjsKIAogICAgIGludCBEUkVBTV9DTE9DS19USU1FX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAxOworICAgIGludCBEUkVBTV9DTE9DS19USU1FX0NPTVBMSUNBVElPTl9XRUlHSFRfTk9fU01BUlRTUEFDRSA9IDI7CiAgICAgaW50IERSRUFNX1NNQVJUU1BBQ0VfQ09NUExJQ0FUSU9OX1dFSUdIVCA9IDI7CiAgICAgaW50IERSRUFNX01FRElBX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAwOwogICAgIGludCBEUkVBTV9IT01FX0NPTlRST0xTX0NISVBfQ09NUExJQ0FUSU9OX1dFSUdIVCA9IDQ7CiAgICAgaW50IERSRUFNX01FRElBX0VOVFJZX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAzOworICAgIGludCBEUkVBTV9XRUFUSEVSX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAwOwogCiAgICAgLyoqCiAgICAgICogUHJvdmlkZXMgbGF5b3V0IHBhcmFtZXRlcnMgZm9yIHRoZSBjbG9jayB0aW1lIGNvbXBsaWNhdGlvbi4KICAgICAgKi8KICAgICBAUHJvdmlkZXMKICAgICBATmFtZWQoRFJFQU1fQ0xPQ0tfVElNRV9DT01QTElDQVRJT05fTEFZT1VUX1BBUkFNUykKLSAgICBzdGF0aWMgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zIHByb3ZpZGVDbG9ja1RpbWVMYXlvdXRQYXJhbXMoKSB7CisgICAgc3RhdGljIENvbXBsaWNhdGlvbkxheW91dFBhcmFtcyBwcm92aWRlQ2xvY2tUaW1lTGF5b3V0UGFyYW1zKEZlYXR1cmVGbGFncyBmZWF0dXJlRmxhZ3MpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuSElERV9TTUFSVFNQQUNFX09OX0RSRUFNX09WRVJMQVkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsaWNhdGlvbkxheW91dFBhcmFtcygwLAorICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX0JPVFRPTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX1NUQVJULAorICAgICAgICAgICAgICAgICAgICBDb21wbGljYXRpb25MYXlvdXRQYXJhbXMuRElSRUNUSU9OX0VORCwKKyAgICAgICAgICAgICAgICAgICAgRFJFQU1fQ0xPQ0tfVElNRV9DT01QTElDQVRJT05fV0VJR0hUX05PX1NNQVJUU1BBQ0UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zKDAsCiAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX0JPVFRPTQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9zbWFydHNwYWNlL0RyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdAppbmRleCA2M2Y2M2E1Li43OGUxMzJmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdApAQCAtMzAsMTQgKzMwLDE1IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5CY1NtYXJ0c3BhY2VEYXRhUGx1Z2luCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5CY1NtYXJ0c3BhY2VEYXRhUGx1Z2luLlNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQmNTbWFydHNwYWNlRGF0YVBsdWdpbi5TbWFydHNwYWNlVmlldworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQmNTbWFydHNwYWNlRGF0YVBsdWdpbi5VSV9TVVJGQUNFX0RSRUFNCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5TbWFydHNwYWNlUHJlY29uZGl0aW9uCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5TbWFydHNwYWNlVGFyZ2V0RmlsdGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5kYWdnZXIuU21hcnRzcGFjZU1vZHVsZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VNb2R1bGUuQ29tcGFuaW9uLkRSRUFNX1NNQVJUU1BBQ0VfREFUQV9QTFVHSU4KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zbWFydHNwYWNlLmRhZ2dlci5TbWFydHNwYWNlTW9kdWxlLkNvbXBhbmlvbi5EUkVBTV9TTUFSVFNQQUNFX1BSRUNPTkRJVElPTgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VNb2R1bGUuQ29tcGFuaW9uLkRSRUFNX1NNQVJUU1BBQ0VfVEFSR0VUX0ZJTFRFUgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VWaWV3Q29tcG9uZW50CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5jb25jdXJyZW5jeS5FeGVjdXRpb24KLWltcG9ydCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCiBpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdApAQCAtNTYsMTMgKzU3LDE2IEBACiAgICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfUFJFQ09ORElUSU9OKSBwcml2YXRlIHZhbCBwcmVjb25kaXRpb246IFNtYXJ0c3BhY2VQcmVjb25kaXRpb24sCiAgICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfVEFSR0VUX0ZJTFRFUikKICAgICBwcml2YXRlIHZhbCBvcHRpb25hbFRhcmdldEZpbHRlcjogT3B0aW9uYWw8U21hcnRzcGFjZVRhcmdldEZpbHRlcj4sCi0gICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfREFUQV9QTFVHSU4pIG9wdGlvbmFsUGx1Z2luOiBPcHRpb25hbDxCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPgorICAgIEBOYW1lZChEUkVBTV9TTUFSVFNQQUNFX0RBVEFfUExVR0lOKSBvcHRpb25hbFBsdWdpbjogT3B0aW9uYWw8QmNTbWFydHNwYWNlRGF0YVBsdWdpbj4sCisgICAgQE5hbWVkKFNtYXJ0c3BhY2VNb2R1bGUuV0VBVEhFUl9TTUFSVFNQQUNFX0RBVEFfUExVR0lOKQorICAgIG9wdGlvbmFsV2VhdGhlclBsdWdpbjogT3B0aW9uYWw8QmNTbWFydHNwYWNlRGF0YVBsdWdpbj4sCiApIHsKICAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgVEFHID0gIkRyZWFtU21hcnRzcGFjZUN0cmxyIgogICAgIH0KIAogICAgIHByaXZhdGUgdmFyIHNlc3Npb246IFNtYXJ0c3BhY2VTZXNzaW9uPyA9IG51bGwKKyAgICBwcml2YXRlIHZhbCB3ZWF0aGVyUGx1Z2luOiBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPyA9IG9wdGlvbmFsV2VhdGhlclBsdWdpbi5vckVsc2UobnVsbCkKICAgICBwcml2YXRlIHZhbCBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/ID0gb3B0aW9uYWxQbHVnaW4ub3JFbHNlKG51bGwpCiAgICAgcHJpdmF0ZSB2YXIgdGFyZ2V0RmlsdGVyOiBTbWFydHNwYWNlVGFyZ2V0RmlsdGVyPyA9IG9wdGlvbmFsVGFyZ2V0RmlsdGVyLm9yRWxzZShudWxsKQogCkBAIC0xMTYsMzEgKzEyMCw1NCBAQAogICAgIHByaXZhdGUgdmFsIHNlc3Npb25MaXN0ZW5lciA9IFNtYXJ0c3BhY2VTZXNzaW9uLk9uVGFyZ2V0c0F2YWlsYWJsZUxpc3RlbmVyIHsgdGFyZ2V0cyAtPgogICAgICAgICBleGVjdXRpb24uYXNzZXJ0SXNNYWluVGhyZWFkKCkKIAorICAgICAgICAvLyBUaGUgd2VhdGhlciBkYXRhIHBsdWdpbiB0YWtlcyB1bmZpbHRlcmVkIHRhcmdldHMgYW5kIHBlcmZvcm1zIHRoZSBmaWx0ZXJpbmcgaW50ZXJuYWxseS4KKyAgICAgICAgd2VhdGhlclBsdWdpbj8ub25UYXJnZXRzQXZhaWxhYmxlKHRhcmdldHMpCisKICAgICAgICAgb25UYXJnZXRzQXZhaWxhYmxlVW5maWx0ZXJlZCh0YXJnZXRzKQogICAgICAgICB2YWwgZmlsdGVyZWRUYXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIgeyB0YXJnZXRGaWx0ZXI/LmZpbHRlclNtYXJ0c3BhY2VUYXJnZXQoaXQpID86IHRydWUgfQogICAgICAgICBwbHVnaW4/Lm9uVGFyZ2V0c0F2YWlsYWJsZShmaWx0ZXJlZFRhcmdldHMpCiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ29uc3RydWN0cyB0aGUgd2VhdGhlciB2aWV3IHdpdGggY3VzdG9tIGxheW91dCBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIHdlYXRoZXIgcGx1Z2luLgorICAgICAqLworICAgIGZ1biBidWlsZEFuZENvbm5lY3RXZWF0aGVyVmlldyhwYXJlbnQ6IFZpZXdHcm91cCwgY3VzdG9tVmlldzogVmlldz8pOiBWaWV3PyB7CisgICAgICAgIHJldHVybiBidWlsZEFuZENvbm5lY3RWaWV3V2l0aFBsdWdpbihwYXJlbnQsIHdlYXRoZXJQbHVnaW4sIGN1c3RvbVZpZXcpCisgICAgfQorCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyB0aGUgc21hcnRzcGFjZSB2aWV3IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgc21hcnRzcGFjZSBzZXJ2aWNlLgogICAgICAqLwogICAgIGZ1biBidWlsZEFuZENvbm5lY3RWaWV3KHBhcmVudDogVmlld0dyb3VwKTogVmlldz8geworICAgICAgICByZXR1cm4gYnVpbGRBbmRDb25uZWN0Vmlld1dpdGhQbHVnaW4ocGFyZW50LCBwbHVnaW4sIG51bGwpCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gYnVpbGRBbmRDb25uZWN0Vmlld1dpdGhQbHVnaW4oCisgICAgICAgIHBhcmVudDogVmlld0dyb3VwLAorICAgICAgICBzbWFydHNwYWNlRGF0YVBsdWdpbjogQmNTbWFydHNwYWNlRGF0YVBsdWdpbj8sCisgICAgICAgIGN1c3RvbVZpZXc6IFZpZXc/CisgICAgKTogVmlldz8gewogICAgICAgICBleGVjdXRpb24uYXNzZXJ0SXNNYWluVGhyZWFkKCkKIAogICAgICAgICBpZiAoIXByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpIHsKICAgICAgICAgICAgIHRocm93IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBidWlsZCB2aWV3IHdoZW4gbm90IGVuYWJsZWQiKQogICAgICAgICB9CiAKLSAgICAgICAgdmFsIHZpZXcgPSBidWlsZFZpZXcocGFyZW50KQorICAgICAgICB2YWwgdmlldyA9IGJ1aWxkVmlldyhwYXJlbnQsIHNtYXJ0c3BhY2VEYXRhUGx1Z2luLCBjdXN0b21WaWV3KQogCiAgICAgICAgIGNvbm5lY3RTZXNzaW9uKCkKIAogICAgICAgICByZXR1cm4gdmlldwogICAgIH0KIAotICAgIHByaXZhdGUgZnVuIGJ1aWxkVmlldyhwYXJlbnQ6IFZpZXdHcm91cCk6IFZpZXc/IHsKLSAgICAgICAgcmV0dXJuIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgdmFyIHZpZXcgPSBzbWFydHNwYWNlVmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHBhcmVudCwgcGx1Z2luLCBzdGF0ZUNoYW5nZUxpc3RlbmVyKQorICAgIHByaXZhdGUgZnVuIGJ1aWxkVmlldygKKyAgICAgICAgcGFyZW50OiBWaWV3R3JvdXAsCisgICAgICAgIHNtYXJ0c3BhY2VEYXRhUGx1Z2luOiBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPywKKyAgICAgICAgY3VzdG9tVmlldzogVmlldz8KKyAgICApOiBWaWV3PyB7CisgICAgICAgIHJldHVybiBpZiAoc21hcnRzcGFjZURhdGFQbHVnaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdmFsIHZpZXcgPSBzbWFydHNwYWNlVmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHBhcmVudCwgc21hcnRzcGFjZURhdGFQbHVnaW4sCisgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZW5lciwgY3VzdG9tVmlldykKICAgICAgICAgICAgICAgICAuZ2V0VmlldygpCiAgICAgICAgICAgICBpZiAodmlldyAhaXMgVmlldykgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsCkBAIC0xNTcsNyArMTg0LDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmdW4gY29ubmVjdFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChwbHVnaW4gPT0gbnVsbCB8fCBzZXNzaW9uICE9IG51bGwgfHwgIWhhc0FjdGl2ZVNlc3Npb25MaXN0ZW5lcnMoKSkgeworICAgICAgICBpZiAocGx1Z2luID09IG51bGwgJiYgd2VhdGhlclBsdWdpbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsIHx8ICFoYXNBY3RpdmVTZXNzaW9uTGlzdGVuZXJzKCkpIHsKICAgICAgICAgICAgIHJldHVybgogICAgICAgICB9CiAKQEAgLTE2NiwxMyArMTk2LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICB2YWwgbmV3U2Vzc2lvbiA9IHNtYXJ0c3BhY2VNYW5hZ2VyLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKAotICAgICAgICAgICAgU21hcnRzcGFjZUNvbmZpZy5CdWlsZGVyKGNvbnRleHQsICJkcmVhbSIpLmJ1aWxkKCkKKyAgICAgICAgICAgIFNtYXJ0c3BhY2VDb25maWcuQnVpbGRlcihjb250ZXh0LCBVSV9TVVJGQUNFX0RSRUFNKS5idWlsZCgpCiAgICAgICAgICkKICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmcgc21hcnRzcGFjZSBzZXNzaW9uIGZvciBkcmVhbSIpCiAgICAgICAgIG5ld1Nlc3Npb24uYWRkT25UYXJnZXRzQXZhaWxhYmxlTGlzdGVuZXIodWlFeGVjdXRvciwgc2Vzc2lvbkxpc3RlbmVyKQogICAgICAgICB0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uCiAKLSAgICAgICAgcGx1Z2luLnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIgeworICAgICAgICB3ZWF0aGVyUGx1Z2luPy5yZWdpc3RlclNtYXJ0c3BhY2VFdmVudE5vdGlmaWVyIHsgZSAtPiBzZXNzaW9uPy5ub3RpZnlTbWFydHNwYWNlRXZlbnQoZSkgfQorICAgICAgICBwbHVnaW4/LnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIgewogICAgICAgICAgICAgICAgIGUgLT4KICAgICAgICAgICAgIHNlc3Npb24/Lm5vdGlmeVNtYXJ0c3BhY2VFdmVudChlKQogICAgICAgICB9CkBAIC0xOTksMjIgKzIzMCw0NyBAQAogCiAgICAgICAgIHNlc3Npb24gPSBudWxsCiAKKyAgICAgICAgd2VhdGhlclBsdWdpbj8ucmVnaXN0ZXJTbWFydHNwYWNlRXZlbnROb3RpZmllcihudWxsKQorICAgICAgICB3ZWF0aGVyUGx1Z2luPy5vblRhcmdldHNBdmFpbGFibGUoZW1wdHlMaXN0KCkpCisKICAgICAgICAgcGx1Z2luPy5yZWdpc3RlclNtYXJ0c3BhY2VFdmVudE5vdGlmaWVyKG51bGwpCiAgICAgICAgIHBsdWdpbj8ub25UYXJnZXRzQXZhaWxhYmxlKGVtcHR5TGlzdCgpKQogICAgICAgICBMb2cuZChUQUcsICJFbmRpbmcgc21hcnRzcGFjZSBzZXNzaW9uIGZvciBkcmVhbSIpCiAgICAgfQogCiAgICAgZnVuIGFkZExpc3RlbmVyKGxpc3RlbmVyOiBTbWFydHNwYWNlVGFyZ2V0TGlzdGVuZXIpIHsKKyAgICAgICAgYWRkQW5kUmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgcGx1Z2luKQorICAgIH0KKworICAgIGZ1biByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogU21hcnRzcGFjZVRhcmdldExpc3RlbmVyKSB7CisgICAgICAgIHJlbW92ZUFuZFVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgcGx1Z2luKQorICAgIH0KKworICAgIGZ1biBhZGRMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4obGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgICAgICBhZGRBbmRSZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCB3ZWF0aGVyUGx1Z2luKQorICAgIH0KKworICAgIGZ1biByZW1vdmVMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4obGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgICAgICByZW1vdmVBbmRVbnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIsIHdlYXRoZXJQbHVnaW4pCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gYWRkQW5kUmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgbGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lciwKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/CisgICAgKSB7CiAgICAgICAgIGV4ZWN1dGlvbi5hc3NlcnRJc01haW5UaHJlYWQoKQotICAgICAgICBwbHVnaW4/LnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpCisgICAgICAgIHNtYXJ0c3BhY2VEYXRhUGx1Z2luPy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKQogICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKQogCiAgICAgICAgIGNvbm5lY3RTZXNzaW9uKCkKICAgICB9CiAKLSAgICBmdW4gcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgIHByaXZhdGUgZnVuIHJlbW92ZUFuZFVucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgbGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lciwKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/CisgICAgKSB7CiAgICAgICAgIGV4ZWN1dGlvbi5hc3NlcnRJc01haW5UaHJlYWQoKQotICAgICAgICBwbHVnaW4/LnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcikKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW4/LnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcikKICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikKICAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc0RlYnVnLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQppbmRleCA1YzMxMGMzLi4yYzExZDc4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQpAQCAtODYsOSArODYsMzQgQEAKICAgICBwcml2YXRlIGZpbmFsIFNlcnZlckZsYWdSZWFkZXIuQ2hhbmdlTGlzdGVuZXIgbU9uUHJvcGVydGllc0NoYW5nZWQgPQogICAgICAgICAgICAgbmV3IFNlcnZlckZsYWdSZWFkZXIuQ2hhbmdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoRmxhZzw/PiBmbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0ZXIucmVzdGFydFN5c3RlbVVJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgZmxhZyBjaGFuZ2U6ICIgKyBmbGFnLmdldE5hbWVzcGFjZSgpICsgIi4iICsgZmxhZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKEZsYWc8Pz4gZmxhZywgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkUmVzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAobUJvb2xlYW5GbGFnQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuRmxhZ0NhY2hlLmdldChmbGFnLmdldE5hbWUoKSkgIT0gbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RyaW5nRmxhZ0NhY2hlLmNvbnRhaW5zS2V5KGZsYWcuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0cmluZ0ZsYWdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUludEZsYWdDYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdWYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IDAgOiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUludEZsYWdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0ZXIucmVzdGFydFN5c3RlbVVJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGZsYWcgY2hhbmdlOiAiICsgZmxhZy5nZXROYW1lc3BhY2UoKSArICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmxhZy5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc1JlbGVhc2UuamF2YQppbmRleCA5ODU5ZmY2Li45ZDE5YTdkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NSZWxlYXNlLmphdmEKQEAgLTUzLDEzICs1MywzOCBAQAogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRmxhZzw/Pj4gbUFsbEZsYWdzOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gbUJvb2xlYW5DYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVN0cmluZ0NhY2hlID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gbUludENhY2hlID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJGbGFnUmVhZGVyLkNoYW5nZUxpc3RlbmVyIG1PblByb3BlcnRpZXNDaGFuZ2VkID0KICAgICAgICAgICAgIG5ldyBTZXJ2ZXJGbGFnUmVhZGVyLkNoYW5nZUxpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKEZsYWc8Pz4gZmxhZykgewotICAgICAgICAgICAgICAgICAgICBtUmVzdGFydGVyLnJlc3RhcnRTeXN0ZW1VSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGZsYWcgY2hhbmdlOiAiICsgZmxhZy5nZXROYW1lc3BhY2UoKSArICIuIiArIGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShGbGFnPD8+IGZsYWcsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZFJlc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKSAhPSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdHJpbmdDYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJpbmdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUludENhY2hlLmNvbnRhaW5zS2V5KGZsYWcuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gMCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW50Q2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKSAhPSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZXN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzdGFydGVyLnJlc3RhcnRTeXN0ZW1VSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBmbGFnIGNoYW5nZTogIiArIGZsYWcuZ2V0TmFtZXNwYWNlKCkgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKQEAgLTk3LDY4ICsxMjIsOTcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChATm90TnVsbCBSZWxlYXNlZEZsYWcgZmxhZykgewotICAgICAgICByZXR1cm4gbVNlcnZlckZsYWdSZWFkZXIucmVhZFNlcnZlck92ZXJyaWRlKGZsYWcuZ2V0TmFtZXNwYWNlKCksIGZsYWcuZ2V0TmFtZSgpLCB0cnVlKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtU2VydmVyRmxhZ1JlYWRlci5yZWFkU2VydmVyT3ZlcnJpZGUoZmxhZy5nZXROYW1lc3BhY2UoKSwgZmxhZy5nZXROYW1lKCksIHRydWUpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZyBmbGFnKSB7Ci0gICAgICAgIGlmICghbUJvb2xlYW5DYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuYWJsZWQoZmxhZy5nZXROYW1lKCksIG1SZXNvdXJjZXMuZ2V0Qm9vbGVhbihmbGFnLmdldFJlc291cmNlSWQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgbVJlc291cmNlcy5nZXRCb29sZWFuKGZsYWcuZ2V0UmVzb3VyY2VJZCgpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZyBmbGFnKSB7Ci0gICAgICAgIGlmICghbUJvb2xlYW5DYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgIGZsYWcuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKGZsYWcuZ2V0TmFtZSgpLCBmbGFnLmdldERlZmF1bHQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbCgKKyAgICAgICAgICAgICAgICBmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKGZsYWcuZ2V0TmFtZSgpLCBmbGFnLmdldERlZmF1bHQoKSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIG1Cb29sZWFuQ2FjaGUucHV0KG5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgLyoqCisgICAgICogQ2hlY2tzIGFuZCBmaWxscyB0aGUgYm9vbGVhbiBjYWNoZS4gVGhpcyBpcyBpbXBvcnRhbnQsIEFsd2F5cyBjYWxsIHRocm91Z2ggdG8gdGhpcyBtZXRob2QhCisgICAgICoKKyAgICAgKiBXZSB1c2UgdGhlIGNhY2hlIGFzIGEgd2F5IHRvIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3Mgd2hlbiBzZXJ2ZXItc2lkZQorICAgICAqIGNoYW5nZXMgb2NjdXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEludGVybmFsKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAvLyBGaWxsIHRoZSBjYWNoZS4KKyAgICAgICAgaWYgKCFtQm9vbGVhbkNhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICBtQm9vbGVhbkNhY2hlLnB1dChuYW1lLCBkZWZhdWx0VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQE5vbk51bGwgU3RyaW5nRmxhZyBmbGFnKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoZmxhZy5nZXROYW1lKCksIGZsYWcuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRTdHJpbmdJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgZmxhZy5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQE5vbk51bGwgUmVzb3VyY2VTdHJpbmdGbGFnIGZsYWcpIHsKLSAgICAgICAgaWYgKCFtU3RyaW5nQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGZsYWcuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICByZXF1aXJlTm9uTnVsbChtUmVzb3VyY2VzLmdldFN0cmluZyhmbGFnLmdldFJlc291cmNlSWQoKSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtU3RyaW5nQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRTdHJpbmdJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICByZXF1aXJlTm9uTnVsbChtUmVzb3VyY2VzLmdldFN0cmluZyhmbGFnLmdldFJlc291cmNlSWQoKSkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgbVN0cmluZ0NhY2hlLnB1dChuYW1lLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIC8qKgorICAgICAqIENoZWNrcyBhbmQgZmlsbHMgdGhlIFN0cmluZyBjYWNoZS4gVGhpcyBpcyBpbXBvcnRhbnQsIEFsd2F5cyBjYWxsIHRocm91Z2ggdG8gdGhpcyBtZXRob2QhCisgICAgICoKKyAgICAgKiBXZSB1c2UgdGhlIGNhY2hlIGFzIGEgd2F5IHRvIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3Mgd2hlbiBzZXJ2ZXItc2lkZQorICAgICAqIGNoYW5nZXMgb2NjdXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKCFtU3RyaW5nQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIG1TdHJpbmdDYWNoZS5wdXQobmFtZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3RyaW5nQ2FjaGUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnQoQE5vbk51bGwgSW50RmxhZyBmbGFnKSB7Ci0gICAgICAgIHJldHVybiBmbGFnLmdldERlZmF1bHQoKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRJbnRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgZmxhZy5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnQoQE5vbk51bGwgUmVzb3VyY2VJbnRGbGFnIGZsYWcpIHsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCiAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzLmdldEludGVnZXIoZmxhZy5nZXRSZXNvdXJjZUlkKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENoZWNrcyBhbmQgZmlsbHMgdGhlIGludGVnZXIgY2FjaGUuIFRoaXMgaXMgaW1wb3J0YW50LCBBbHdheXMgY2FsbCB0aHJvdWdoIHRvIHRoaXMgbWV0aG9kIQorICAgICAqCisgICAgICogV2UgdXNlIHRoZSBjYWNoZSBhcyBhIHdheSB0byBkZWNpZGUgaWYgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBwcm9jZXNzIHdoZW4gc2VydmVyLXNpZGUKKyAgICAgKiBjaGFuZ2VzIG9jY3VyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldEludEludGVybmFsKFN0cmluZyBuYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGlmICghbUludENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICBtSW50Q2FjaGUucHV0KG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUludENhY2hlLmdldChuYW1lKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkdW1wKEBOb25OdWxsIFByaW50V3JpdGVyIHB3LCBATm9uTnVsbCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIHB3LnByaW50bG4oImNhbiBvdmVycmlkZTogZmFsc2UiKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GbGFncy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GbGFncy5rdAppbmRleCBiNjExZjQ2Li42NjFiMmI2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmxhZ3Mua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZsYWdzLmt0CkBAIC0yNDQsNiArMjQ0LDExIEBACiAgICAgQEp2bUZpZWxkCiAgICAgdmFsIEhJREVfU01BUlRTUEFDRV9PTl9EUkVBTV9PVkVSTEFZID0gdW5yZWxlYXNlZEZsYWcoNDA0LCAiaGlkZV9zbWFydHNwYWNlX29uX2RyZWFtX292ZXJsYXkiKQogCisgICAgLy8gVE9ETyhiLzI3MTQ2MDk1OCk6IFRyYWNraW5nIEJ1ZworICAgIEBKdm1GaWVsZAorICAgIHZhbCBTSE9XX1dFQVRIRVJfQ09NUExJQ0FUSU9OX09OX0RSRUFNX09WRVJMQVkgPSB1bnJlbGVhc2VkRmxhZyg0MDUsCisgICAgICAgICJzaG93X3dlYXRoZXJfY29tcGxpY2F0aW9uX29uX2RyZWFtX292ZXJsYXkiKQorCiAgICAgLy8gNTAwIC0gcXVpY2sgc2V0dGluZ3MKIAogICAgIHZhbCBQRU9QTEVfVElMRSA9IHJlc291cmNlQm9vbGVhbkZsYWcoNTAyLCBSLmJvb2wuZmxhZ19jb252ZXJzYXRpb25zLCAicGVvcGxlX3RpbGUiKQpAQCAtNTkxLDggKzU5Niw3IEBACiAgICAgLy8gMTcwMCAtIGNsaXBib2FyZAogICAgIEBKdm1GaWVsZCB2YWwgQ0xJUEJPQVJEX1JFTU9URV9CRUhBVklPUiA9IHJlbGVhc2VkRmxhZygxNzAxLCAiY2xpcGJvYXJkX3JlbW90ZV9iZWhhdmlvciIpCiAgICAgLy8gVE9ETyhiLzI2NzE2Mjk0NCk6IFRyYWNraW5nIGJ1ZwotICAgIEBKdm1GaWVsZAotICAgIHZhbCBDTElQQk9BUkRfTUlOSU1JWkVEX0xBWU9VVCA9IHVucmVsZWFzZWRGbGFnKDE3MDIsICJjbGlwYm9hcmRfZGF0YV9tb2RlbCIsIHRlYW1mb29kID0gdHJ1ZSkKKyAgICBASnZtRmllbGQgdmFsIENMSVBCT0FSRF9NSU5JTUlaRURfTEFZT1VUID0gcmVsZWFzZWRGbGFnKDE3MDIsICJjbGlwYm9hcmRfZGF0YV9tb2RlbCIpCiAKICAgICAvLyAxODAwIC0gc2hhZGUgY29udGFpbmVyCiAgICAgQEp2bUZpZWxkCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvU2VydmVyRmxhZ1JlYWRlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVyLmt0CmluZGV4IDliNzQ4ZDAuLmVhZjVlYWMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVyLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVyLmt0CkBAIC0zNyw3ICszNyw3IEBACiAgICAgZnVuIGxpc3RlbkZvckNoYW5nZXModmFsdWVzOiBDb2xsZWN0aW9uPEZsYWc8Kj4+LCBsaXN0ZW5lcjogQ2hhbmdlTGlzdGVuZXIpCiAKICAgICBpbnRlcmZhY2UgQ2hhbmdlTGlzdGVuZXIgewotICAgICAgICBmdW4gb25DaGFuZ2UoZmxhZzogRmxhZzwqPikKKyAgICAgICAgZnVuIG9uQ2hhbmdlKGZsYWc6IEZsYWc8Kj4sIHZhbHVlOiBTdHJpbmc/KQogICAgIH0KIH0KIApAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgICAgIHByb3BMb29wQCBmb3IgKHByb3BOYW1lIGluIHByb3BlcnRpZXMua2V5c2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoZmxhZyBpbiBmbGFncykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09IGZsYWcubmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQ2hhbmdlKGZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25DaGFuZ2UoZmxhZywgcHJvcGVydGllcy5nZXRTdHJpbmcocHJvcE5hbWUsIG51bGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQHByb3BMb29wCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICBmb3IgKChsaXN0ZW5lciwgZmxhZ3MpIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgZmxhZ0xvb3BAIGZvciAoZmxhZyBpbiBmbGFncykgewogICAgICAgICAgICAgICAgIGlmIChuYW1lID09IGZsYWcubmFtZSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkNoYW5nZShmbGFnKQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkNoYW5nZShmbGFnLCBpZiAodmFsdWUpICJ0cnVlIiBlbHNlICJmYWxzZSIpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrQGZsYWdMb29wCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTU5LDUgKzE1OSw2IEBACiAgICAgICAgIGZsYWdzOiBDb2xsZWN0aW9uPEZsYWc8Kj4+LAogICAgICAgICBsaXN0ZW5lcjogU2VydmVyRmxhZ1JlYWRlci5DaGFuZ2VMaXN0ZW5lcgogICAgICkgeworICAgICAgICBsaXN0ZW5lcnMuYWRkKFBhaXIobGlzdGVuZXIsIGZsYWdzKSkKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCmluZGV4IDM3N2ExMzYuLjVlY2MwMGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCkBAIC0xMTgsNiArMTE4LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5Db3JlU3RhcnRhYmxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLkRlamFua1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLkR1bXBhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLkV2ZW50TG9nVGFnczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmFuaW1hdGlvbi5BY3Rpdml0eUxhdW5jaEFuaW1hdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmFuaW1hdGlvbi5JbnRlcnBvbGF0b3JzOwpAQCAtMTg0OSw2ICsxODUwLDggQEAKICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2V0T2NjbHVkZWQoYm9vbGVhbiBpc09jY2x1ZGVkLCBib29sZWFuIGFuaW1hdGUpIHsKICAgICAgICAgVHJhY2UuYmVnaW5TZWN0aW9uKCJLZXlndWFyZFZpZXdNZWRpYXRvciNoYW5kbGVTZXRPY2NsdWRlZCIpOwogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTZXRPY2NsdWRlZCgiICsgaXNPY2NsdWRlZCArICIpIik7CisgICAgICAgIEV2ZW50TG9nVGFncy53cml0ZVN5c3VpS2V5Z3VhcmQoaXNPY2NsdWRlZCA/IDEgOiAwLCBhbmltYXRlID8gMSA6IDApOworCiAgICAgICAgIG1JbnRlcmFjdGlvbkphbmtNb25pdG9yLmNhbmNlbChDVUpfTE9DS1NDUkVFTl9UUkFOU0lUSU9OX0ZST01fQU9EKTsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKEtleWd1YXJkVmlld01lZGlhdG9yLnRoaXMpIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9Xb3JrTG9ja0FjdGl2aXR5LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvV29ya0xvY2tBY3Rpdml0eS5qYXZhCmluZGV4IDQ1MGZhMTQuLjgyYmUwMDkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9Xb3JrTG9ja0FjdGl2aXR5LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL1dvcmtMb2NrQWN0aXZpdHkuamF2YQpAQCAtMTc2LDEwICsxNzYsMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIEludGVudCBjcmVkZW50aWFsID0gZ2V0S2V5Z3VhcmRNYW5hZ2VyKCkKKyAgICAgICAgZmluYWwgSW50ZW50IGNvbmZpcm1DcmVkZW50aWFsSW50ZW50ID0gZ2V0S2V5Z3VhcmRNYW5hZ2VyKCkKICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlybURldmljZUNyZWRlbnRpYWxJbnRlbnQobnVsbCwgbnVsbCwgZ2V0VGFyZ2V0VXNlcklkKCksCiAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXNhbGxvd0Jpb21ldHJpY3NJZlBvbGljeUV4aXN0cyAqLyk7Ci0gICAgICAgIGlmIChjcmVkZW50aWFsID09IG51bGwpIHsKKyAgICAgICAgaWYgKGNvbmZpcm1DcmVkZW50aWFsSW50ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xOTMsMTQgKzE5MywxOCBAQAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUsIG9wdGlvbnMudG9CdW5kbGUoKSk7CiAKICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVkZW50aWFsLnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIHRhcmdldC5nZXRJbnRlbnRTZW5kZXIoKSk7CisgICAgICAgICAgICBjb25maXJtQ3JlZGVudGlhbEludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfSU5URU5ULCB0YXJnZXQuZ2V0SW50ZW50U2VuZGVyKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gV29ya0xvY2tBY3Rpdml0eSBpcyBzdGFydGVkIGFzIGEgdGFzayBvdmVybGF5LCBzbyB1bmxlc3MgY3JlZGVudGlhbCBjb25maXJtYXRpb24gaXMgYWxzbworICAgICAgICAvLyBzdGFydGVkIGFzIGFuIG92ZXJsYXksIGl0IHdvbid0IGJlIHZpc2libGUuCiAgICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBsYXVuY2hPcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOwogICAgICAgICBsYXVuY2hPcHRpb25zLnNldExhdW5jaFRhc2tJZChnZXRUYXNrSWQoKSk7CiAgICAgICAgIGxhdW5jaE9wdGlvbnMuc2V0VGFza092ZXJsYXkodHJ1ZSAvKiB0YXNrT3ZlcmxheSAqLywgdHJ1ZSAvKiBjYW5SZXN1bWUgKi8pOworICAgICAgICAvLyBQcm9wYWdhdGUgaXQgaW4gY2FzZSBtb3JlIHRoYW4gb25lIGFjdGl2aXR5IGlzIGxhdW5jaGVkLgorICAgICAgICBjb25maXJtQ3JlZGVudGlhbEludGVudC5wdXRFeHRyYShLZXlndWFyZE1hbmFnZXIuRVhUUkFfRk9SQ0VfVEFTS19PVkVSTEFZLCB0cnVlKTsKIAotICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGNyZWRlbnRpYWwsIFJFUVVFU1RfQ09ERV9DT05GSVJNX0NSRURFTlRJQUxTLAorICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGNvbmZpcm1DcmVkZW50aWFsSW50ZW50LCBSRVFVRVNUX0NPREVfQ09ORklSTV9DUkVERU5USUFMUywKICAgICAgICAgICAgICAgICBsYXVuY2hPcHRpb25zLnRvQnVuZGxlKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL2JpbmRlci9LZXlndWFyZEJvdW5jZXJWaWV3QmluZGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL2JpbmRlci9LZXlndWFyZEJvdW5jZXJWaWV3QmluZGVyLmt0CmluZGV4IGQ3MTY3ODQuLjVmY2YxMDUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS9iaW5kZXIvS2V5Z3VhcmRCb3VuY2VyVmlld0JpbmRlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvYmluZGVyL0tleWd1YXJkQm91bmNlclZpZXdCaW5kZXIua3QKQEAgLTM0LDcgKzM0LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5saWZlY3ljbGUucmVwZWF0V2hlbkF0dGFjaGVkCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5BY3Rpdml0eVN0YXJ0ZXIKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuYXdhaXRDYW5jZWxsYXRpb24KLWltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5jb2xsZWN0CiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZmlsdGVyCiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmxhdW5jaAogCkBAIC0xMTIsMTYgKzExMSwxOCBAQAogICAgICAgICAgICAgICAgICAgICBsYXVuY2ggewogICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsLnNob3cuY29sbGVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgU2VjdXJpdHkgQ29udGFpbmVyIGVudGlyZWx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcudmlzaWJpbGl0eSA9IFZpZXcuVklTSUJMRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5vbkJvdW5jZXJWaXNpYmlsaXR5Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNWaXNpYmxlPSAqLyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5yZWluZmxhdGVWaWV3RmxpcHBlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLnNob3dQcmltYXJ5U2VjdXJpdHlTY3JlZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR1cm5pbmdPZmY9ICovIGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5hcHBlYXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5vblJlc3VtZShLZXlndWFyZFNlY3VyaXR5Vmlldy5TQ1JFRU5fT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLnJlaW5mbGF0ZVZpZXdGbGlwcGVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgU2VjdXJpdHkgQ29udGFpbmVyIGVudGlyZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LnZpc2liaWxpdHkgPSBWaWV3LlZJU0lCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLm9uQm91bmNlclZpc2liaWxpdHlDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNWaXNpYmxlPSAqLyB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLnNob3dQcmltYXJ5U2VjdXJpdHlTY3JlZW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuaW5nT2ZmPSAqLyBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5hcHBlYXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIub25SZXN1bWUoS2V5Z3VhcmRTZWN1cml0eVZpZXcuU0NSRUVOX09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvdmlld21vZGVsL0tleWd1YXJkQm91bmNlclZpZXdNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLmt0CmluZGV4IDY4OTEwYzYuLjA2NTZjOWIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLmt0CkBAIC03MCw3ICs3MCw3IEBACiAgICAgLyoqIE9ic2VydmUgd2hldGhlciB3ZSBzaG91bGQgdXBkYXRlIGZwcyBpcyBzaG93aW5nLiAqLwogICAgIHZhbCBzaG91bGRVcGRhdGVTaWRlRnBzOiBGbG93PFVuaXQ+ID0KICAgICAgICAgbWVyZ2UoCi0gICAgICAgICAgICBpbnRlcmFjdG9yLnN0YXJ0aW5nVG9IaWRlLAorICAgICAgICAgICAgaW50ZXJhY3Rvci5oaWRlLAogICAgICAgICAgICAgaW50ZXJhY3Rvci5zaG93LAogICAgICAgICAgICAgaW50ZXJhY3Rvci5zdGFydGluZ0Rpc2FwcGVhckFuaW1hdGlvbi5maWx0ZXJOb3ROdWxsKCkubWFwIHt9CiAgICAgICAgICkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL0xvZ01vZHVsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTG9nTW9kdWxlLmphdmEKaW5kZXggZDI0NmIzNWUuLjg4OWFkYzcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL0xvZ01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL0xvZ01vZHVsZS5qYXZhCkBAIC0xMzYsNiArMTM2LDE0IEBACiAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZSgiTm90aWZTZWN0aW9uTG9nIiwgMTAwMCAvKiBtYXhTaXplICovLCBmYWxzZSAvKiBzeXN0cmFjZSAqLyk7CiAgICAgfQogCisgICAgLyoqIFByb3ZpZGVzIGEgbG9nZ2luZyBidWZmZXIgZm9yIGFsbCBsb2dzIHJlbGF0ZWQgdG8gcmVtb3RlIGlucHV0IGNvbnRyb2xsZXIuICovCisgICAgQFByb3ZpZGVzCisgICAgQFN5c1VJU2luZ2xldG9uCisgICAgQE5vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nCisgICAgcHVibGljIHN0YXRpYyBMb2dCdWZmZXIgcHJvdmlkZU5vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nQnVmZmVyKExvZ0J1ZmZlckZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoIk5vdGlmUmVtb3RlSW5wdXRMb2ciLCA1MCAvKiBtYXhTaXplICovLCBmYWxzZSAvKiBzeXN0cmFjZSAqLyk7CisgICAgfQorCiAgICAgLyoqIFByb3ZpZGVzIGEgbG9nZ2luZyBidWZmZXIgZm9yIGFsbCBsb2dzIHJlbGF0ZWQgdG8gdGhlIGRhdGEgbGF5ZXIgb2Ygbm90aWZpY2F0aW9ucy4gKi8KICAgICBAUHJvdmlkZXMKICAgICBAU3lzVUlTaW5nbGV0b24KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2MzlhMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nLmt0CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy5kYWdnZXIKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXIKKworLyoqIEEgW2NvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy5Mb2dCdWZmZXJdIGZvciBOb3RpZmljYXRpb25SZW1vdGVJbnB1dC4gKi8KK0BRdWFsaWZpZXIKK0BNdXN0QmVEb2N1bWVudGVkCitAUmV0ZW50aW9uKEFubm90YXRpb25SZXRlbnRpb24uUlVOVElNRSkKK2Fubm90YXRpb24gY2xhc3MgTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUNvbnRyb2xQYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKaW5kZXggYTMxYzFlNS4uMDBlNWFhYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKQEAgLTUxOSwxNiArNTE5LDE1IEBACiAgICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dUYXBDb250ZW50VmlldyhtVWlkLCBtUGFja2FnZU5hbWUsIG1JbnN0YW5jZUlkKTsKICAgICAgICAgICAgICAgICBsb2dTbWFydHNwYWNlQ2FyZFJlcG9ydGVkKFNNQVJUU1BBQ0VfQ0FSRF9DTElDS19FVkVOVCk7CiAKLSAgICAgICAgICAgICAgICAvLyBTZWUgU3RhdHVzQmFyTm90aWZpY2F0aW9uQWN0aXZpdHlTdGFydGVyI29uTm90aWZpY2F0aW9uQ2xpY2tlZAogICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd092ZXJMb2Nrc2NyZWVuID0gbUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRTaG93T3ZlckxvY2tzY3JlZW4oY2xpY2tJbnRlbnQuZ2V0SW50ZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRQZW5kaW5nU2hvd092ZXJMb2Nrc2NyZWVuKGNsaWNrSW50ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tzY3JlZW5Vc2VyTWFuYWdlci5nZXRDdXJyZW50VXNlcklkKCkpOwotCiAgICAgICAgICAgICAgICAgaWYgKHNob3dPdmVyTG9ja3NjcmVlbikgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlTdGFydGVyLnN0YXJ0QWN0aXZpdHkoY2xpY2tJbnRlbnQuZ2V0SW50ZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzbWlzc1NoYWRlICovIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5pbWF0aW9uQ29udHJvbGxlciAqLyBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3dPdmVyTG9ja3NjcmVlbldoZW5Mb2NrZWQgKi8gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlja0ludGVudC5zZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGVuZGluZyBpbnRlbnQgZm9yICIgKyBrZXkgKyAiIHdhcyBjYW5jZWxsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eVN0YXJ0ZXIucG9zdFN0YXJ0QWN0aXZpdHlEaXNtaXNzaW5nS2V5Z3VhcmQoY2xpY2tJbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRMYXVuY2hBbmltYXRvckNvbnRyb2xsZXIobU1lZGlhVmlld0hvbGRlci5nZXRQbGF5ZXIoKSkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dEFkYXB0ZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyLmphdmEKaW5kZXggMDBlOWE3OS4uYjcxYTkxOTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dEFkYXB0ZXIuamF2YQpAQCAtMTYsMTcgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubWVkaWEuZGlhbG9nOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFA7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNFTEVDVElPTl9CRUhBVklPUl9OT05FOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TRUxFQ1RJT05fQkVIQVZJT1JfVFJBTlNGRVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfQURfUk9VVElOR19ESVNBTExPV0VEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0RPV05MT0FERURfQ09OVEVOVF9ST1VUSU5HX0RJU0FMTE9XRUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfU1VCU0NSSVBUSU9OX1JFUVVJUkVEOwogCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLk1lZGlhRGV2aWNlLlNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFA7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLk1lZGlhRGV2aWNlLlNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9OT05FOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5tZWRpYS5NZWRpYURldmljZS5TZWxlY3Rpb25CZWhhdmlvci5TRUxFQ1RJT05fQkVIQVZJT1JfVFJBTlNGRVI7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGVkVmVjdG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwpAQCAtMjk2LDYgKzI5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUNvbnRyb2xsZXIuaXNBZHZhbmNlZExheW91dFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGRldmljZSBpcyBjb25uZWN0ZWQgYW5kIHRoZXJlJ3Mgb3RoZXIgc2VsZWN0YWJsZSBkZXZpY2VzLCBsYXlvdXQgYXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBvZiBzZWxlY3RlZCBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGl0bGVJY29uKFIuZHJhd2FibGUubWVkaWFfb3V0cHV0X2ljb25fdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RldmljZURlc2VsZWN0YWJsZSA9IGlzRGV2aWNlSW5jbHVkZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLmdldERlc2VsZWN0YWJsZU1lZGlhRGV2aWNlKCksIGRldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHcm91cGFibGVDaGVja0JveCh0cnVlLCBpc0RldmljZURlc2VsZWN0YWJsZSwgZGV2aWNlKTsKQEAgLTM3MSw3ICszNzIsOCBAQAogICAgICAgICAgICAgbUVuZENsaWNrSWNvbi5zZXRPbkNsaWNrTGlzdGVuZXIobnVsbCk7CiAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLnNldE9uQ2xpY2tMaXN0ZW5lcihudWxsKTsKICAgICAgICAgICAgIHVwZGF0ZUVuZENsaWNrQXJlYUNvbG9yKG1Db250cm9sbGVyLmdldENvbG9yU2Vla2JhclByb2dyZXNzKCkpOwotICAgICAgICAgICAgbUVuZENsaWNrSWNvbi5zZXRDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOworICAgICAgICAgICAgbUVuZENsaWNrSWNvbi5zZXRJbWFnZVRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICAgICAgbUVuZENsaWNrSWNvbi5zZXRPbkNsaWNrTGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgIHYgLT4gbUNvbnRyb2xsZXIudHJ5VG9MYXVuY2hJbkFwcFJvdXRpbmdJbnRlbnQoZGV2aWNlLmdldElkKCksIHYpKTsKICAgICAgICAgICAgIG1FbmRUb3VjaEFyZWEuc2V0T25DbGlja0xpc3RlbmVyKHYgLT4gbUNoZWNrQm94LnBlcmZvcm1DbGljaygpKTsKQEAgLTM3OSw4ICszODEsOCBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVuZENsaWNrQXJlYUNvbG9yKGludCBjb2xvcikgewogICAgICAgICAgICAgaWYgKG1Db250cm9sbGVyLmlzQWR2YW5jZWRMYXlvdXRTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIG1FbmRUb3VjaEFyZWEuZ2V0QmFja2dyb3VuZCgpLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgICAgIG1FbmRUb3VjaEFyZWEuc2V0QmFja2dyb3VuZFRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihjb2xvcikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM5NCwyMiArMzk2LDIyIEBACiAgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0aW9uRmFpbGVkU3RhdHVzSWNvbigpIHsKICAgICAgICAgICAgIG1TdGF0dXNJY29uLnNldEltYWdlRHJhd2FibGUoCiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldERyYXdhYmxlKFIuZHJhd2FibGUubWVkaWFfb3V0cHV0X3N0YXR1c19mYWlsZWQpKTsKLSAgICAgICAgICAgIG1TdGF0dXNJY29uLnNldENvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRJbWFnZVRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURldmljZVN0YXR1c0ljb24oRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAgICAgIG1TdGF0dXNJY29uLnNldEltYWdlRHJhd2FibGUoZHJhd2FibGUpOwotICAgICAgICAgICAgbVN0YXR1c0ljb24uc2V0Q29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKTsKKyAgICAgICAgICAgIG1TdGF0dXNJY29uLnNldEltYWdlVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKSk7CiAgICAgICAgICAgICBpZiAoZHJhd2FibGUgaW5zdGFuY2VvZiBBbmltYXRlZFZlY3RvckRyYXdhYmxlKSB7CiAgICAgICAgICAgICAgICAgKChBbmltYXRlZFZlY3RvckRyYXdhYmxlKSBkcmF3YWJsZSkuc3RhcnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9ncmVzc0JhckNvbG9yKCkgewotICAgICAgICAgICAgbVByb2dyZXNzQmFyLmdldEluZGV0ZXJtaW5hdGVEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuZ2V0SW5kZXRlcm1pbmF0ZURyYXdhYmxlKCkuc2V0VGludExpc3QoCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmRDbGlja0FyZWEoTWVkaWFEZXZpY2UgZGV2aWNlLCBib29sZWFuIGlzRGV2aWNlRGVzZWxlY3RhYmxlKSB7CkBAIC00MTksOSArNDIxLDggQEAKICAgICAgICAgICAgIG1FbmRUb3VjaEFyZWEuc2V0SW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eSgKICAgICAgICAgICAgICAgICAgICAgVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKTsKICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlci5pc0FkdmFuY2VkTGF5b3V0U3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICAgICAgbUVuZFRvdWNoQXJlYS5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0VXBDb250ZW50RGVzY3JpcHRpb25Gb3JWaWV3KG1FbmRUb3VjaEFyZWEsIHRydWUsIGRldmljZSk7CiAgICAgICAgIH0KQEAgLTQ1MCwxMSArNDUxLDExIEBACiAgICAgICAgICAgICAgICAgc2V0U2luZ2xlTGluZUxheW91dChtQ29udGV4dC5nZXRUZXh0KFIuc3RyaW5nLm1lZGlhX291dHB1dF9kaWFsb2dfcGFpcmluZ19uZXcpKTsKICAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBhZGREcmF3YWJsZSA9IG1Db250ZXh0LmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfYWRkKTsKICAgICAgICAgICAgICAgICBtVGl0bGVJY29uLnNldEltYWdlRHJhd2FibGUoYWRkRHJhd2FibGUpOwotICAgICAgICAgICAgICAgIG1UaXRsZUljb24uc2V0Q29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKTsKKyAgICAgICAgICAgICAgICBtVGl0bGVJY29uLnNldEltYWdlVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlci5pc0FkdmFuY2VkTGF5b3V0U3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29udGFpbmVyTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihtQ29udHJvbGxlcjo6bGF1bmNoQmx1ZXRvb3RoUGFpcmluZyk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QmFzZUFkYXB0ZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRCYXNlQWRhcHRlci5qYXZhCmluZGV4IDJhMmNmNjMuLmY3NmYwNDkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRCYXNlQWRhcHRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRCYXNlQWRhcHRlci5qYXZhCkBAIC0yMyw4ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkRyYXdhYmxlUmVzOwogaW1wb3J0IGFuZHJvaWQuYXBwLldhbGxwYXBlckNvbG9yczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ2xpcERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xOTYsOSArMTk1LDggQEAKICAgICAgICAgICAgICAgICBtSWNvbkFyZWFMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwogICAgICAgICAgICAgICAgIG1Wb2x1bWVWYWx1ZVRleHQuc2V0VGV4dENvbG9yKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2Vla0Jhci5nZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JTZWVrYmFyUHJvZ3Jlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICBtU2Vla0Jhci5zZXRQcm9ncmVzc1RpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9yU2Vla2JhclByb2dyZXNzKCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGFic3RyYWN0IHZvaWQgb25CaW5kKGludCBjdXN0b21pemVkSXRlbSk7CkBAIC0yMjQsMTYgKzIyMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWVrYmFyUHJvZ3Jlc3NCYWNrZ3JvdW5kKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUl0ZW1MYXlvdXQuZ2V0QmFja2dyb3VuZCgpLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JDb25uZWN0ZWRJdGVtQmFja2dyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCksCi0gICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgIG1JdGVtTGF5b3V0LnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihpc0FjdGl2ZSA/IG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpKSk7CiAgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXIuaXNBZHZhbmNlZExheW91dFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1NlZWtCYXIgPyBtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpCisgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2Yoc2hvd1NlZWtCYXIgPyBtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2hvd1Byb2dyZXNzQmFyID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JDb25uZWN0ZWRJdGVtQmFja2dyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qcm9ncmVzc0Jhci5zZXRWaXNpYmlsaXR5KHNob3dQcm9ncmVzc0JhciA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CiAgICAgICAgICAgICBtU2Vla0Jhci5zZXRBbHBoYSgxKTsKQEAgLTI1MSw3ICsyNDcsOCBAQAogICAgICAgICAgICAgICAgIHBhcmFtcy5yaWdodE1hcmdpbiA9IHNob3dFbmRUb3VjaEFyZWEgPyBtQ29udHJvbGxlci5nZXRJdGVtTWFyZ2luRW5kU2VsZWN0YWJsZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldEl0ZW1NYXJnaW5FbmREZWZhdWx0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGl0bGVJY29uLnNldENvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICBtVGl0bGVJY29uLnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgc2V0VHdvTGluZUxheW91dChNZWRpYURldmljZSBkZXZpY2UsIGJvb2xlYW4gYkZvY3VzZWQsIGJvb2xlYW4gc2hvd1NlZWtCYXIsCkBAIC0yNzQsMTUgKzI3MSwxNCBAQAogICAgICAgICAgICAgICAgIGJhY2tncm91bmREcmF3YWJsZSA9IG1Db250ZXh0LmdldERyYXdhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1NlZWtCYXIgPyBSLmRyYXdhYmxlLm1lZGlhX291dHB1dF9pdGVtX2JhY2tncm91bmRfYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5tZWRpYV9vdXRwdXRfaXRlbV9iYWNrZ3JvdW5kKS5tdXRhdGUoKTsKLSAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUuc2V0VGludCgKICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWVrQmFyID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JDb25uZWN0ZWRJdGVtQmFja2dyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7Ci0gICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyIHx8IGlzRmFrZUFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSk7CisgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2Yoc2hvd1Byb2dyZXNzQmFyIHx8IGlzRmFrZUFjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNob3dTZWVrQmFyID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JTZWVrYmFyUHJvZ3Jlc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpKSk7CiAgICAgICAgICAgICAgICAgaWYgKHNob3dTZWVrQmFyKSB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlZWtiYXJQcm9ncmVzc0JhY2tncm91bmQoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yOTcsOSArMjkzLDcgQEAKICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUgPSBtQ29udGV4dC5nZXREcmF3YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5tZWRpYV9vdXRwdXRfaXRlbV9iYWNrZ3JvdW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZSgpOwotICAgICAgICAgICAgICAgIGJhY2tncm91bmREcmF3YWJsZS5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgICAgIGJhY2tncm91bmREcmF3YWJsZS5zZXRUaW50KG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtSXRlbUxheW91dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmREcmF3YWJsZSk7CiAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuc2V0VmlzaWJpbGl0eShzaG93UHJvZ3Jlc3NCYXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwpAQCAtNDQyLDExICs0MzYsMTAgQEAKIAogICAgICAgICB2b2lkIHVwZGF0ZVRpdGxlSWNvbihARHJhd2FibGVSZXMgaW50IGlkLCBpbnQgY29sb3IpIHsKICAgICAgICAgICAgIG1UaXRsZUljb24uc2V0SW1hZ2VEcmF3YWJsZShtQ29udGV4dC5nZXREcmF3YWJsZShpZCkpOwotICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRDb2xvckZpbHRlcihjb2xvcik7CisgICAgICAgICAgICBtVGl0bGVJY29uLnNldEltYWdlVGludExpc3QoQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihjb2xvcikpOwogICAgICAgICAgICAgaWYgKG1Db250cm9sbGVyLmlzQWR2YW5jZWRMYXlvdXRTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5nZXRCYWNrZ3JvdW5kKCkuc2V0Q29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9yU2Vla2JhclByb2dyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgICAgICBtSWNvbkFyZWFMYXlvdXQuc2V0QmFja2dyb3VuZFRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDYyLDkgKzQ1NSw3IEBACiAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBiYWNrZ3JvdW5kRHJhd2FibGUgPSBtQ29udGV4dC5nZXREcmF3YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUubWVkaWFfb3V0cHV0X2l0ZW1fYmFja2dyb3VuZF9hY3RpdmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZSgpOwotICAgICAgICAgICAgYmFja2dyb3VuZERyYXdhYmxlLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUuc2V0VGludChtQ29udHJvbGxlci5nZXRDb2xvckNvbm5lY3RlZEl0ZW1CYWNrZ3JvdW5kKCkpOwogICAgICAgICAgICAgbUl0ZW1MYXlvdXQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kRHJhd2FibGUpOwogICAgICAgICB9CiAKQEAgLTUzOSwxMCArNTMwLDggQEAKICAgICAgICAgRHJhd2FibGUgZ2V0U3BlYWtlckRyYXdhYmxlKCkgewogICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtQ29udGV4dC5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3NwZWFrZXJfZ3JvdXBfYmxhY2tfMjRkcCkKICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZSgpOwotICAgICAgICAgICAgZHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoVXRpbHMuZ2V0Q29sb3JTdGF0ZUxpc3REZWZhdWx0Q29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5jb2xvci5tZWRpYV9kaWFsb2dfaXRlbV9tYWluX2NvbnRlbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnNldFRpbnQoVXRpbHMuZ2V0Q29sb3JTdGF0ZUxpc3REZWZhdWx0Q29sb3IobUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIFIuY29sb3IubWVkaWFfZGlhbG9nX2l0ZW1fbWFpbl9jb250ZW50KSk7CiAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CiAgICAgICAgIH0KIApAQCAtNTc0LDcgKzU2Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRJbWFnZUljb24oaWNvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZUljb24uc2V0Q29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWNvbi5zZXRUaW50KG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZUljb24uc2V0SW1hZ2VUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRNZXRyaWNMb2dnZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRNZXRyaWNMb2dnZXIuamF2YQppbmRleCAyMjUwZDcyLi4zOWQ0ZTZlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0TWV0cmljTG9nZ2VyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dE1ldHJpY0xvZ2dlci5qYXZhCkBAIC04MCw2ICs4MCwxMCBAQAogICAgICAgICAgICAgTG9nLmQoVEFHLCAibG9nT3V0cHV0U3VjY2VzcyAtIHNlbGVjdGVkIGRldmljZTogIiArIHNlbGVjdGVkRGV2aWNlVHlwZSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVNvdXJjZURldmljZSA9PSBudWxsICYmIG1UYXJnZXREZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdXBkYXRlTG9nZ2luZ0RldmljZUNvdW50KGRldmljZUxpc3QpOwogCiAgICAgICAgIFN5c1VpU3RhdHNMb2cud3JpdGUoCkBAIC0xMDUsNiArMTA5LDEwIEBACiAgICAgICAgICAgICBMb2cuZChUQUcsICJsb2dPdXRwdXRTdWNjZXNzIC0gc2VsZWN0ZWQgZGV2aWNlOiAiICsgc2VsZWN0ZWREZXZpY2VUeXBlKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtU291cmNlRGV2aWNlID09IG51bGwgJiYgbVRhcmdldERldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICB1cGRhdGVMb2dnaW5nTWVkaWFJdGVtQ291bnQoZGV2aWNlSXRlbUxpc3QpOwogCiAgICAgICAgIFN5c1VpU3RhdHNMb2cud3JpdGUoCkBAIC0xNzYsNiArMTg0LDEwIEBACiAgICAgICAgICAgICBMb2cuZShUQUcsICJsb2dSZXF1ZXN0RmFpbGVkIC0gIiArIHJlYXNvbik7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVNvdXJjZURldmljZSA9PSBudWxsICYmIG1UYXJnZXREZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdXBkYXRlTG9nZ2luZ0RldmljZUNvdW50KGRldmljZUxpc3QpOwogCiAgICAgICAgIFN5c1VpU3RhdHNMb2cud3JpdGUoCkBAIC0yMDEsNiArMjEzLDEwIEBACiAgICAgICAgICAgICBMb2cuZShUQUcsICJsb2dSZXF1ZXN0RmFpbGVkIC0gIiArIHJlYXNvbik7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVNvdXJjZURldmljZSA9PSBudWxsICYmIG1UYXJnZXREZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdXBkYXRlTG9nZ2luZ01lZGlhSXRlbUNvdW50KGRldmljZUl0ZW1MaXN0KTsKIAogICAgICAgICBTeXNVaVN0YXRzTG9nLndyaXRlKApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL3RhcHRvdHJhbnNmZXIvcmVjZWl2ZXIvTWVkaWFUdHRDaGlwQ29udHJvbGxlclJlY2VpdmVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL3RhcHRvdHJhbnNmZXIvcmVjZWl2ZXIvTWVkaWFUdHRDaGlwQ29udHJvbGxlclJlY2VpdmVyLmt0CmluZGV4IGZhYjhjMDYuLjc4MDgyYzMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS90YXB0b3RyYW5zZmVyL3JlY2VpdmVyL01lZGlhVHR0Q2hpcENvbnRyb2xsZXJSZWNlaXZlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvdGFwdG90cmFuc2Zlci9yZWNlaXZlci9NZWRpYVR0dENoaXBDb250cm9sbGVyUmVjZWl2ZXIua3QKQEAgLTIyNSw4ICsyMjUsMTAgQEAKICAgICAgICAgdmFsIGljb25SaXBwbGVWaWV3OiBSZWNlaXZlckNoaXBSaXBwbGVWaWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC5pY29uX2dsb3dfcmlwcGxlKQogICAgICAgICB2YWwgcmlwcGxlVmlldzogUmVjZWl2ZXJDaGlwUmlwcGxlVmlldyA9IHZpZXcucmVxdWlyZVZpZXdCeUlkKFIuaWQucmlwcGxlKQogICAgICAgICB2YWwgdHJhbnNsYXRpb25ZQnkgPSBnZXRUcmFuc2xhdGlvbkFtb3VudCgpCisgICAgICAgIC8vIEV4cGFuZCByaXBwbGUgYmVmb3JlIHRyYW5zbGF0aW5nIGljb24gY29udGFpbmVyIHRvIG1ha2Ugc3VyZSBib3RoIHZpZXdzIGhhdmUgc2FtZSBib3VuZHMuCisgICAgICAgIHJpcHBsZUNvbnRyb2xsZXIuZXhwYW5kVG9JblByb2dyZXNzU3RhdGUocmlwcGxlVmlldywgaWNvblJpcHBsZVZpZXcpCiAgICAgICAgIC8vIE1ha2UgdGhlIGljb24gY29udGFpbmVyIHZpZXcgc3RhcnRzIGFuaW1hdGlvbiBmcm9tIGJvdHRvbSBvZiB0aGUgc2NyZWVuLgotICAgICAgICBpY29uQ29udGFpbmVyVmlldy50cmFuc2xhdGlvblkgKz0gcmlwcGxlQ29udHJvbGxlci5nZXRSZWNlaXZlckljb25TaXplKCkKKyAgICAgICAgaWNvbkNvbnRhaW5lclZpZXcudHJhbnNsYXRpb25ZID0gcmlwcGxlQ29udHJvbGxlci5nZXRSZWNlaXZlckljb25TaXplKCkudG9GbG9hdCgpCiAgICAgICAgIGFuaW1hdGVWaWV3VHJhbnNsYXRpb25BbmRGYWRlKAogICAgICAgICAgICAgaWNvbkNvbnRhaW5lclZpZXcsCiAgICAgICAgICAgICB0cmFuc2xhdGlvbllCeSA9IC0xICogdHJhbnNsYXRpb25ZQnksCkBAIC0yMzUsNyArMjM3LDYgQEAKICAgICAgICAgKSB7CiAgICAgICAgICAgICBhbmltYXRlQm91bmNpbmdWaWV3KGljb25Db250YWluZXJWaWV3LCB0cmFuc2xhdGlvbllCeSAqIEJPVU5DRV9UUkFOU0xBVElPTl9SQVRJTykKICAgICAgICAgfQotICAgICAgICByaXBwbGVDb250cm9sbGVyLmV4cGFuZFRvSW5Qcm9ncmVzc1N0YXRlKHJpcHBsZVZpZXcsIGljb25SaXBwbGVWaWV3KQogICAgIH0KIAogICAgIG92ZXJyaWRlIGZ1biBhbmltYXRlVmlld091dCh2aWV3OiBWaWV3R3JvdXAsIHJlbW92YWxSZWFzb246IFN0cmluZz8sIG9uQW5pbWF0aW9uRW5kOiBSdW5uYWJsZSkgewpAQCAtMjkzLDcgKzI5NCw3IEBACiAKICAgICAvKiogUmV0dXJucyB0aGUgYW1vdW50IHRoYXQgdGhlIGNoaXAgd2lsbCBiZSB0cmFuc2xhdGVkIGJ5IGluIGl0cyBpbnRybyBhbmltYXRpb24uICovCiAgICAgcHJpdmF0ZSBmdW4gZ2V0VHJhbnNsYXRpb25BbW91bnQoKTogRmxvYXQgewotICAgICAgICByZXR1cm4gcmlwcGxlQ29udHJvbGxlci5nZXRSaXBwbGVTaXplKCkgKiAwLjVmCisgICAgICAgIHJldHVybiByaXBwbGVDb250cm9sbGVyLmdldFJlY2VpdmVySWNvblNpemUoKSAqIDJmCiAgICAgfQogCiAgICAgcHJpdmF0ZSBmdW4gVmlldy5nZXRBcHBJY29uVmlldygpOiBDYWNoaW5nSWNvblZpZXcgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9tb2RlbC9NdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvbW9kZWwvTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4MDI4YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvbW9kZWwvTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwua3QKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5tb2RlbAorCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVJZAorCisvKiogTW9kZWxzIHRoZSBjdXJyZW50IGludGVyYWN0aW9uIHdpdGggb25lIG9mIHRoZSBzaGFkZXMuICovCitkYXRhIGNsYXNzIE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsKAorICAgIC8qKiBUaGUgSUQgb2YgdGhlIHNoYWRlIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGludGVyYWN0aW5nIHdpdGguICovCisgICAgdmFsIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgLyoqIFdoZXRoZXIgdGhlIGludGVyYWN0aW9uIGlzIHByb3hpZWQgKGFzIGluOiBjb21pbmcgZnJvbSBhbiBleHRlcm5hbCBhcHAgb3IgZGlmZmVyZW50IFVJKS4gKi8KKyAgICB2YWwgaXNQcm94aWVkOiBCb29sZWFuLAorKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9yZW1vdGVwcm94eS9NdWx0aVNoYWRlSW5wdXRQcm94eS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVtb3RlcHJveHkvTXVsdGlTaGFkZUlucHV0UHJveHkua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmMGMwZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVtb3RlcHJveHkvTXVsdGlTaGFkZUlucHV0UHJveHkua3QKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eQorCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5jaGFubmVscy5CdWZmZXJPdmVyZmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5NdXRhYmxlU2hhcmVkRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmFzU2hhcmVkRmxvdworCisvKioKKyAqIEFjdHMgYXMgYSBodWIgZm9yIHJvdXRpbmcgcHJveGllZCB1c2VyIGlucHV0IGludG8gdGhlIG11bHRpIHNoYWRlIHN5c3RlbS4KKyAqCisgKiAiUHJveGllZCIgdXNlciBpbnB1dCBpcyBjb21pbmcgdGhyb3VnaCBhIHByb3h5OyB0eXBpY2FsbHkgZnJvbSBhbiBleHRlcm5hbCBhcHAgb3IgZGlmZmVyZW50IFVJLgorICogSW4gb3RoZXIgd29yZHM6IGl0J3Mgbm90IHVzZXIgaW5wdXQgdGhhdCdzIG9jY3VycmluZyBkaXJlY3RseSBvbiB0aGUgc2hhZGUgVUkgaXRzZWxmLiBUaGlzIGNsYXNzCisgKiBpcyB0aGF0IHByb3h5LgorICovCitAU2luZ2xldG9uCitjbGFzcyBNdWx0aVNoYWRlSW5wdXRQcm94eSBASW5qZWN0IGNvbnN0cnVjdG9yKCkgeworICAgIHByaXZhdGUgdmFsIF9wcm94aWVkVG91Y2ggPQorICAgICAgICBNdXRhYmxlU2hhcmVkRmxvdzxQcm94aWVkSW5wdXRNb2RlbD4oCisgICAgICAgICAgICByZXBsYXkgPSAxLAorICAgICAgICAgICAgb25CdWZmZXJPdmVyZmxvdyA9IEJ1ZmZlck92ZXJmbG93LkRST1BfT0xERVNULAorICAgICAgICApCisgICAgdmFsIHByb3hpZWRJbnB1dDogRmxvdzxQcm94aWVkSW5wdXRNb2RlbD4gPSBfcHJveGllZFRvdWNoLmFzU2hhcmVkRmxvdygpCisKKyAgICBmdW4gb25Qcm94aWVkSW5wdXQocHJveGllZElucHV0OiBQcm94aWVkSW5wdXRNb2RlbCkgeworICAgICAgICBfcHJveGllZFRvdWNoLnRyeUVtaXQocHJveGllZElucHV0KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVwb3NpdG9yeS9NdWx0aVNoYWRlUmVwb3NpdG9yeS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVwb3NpdG9yeS9NdWx0aVNoYWRlUmVwb3NpdG9yeS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTcyMDMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9yZXBvc2l0b3J5L011bHRpU2hhZGVSZXBvc2l0b3J5Lmt0CkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlcG9zaXRvcnkKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5TeXNVSVNpbmdsZXRvbgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLkFwcGxpY2F0aW9uCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLm1vZGVsLk11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlbW90ZXByb3h5Lk11bHRpU2hhZGVJbnB1dFByb3h5CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUNvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlSWQKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZU1vZGVsCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5NdXRhYmxlU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuYXNTdGF0ZUZsb3cKKworLyoqIEVuY2Fwc3VsYXRlcyBhcHBsaWNhdGlvbiBzdGF0ZSBmb3IgYWxsIHNoYWRlcy4gKi8KK0BTeXNVSVNpbmdsZXRvbgorY2xhc3MgTXVsdGlTaGFkZVJlcG9zaXRvcnkKK0BJbmplY3QKK2NvbnN0cnVjdG9yKAorICAgIEBBcHBsaWNhdGlvbiBwcml2YXRlIHZhbCBhcHBsaWNhdGlvbkNvbnRleHQ6IENvbnRleHQsCisgICAgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHksCispIHsKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaW5wdXQgY29taW5nIGZyb20gc291cmNlcyBvdXRzaWRlIG9mIHN5c3RlbSBVSSAoZm9yIGV4YW1wbGUsIHN3aXBpbmcgZG93biBvbiB0aGUKKyAgICAgKiBMYXVuY2hlciBvciBmcm9tIHRoZSBzdGF0dXMgYmFyKS4KKyAgICAgKi8KKyAgICB2YWwgcHJveGllZElucHV0OiBGbG93PFByb3hpZWRJbnB1dE1vZGVsPiA9IGlucHV0UHJveHkucHJveGllZElucHV0CisKKyAgICAvKiogV2lkdGggb2YgdGhlIGxlZnQtaGFuZCBzaWRlIHNoYWRlLCBpbiBwaXhlbHMuICovCisgICAgcHJpdmF0ZSB2YWwgbGVmdFNoYWRlV2lkdGhQeCA9CisgICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubGVmdF9zaGFkZV93aWR0aCkKKworICAgIC8qKiBXaWR0aCBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlIHNoYWRlLCBpbiBwaXhlbHMuICovCisgICAgcHJpdmF0ZSB2YWwgcmlnaHRTaGFkZVdpZHRoUHggPQorICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQucmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnJpZ2h0X3NoYWRlX3dpZHRoKQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgdXAgd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgZXhwYW5kZWQgdG8gYXV0b21hdGljYWxseQorICAgICAqIGNvbGxhcHNlIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBleHBhbmRlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgZnJhY3Rpb24gYmV0d2VlbiBgMGAgYW5kIGAxYC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhbCBzd2lwZUNvbGxhcHNlVGhyZXNob2xkID0KKyAgICAgICAgY2hlY2tJbkJvdW5kcyhhcHBsaWNhdGlvbkNvbnRleHQucmVzb3VyY2VzLmdldEZsb2F0KFIuZGltZW4uc2hhZGVfc3dpcGVfY29sbGFwc2VfdGhyZXNob2xkKSkKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdXNlciBtdXN0IHN3aXBlIGRvd24gd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgY29sbGFwc2VkIHRvIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBleHBhbmQgb25jZSB0aGUgdXNlciBsZXRzIGdvIG9mIHRoZSBzaGFkZS4gSWYgdGhlIHVzZXIgc3dpcGVzIGxlc3MgdGhhbiB0aGlzIGFtb3VudCwgdGhlCisgICAgICogc2hhZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJldmVydCBiYWNrIHRvIGZ1bGx5IGNvbGxhcHNlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgZnJhY3Rpb24gYmV0d2VlbiBgMGAgYW5kIGAxYC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZCA9CisgICAgICAgIGNoZWNrSW5Cb3VuZHMoYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXRGbG9hdChSLmRpbWVuLnNoYWRlX3N3aXBlX2V4cGFuZF90aHJlc2hvbGQpKQorCisgICAgLyoqCisgICAgICogTWF4aW11bSBvcGFjaXR5IHdoZW4gdGhlIHNjcmltIHRoYXQgc2hvd3MgdXAgYmVoaW5kIHRoZSBkdWFsIHNoYWRlcyBpcyBmdWxseSB2aXNpYmxlLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGZyYWN0aW9uIGJldHdlZW4gYDBgIGFuZCBgMWAuCisgICAgICovCisgICAgcHJpdmF0ZSB2YWwgZHVhbFNoYWRlU2NyaW1BbHBoYSA9CisgICAgICAgIGNoZWNrSW5Cb3VuZHMoYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXRGbG9hdChSLmRpbWVuLmR1YWxfc2hhZGVfc2NyaW1fYWxwaGEpKQorCisgICAgLyoqIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNoYWRlIHN5c3RlbS4gKi8KKyAgICB2YWwgc2hhZGVDb25maWc6IFN0YXRlRmxvdzxTaGFkZUNvbmZpZz4gPQorICAgICAgICBNdXRhYmxlU3RhdGVGbG93KAorICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbkNvbnRleHQucmVzb3VyY2VzLmdldEJvb2xlYW4oUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNoYWRlV2lkdGhQeCA9IGxlZnRTaGFkZVdpZHRoUHgsCisgICAgICAgICAgICAgICAgICAgICAgICByaWdodFNoYWRlV2lkdGhQeCA9IHJpZ2h0U2hhZGVXaWR0aFB4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVDb2xsYXBzZVRocmVzaG9sZCA9IHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUV4cGFuZFRocmVzaG9sZCA9IHN3aXBlRXhwYW5kVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRGcmFjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXRGbG9hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5kdWFsX3NoYWRlX3NwbGl0X2ZyYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmltQWxwaGEgPSBkdWFsU2hhZGVTY3JpbUFscGhhLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVDb25maWcuU2luZ2xlU2hhZGVDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUNvbGxhcHNlVGhyZXNob2xkID0gc3dpcGVDb2xsYXBzZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXBlRXhwYW5kVGhyZXNob2xkID0gc3dpcGVFeHBhbmRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApCisgICAgICAgICAgICAuYXNTdGF0ZUZsb3coKQorCisgICAgcHJpdmF0ZSB2YWwgX2ZvcmNlQ29sbGFwc2VBbGwgPSBNdXRhYmxlU3RhdGVGbG93KGZhbHNlKQorICAgIC8qKiBXaGV0aGVyIGFsbCBzaGFkZXMgc2hvdWxkIGJlIGNvbGxhcHNlZC4gKi8KKyAgICB2YWwgZm9yY2VDb2xsYXBzZUFsbDogU3RhdGVGbG93PEJvb2xlYW4+ID0gX2ZvcmNlQ29sbGFwc2VBbGwuYXNTdGF0ZUZsb3coKQorCisgICAgcHJpdmF0ZSB2YWwgX3NoYWRlSW50ZXJhY3Rpb24gPSBNdXRhYmxlU3RhdGVGbG93PE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsPz4obnVsbCkKKyAgICAvKiogVGhlIGN1cnJlbnQgc2hhZGUgaW50ZXJhY3Rpb24gb3IgYG51bGxgIGlmIG5vIHNoYWRlIGlzIGludGVyYWN0ZWQgd2l0aCBjdXJyZW50bHkuICovCisgICAgdmFsIHNoYWRlSW50ZXJhY3Rpb246IFN0YXRlRmxvdzxNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbD8+ID0gX3NoYWRlSW50ZXJhY3Rpb24uYXNTdGF0ZUZsb3coKQorCisgICAgcHJpdmF0ZSB2YWwgc3RhdGVCeVNoYWRlID0gbXV0YWJsZU1hcE9mPFNoYWRlSWQsIE11dGFibGVTdGF0ZUZsb3c8U2hhZGVNb2RlbD4+KCkKKworICAgIC8qKiBUaGUgbW9kZWwgZm9yIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRC4gKi8KKyAgICBmdW4gZ2V0U2hhZGUoCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgKTogU3RhdGVGbG93PFNoYWRlTW9kZWw+IHsKKyAgICAgICAgcmV0dXJuIGdldE11dGFibGVTaGFkZShzaGFkZUlkKS5hc1N0YXRlRmxvdygpCisgICAgfQorCisgICAgLyoqIFNldHMgdGhlIGV4cGFuc2lvbiBhbW91bnQgZm9yIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRC4gKi8KKyAgICBmdW4gc2V0RXhwYW5zaW9uKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgZXhwYW5zaW9uOiBGbG9hdCwKKyAgICApIHsKKyAgICAgICAgZ2V0TXV0YWJsZVNoYWRlKHNoYWRlSWQpLmxldCB7IG11dGFibGVTdGF0ZSAtPgorICAgICAgICAgICAgbXV0YWJsZVN0YXRlLnZhbHVlID0gbXV0YWJsZVN0YXRlLnZhbHVlLmNvcHkoZXhwYW5zaW9uID0gZXhwYW5zaW9uKQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFNldHMgd2hldGhlciBhbGwgc2hhZGVzIHNob3VsZCBiZSBpbW1lZGlhdGVseSBmb3JjZWQgdG8gY29sbGFwc2UuICovCisgICAgZnVuIHNldEZvcmNlQ29sbGFwc2VBbGwoaXNGb3JjZWQ6IEJvb2xlYW4pIHsKKyAgICAgICAgX2ZvcmNlQ29sbGFwc2VBbGwudmFsdWUgPSBpc0ZvcmNlZAorICAgIH0KKworICAgIC8qKiBTZXRzIHRoZSBjdXJyZW50IHNoYWRlIGludGVyYWN0aW9uOyB1c2UgYG51bGxgIGlmIG5vIHNoYWRlIGlzIGludGVyYWN0ZWQgd2l0aCBjdXJyZW50bHkuICovCisgICAgZnVuIHNldFNoYWRlSW50ZXJhY3Rpb24oc2hhZGVJbnRlcmFjdGlvbjogTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWw/KSB7CisgICAgICAgIF9zaGFkZUludGVyYWN0aW9uLnZhbHVlID0gc2hhZGVJbnRlcmFjdGlvbgorICAgIH0KKworICAgIHByaXZhdGUgZnVuIGdldE11dGFibGVTaGFkZShpZDogU2hhZGVJZCk6IE11dGFibGVTdGF0ZUZsb3c8U2hhZGVNb2RlbD4geworICAgICAgICByZXR1cm4gc3RhdGVCeVNoYWRlLmdldE9yUHV0KGlkKSB7IE11dGFibGVTdGF0ZUZsb3coU2hhZGVNb2RlbChpZCkpIH0KKyAgICB9CisKKyAgICAvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBbRmxvYXRdIGlzIGluIHRoZSByYW5nZSBvZiBgMGAgYW5kIGAxYCwgaW5jbHVzaXZlLiAqLworICAgIHByaXZhdGUgZnVuIGNoZWNrSW5Cb3VuZHMoZmxvYXQ6IEZsb2F0KTogRmxvYXQgeworICAgICAgICBjaGVjayhmbG9hdCBpbiAwZi4uMWYpIHsgIiRmbG9hdCBpc24ndCBiZXR3ZWVuIDAgYW5kIDEuIiB9CisgICAgICAgIHJldHVybiBmbG9hdAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RvbWFpbi9pbnRlcmFjdG9yL011bHRpU2hhZGVJbnRlcmFjdG9yLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZG9tYWluL2ludGVyYWN0b3IvTXVsdGlTaGFkZUludGVyYWN0b3Iua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RvbWFpbi9pbnRlcmFjdG9yL011bHRpU2hhZGVJbnRlcmFjdG9yLmt0CkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3RvcgorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c1VJU2luZ2xldG9uCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLnF1YWxpZmllcnMuQXBwbGljYXRpb24KK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEubW9kZWwuTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVwb3NpdG9yeS5NdWx0aVNoYWRlUmVwb3NpdG9yeQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVNb2RlbAoraW1wb3J0IGphdmF4LmluamVjdC5JbmplY3QKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuQ29yb3V0aW5lU2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5TaGFyZWRGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU2hhcmluZ1N0YXJ0ZWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5TdGF0ZUZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5jb21iaW5lCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZGlzdGluY3RVbnRpbENoYW5nZWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5mbGF0TWFwTGF0ZXN0CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cubWFwCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cub25FYWNoCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuc2hhcmVJbgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy55aWVsZAorCisvKiogRW5jYXBzdWxhdGVzIGJ1c2luZXNzIGxvZ2ljIHJlbGF0ZWQgdG8gaW50ZXJhY3Rpb25zIHdpdGggdGhlIG11bHRpLXNoYWRlIHN5c3RlbS4gKi8KK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK0BTeXNVSVNpbmdsZXRvbgorY2xhc3MgTXVsdGlTaGFkZUludGVyYWN0b3IKK0BJbmplY3QKK2NvbnN0cnVjdG9yKAorICAgIEBBcHBsaWNhdGlvbiBwcml2YXRlIHZhbCBhcHBsaWNhdGlvblNjb3BlOiBDb3JvdXRpbmVTY29wZSwKKyAgICBwcml2YXRlIHZhbCByZXBvc2l0b3J5OiBNdWx0aVNoYWRlUmVwb3NpdG9yeSwKKyAgICBwcml2YXRlIHZhbCBpbnB1dFByb3h5OiBNdWx0aVNoYWRlSW5wdXRQcm94eSwKKykgeworICAgIC8qKiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBzaGFkZSBzeXN0ZW0uICovCisgICAgdmFsIHNoYWRlQ29uZmlnOiBTdGF0ZUZsb3c8U2hhZGVDb25maWc+ID0gcmVwb3NpdG9yeS5zaGFkZUNvbmZpZworCisgICAgLyoqIFRoZSBleHBhbnNpb24gb2YgdGhlIHNoYWRlIHRoYXQncyBtb3N0IGV4cGFuZGVkLiAqLworICAgIHZhbCBtYXhTaGFkZUV4cGFuc2lvbjogRmxvdzxGbG9hdD4gPQorICAgICAgICByZXBvc2l0b3J5LnNoYWRlQ29uZmlnLmZsYXRNYXBMYXRlc3QgeyBzaGFkZUNvbmZpZyAtPgorICAgICAgICAgICAgY29tYmluZShhbGxTaGFkZXMoc2hhZGVDb25maWcpKSB7IHNoYWRlTW9kZWxzIC0+CisgICAgICAgICAgICAgICAgc2hhZGVNb2RlbHMubWF4T2ZPck51bGwgeyBpdC5leHBhbnNpb24gfSA/OiAwZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIF9wcm9jZXNzZWRfIHZlcnNpb24gb2YgdGhlIHByb3hpZWQgaW5wdXQgZmxvdy4KKyAgICAgKgorICAgICAqIEFsbCBpbnRlcm5hbCBkZXBlbmRlbmNpZXMgb24gdGhlIHByb3hpZWQgaW5wdXQgZmxvdyAqbXVzdCogdXNlIHRoaXMgb25lIGZvciB0d28gcmVhc29uczoKKyAgICAgKiAxLiBJdCdzIGEgW1NoYXJlZEZsb3ddIHNvIHdlIG9ubHkgZG8gdGhlIHVwc3RyZWFtIHdvcmsgb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IHVzYWdlcyB3ZQorICAgICAqICAgIGFjdHVhbGx5IGhhdmUuCisgICAgICogMi4gSXQgYWN0dWFsbHkgZG9lcyBzb21lIHByZXByb2Nlc3NpbmcgYXMgdGhlIHByb3hpZWQgaW5wdXQgZXZlbnRzIHN0cmVhbSB0aHJvdWdoLCBoYW5kbGluZworICAgICAqICAgIGNvbW1vbiB0aGluZ3MgbGlrZSByZWNvcmRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbSBiYXNlZCBvbiBpbmNvbWluZyBpbnB1dAorICAgICAqICAgIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhbCBwcm9jZXNzZWRQcm94aWVkSW5wdXQ6IFNoYXJlZEZsb3c8UHJveGllZElucHV0TW9kZWw+ID0KKyAgICAgICAgY29tYmluZSgKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNoYWRlQ29uZmlnLAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkucHJveGllZElucHV0LmRpc3RpbmN0VW50aWxDaGFuZ2VkKCksCisgICAgICAgICAgICAgICAgOjpQYWlyLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgLm1hcCB7IChzaGFkZUNvbmZpZywgcHJveGllZElucHV0KSAtPgorICAgICAgICAgICAgICAgIGlmIChwcm94aWVkSW5wdXQgIWlzIFByb3hpZWRJbnB1dE1vZGVsLk9uVGFwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGludGVyYWN0aW5nIHdpdGggYW55IG90aGVyIGdlc3R1cmUgdHlwZSAoZm9yIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAvLyBkcmFnZ2luZyksCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5vIGxvbmdlciB3YW50IHRvIGZvcmNlIGNvbGxhcHNlIGFsbCBzaGFkZXMuCisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuc2V0Rm9yY2VDb2xsYXBzZUFsbChmYWxzZSkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGVuIChwcm94aWVkSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaXMgUHJveGllZElucHV0TW9kZWwuT25EcmFnIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBhZmZlY3RlZFNoYWRlSWQgPSBhZmZlY3RlZFNoYWRlSWQoc2hhZGVDb25maWcsIHByb3hpZWRJbnB1dC54RnJhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGJlIHRoZSBzdGFydCBvZiBhIG5ldyBkcmFnIGdlc3R1cmUsIGxldCdzIHVwZGF0ZSBvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB0byByZWNvcmQgdGhhdCBmYWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgb25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlSWQgPSBhZmZlY3RlZFNoYWRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcm94aWVkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpcyBQcm94aWVkSW5wdXRNb2RlbC5PblRhcCAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG91dHNpZGUgYW55IHNoYWRlIGNvbGxhcHNlcyBhbGwgc2hhZGVzLiBUaGlzIGNvZGUgcGF0aCBpcyBub3QgaGl0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcHMgdGhhdCBoYXBwZW4gX2luc2lkZV8gYSBzaGFkZSBhcyB0aGF0IGlucHV0IGV2ZW50IGlzIGRpcmVjdGx5IGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIFVJIGFuZCBpcywgaGVuY2UsIG5vdCBhIHByb3hpZWQgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFsbCgpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAtPiBVbml0CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJveGllZElucHV0CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuc2hhcmVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IGFwcGxpY2F0aW9uU2NvcGUsCisgICAgICAgICAgICAgICAgc3RhcnRlZCA9IFNoYXJpbmdTdGFydGVkLkVhZ2VybHksCisgICAgICAgICAgICAgICAgcmVwbGF5ID0gMSwKKyAgICAgICAgICAgICkKKworICAgIC8qKiBXaGV0aGVyIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRCBzaG91bGQgYmUgdmlzaWJsZS4gKi8KKyAgICBmdW4gaXNWaXNpYmxlKHNoYWRlSWQ6IFNoYWRlSWQpOiBGbG93PEJvb2xlYW4+IHsKKyAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuc2hhZGVDb25maWcubWFwIHsgc2hhZGVDb25maWcgLT4gc2hhZGVDb25maWcuc2hhZGVJZHMuY29udGFpbnMoc2hhZGVJZCkgfQorICAgIH0KKworICAgIC8qKiBXaGV0aGVyIGRpcmVjdCB1c2VyIGlucHV0IGlzIGFsbG93ZWQgb24gdGhlIHNoYWRlIHdpdGggdGhlIGdpdmVuIElELiAqLworICAgIGZ1biBpc05vblByb3hpZWRJbnB1dEFsbG93ZWQoc2hhZGVJZDogU2hhZGVJZCk6IEZsb3c8Qm9vbGVhbj4geworICAgICAgICByZXR1cm4gY29tYmluZSgKKyAgICAgICAgICAgICAgICBpc0ZvcmNlQ29sbGFwc2VkKHNoYWRlSWQpLAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuc2hhZGVJbnRlcmFjdGlvbiwKKyAgICAgICAgICAgICAgICA6OlBhaXIsCisgICAgICAgICAgICApCisgICAgICAgICAgICAubWFwIHsgKGlzRm9yY2VDb2xsYXBzZWQsIHNoYWRlSW50ZXJhY3Rpb24pIC0+CisgICAgICAgICAgICAgICAgIWlzRm9yY2VDb2xsYXBzZWQgJiYgc2hhZGVJbnRlcmFjdGlvbj8uaXNQcm94aWVkICE9IHRydWUKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogV2hldGhlciB0aGUgc2hhZGUgd2l0aCB0aGUgZ2l2ZW4gSUQgaXMgZm9yY2VkIHRvIGNvbGxhcHNlLiAqLworICAgIGZ1biBpc0ZvcmNlQ29sbGFwc2VkKHNoYWRlSWQ6IFNoYWRlSWQpOiBGbG93PEJvb2xlYW4+IHsKKyAgICAgICAgcmV0dXJuIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeS5mb3JjZUNvbGxhcHNlQWxsLAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuc2hhZGVJbnRlcmFjdGlvbi5tYXAgeyBpdD8uc2hhZGVJZCB9LAorICAgICAgICAgICAgICAgIDo6UGFpciwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5tYXAgeyAoY29sbGFwc2VBbGwsIHVzZXJJbnRlcmFjdGVkU2hhZGVJZE9yTnVsbCkgLT4KKyAgICAgICAgICAgICAgICB2YWwgY291bnRlcnBhcnRTaGFkZUlkT3JOdWxsID0KKyAgICAgICAgICAgICAgICAgICAgd2hlbiAoc2hhZGVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVJZC5TSU5HTEUgLT4gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVJZC5MRUZUIC0+IFNoYWRlSWQuUklHSFQKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlSWQuUklHSFQgLT4gU2hhZGVJZC5MRUZUCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoZW4geworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbGwgc2hhZGVzIGhhdmUgYmVlbiB0b2xkIHRvIGNvbGxhcHNlIChieSBhIHRhcCBvdXRzaWRlLCBmb3IgZXhhbXBsZSksCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhpcyBzaGFkZSBpcyBjb2xsYXBzZWQuCisgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQWxsIC0+IHRydWUKKyAgICAgICAgICAgICAgICAgICAgLy8gQSBzaGFkZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvdW50ZXJwYXJ0IHNoYWRlIGNhbm5vdCBiZSBmb3JjZS1jb2xsYXBzZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJhY3Rpb25zIG9uIHRoZSBjb3VudGVycGFydCBzaGFkZS4KKyAgICAgICAgICAgICAgICAgICAgY291bnRlcnBhcnRTaGFkZUlkT3JOdWxsID09IG51bGwgLT4gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgdXNlciBpbnRlcmFjdGlvbiBpcyBvbiB0aGUgY291bnRlcnBhcnQgc2hhZGUsIHRoZW4gdGhpcyBzaGFkZQorICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgZm9yY2UtY29sbGFwc2VkLgorICAgICAgICAgICAgICAgICAgICBlbHNlIC0+IHVzZXJJbnRlcmFjdGVkU2hhZGVJZE9yTnVsbCA9PSBjb3VudGVycGFydFNoYWRlSWRPck51bGwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveGllZCBpbnB1dCBhZmZlY3RpbmcgdGhlIHNoYWRlIHdpdGggdGhlIGdpdmVuIElELiBUaGlzIGlzIGlucHV0IGNvbWluZyBmcm9tIHNvdXJjZXMKKyAgICAgKiBvdXRzaWRlIG9mIHN5c3RlbSBVSSAoZm9yIGV4YW1wbGUsIHN3aXBpbmcgZG93biBvbiB0aGUgTGF1bmNoZXIgb3IgZnJvbSB0aGUgc3RhdHVzIGJhcikgb3IKKyAgICAgKiBvdXRzaWRlIHRoZSBVSSBvZiBhbnkgc2hhZGUgKGZvciBleGFtcGxlLCB0aGUgc2NyaW0gdGhhdCdzIHNob3duIGJlaGluZCB0aGUgc2hhZGVzKS4KKyAgICAgKi8KKyAgICBmdW4gcHJveGllZElucHV0KHNoYWRlSWQ6IFNoYWRlSWQpOiBGbG93PFByb3hpZWRJbnB1dE1vZGVsPz4geworICAgICAgICByZXR1cm4gY29tYmluZSgKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWRQcm94aWVkSW5wdXQsCisgICAgICAgICAgICAgICAgaXNGb3JjZUNvbGxhcHNlZChzaGFkZUlkKS5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpLAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuc2hhZGVJbnRlcmFjdGlvbiwKKyAgICAgICAgICAgICAgICA6OlRyaXBsZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5tYXAgeyAocHJveGllZElucHV0LCBpc0ZvcmNlQ29sbGFwc2VkLCBzaGFkZUludGVyYWN0aW9uKSAtPgorICAgICAgICAgICAgICAgIHdoZW4geworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2hhZGUgaXMgZm9yY2UtY29sbGFwc2VkLCB3ZSBpZ25vcmVkIHByb3hpZWQgaW5wdXQgb24gaXQuCisgICAgICAgICAgICAgICAgICAgIGlzRm9yY2VDb2xsYXBzZWQgLT4gbnVsbAorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJveGllZCBpbnB1dCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBzaGFkZSwgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICBzaGFkZUludGVyYWN0aW9uPy5zaGFkZUlkICE9IHNoYWRlSWQgLT4gbnVsbAorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmdvaW5nIG5vbi1wcm94aWVkIHVzZXIgaW5wdXQgb24gYW55IHNoYWRlLCBpZ25vcmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHByb3hpZWQgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICFzaGFkZUludGVyYWN0aW9uLmlzUHJveGllZCAtPiBudWxsCisgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2VuZCB0aGUgcHJveGllZCBpbnB1dCBkb3duc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICBlbHNlIC0+IHByb3hpZWRJbnB1dAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5vbkVhY2ggeyBwcm94aWVkSW5wdXQgLT4KKyAgICAgICAgICAgICAgICAvLyBXZSB1c2UgeWllbGQoKSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGJsb2NrIG9mIGNvZGUgaGFwcGVucyBfYWZ0ZXJfCisgICAgICAgICAgICAgICAgLy8gZG93bnN0cmVhbSBjb2xsZWN0b3JzIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBwcm94aWVkIGlucHV0LiBPdGhlcndpc2UsIHdlCisgICAgICAgICAgICAgICAgLy8gbWlnaHQgY2hhbmdlIG91ciBzdGF0ZSB0byBjbGVhciB0aGUgY3VycmVudCBVc2VySW50ZXJhY3Rpb24gX2JlZm9yZV8gdGhvc2UKKyAgICAgICAgICAgICAgICAvLyBkb3duc3RyZWFtIGNvbGxlY3RvcnMgZ2V0IGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIHByb3hpZWQgaW5wdXQsIHdoaWNoIHdpbGwgbWFrZQorICAgICAgICAgICAgICAgIC8vIHRoZW0gaWdub3JlIGl0IChzaW5jZSB0aGV5IGlnbm9yZSBwcm94aWVkIGlucHV0IHdoZW4gdGhlIGN1cnJlbnQgdXNlciBpbnRlcmFjdGlvbgorICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggdGhlaXIgc2hhZGUpLgorICAgICAgICAgICAgICAgIHlpZWxkKCkKKworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgcHJveGllZElucHV0IGlzIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllZElucHV0IGlzIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0NhbmNlbAorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBvblVzZXJJbnRlcmFjdGlvbkVuZGVkKHNoYWRlSWQgPSBzaGFkZUlkLCBpc1Byb3hpZWQgPSB0cnVlKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgZXhwYW5zaW9uIGFtb3VudCBmb3IgdGhlIHNoYWRlIHdpdGggdGhlIGdpdmVuIElELiAqLworICAgIGZ1biBzZXRFeHBhbnNpb24oCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSBleHBhbnNpb246IEZsb2F0LAorICAgICkgeworICAgICAgICByZXBvc2l0b3J5LnNldEV4cGFuc2lvbihzaGFkZUlkLCBleHBhbnNpb24pCisgICAgfQorCisgICAgLyoqIENvbGxhcHNlcyBhbGwgc2hhZGVzLiAqLworICAgIGZ1biBjb2xsYXBzZUFsbCgpIHsKKyAgICAgICAgcmVwb3NpdG9yeS5zZXRGb3JjZUNvbGxhcHNlQWxsKHRydWUpCisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhhdCBhIG5ldyBub24tcHJveGllZCBpbnRlcmFjdGlvbiBtYXkgaGF2ZSBzdGFydGVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMgZm9yCisgICAgICogdGhlIHNhbWUgaW50ZXJhY3Rpb24gYXMgaXQgd29uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGludGVyYWN0aW9uLgorICAgICAqCisgICAgICogRXhpc3RpbmcgaW50ZXJhY3Rpb25zIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgW29uVXNlckludGVyYWN0aW9uRW5kZWRdLgorICAgICAqLworICAgIGZ1biBvblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoc2hhZGVJZDogU2hhZGVJZCkgeworICAgICAgICBvblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoCisgICAgICAgICAgICBzaGFkZUlkID0gc2hhZGVJZCwKKyAgICAgICAgICAgIGlzUHJveGllZCA9IGZhbHNlLAorICAgICAgICApCisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhhdCB0aGUgY3VycmVudCBub24tcHJveGllZCBpbnRlcmFjdGlvbiBoYXMgZW5kZWQuCisgICAgICoKKyAgICAgKiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMsIGV2ZW4gaWYgdGhlcmUncyBubyBjdXJyZW50IGludGVyYWN0aW9uIG9yIGV2ZW4gaWYgdGhlIGN1cnJlbnQKKyAgICAgKiBpbnRlcmFjdGlvbiBkb2Vzbid0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gc2hhZGUgb3IgaXMgcHJveGllZCBhcyB0aGUgY29kZSBpcyBhIG5vLW9wIHVubGVzcworICAgICAqIHRoZXJlJ3MgYSBtYXRjaCBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgY3VycmVudCBpbnRlcmFjdGlvbi4KKyAgICAgKi8KKyAgICBmdW4gb25Vc2VySW50ZXJhY3Rpb25FbmRlZCgKKyAgICAgICAgc2hhZGVJZDogU2hhZGVJZCwKKyAgICApIHsKKyAgICAgICAgb25Vc2VySW50ZXJhY3Rpb25FbmRlZCgKKyAgICAgICAgICAgIHNoYWRlSWQgPSBzaGFkZUlkLAorICAgICAgICAgICAgaXNQcm94aWVkID0gZmFsc2UsCisgICAgICAgICkKKyAgICB9CisKKyAgICBmdW4gc2VuZFByb3hpZWRJbnB1dChwcm94aWVkSW5wdXQ6IFByb3hpZWRJbnB1dE1vZGVsKSB7CisgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQocHJveGllZElucHV0KQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoYXQgYSBuZXcgaW50ZXJhY3Rpb24gbWF5IGhhdmUgc3RhcnRlZC4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZQorICAgICAqIGludGVyYWN0aW9uIGFzIGl0IHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBpbnRlcmFjdGlvbi4KKyAgICAgKgorICAgICAqIEV4aXN0aW5nIGludGVyYWN0aW9ucyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nIFtvblVzZXJJbnRlcmFjdGlvbkVuZGVkXS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1biBvblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgICAgIGlzUHJveGllZDogQm9vbGVhbiwKKyAgICApIHsKKyAgICAgICAgaWYgKHJlcG9zaXRvcnkuc2hhZGVJbnRlcmFjdGlvbi52YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIHJlcG9zaXRvcnkuc2V0U2hhZGVJbnRlcmFjdGlvbigKKyAgICAgICAgICAgIE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsKAorICAgICAgICAgICAgICAgIHNoYWRlSWQgPSBzaGFkZUlkLAorICAgICAgICAgICAgICAgIGlzUHJveGllZCA9IGlzUHJveGllZCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgaW50ZXJhY3Rpb24gaGFzIGVuZGVkLgorICAgICAqCisgICAgICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLCBldmVuIGlmIHRoZXJlJ3Mgbm8gY3VycmVudCBpbnRlcmFjdGlvbiBvciBldmVuIGlmIHRoZSBjdXJyZW50CisgICAgICogaW50ZXJhY3Rpb24gZG9lc24ndCBiZWxvbmcgdG8gdGhlIGdpdmVuIHNoYWRlIG9yIFtpc1Byb3hpZWRdIHZhbHVlIGFzIHRoZSBjb2RlIGlzIGEgbm8tb3AKKyAgICAgKiB1bmxlc3MgdGhlcmUncyBhIG1hdGNoIGJldHdlZW4gdGhlIHBhcmFtZXRlcnMgYW5kIHRoZSBjdXJyZW50IGludGVyYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZnVuIG9uVXNlckludGVyYWN0aW9uRW5kZWQoCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgICAgIGlzUHJveGllZDogQm9vbGVhbiwKKyAgICApIHsKKyAgICAgICAgcmVwb3NpdG9yeS5zaGFkZUludGVyYWN0aW9uLnZhbHVlPy5sZXQgeyAoaW50ZXJhY3Rpb25TaGFkZUlkLCBpc0ludGVyYWN0aW9uUHJveGllZCkgLT4KKyAgICAgICAgICAgIGlmIChzaGFkZUlkID09IGludGVyYWN0aW9uU2hhZGVJZCAmJiBpc1Byb3hpZWQgPT0gaXNJbnRlcmFjdGlvblByb3hpZWQpIHsKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNldFNoYWRlSW50ZXJhY3Rpb24obnVsbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElEIG9mIHRoZSBzaGFkZSB0aGF0J3MgYWZmZWN0ZWQgYnkgdXNlciBpbnB1dCBhdCBhIGdpdmVuIGNvb3JkaW5hdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBzaGFkZSBjb25maWd1cmF0aW9uIGJlaW5nIHVzZWQuCisgICAgICogQHBhcmFtIHhGcmFjdGlvbiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdXNlciBpbnB1dCBhcyBhIGZyYWN0aW9uIGFsb25nIHRoZSB3aWR0aCBvZgorICAgICAqICAgaXRzIGNvbnRhaW5lciB3aGVyZSBgMGAgaXMgYWxsIHRoZSB3YXkgdG8gdGhlIGxlZnQgYW5kIGAxYCBpcyBhbGwgdGhlIHdheSB0byB0aGUgcmlnaHQuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW4gYWZmZWN0ZWRTaGFkZUlkKAorICAgICAgICBjb25maWc6IFNoYWRlQ29uZmlnLAorICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgeEZyYWN0aW9uOiBGbG9hdCwKKyAgICApOiBTaGFkZUlkIHsKKyAgICAgICAgcmV0dXJuIGlmIChjb25maWcgaXMgU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKSB7CisgICAgICAgICAgICBpZiAoeEZyYWN0aW9uIDw9IGNvbmZpZy5zcGxpdEZyYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgU2hhZGVJZC5MRUZUCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNoYWRlSWQuUklHSFQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNoYWRlSWQuU0lOR0xFCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgbGlzdCBvZiBmbG93cyBvZiBhbGwgdGhlIHNoYWRlcyBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gKi8KKyAgICBwcml2YXRlIGZ1biBhbGxTaGFkZXMoCisgICAgICAgIGNvbmZpZzogU2hhZGVDb25maWcsCisgICAgKTogTGlzdDxGbG93PFNoYWRlTW9kZWw+PiB7CisgICAgICAgIHJldHVybiBjb25maWcuc2hhZGVJZHMubWFwIHsgc2hhZGVJZCAtPiByZXBvc2l0b3J5LmdldFNoYWRlKHNoYWRlSWQpIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvUHJveGllZElucHV0TW9kZWwua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvUHJveGllZElucHV0TW9kZWwua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxZGQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9Qcm94aWVkSW5wdXRNb2RlbC5rdApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uRmxvYXRSYW5nZQorCisvKioKKyAqIE1vZGVscyBhIHBhcnQgb2YgYW4gb25nb2luZyBwcm94aWVkIHVzZXIgaW5wdXQgZ2VzdHVyZS4KKyAqCisgKiAiUHJveGllZCIgdXNlciBpbnB1dCBpcyBjb21pbmcgdGhyb3VnaCBhIHByb3h5OyB0eXBpY2FsbHkgZnJvbSBhbiBleHRlcm5hbCBhcHAgb3IgZGlmZmVyZW50IFVJLgorICogSW4gb3RoZXIgd29yZHM6IGl0J3Mgbm90IHVzZXIgaW5wdXQgdGhhdCdzIG9jY3VycmluZyBkaXJlY3RseSBvbiB0aGUgc2hhZGUgVUkgaXRzZWxmLgorICovCitzZWFsZWQgY2xhc3MgUHJveGllZElucHV0TW9kZWwgeworICAgIC8qKiBUaGUgdXNlciBpcyBkcmFnZ2luZyB0aGVpciBwb2ludGVyLiAqLworICAgIGRhdGEgY2xhc3MgT25EcmFnKAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyIGFzIGEgZnJhY3Rpb24gb2YgaXRzIGNvbnRhaW5lciB3aWR0aCB3aGVyZSBgMGAgaXMKKyAgICAgICAgICogYWxsIHRoZSB3YXkgdG8gdGhlIGxlZnQgYW5kIGAxYCBpcyBhbGwgdGhlIHdheSB0byB0aGUgcmlnaHQuCisgICAgICAgICAqLworICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgdmFsIHhGcmFjdGlvbjogRmxvYXQsCisgICAgICAgIC8qKiBUaGUgYW1vdW50IHRoYXQgdGhlIHBvaW50ZXIgd2FzIGRyYWdnZWQsIGluIHBpeGVscy4gKi8KKyAgICAgICAgdmFsIHlEcmFnQW1vdW50UHg6IEZsb2F0LAorICAgICkgOiBQcm94aWVkSW5wdXRNb2RlbCgpCisKKyAgICAvKiogVGhlIHVzZXIgZmluaXNoZWQgZHJhZ2dpbmcgYnkgbGlmdGluZyB1cCB0aGVpciBwb2ludGVyLiAqLworICAgIG9iamVjdCBPbkRyYWdFbmQgOiBQcm94aWVkSW5wdXRNb2RlbCgpCisKKyAgICAvKioKKyAgICAgKiBUaGUgZHJhZyBnZXN0dXJlIGhhcyBiZWVuIGNhbmNlbGVkLiBVc3VhbGx5IGJlY2F1c2UgdGhlIHBvaW50ZXIgZXhpdGVkIHRoZSBkcmFnZ2FibGUgYXJlYS4KKyAgICAgKi8KKyAgICBvYmplY3QgT25EcmFnQ2FuY2VsIDogUHJveGllZElucHV0TW9kZWwoKQorCisgICAgLyoqIFRoZSB1c2VyIGhhcyB0YXBwZWQgKGNsaWNrZWQpLiAqLworICAgIG9iamVjdCBPblRhcCA6IFByb3hpZWRJbnB1dE1vZGVsKCkKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZUNvbmZpZy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZUNvbmZpZy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGNkMzVjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlQ29uZmlnLmt0CkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbAorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCisKKy8qKiBFbnVtZXJhdGVzIHRoZSB2YXJpb3VzIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIG9mIHRoZSBzaGFkZSBzeXN0ZW0uICovCitzZWFsZWQgY2xhc3MgU2hhZGVDb25maWcoCisKKyAgICAvKiogSURzIG9mIHRoZSBzaGFkZShzKSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uICovCisgICAgb3BlbiB2YWwgc2hhZGVJZHM6IExpc3Q8U2hhZGVJZD4sCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSB1cCB3aGVuIHRoZSBzaGFkZSBpcyBmdWxseSBleHBhbmRlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgICogY29sbGFwc2Ugb25jZSB0aGUgdXNlciBsZXRzIGdvIG9mIHRoZSBzaGFkZS4gSWYgdGhlIHVzZXIgc3dpcGVzIGxlc3MgdGhhbiB0aGlzIGFtb3VudCwgdGhlCisgICAgICogc2hhZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJldmVydCBiYWNrIHRvIGZ1bGx5IGV4cGFuZGVkIG9uY2UgdGhlIHVzZXIgc3RvcHMgc3dpcGluZy4KKyAgICAgKi8KKyAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgb3BlbiB2YWwgc3dpcGVDb2xsYXBzZVRocmVzaG9sZDogRmxvYXQsCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGNvbGxhcHNlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgICogZXhwYW5kIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBjb2xsYXBzZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgICAqLworICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSBvcGVuIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZDogRmxvYXQsCispIHsKKworICAgIC8qKiBUaGVyZSBpcyBhIHNpbmdsZSBzaGFkZS4gKi8KKyAgICBkYXRhIGNsYXNzIFNpbmdsZVNoYWRlQ29uZmlnKAorICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgb3ZlcnJpZGUgdmFsIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQ6IEZsb2F0LAorICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgb3ZlcnJpZGUgdmFsIHN3aXBlRXhwYW5kVGhyZXNob2xkOiBGbG9hdCwKKyAgICApIDoKKyAgICAgICAgU2hhZGVDb25maWcoCisgICAgICAgICAgICBzaGFkZUlkcyA9IGxpc3RPZihTaGFkZUlkLlNJTkdMRSksCisgICAgICAgICAgICBzd2lwZUNvbGxhcHNlVGhyZXNob2xkID0gc3dpcGVDb2xsYXBzZVRocmVzaG9sZCwKKyAgICAgICAgICAgIHN3aXBlRXhwYW5kVGhyZXNob2xkID0gc3dpcGVFeHBhbmRUaHJlc2hvbGQsCisgICAgICAgICkKKworICAgIC8qKiBUaGVyZSBhcmUgdHdvIHNoYWRlcyBhcnJhbmdlZCBzaWRlLWJ5LXNpZGUuICovCisgICAgZGF0YSBjbGFzcyBEdWFsU2hhZGVDb25maWcoCisgICAgICAgIC8qKiBXaWR0aCBvZiB0aGUgbGVmdC1oYW5kIHNpZGUgc2hhZGUuICovCisgICAgICAgIHZhbCBsZWZ0U2hhZGVXaWR0aFB4OiBJbnQsCisgICAgICAgIC8qKiBXaWR0aCBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlIHNoYWRlLiAqLworICAgICAgICB2YWwgcmlnaHRTaGFkZVdpZHRoUHg6IEludCwKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIG92ZXJyaWRlIHZhbCBzd2lwZUNvbGxhcHNlVGhyZXNob2xkOiBGbG9hdCwKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIG92ZXJyaWRlIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZDogRmxvYXQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJzcGxpdCIgYmV0d2VlbiBpbnRlcmFjdGlvbiBhcmVhcyBmb3IgZWFjaCBvZiB0aGUgc2hhZGVzLCBhcyBhCisgICAgICAgICAqIGZyYWN0aW9uIG9mIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBJbnRlcmFjdGlvbnMgdGhhdCBvY2N1ciBvbiB0aGUgc3RhcnQtc2lkZSAobGVmdC1oYW5kIHNpZGUgaW4gbGVmdC10by1yaWdodCBsYW5ndWFnZXMgbGlrZQorICAgICAgICAgKiBFbmdsaXNoKSBhZmZlY3QgdGhlIHN0YXJ0LXNpZGUgc2hhZGUuIEludGVyYWN0aW9ucyB0aGF0IG9jY3VyIG9uIHRoZSBlbmQtc2lkZSAocmlnaHQtaGFuZAorICAgICAgICAgKiBzaWRlIGluIGxlZnQtdG8tcmlnaHQgbGFuZ3VhZ2VzIGxpa2UgRW5nbGlzaCkgYWZmZWN0IHRoZSBlbmQtc2lkZSBzaGFkZS4KKyAgICAgICAgICovCisgICAgICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSB2YWwgc3BsaXRGcmFjdGlvbjogRmxvYXQsCisgICAgICAgIC8qKiBNYXhpbXVtIG9wYWNpdHkgd2hlbiB0aGUgc2NyaW0gdGhhdCBzaG93cyB1cCBiZWhpbmQgdGhlIGR1YWwgc2hhZGVzIGlzIGZ1bGx5IHZpc2libGUuICovCisgICAgICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSB2YWwgc2NyaW1BbHBoYTogRmxvYXQsCisgICAgKSA6CisgICAgICAgIFNoYWRlQ29uZmlnKAorICAgICAgICAgICAgc2hhZGVJZHMgPSBsaXN0T2YoU2hhZGVJZC5MRUZULCBTaGFkZUlkLlJJR0hUKSwKKyAgICAgICAgICAgIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQgPSBzd2lwZUNvbGxhcHNlVGhyZXNob2xkLAorICAgICAgICAgICAgc3dpcGVFeHBhbmRUaHJlc2hvbGQgPSBzd2lwZUV4cGFuZFRocmVzaG9sZCwKKyAgICAgICAgKQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlSWQua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvU2hhZGVJZC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAyNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlSWQua3QKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsCisKKy8qKiBFbnVtZXJhdGVzIGFsbCBrbm93biBzaGFkZSBJRHMuICovCitlbnVtIGNsYXNzIFNoYWRlSWQgeworICAgIC8qKiBJRCBvZiB0aGUgc2hhZGUgb24gdGhlIGxlZnQgaW4gZHVhbCBzaGFkZSBjb25maWd1cmF0aW9ucy4gKi8KKyAgICBMRUZULAorICAgIC8qKiBJRCBvZiB0aGUgc2hhZGUgb24gdGhlIHJpZ2h0IGluIGR1YWwgc2hhZGUgY29uZmlndXJhdGlvbnMuICovCisgICAgUklHSFQsCisgICAgLyoqIElEIG9mIHRoZSBzaW5nbGUgc2hhZGUgaW4gc2luZ2xlIHNoYWRlIGNvbmZpZ3VyYXRpb25zLiAqLworICAgIFNJTkdMRSwKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZU1vZGVsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlTW9kZWwua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYzY0YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZU1vZGVsLmt0CkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbAorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCisKKy8qKiBNb2RlbHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBzaGFkZS4gKi8KK2RhdGEgY2xhc3MgU2hhZGVNb2RlbCgKKyAgICB2YWwgaWQ6IFNoYWRlSWQsCisgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIHZhbCBleHBhbnNpb246IEZsb2F0ID0gMGYsCispCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3L011bHRpU2hhZGVWaWV3Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlldy9NdWx0aVNoYWRlVmlldy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNlYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlldy9NdWx0aVNoYWRlVmlldy5rdApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAoraW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAoraW1wb3J0IGFuZHJvaWR4LmxpZmVjeWNsZS5MaWZlY3ljbGUKK2ltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUubGlmZWN5Y2xlU2NvcGUKK2ltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUucmVwZWF0T25MaWZlY3ljbGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb21wb3NlLkNvbXBvc2VGYWNhZGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5saWZlY3ljbGUucmVwZWF0V2hlbkF0dGFjaGVkCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsLk11bHRpU2hhZGVWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2sKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMubGF1bmNoCisKKy8qKgorICogVmlldyB0aGF0IGhvc3RzIHRoZSBtdWx0aS1zaGFkZSBzeXN0ZW0gYW5kIGFjdHMgYXMgZ2x1ZSBiZXR3ZWVuIGxlZ2FjeSBjb2RlIGFuZCB0aGUKKyAqIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBNdWx0aVNoYWRlVmlldygKKyAgICBjb250ZXh0OiBDb250ZXh0LAorICAgIGF0dHJzOiBBdHRyaWJ1dGVTZXQ/LAorKSA6CisgICAgRnJhbWVMYXlvdXQoCisgICAgICAgIGNvbnRleHQsCisgICAgICAgIGF0dHJzLAorICAgICkgeworCisgICAgZnVuIGluaXQoCisgICAgICAgIGludGVyYWN0b3I6IE11bHRpU2hhZGVJbnRlcmFjdG9yLAorICAgICAgICBjbG9jazogU3lzdGVtQ2xvY2ssCisgICAgKSB7CisgICAgICAgIHJlcGVhdFdoZW5BdHRhY2hlZCB7CisgICAgICAgICAgICBsaWZlY3ljbGVTY29wZS5sYXVuY2ggeworICAgICAgICAgICAgICAgIHJlcGVhdE9uTGlmZWN5Y2xlKExpZmVjeWNsZS5TdGF0ZS5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NlRmFjYWRlLmNyZWF0ZU11bHRpU2hhZGVWaWV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpU2hhZGVWaWV3TW9kZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZWxTY29wZSA9IHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdG9yID0gaW50ZXJhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayA9IGNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSB3aGVuIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICByZW1vdmVBbGxWaWV3cygpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9NdWx0aVNoYWRlVmlld01vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmFiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbC5rdApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsCisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUNvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlSWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuQ29yb3V0aW5lU2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJpbmdTdGFydGVkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuY29tYmluZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmRpc3RpbmN0VW50aWxDaGFuZ2VkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZmxhdE1hcExhdGVzdAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZsb3dPZgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93Lm1hcAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LnN0YXRlSW4KKworLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgVUkgdGhhdCBzdXBwb3J0cyBtdWx0aSAob3Igc2luZ2xlKSBzaGFkZS4gKi8KK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK2NsYXNzIE11bHRpU2hhZGVWaWV3TW9kZWwoCisgICAgdmlld01vZGVsU2NvcGU6IENvcm91dGluZVNjb3BlLAorICAgIHByaXZhdGUgdmFsIGludGVyYWN0b3I6IE11bHRpU2hhZGVJbnRlcmFjdG9yLAorKSB7CisgICAgLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgdGhlIHNpbmdsZSBzaGFkZS4gKi8KKyAgICB2YWwgc2luZ2xlU2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5TSU5HTEUsCisgICAgICAgICAgICBpbnRlcmFjdG9yLAorICAgICAgICApCisKKyAgICAvKiogTW9kZWxzIFVJIHN0YXRlIGZvciB0aGUgc2hhZGUgb24gdGhlIGxlZnQtaGFuZCBzaWRlLiAqLworICAgIHZhbCBsZWZ0U2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5MRUZULAorICAgICAgICAgICAgaW50ZXJhY3RvciwKKyAgICAgICAgKQorCisgICAgLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgdGhlIHNoYWRlIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuICovCisgICAgdmFsIHJpZ2h0U2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5SSUdIVCwKKyAgICAgICAgICAgIGludGVyYWN0b3IsCisgICAgICAgICkKKworICAgIC8qKiBUaGUgYW1vdW50IG9mIGFscGhhIHRoYXQgdGhlIHNjcmltIHNob3VsZCBoYXZlLiBUaGlzIGlzIGEgdmFsdWUgYmV0d2VlbiBgMGAgYW5kIGAxYC4gKi8KKyAgICB2YWwgc2NyaW1BbHBoYTogU3RhdGVGbG93PEZsb2F0PiA9CisgICAgICAgIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgaW50ZXJhY3Rvci5tYXhTaGFkZUV4cGFuc2lvbiwKKyAgICAgICAgICAgICAgICBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnCisgICAgICAgICAgICAgICAgICAgIC5tYXAgeyBpdCBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnIH0KKyAgICAgICAgICAgICAgICAgICAgLm1hcCB7IGR1YWxTaGFkZUNvbmZpZ09yTnVsbCAtPiBkdWFsU2hhZGVDb25maWdPck51bGw/LnNjcmltQWxwaGEgPzogMGYgfSwKKyAgICAgICAgICAgICAgICA6OlBhaXIsCisgICAgICAgICAgICApCisgICAgICAgICAgICAubWFwIHsgKGFueVNoYWRlRXhwYW5zaW9uLCBzY3JpbUFscGhhKSAtPgorICAgICAgICAgICAgICAgIChhbnlTaGFkZUV4cGFuc2lvbiAqIHNjcmltQWxwaGEpLmNvZXJjZUluKDBmLCAxZikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5zdGF0ZUluKAorICAgICAgICAgICAgICAgIHNjb3BlID0gdmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgc3RhcnRlZCA9IFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLAorICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IDBmLAorICAgICAgICAgICAgKQorCisgICAgLyoqIFdoZXRoZXIgdGhlIHNjcmltIHNob3VsZCBhY2NlcHQgdG91Y2ggZXZlbnRzLiAqLworICAgIHZhbCBpc1NjcmltRW5hYmxlZDogU3RhdGVGbG93PEJvb2xlYW4+ID0KKyAgICAgICAgaW50ZXJhY3Rvci5zaGFkZUNvbmZpZworICAgICAgICAgICAgLmZsYXRNYXBMYXRlc3QgeyBzaGFkZUNvbmZpZyAtPgorICAgICAgICAgICAgICAgIHdoZW4gKHNoYWRlQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBkdWFsIHNoYWRlIGNvbmZpZ3VyYXRpb24sIHRoZSBzY3JpbSBpcyBlbmFibGVkIHdoZW4gdGhlIGV4cGFuc2lvbiBpcworICAgICAgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gemVybyBvbiBhbnkgb25lIG9mIHRoZSBzaGFkZXMuCisgICAgICAgICAgICAgICAgICAgIGlzIFNoYWRlQ29uZmlnLkR1YWxTaGFkZUNvbmZpZyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvci5tYXhTaGFkZUV4cGFuc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAgeyBleHBhbnNpb24gLT4gZXhwYW5zaW9uID4gMCB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gc2NyaW0gaW4gdGhlIHNpbmdsZSBzaGFkZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICBpcyBTaGFkZUNvbmZpZy5TaW5nbGVTaGFkZUNvbmZpZyAtPiBmbG93T2YoZmFsc2UpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLnN0YXRlSW4oCisgICAgICAgICAgICAgICAgc2NvcGUgPSB2aWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICBzdGFydGVkID0gU2hhcmluZ1N0YXJ0ZWQuV2hpbGVTdWJzY3JpYmVkKCksCisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gZmFsc2UsCisgICAgICAgICAgICApCisKKyAgICAvKiogTm90aWZpZXMgdGhhdCB0aGUgc2NyaW0gaGFzIGJlZW4gdG91Y2hlZC4gKi8KKyAgICBmdW4gb25TY3JpbVRvdWNoZWQocHJveGllZElucHV0OiBQcm94aWVkSW5wdXRNb2RlbCkgeworICAgICAgICBpZiAoIWlzU2NyaW1FbmFibGVkLnZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIGludGVyYWN0b3Iuc2VuZFByb3hpZWRJbnB1dChwcm94aWVkSW5wdXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL1NoYWRlVmlld01vZGVsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL1NoYWRlVmlld01vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjhkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvU2hhZGVWaWV3TW9kZWwua3QKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbAorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNvcm91dGluZVNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJpbmdTdGFydGVkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZGlzdGluY3RVbnRpbENoYW5nZWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXAKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5zdGF0ZUluCisKKy8qKiBNb2RlbHMgVUkgc3RhdGUgZm9yIGEgc2luZ2xlIHNoYWRlLiAqLworY2xhc3MgU2hhZGVWaWV3TW9kZWwoCisgICAgdmlld01vZGVsU2NvcGU6IENvcm91dGluZVNjb3BlLAorICAgIHByaXZhdGUgdmFsIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgcHJpdmF0ZSB2YWwgaW50ZXJhY3RvcjogTXVsdGlTaGFkZUludGVyYWN0b3IsCispIHsKKyAgICAvKiogV2hldGhlciB0aGUgc2hhZGUgaXMgdmlzaWJsZS4gKi8KKyAgICB2YWwgaXNWaXNpYmxlOiBTdGF0ZUZsb3c8Qm9vbGVhbj4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAuaXNWaXNpYmxlKHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICkKKworICAgIC8qKiBXaGV0aGVyIHN3aXBpbmcgb24gdGhlIHNoYWRlIFVJIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqLworICAgIHZhbCBpc1N3aXBpbmdFbmFibGVkOiBTdGF0ZUZsb3c8Qm9vbGVhbj4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAuaXNOb25Qcm94aWVkSW5wdXRBbGxvd2VkKHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICkKKworICAgIC8qKiBXaGV0aGVyIHRoZSBzaGFkZSBtdXN0IGJlIGNvbGxhcHNlZCBpbW1lZGlhdGVseS4gKi8KKyAgICB2YWwgaXNGb3JjZUNvbGxhcHNlZDogRmxvdzxCb29sZWFuPiA9CisgICAgICAgIGludGVyYWN0b3IuaXNGb3JjZUNvbGxhcHNlZChzaGFkZUlkKS5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpCisKKyAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBzaGFkZS4gKi8KKyAgICB2YWwgd2lkdGg6IFN0YXRlRmxvdzxTaXplPiA9CisgICAgICAgIGludGVyYWN0b3Iuc2hhZGVDb25maWcKKyAgICAgICAgICAgIC5tYXAgeyBzaGFkZVdpZHRoKGl0KSB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBzaGFkZVdpZHRoKGludGVyYWN0b3Iuc2hhZGVDb25maWcudmFsdWUpLAorICAgICAgICAgICAgKQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgdXAgd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgZXhwYW5kZWQgdG8gYXV0b21hdGljYWxseQorICAgICAqIGNvbGxhcHNlIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBleHBhbmRlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgICovCisgICAgdmFsIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQ6IFN0YXRlRmxvdzxGbG9hdD4gPQorICAgICAgICBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnCisgICAgICAgICAgICAubWFwIHsgaXQuc3dpcGVDb2xsYXBzZVRocmVzaG9sZCB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnLnZhbHVlLnN3aXBlQ29sbGFwc2VUaHJlc2hvbGQsCisgICAgICAgICAgICApCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGNvbGxhcHNlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgICogZXhwYW5kIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBjb2xsYXBzZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgICAqLworICAgIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZDogU3RhdGVGbG93PEZsb2F0PiA9CisgICAgICAgIGludGVyYWN0b3Iuc2hhZGVDb25maWcKKyAgICAgICAgICAgIC5tYXAgeyBpdC5zd2lwZUV4cGFuZFRocmVzaG9sZCB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnLnZhbHVlLnN3aXBlRXhwYW5kVGhyZXNob2xkLAorICAgICAgICAgICAgKQorCisgICAgLyoqCisgICAgICogUHJveGllZCBpbnB1dCBhZmZlY3RpbmcgdGhlIHNoYWRlLiBUaGlzIGlzIGlucHV0IGNvbWluZyBmcm9tIHNvdXJjZXMgb3V0c2lkZSBvZiBzeXN0ZW0gVUkKKyAgICAgKiAoZm9yIGV4YW1wbGUsIHN3aXBpbmcgZG93biBvbiB0aGUgTGF1bmNoZXIgb3IgZnJvbSB0aGUgc3RhdHVzIGJhcikgb3Igb3V0c2lkZSB0aGUgVUkgb2YgYW55CisgICAgICogc2hhZGUgKGZvciBleGFtcGxlLCB0aGUgc2NyaW0gdGhhdCdzIHNob3duIGJlaGluZCB0aGUgc2hhZGVzKS4KKyAgICAgKi8KKyAgICB2YWwgcHJveGllZElucHV0OiBGbG93PFByb3hpZWRJbnB1dE1vZGVsPz4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAucHJveGllZElucHV0KHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgKQorCisgICAgLyoqIE5vdGlmaWVzIHRoYXQgdGhlIGV4cGFuc2lvbiBhbW91bnQgZm9yIHRoZSBzaGFkZSBoYXMgY2hhbmdlZC4gKi8KKyAgICBmdW4gb25FeHBhbnNpb25DaGFuZ2VkKAorICAgICAgICBleHBhbnNpb246IEZsb2F0LAorICAgICkgeworICAgICAgICBpbnRlcmFjdG9yLnNldEV4cGFuc2lvbihzaGFkZUlkLCBleHBhbnNpb24uY29lcmNlSW4oMGYsIDFmKSkKKyAgICB9CisKKyAgICAvKiogTm90aWZpZXMgdGhhdCBhIGRyYWcgZ2VzdHVyZSBoYXMgc3RhcnRlZC4gKi8KKyAgICBmdW4gb25EcmFnU3RhcnRlZCgpIHsKKyAgICAgICAgaW50ZXJhY3Rvci5vblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoc2hhZGVJZCkKKyAgICB9CisKKyAgICAvKiogTm90aWZpZXMgdGhhdCBhIGRyYWcgZ2VzdHVyZSBoYXMgZW5kZWQuICovCisgICAgZnVuIG9uRHJhZ0VuZGVkKCkgeworICAgICAgICBpbnRlcmFjdG9yLm9uVXNlckludGVyYWN0aW9uRW5kZWQoc2hhZGVJZCA9IHNoYWRlSWQpCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gc2hhZGVXaWR0aChzaGFkZUNvbmZpZzogU2hhZGVDb25maWcpOiBTaXplIHsKKyAgICAgICAgcmV0dXJuIHdoZW4gKHNoYWRlSWQpIHsKKyAgICAgICAgICAgIFNoYWRlSWQuTEVGVCAtPgorICAgICAgICAgICAgICAgIFNpemUuUGl4ZWxzKChzaGFkZUNvbmZpZyBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKT8ubGVmdFNoYWRlV2lkdGhQeCA/OiAwKQorICAgICAgICAgICAgU2hhZGVJZC5SSUdIVCAtPgorICAgICAgICAgICAgICAgIFNpemUuUGl4ZWxzKChzaGFkZUNvbmZpZyBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKT8ucmlnaHRTaGFkZVdpZHRoUHggPzogMCkKKyAgICAgICAgICAgIFNoYWRlSWQuU0lOR0xFIC0+IFNpemUuRnJhY3Rpb24oMWYpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZWFsZWQgY2xhc3MgU2l6ZSB7CisgICAgICAgIGRhdGEgY2xhc3MgRnJhY3Rpb24oCisgICAgICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgdmFsIGZyYWN0aW9uOiBGbG9hdCwKKyAgICAgICAgKSA6IFNpemUoKQorICAgICAgICBkYXRhIGNsYXNzIFBpeGVscygKKyAgICAgICAgICAgIHZhbCBwaXhlbHM6IEludCwKKyAgICAgICAgKSA6IFNpemUoKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbm90ZXRhc2svTm90ZVRhc2tDb250cm9sbGVyLmt0CmluZGV4IGFjMjJiN2MuLjc3OWYxZDggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGV0YXNrL05vdGVUYXNrQ29udHJvbGxlci5rdApAQCAtMTI5LDggKzEyOSw3IEBACiAgICAgICAgICAgICBsb2dEZWJ1ZyB7ICJvblNob3dOb3RlVGFzayAtIHN0YXJ0OiAkaW5mbyIgfQogICAgICAgICAgICAgd2hlbiAoaW5mby5sYXVuY2hNb2RlKSB7CiAgICAgICAgICAgICAgICAgaXMgTm90ZVRhc2tMYXVuY2hNb2RlLkFwcEJ1YmJsZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8yNjc2MzQ0MTIsIGIvMjY4MzUxNjkzKTogU2hvdWxkIHVzZSBgc2hvd09ySGlkZUFwcEJ1YmJsZUFzVXNlcmAKLSAgICAgICAgICAgICAgICAgICAgYnViYmxlcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCkKKyAgICAgICAgICAgICAgICAgICAgYnViYmxlcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCwgdXNlclRyYWNrZXIudXNlckhhbmRsZSkKICAgICAgICAgICAgICAgICAgICAgLy8gQXBwIGJ1YmJsZSBsb2dnaW5nIGhhcHBlbnMgb24gYG9uQnViYmxlRXhwYW5kQ2hhbmdlZGAuCiAgICAgICAgICAgICAgICAgICAgIGxvZ0RlYnVnIHsgIm9uU2hvd05vdGVUYXNrIC0gb3BlbmVkIGFzIGFwcCBidWJibGU6ICRpbmZvIiB9CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudHMvT3ZlcnZpZXdQcm94eVNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnRzL092ZXJ2aWV3UHJveHlTZXJ2aWNlLmphdmEKaW5kZXggOGEzZWNjNi4uMDc0OGJjYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudHMvT3ZlcnZpZXdQcm94eVNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50cy9PdmVydmlld1Byb3h5U2VydmljZS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50LkFDVElPTl9VUDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJQb2xpY3lDb25zdGFudHMuTkFWX0JBUl9NT0RFXzNCVVRUT047Ci0KIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5jb21tb24uU2hvcnRjdXRDb25zdGFudHMuQ0hPT1NFUl9QQUNLQUdFX05BTUU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYXJlZC5zeXN0ZW0uUXVpY2tTdGVwQ29udHJhY3QuS0VZX0VYVFJBX1NVUFBPUlRTX1dJTkRPV19DT1JORVJTOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFyZWQuc3lzdGVtLlF1aWNrU3RlcENvbnRyYWN0LktFWV9FWFRSQV9TWVNVSV9QUk9YWTsKQEAgLTcxMyw2ICs3MTIsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29ubmVjdGlvblRvQ3VycmVudFVzZXIoKSB7CisgICAgICAgIExvZy52KFRBR19PUFMsICJzdGFydENvbm5lY3Rpb25Ub0N1cnJlbnRVc2VyOiBjb25uZWN0aW9uIGlzIHJlc3RhcnRlZCIpOwogICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUNvbm5lY3Rpb25SdW5uYWJsZSk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2NyZWVuc2hvdC9Mb25nU2NyZWVuc2hvdEFjdGl2aXR5LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2NyZWVuc2hvdC9Mb25nU2NyZWVuc2hvdEFjdGl2aXR5LmphdmEKaW5kZXggY2E4ZTEwMS4uMDJhNjBhZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NjcmVlbnNob3QvTG9uZ1NjcmVlbnNob3RBY3Rpdml0eS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zY3JlZW5zaG90L0xvbmdTY3JlZW5zaG90QWN0aXZpdHkuamF2YQpAQCAtNDgxLDcgKzQ4MSw2IEBACiAgICAgICAgICAgICBtQ3JvcFZpZXcuc2V0RXh0cmFQYWRkaW5nKGV4dHJhUGFkZGluZyArIG1QcmV2aWV3LmdldFBhZGRpbmdUb3AoKSwKICAgICAgICAgICAgICAgICAgICAgZXh0cmFQYWRkaW5nICsgbVByZXZpZXcuZ2V0UGFkZGluZ0JvdHRvbSgpKTsKICAgICAgICAgICAgIGltYWdlVG9wICs9IChwcmV2aWV3SGVpZ2h0IC0gaW1hZ2VIZWlnaHQpIC8gMjsKLSAgICAgICAgICAgIG1Dcm9wVmlldy5zZXRFeHRyYVBhZGRpbmcoZXh0cmFQYWRkaW5nLCBleHRyYVBhZGRpbmcpOwogICAgICAgICAgICAgbUNyb3BWaWV3LnNldEltYWdlV2lkdGgocHJldmlld1dpZHRoKTsKICAgICAgICAgICAgIHNjYWxlID0gcHJldmlld1dpZHRoIC8gKGZsb2F0KSBtUHJldmlldy5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIuamF2YQppbmRleCBlMmYzMWU4Li5hNzE2YTZlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyLmphdmEKQEAgLTE2LDEzICsxNiwxMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYWRlOwogCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzLlRSQUNLUEFEX0dFU1RVUkVfQkFDSzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5rb3RsaW4uSmF2YUFkYXB0ZXJLdC5jb2xsZWN0RmxvdzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkxlZ2FjeUhlbHBlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdTdHViOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuQXV0aEtleWd1YXJkTWVzc2FnZUFyZWE7CkBAIC0zOCw3ICszOSwxMCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYmlvbWV0cmljcy5kb21haW4uaW50ZXJhY3Rvci5VZGZwc092ZXJsYXlJbnRlcmFjdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb21wb3NlLkNvbXBvc2VGYWNhZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZG9jay5Eb2NrTWFuYWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GZWF0dXJlRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3M7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLkFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLktleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3I7CkBAIC00Nyw2ICs1MSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkuYmluZGVyLktleWd1YXJkQm91bmNlclZpZXdCaW5kZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLktleWd1YXJkQm91bmNlclZpZXdNb2RlbDsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC51aS52aWV3bW9kZWwuUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3Lk11bHRpU2hhZGVWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5EcmFnRG93bkhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLk5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXI7CkBAIC02MSwxMSArNjcsMTMgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuZGFnZ2VyLkNlbnRyYWxTdXJmYWNlc0NvbXBvbmVudDsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIud2luZG93LlN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2s7CiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOwogCiAvKioKICAqIENvbnRyb2xsZXIgZm9yIHtAbGluayBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXd9LgpAQCAtODgsMTAgKzk2LDEyIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBOb3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyIG1Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyOwogICAgIHByaXZhdGUgZmluYWwgQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IgbUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOwogICAgIHByaXZhdGUgZmluYWwgVWRmcHNPdmVybGF5SW50ZXJhY3RvciBtVWRmcHNPdmVybGF5SW50ZXJhY3RvcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVHJhY2twYWRHZXN0dXJlQmFja0VuYWJsZWQ7CiAgICAgcHJpdmF0ZSBHZXN0dXJlRGV0ZWN0b3IgbVB1bHNpbmdXYWtldXBHZXN0dXJlSGFuZGxlcjsKICAgICBwcml2YXRlIFZpZXcgbUJyaWdodG5lc3NNaXJyb3I7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Ub3VjaEFjdGl2ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRvdWNoQ2FuY2VsbGVkOworICAgIHByaXZhdGUgTW90aW9uRXZlbnQgbURvd25FdmVudDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUV4cGFuZEFuaW1hdGlvblJ1bm5pbmc7CiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dCBtU3RhY2tTY3JvbGxMYXlvdXQ7CiAgICAgcHJpdmF0ZSBQaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyIG1TdGF0dXNCYXJWaWV3Q29udHJvbGxlcjsKQEAgLTExMSw2ICsxMjEsNyBAQAogICAgICAgICAgICAgICAgIG1Jc09jY2x1c2lvblRyYW5zaXRpb25SdW5uaW5nID0KICAgICAgICAgICAgICAgICAgICAgc3RlcC5nZXRUcmFuc2l0aW9uU3RhdGUoKSA9PSBUcmFuc2l0aW9uU3RhdGUuUlVOTklORzsKICAgICAgICAgICAgIH07CisgICAgcHJpdmF0ZSBmaW5hbCBTeXN0ZW1DbG9jayBtQ2xvY2s7CiAKICAgICBASW5qZWN0CiAgICAgcHVibGljIE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIoCkBAIC0xMzcsOCArMTQ4LDEwIEBACiAgICAgICAgICAgICBBbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvciBhbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvciwKICAgICAgICAgICAgIFVkZnBzT3ZlcmxheUludGVyYWN0b3IgdWRmcHNPdmVybGF5SW50ZXJhY3RvciwKICAgICAgICAgICAgIEtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3Iga2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvciwKLSAgICAgICAgICAgIFByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbCBwcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwKLSAgICApIHsKKyAgICAgICAgICAgIFByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbCBwcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwsCisgICAgICAgICAgICBGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzLAorICAgICAgICAgICAgUHJvdmlkZXI8TXVsdGlTaGFkZUludGVyYWN0b3I+IG11bHRpU2hhZGVJbnRlcmFjdG9yUHJvdmlkZXIsCisgICAgICAgICAgICBTeXN0ZW1DbG9jayBjbG9jaykgewogICAgICAgICBtTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXIgPSB0cmFuc2l0aW9uQ29udHJvbGxlcjsKICAgICAgICAgbUZhbHNpbmdDb2xsZWN0b3IgPSBmYWxzaW5nQ29sbGVjdG9yOwogICAgICAgICBtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyID0gc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyOwpAQCAtMTU5LDYgKzE3Miw3IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyID0gbm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcjsKICAgICAgICAgbUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yID0gYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3I7CiAgICAgICAgIG1VZGZwc092ZXJsYXlJbnRlcmFjdG9yID0gdWRmcHNPdmVybGF5SW50ZXJhY3RvcjsKKyAgICAgICAgbUlzVHJhY2twYWRHZXN0dXJlQmFja0VuYWJsZWQgPSBmZWF0dXJlRmxhZ3MuaXNFbmFibGVkKFRSQUNLUEFEX0dFU1RVUkVfQkFDSyk7CiAKICAgICAgICAgLy8gVGhpcyB2aWV3IGlzIG5vdCBwYXJ0IG9mIHRoZSBuZXdseSBpbmZsYXRlZCBleHBhbmRlZCBzdGF0dXMgYmFyLgogICAgICAgICBtQnJpZ2h0bmVzc01pcnJvciA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLmJyaWdodG5lc3NfbWlycm9yX2NvbnRhaW5lcik7CkBAIC0xNzAsNiArMTg0LDE2IEBACiAKICAgICAgICAgY29sbGVjdEZsb3cobVZpZXcsIGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IuZ2V0TG9ja3NjcmVlblRvRHJlYW1pbmdUcmFuc2l0aW9uKCksCiAgICAgICAgICAgICAgICAgbUxvY2tzY3JlZW5Ub0RyZWFtaW5nVHJhbnNpdGlvbik7CisKKyAgICAgICAgbUNsb2NrID0gY2xvY2s7CisgICAgICAgIGlmIChDb21wb3NlRmFjYWRlLklOU1RBTkNFLmlzQ29tcG9zZUF2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgJiYgZmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5EVUFMX1NIQURFKSkgeworICAgICAgICAgICAgZmluYWwgVmlld1N0dWIgbXVsdGlTaGFkZVZpZXdTdHViID0gbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXVsdGlfc2hhZGVfc3R1Yik7CisgICAgICAgICAgICBpZiAobXVsdGlTaGFkZVZpZXdTdHViICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aVNoYWRlVmlldyBtdWx0aVNoYWRlVmlldyA9IChNdWx0aVNoYWRlVmlldykgbXVsdGlTaGFkZVZpZXdTdHViLmluZmxhdGUoKTsKKyAgICAgICAgICAgICAgICBtdWx0aVNoYWRlVmlldy5pbml0KG11bHRpU2hhZGVJbnRlcmFjdG9yUHJvdmlkZXIuZ2V0KCksIGNsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjE5LDkgKzI0MywxMSBAQAogICAgICAgICAgICAgICAgIGlmIChpc0Rvd24pIHsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ2FuY2VsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duRXZlbnQgPSBldjsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2LmdldEFjdGlvbk1hc2tlZCgpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXYuZ2V0QWN0aW9uTWFza2VkKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCkgewogICAgICAgICAgICAgICAgICAgICBtVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbURvd25FdmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtVG91Y2hDYW5jZWxsZWQgfHwgbUV4cGFuZEFuaW1hdGlvblJ1bm5pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjYyLDcgKzI4OCw3IEBACiAgICAgICAgICAgICAgICAgbUxvY2tJY29uVmlld0NvbnRyb2xsZXIub25Ub3VjaEV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBtU2VydmljZS53YWtlVXBJZkRvemluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbG9jay51cHRpbWVNaWxsaXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMT0NLX0lDT05fVE9VQ0giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZXIuV0FLRV9SRUFTT05fR0VTVFVSRSkKQEAgLTQ0NiwxMCArNDcyLDE4IEBACiAKICAgICBwdWJsaWMgdm9pZCBjYW5jZWxDdXJyZW50VG91Y2goKSB7CiAgICAgICAgIGlmIChtVG91Y2hBY3RpdmUpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbihub3csIG5vdywKLSAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCwgMC4wZiwgMC4wZiwgMCk7Ci0gICAgICAgICAgICBldmVudC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICBpZiAobUlzVHJhY2twYWRHZXN0dXJlQmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbihtRG93bkV2ZW50KTsKKyAgICAgICAgICAgICAgICBldmVudC5zZXREb3duVGltZShub3cpOworICAgICAgICAgICAgICAgIGV2ZW50LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICBldmVudC5zZXRMb2NhdGlvbigwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csCisgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMLCAwLjBmLCAwLjBmLCAwKTsKKyAgICAgICAgICAgICAgICBldmVudC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CiAgICAgICAgICAgICBldmVudC5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVG91Y2hDYW5jZWxsZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvZGFnZ2VyL1NtYXJ0c3BhY2VWaWV3Q29tcG9uZW50Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvZGFnZ2VyL1NtYXJ0c3BhY2VWaWV3Q29tcG9uZW50Lmt0CmluZGV4IDU3MzZhNWMuLjI2MTQ5MzIxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc21hcnRzcGFjZS9kYWdnZXIvU21hcnRzcGFjZVZpZXdDb21wb25lbnQua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvZGFnZ2VyL1NtYXJ0c3BhY2VWaWV3Q29tcG9uZW50Lmt0CkBAIC0zNyw3ICszNyw4IEBACiAgICAgICAgIGZ1biBjcmVhdGUoCiAgICAgICAgICAgICBAQmluZHNJbnN0YW5jZSBwYXJlbnQ6IFZpZXdHcm91cCwKICAgICAgICAgICAgIEBCaW5kc0luc3RhbmNlIEBOYW1lZChQTFVHSU4pIHBsdWdpbjogQmNTbWFydHNwYWNlRGF0YVBsdWdpbiwKLSAgICAgICAgICAgIEBCaW5kc0luc3RhbmNlIG9uQXR0YWNoTGlzdGVuZXI6IFZpZXcuT25BdHRhY2hTdGF0ZUNoYW5nZUxpc3RlbmVyCisgICAgICAgICAgICBAQmluZHNJbnN0YW5jZSBvbkF0dGFjaExpc3RlbmVyOiBWaWV3Lk9uQXR0YWNoU3RhdGVDaGFuZ2VMaXN0ZW5lciwKKyAgICAgICAgICAgIEBCaW5kc0luc3RhbmNlIHZpZXdXaXRoQ3VzdG9tTGF5b3V0OiBWaWV3PyA9IG51bGwKICAgICAgICAgKTogU21hcnRzcGFjZVZpZXdDb21wb25lbnQKICAgICB9CiAKQEAgLTUzLDEwICs1NCwxMyBAQAogICAgICAgICAgICAgZmFsc2luZ01hbmFnZXI6IEZhbHNpbmdNYW5hZ2VyLAogICAgICAgICAgICAgcGFyZW50OiBWaWV3R3JvdXAsCiAgICAgICAgICAgICBATmFtZWQoUExVR0lOKSBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4sCisgICAgICAgICAgICB2aWV3V2l0aEN1c3RvbUxheW91dDogVmlldz8sCiAgICAgICAgICAgICBvbkF0dGFjaExpc3RlbmVyOiBWaWV3Lk9uQXR0YWNoU3RhdGVDaGFuZ2VMaXN0ZW5lcgogICAgICAgICApOgogICAgICAgICAgICAgICAgIEJjU21hcnRzcGFjZURhdGFQbHVnaW4uU21hcnRzcGFjZVZpZXcgewotICAgICAgICAgICAgdmFsIHNzVmlldyA9IHBsdWdpbi5nZXRWaWV3KHBhcmVudCkKKyAgICAgICAgICAgIHZhbCBzc1ZpZXcgPSB2aWV3V2l0aEN1c3RvbUxheW91dAorICAgICAgICAgICAgICAgICAgICBhcz8gQmNTbWFydHNwYWNlRGF0YVBsdWdpbi5TbWFydHNwYWNlVmlldworICAgICAgICAgICAgICAgICAgICA/OiBwbHVnaW4uZ2V0VmlldyhwYXJlbnQpCiAgICAgICAgICAgICAvLyBDdXJyZW50bHksIHRoaXMgaXMgb25seSB1c2VkIHRvIHByb3ZpZGUgU21hcnRzcGFjZVZpZXcgb24gRHJlYW0gc3VyZmFjZS4KICAgICAgICAgICAgIHNzVmlldy5zZXRVaVN1cmZhY2UoVUlfU1VSRkFDRV9EUkVBTSkKICAgICAgICAgICAgIHNzVmlldy5yZWdpc3RlckRhdGFQcm92aWRlcihwbHVnaW4pCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkxvY2tzY3JlZW5Vc2VyTWFuYWdlckltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uTG9ja3NjcmVlblVzZXJNYW5hZ2VySW1wbC5qYXZhCmluZGV4IDUxYzUxODMuLmNhYzQyNTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uTG9ja3NjcmVlblVzZXJNYW5hZ2VySW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uTG9ja3NjcmVlblVzZXJNYW5hZ2VySW1wbC5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9ERVZJQ0VfUE9MSUNZX01BTkFHRVJfU1RBVEVfQ0hBTkdFRDsKLQogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5EZWphbmtVdGlscy53aGl0ZWxpc3RJcGNzOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwpAQCAtMTQ1LDcgKzE0NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEludGVudC5BQ1RJT05fVVNFUl9VTkxPQ0tFRDoKICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG92ZXJ2aWV3IGNvbm5lY3Rpb24gdG8gdGhlIGxhdW5jaGVyIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJ2aWV3UHJveHlTZXJ2aWNlTGF6eS5nZXQoKS5zdGFydENvbm5lY3Rpb25Ub0N1cnJlbnRVc2VyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3QgaWYgdXNlciBoYXNuJ3QgY29ubmVjdGVkIHlldAorICAgICAgICAgICAgICAgICAgICBpZiAobU92ZXJ2aWV3UHJveHlTZXJ2aWNlTGF6eS5nZXQoKS5nZXRQcm94eSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVydmlld1Byb3h5U2VydmljZUxhenkuZ2V0KCkuc3RhcnRDb25uZWN0aW9uVG9DdXJyZW50VXNlcigpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTk9USUZJQ0FUSU9OX1VOTE9DS0VEX0JZX1dPUktfQ0hBTExFTkdFX0FDVElPTjoKICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGludGVudFNlbmRlciA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TWFuYWdlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25SZW1vdGVJbnB1dE1hbmFnZXIuamF2YQppbmRleCA5OTA4MWU5Li45ZTJhMDdlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TWFuYWdlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyLmphdmEKQEAgLTU0LDYgKzU0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLmRhZ2dlci5DZW50cmFsU3VyZmFjZXNEZXBlbmRlbmNpZXNNb2R1bGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5Ob3RpZlBpcGVsaW5lRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLk5vdGlmaWNhdGlvbkVudHJ5OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeS5FZGl0ZWRTdWdnZXN0aW9uSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24ucmVuZGVyLk5vdGlmaWNhdGlvblZpc2liaWxpdHlQcm92aWRlcjsKQEAgLTY1LDYgKzY2LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLkR1bXBVdGlsc0t0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuTGlzdGVuZXJTZXQ7CiAKK2ltcG9ydCBkYWdnZXIuTGF6eTsKKwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTcyLDggKzc1LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi1pbXBvcnQgZGFnZ2VyLkxhenk7Ci0KIC8qKgogICogQ2xhc3MgZm9yIGhhbmRsaW5nIHJlbW90ZSBpbnB1dCBzdGF0ZSBvdmVyIGEgc2V0IG9mIG5vdGlmaWNhdGlvbnMuIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGluZ3MKICAqIGxpa2Uga2VlcGluZyBub3RpZmljYXRpb25zIHRlbXBvcmFyaWx5IHRoYXQgd2VyZSBjYW5jZWxsZWQgYXMgYSByZXNwb25zZSB0byBhIHJlbW90ZSBpbnB1dApAQCAtMTA0LDYgKzEwNSw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZE1hbmFnZXIgbUtleWd1YXJkTWFuYWdlcjsKICAgICBwcml2YXRlIGZpbmFsIFN0YXR1c0JhclN0YXRlQ29udHJvbGxlciBtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyOwogICAgIHByaXZhdGUgZmluYWwgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIG1SZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciBtUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyOwogICAgIHByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uQ2xpY2tOb3RpZmllciBtQ2xpY2tOb3RpZmllcjsKIAogICAgIHByb3RlY3RlZCBSZW1vdGVJbnB1dENvbnRyb2xsZXIgbVJlbW90ZUlucHV0Q29udHJvbGxlcjsKQEAgLTI1OSw2ICsyNjIsNyBAQAogICAgICAgICAgICAgTGF6eTxPcHRpb25hbDxDZW50cmFsU3VyZmFjZXM+PiBjZW50cmFsU3VyZmFjZXNPcHRpb25hbExhenksCiAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIHJlbW90ZUlucHV0VXJpQ29udHJvbGxlciwKKyAgICAgICAgICAgIFJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIsCiAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGlja05vdGlmaWVyIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICBBY3Rpb25DbGlja0xvZ2dlciBsb2dnZXIsCiAgICAgICAgICAgICBEdW1wTWFuYWdlciBkdW1wTWFuYWdlcikgewpAQCAtMjc1LDYgKzI3OSw3IEBACiAgICAgICAgIG1LZXlndWFyZE1hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKTsKICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciA9IHN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKICAgICAgICAgbVJlbW90ZUlucHV0VXJpQ29udHJvbGxlciA9IHJlbW90ZUlucHV0VXJpQ29udHJvbGxlcjsKKyAgICAgICAgbVJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciA9IHJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlcjsKICAgICAgICAgbUNsaWNrTm90aWZpZXIgPSBjbGlja05vdGlmaWVyOwogCiAgICAgICAgIGR1bXBNYW5hZ2VyLnJlZ2lzdGVyRHVtcGFibGUodGhpcyk7CkBAIC0yOTQsNyArMjk5LDggQEAKICAgICAvKiogSW5pdGlhbGl6ZXMgdGhpcyBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGVwZW5kZW5jaWVzLiAqLwogICAgIHB1YmxpYyB2b2lkIHNldFVwV2l0aENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrLCBSZW1vdGVJbnB1dENvbnRyb2xsZXIuRGVsZWdhdGUgZGVsZWdhdGUpIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1SZW1vdGVJbnB1dENvbnRyb2xsZXIgPSBuZXcgUmVtb3RlSW5wdXRDb250cm9sbGVyKGRlbGVnYXRlLCBtUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyKTsKKyAgICAgICAgbVJlbW90ZUlucHV0Q29udHJvbGxlciA9IG5ldyBSZW1vdGVJbnB1dENvbnRyb2xsZXIoZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgbVJlbW90ZUlucHV0VXJpQ29udHJvbGxlciwgbVJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlcik7CiAgICAgICAgIGlmIChtUmVtb3RlSW5wdXRMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtUmVtb3RlSW5wdXRMaXN0ZW5lci5zZXRSZW1vdGVJbnB1dENvbnRyb2xsZXIobVJlbW90ZUlucHV0Q29udHJvbGxlcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUmVtb3RlSW5wdXRDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1JlbW90ZUlucHV0Q29udHJvbGxlci5qYXZhCmluZGV4IGY0NGY1OTguLmEzN2IyYTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUmVtb3RlSW5wdXRDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9SZW1vdGVJbnB1dENvbnRyb2xsZXIuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLk5vdGlmaWNhdGlvbkVudHJ5OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuUmVtb3RlSW5wdXRWaWV3OwpAQCAtNTIsMTAgKzUzLDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBEZWxlZ2F0ZSBtRGVsZWdhdGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIgbVJlbW90ZUlucHV0VXJpQ29udHJvbGxlcjsKIAorICAgIHByaXZhdGUgZmluYWwgUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyIG1Mb2dnZXI7CisKICAgICBwdWJsaWMgUmVtb3RlSW5wdXRDb250cm9sbGVyKERlbGVnYXRlIGRlbGVnYXRlLAotICAgICAgICAgICAgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIHJlbW90ZUlucHV0VXJpQ29udHJvbGxlcikgeworICAgICAgICAgICAgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIHJlbW90ZUlucHV0VXJpQ29udHJvbGxlciwKKyAgICAgICAgICAgIFJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciBsb2dnZXIpIHsKICAgICAgICAgbURlbGVnYXRlID0gZGVsZWdhdGU7CiAgICAgICAgIG1SZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIgPSByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXI7CisgICAgICAgIG1Mb2dnZXIgPSBsb2dnZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsNiArMTIyLDkgQEAKICAgICAgICAgYm9vbGVhbiBpc0FjdGl2ZSA9IGlzUmVtb3RlSW5wdXRBY3RpdmUoZW50cnkpOwogICAgICAgICBib29sZWFuIGZvdW5kID0gcHJ1bmVXZWFrVGhlblJlbW92ZUFuZENvbnRhaW5zKAogICAgICAgICAgICAgICAgIGVudHJ5IC8qIGNvbnRhaW5zICovLCBudWxsIC8qIHJlbW92ZSAqLywgdG9rZW4gLyogcmVtb3ZlVG9rZW4gKi8pOworICAgICAgICBtTG9nZ2VyLmxvZ0FkZFJlbW90ZUlucHV0KGVudHJ5LmdldEtleSgpLyogZW50cnlLZXkgKi8sCisgICAgICAgICAgICAgICAgaXNBY3RpdmUgLyogaXNSZW1vdGVJbnB1dEFscmVhZHlBY3RpdmUgKi8sCisgICAgICAgICAgICAgICAgZm91bmQgLyogaXNSZW1vdGVJbnB1dEZvdW5kICovKTsKICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgbU9wZW4uYWRkKG5ldyBQYWlyPD4obmV3IFdlYWtSZWZlcmVuY2U8PihlbnRyeSksIHRva2VuKSk7CiAgICAgICAgIH0KQEAgLTEzNyw5ICsxNDUsMjIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVJbnB1dChOb3RpZmljYXRpb25FbnRyeSBlbnRyeSwgT2JqZWN0IHRva2VuKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZW50cnkpOwotICAgICAgICBpZiAoZW50cnkubVJlbW90ZUVkaXRJbWVWaXNpYmxlICYmIGVudHJ5Lm1SZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheSkgcmV0dXJuOworICAgICAgICBpZiAoZW50cnkubVJlbW90ZUVkaXRJbWVWaXNpYmxlICYmIGVudHJ5Lm1SZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheSkgeworICAgICAgICAgICAgbUxvZ2dlci5sb2dSZW1vdmVSZW1vdGVJbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkgLyogZW50cnlLZXkqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZW1vdGVFZGl0SW1lVmlzaWJsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheSAqLyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gSWYgdGhlIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZCwgdGhpcyBtYXkgYmUgY2FsbGVkIGV2ZW4gdGhvdWdoIHdlJ3JlIG5vdCBhY3RpdmUKLSAgICAgICAgaWYgKCFpc1JlbW90ZUlucHV0QWN0aXZlKGVudHJ5KSkgcmV0dXJuOworICAgICAgICBib29sZWFuIHJlbW90ZUlucHV0QWN0aXZlID0gaXNSZW1vdGVJbnB1dEFjdGl2ZShlbnRyeSk7CisgICAgICAgIG1Mb2dnZXIubG9nUmVtb3ZlUmVtb3RlSW5wdXQoCisgICAgICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkgLyogZW50cnlLZXkqLywKKyAgICAgICAgICAgICAgICBlbnRyeS5tUmVtb3RlRWRpdEltZVZpc2libGUgLyogcmVtb3RlRWRpdEltZVZpc2libGUgKi8sCisgICAgICAgICAgICAgICAgZW50cnkubVJlbW90ZUVkaXRJbWVBbmltYXRpbmdBd2F5IC8qIHJlbW90ZUVkaXRJbWVBbmltYXRpbmdBd2F5ICovLAorICAgICAgICAgICAgICAgIHJlbW90ZUlucHV0QWN0aXZlIC8qIGlzUmVtb3RlSW5wdXRBY3RpdmUgKi8pOworCisgICAgICAgIGlmICghcmVtb3RlSW5wdXRBY3RpdmUpIHJldHVybjsKIAogICAgICAgICBwcnVuZVdlYWtUaGVuUmVtb3ZlQW5kQ29udGFpbnMobnVsbCAvKiBjb250YWlucyAqLywgZW50cnkgLyogcmVtb3ZlICovLCB0b2tlbik7CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXJJbXBsLmphdmEKaW5kZXggYjlhYzkxOC4uNzlkMDFiNGEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbC5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2hhZGUuU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5zdGFjay5TdGFja1N0YXRlQW5pbWF0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5DYWxsYmFja0NvbnRyb2xsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5Db21waWxlOwogCiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjk5LDcgKzMwMCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBzZXRJc0RyZWFtaW5nKGJvb2xlYW4gaXNEcmVhbWluZykgewotICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykgfHwgQ29tcGlsZS5JU19ERUJVRykgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0SXNEcmVhbWluZzoiICsgaXNEcmVhbWluZyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Jc0RyZWFtaW5nID09IGlzRHJlYW1pbmcpIHsKQEAgLTMyMSw2ICszMjIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RyZWFtaW5nKCkgeworICAgICAgICByZXR1cm4gbUlzRHJlYW1pbmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QW5kSW5zdHJ1bWVudERvemVBbW91bnQoVmlldyB2aWV3LCBmbG9hdCBkb3plQW1vdW50LCBib29sZWFuIGFuaW1hdGVkKSB7CiAgICAgICAgIGlmIChtRGFya0FuaW1hdG9yICE9IG51bGwgJiYgbURhcmtBbmltYXRvci5pc1J1bm5pbmcoKSkgewogICAgICAgICAgICAgaWYgKGFuaW1hdGVkICYmIG1Eb3plQW1vdW50VGFyZ2V0ID09IGRvemVBbW91bnQpIHsKQEAgLTU4MCw2ICs1ODYsNyBAQAogICAgICAgICBwdy5wcmludGxuKCIgbUxlYXZlT3Blbk9uS2V5Z3VhcmRIaWRlPSIgKyBtTGVhdmVPcGVuT25LZXlndWFyZEhpZGUpOwogICAgICAgICBwdy5wcmludGxuKCIgbUtleWd1YXJkUmVxdWVzdGVkPSIgKyBtS2V5Z3VhcmRSZXF1ZXN0ZWQpOwogICAgICAgICBwdy5wcmludGxuKCIgbUlzRG96aW5nPSIgKyBtSXNEb3ppbmcpOworICAgICAgICBwdy5wcmludGxuKCIgbUlzRHJlYW1pbmc9IiArIG1Jc0RyZWFtaW5nKTsKICAgICAgICAgcHcucHJpbnRsbigiIG1MaXN0ZW5lcnN7IiArIG1MaXN0ZW5lcnMuc2l6ZSgpICsgIn09Iik7CiAgICAgICAgIGZvciAoUmFua2VkTGlzdGVuZXIgcmwgOiBtTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIHJsLm1MaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL2RhZ2dlci9DZW50cmFsU3VyZmFjZXNEZXBlbmRlbmNpZXNNb2R1bGUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvZGFnZ2VyL0NlbnRyYWxTdXJmYWNlc0RlcGVuZGVuY2llc01vZHVsZS5qYXZhCmluZGV4IGQ3NTY4YTkuLjU2NWMwYTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvZGFnZ2VyL0NlbnRyYWxTdXJmYWNlc0RlcGVuZGVuY2llc01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvZGFnZ2VyL0NlbnRyYWxTdXJmYWNlc0RlcGVuZGVuY2llc01vZHVsZS5qYXZhCkBAIC01NCw2ICs1NCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLmNvbW1hbmRsaW5lLkNvbW1hbmRSZWdpc3RyeTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuZ2VzdHVyZS5Td2lwZVN0YXR1c0JhckF3YXlHZXN0dXJlSGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLk5vdGlmUGlwZWxpbmVGbGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLlJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24uTm90aWZDb2xsZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZlBpcGVsaW5lOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5ub3RpZmNvbGxlY3Rpb24uQ29tbW9uTm90aWZDb2xsZWN0aW9uOwpAQCAtNzcsMTQgKzc4LDE0IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5jb25jdXJyZW5jeS5EZWxheWFibGVFeGVjdXRvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2s7CiAKLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KIGltcG9ydCBkYWdnZXIuQmluZHM7CiBpbXBvcnQgZGFnZ2VyLkxhenk7CiBpbXBvcnQgZGFnZ2VyLk1vZHVsZTsKIGltcG9ydCBkYWdnZXIuUHJvdmlkZXM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKIC8qKgogICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW5zdGFuY2VzIG5lZWRlZCB0byBjb25zdHJ1Y3Qge0BsaW5rIENlbnRyYWxTdXJmYWNlc0ltcGx9LiBUaGVzZSBhcmUgbW92ZWQgdG8KICAqIHRoaXMgc2VwYXJhdGUgZnJvbSB7QGxpbmsgQ2VudHJhbFN1cmZhY2VzTW9kdWxlfSBtb2R1bGUgc28gdGhhdCBjb21wb25lbnRzIHRoYXQgd2lzaCB0byBidWlsZApAQCAtMTA1LDYgKzEwNiw3IEBACiAgICAgICAgICAgICBMYXp5PE9wdGlvbmFsPENlbnRyYWxTdXJmYWNlcz4+IGNlbnRyYWxTdXJmYWNlc09wdGlvbmFsTGF6eSwKICAgICAgICAgICAgIFN0YXR1c0JhclN0YXRlQ29udHJvbGxlciBzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCiAgICAgICAgICAgICBSZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIgcmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyIHJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciwKICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWNrTm90aWZpZXIgY2xpY2tOb3RpZmllciwKICAgICAgICAgICAgIEFjdGlvbkNsaWNrTG9nZ2VyIGFjdGlvbkNsaWNrTG9nZ2VyLAogICAgICAgICAgICAgRHVtcE1hbmFnZXIgZHVtcE1hbmFnZXIpIHsKQEAgLTExNyw2ICsxMTksNyBAQAogICAgICAgICAgICAgICAgIGNlbnRyYWxTdXJmYWNlc09wdGlvbmFsTGF6eSwKICAgICAgICAgICAgICAgICBzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgcmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIHJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciwKICAgICAgICAgICAgICAgICBjbGlja05vdGlmaWVyLAogICAgICAgICAgICAgICAgIGFjdGlvbkNsaWNrTG9nZ2VyLAogICAgICAgICAgICAgICAgIGR1bXBNYW5hZ2VyKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL1JlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL1JlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlci5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTgyZGZhZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL1JlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlci5rdApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uCisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kYWdnZXIuU3lzVUlTaW5nbGV0b24KK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5sb2cuZGFnZ2VyLk5vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5sb2cuTG9nQnVmZmVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5sb2cuTG9nTGV2ZWwuREVCVUcKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CisKKy8qKiBMb2dnZXIgY2xhc3MgZm9yIFtSZW1vdGVJbnB1dENvbnRyb2xsZXJdLiAqLworQFN5c1VJU2luZ2xldG9uCitjbGFzcyBSZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIKK0BJbmplY3QKK2NvbnN0cnVjdG9yKEBOb3RpZmljYXRpb25SZW1vdGVJbnB1dExvZyBwcml2YXRlIHZhbCBsb2dCdWZmZXI6IExvZ0J1ZmZlcikgeworCisgICAgLyoqIGxvZ3MgYWRkUmVtb3RlSW5wdXQgaW52b2NhdGlvbiBvZiBbUmVtb3RlSW5wdXRDb250cm9sbGVyXSAqLworICAgIGZ1biBsb2dBZGRSZW1vdGVJbnB1dCgKKyAgICAgICAgZW50cnlLZXk6IFN0cmluZywKKyAgICAgICAgaXNSZW1vdGVJbnB1dEFscmVhZHlBY3RpdmU6IEJvb2xlYW4sCisgICAgICAgIGlzUmVtb3RlSW5wdXRGb3VuZDogQm9vbGVhbgorICAgICkgPQorICAgICAgICBsb2dCdWZmZXIubG9nKAorICAgICAgICAgICAgVEFHLAorICAgICAgICAgICAgREVCVUcsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyMSA9IGVudHJ5S2V5CisgICAgICAgICAgICAgICAgYm9vbDEgPSBpc1JlbW90ZUlucHV0QWxyZWFkeUFjdGl2ZQorICAgICAgICAgICAgICAgIGJvb2wyID0gaXNSZW1vdGVJbnB1dEZvdW5kCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeyAiYWRkUmVtb3RlSW5wdXQgZW50cnk6ICRzdHIxLCBpc0FscmVhZHlBY3RpdmU6ICRib29sMSwgaXNGb3VuZDokYm9vbDIiIH0KKyAgICAgICAgKQorCisgICAgLyoqIGxvZ3MgcmVtb3ZlUmVtb3RlSW5wdXQgaW52b2NhdGlvbiBvZiBbUmVtb3RlSW5wdXRDb250cm9sbGVyXSAqLworICAgIEBKdm1PdmVybG9hZHMKKyAgICBmdW4gbG9nUmVtb3ZlUmVtb3RlSW5wdXQoCisgICAgICAgIGVudHJ5S2V5OiBTdHJpbmcsCisgICAgICAgIHJlbW90ZUVkaXRJbWVWaXNpYmxlOiBCb29sZWFuLAorICAgICAgICByZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheTogQm9vbGVhbiwKKyAgICAgICAgaXNSZW1vdGVJbnB1dEFjdGl2ZTogQm9vbGVhbj8gPSBudWxsCisgICAgKSA9CisgICAgICAgIGxvZ0J1ZmZlci5sb2coCisgICAgICAgICAgICBUQUcsCisgICAgICAgICAgICBERUJVRywKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHIxID0gZW50cnlLZXkKKyAgICAgICAgICAgICAgICBib29sMSA9IHJlbW90ZUVkaXRJbWVWaXNpYmxlCisgICAgICAgICAgICAgICAgYm9vbDIgPSByZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheQorICAgICAgICAgICAgICAgIHN0cjIgPSBpc1JlbW90ZUlucHV0QWN0aXZlPy50b1N0cmluZygpID86ICJOL0EiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJyZW1vdmVSZW1vdGVJbnB1dCBlbnRyeTogJHN0cjEsIHJlbW90ZUVkaXRJbWVWaXNpYmxlOiAkYm9vbDEiICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXk6ICRib29sMiwgaXNBY3RpdmU6ICRzdHIyIgorICAgICAgICAgICAgfQorICAgICAgICApCisKKyAgICBwcml2YXRlIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBUQUcgPSAiUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsLmphdmEKaW5kZXggMjc0Mzc3Zi4uNmY0ZWVkMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsLmphdmEKQEAgLTI4LDEyICsyOCw5IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmRyZWFtcy5JRHJlYW1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uU3RhdHVzQmFyTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiAKQEAgLTcwLDcgKzY3LDYgQEAKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgZmluYWwgUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRHJlYW1NYW5hZ2VyIG1EcmVhbU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24gbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIEJhdHRlcnlDb250cm9sbGVyIG1CYXR0ZXJ5Q29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIEhlYWRzVXBNYW5hZ2VyIG1IZWFkc1VwTWFuYWdlcjsKQEAgLTExMiw3ICsxMDgsNiBAQAogICAgIHB1YmxpYyBOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbCgKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIsCiAgICAgICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgSURyZWFtTWFuYWdlciBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICBBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24gYW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgQmF0dGVyeUNvbnRyb2xsZXIgYmF0dGVyeUNvbnRyb2xsZXIsCiAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLApAQCAtMTI2LDcgKzEyMSw2IEBACiAgICAgICAgICAgICBVc2VyVHJhY2tlciB1c2VyVHJhY2tlcikgewogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOwogICAgICAgICBtUG93ZXJNYW5hZ2VyID0gcG93ZXJNYW5hZ2VyOwotICAgICAgICBtRHJlYW1NYW5hZ2VyID0gZHJlYW1NYW5hZ2VyOwogICAgICAgICBtQmF0dGVyeUNvbnRyb2xsZXIgPSBiYXR0ZXJ5Q29udHJvbGxlcjsKICAgICAgICAgbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiA9IGFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciA9IHN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKQEAgLTI4Nyw3ICsyODEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgZHJlYW1pbmcsIHRoZW4gbGF1bmNoIHRoZSBGdWxsU2NyZWVuSW50ZW50Ci0gICAgICAgIGlmIChpc0RyZWFtaW5nKCkpIHsKKyAgICAgICAgLy8gV2UgYXZvaWQgdXNpbmcgSURyZWFtTWFuYWdlciNpc0RyZWFtaW5nIGhlcmUgYXMgdGhhdCBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgZHVyaW5nCisgICAgICAgIC8vIHRoZSBkcmVhbSdzIHdha2UtdXAgcGhhc2UuCisgICAgICAgIGlmIChtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldERlY2lzaW9uR2l2ZW5TdXBwcmVzc2lvbihGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uRlNJX0RFVklDRV9JU19EUkVBTUlORywKICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NlZEJ5RE5EKTsKICAgICAgICAgfQpAQCAtMzY1LDE2ICszNjEsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RyZWFtaW5nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHF1ZXJ5IGRyZWFtIG1hbmFnZXIuIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkSGVhZHNVcFdoZW5Bd2FrZShOb3RpZmljYXRpb25FbnRyeSBlbnRyeSwgYm9vbGVhbiBsb2cpIHsKICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiA9IGVudHJ5LmdldFNibigpOwogCkBAIC00MjQsNyArNDEwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gaW5Vc2UgPSBtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSAmJiAhaXNEcmVhbWluZygpOworICAgICAgICBib29sZWFuIGluVXNlID0gbVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkgJiYgIW1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpOwogCiAgICAgICAgIGlmICghaW5Vc2UpIHsKICAgICAgICAgICAgIGlmIChsb2cpIG1Mb2dnZXIubG9nTm9IZWFkc1VwTm90SW5Vc2UoZW50cnkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93LmphdmEKaW5kZXggYTViN2U5NC4uMzNjYmYwNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvdy5qYXZhCkBAIC0xODQsNyArMTg0LDYgQEAKICAgICBwcml2YXRlIGludCBtTWF4U21hbGxIZWlnaHQ7CiAgICAgcHJpdmF0ZSBpbnQgbU1heFNtYWxsSGVpZ2h0TGFyZ2U7CiAgICAgcHJpdmF0ZSBpbnQgbU1heEV4cGFuZGVkSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1JbmNyZWFzZWRQYWRkaW5nQmV0d2VlbkVsZW1lbnRzOwogICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25MYXVuY2hIZWlnaHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1NdXN0U3RheU9uU2NyZWVuOwogCkBAIC0zMDY1LDE0ICszMDY0LDYgQEAKICAgICAgICAgcmV0dXJuIHNob3dpbmdMYXlvdXQgIT0gbnVsbCAmJiBzaG93aW5nTGF5b3V0LnJlcXVpcmVSb3dUb0hhdmVPdmVybGFwcGluZ1JlbmRlcmluZygpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0RXh0cmFCb3R0b21QYWRkaW5nKCkgewotICAgICAgICBpZiAobUlzU3VtbWFyeVdpdGhDaGlsZHJlbiAmJiBpc0dyb3VwRXhwYW5kZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1JbmNyZWFzZWRQYWRkaW5nQmV0d2VlbkVsZW1lbnRzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHNldElubGluZVJlcGx5QW5pbWF0aW9uRmxhZ0VuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKICAgICAgICAgbUlzSW5saW5lUmVwbHlBbmltYXRpb25GbGFnRW5hYmxlZCA9IGlzRW5hYmxlZDsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZVZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlVmlldy5qYXZhCmluZGV4IDI1YzcyNjQuLjlkZjZiYTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlVmlldy5qYXZhCkBAIC00NTEsNyArNDUxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDbGlwcGluZygpIHsKICAgICAgICAgaWYgKG1DbGlwVG9BY3R1YWxIZWlnaHQgJiYgc2hvdWxkQ2xpcFRvQWN0dWFsSGVpZ2h0KCkpIHsKICAgICAgICAgICAgIGludCB0b3AgPSBnZXRDbGlwVG9wQW1vdW50KCk7Ci0gICAgICAgICAgICBpbnQgYm90dG9tID0gTWF0aC5tYXgoTWF0aC5tYXgoZ2V0QWN0dWFsSGVpZ2h0KCkgKyBnZXRFeHRyYUJvdHRvbVBhZGRpbmcoKQorICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1hdGgubWF4KE1hdGgubWF4KGdldEFjdHVhbEhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgIC0gbUNsaXBCb3R0b21BbW91bnQsIHRvcCksIG1NaW5pbXVtSGVpZ2h0Rm9yQ2xpcHBpbmcpOwogICAgICAgICAgICAgbUNsaXBSZWN0LnNldChJbnRlZ2VyLk1JTl9WQUxVRSwgdG9wLCBJbnRlZ2VyLk1BWF9WQUxVRSwgYm90dG9tKTsKICAgICAgICAgICAgIHNldENsaXBCb3VuZHMobUNsaXBSZWN0KTsKQEAgLTU5MiwxMyArNTkyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIHBhZGRpbmcgdXNlZCB0byBhbHRlciBob3cgbXVjaCBvZiB0aGUgdmlldyBpcyBjbGlwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RXh0cmFCb3R0b21QYWRkaW5nKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdyb3VwJ3MgZXhwYW5zaW9uIHN0YXRlIGlzIGNoYW5naW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNHcm91cEV4cGFuc2lvbkNoYW5naW5nKCkgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvbkNvbnRlbnRWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvTm90aWZpY2F0aW9uQ29udGVudFZpZXcuamF2YQppbmRleCBkOTNjMTJiLi41ODM0ZGNiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvTm90aWZpY2F0aW9uQ29udGVudFZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvTm90aWZpY2F0aW9uQ29udGVudFZpZXcuamF2YQpAQCAtMjA1NSw2ICsyMDU1LDIzIEBACiAgICAgICAgICAgICBwdy5wcmludCgibnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKKworICAgICAgICBwdy5wcmludCgiUmVtb3RlSW5wdXRWaWV3cyB7ICIpOworICAgICAgICBwdy5wcmludCgiIHZpc2libGVUeXBlOiAiICsgbVZpc2libGVUeXBlKTsKKyAgICAgICAgaWYgKG1IZWFkc1VwUmVtb3RlSW5wdXRDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIsIGhlYWRzVXBSZW1vdGVJbnB1dENvbnRyb2xsZXIuaXNBY3RpdmU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtSGVhZHNVcFJlbW90ZUlucHV0Q29udHJvbGxlci5pc0FjdGl2ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIsIGhlYWRzVXBSZW1vdGVJbnB1dENvbnRyb2xsZXI6IG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwYW5kZWRSZW1vdGVJbnB1dENvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHcucHJpbnQoIiwgZXhwYW5kZWRSZW1vdGVJbnB1dENvbnRyb2xsZXIuaXNBY3RpdmU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtRXhwYW5kZWRSZW1vdGVJbnB1dENvbnRyb2xsZXIuaXNBY3RpdmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdy5wcmludCgiLCBleHBhbmRlZFJlbW90ZUlucHV0Q29udHJvbGxlcjogbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oIiB9Iik7CiAgICAgfQogCiAgICAgLyoqIEFkZCBhbnkgZXhpc3RpbmcgU21hcnRSZXBseVZpZXcgdG8gdGhlIGR1bXAgKi8KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3N0YWNrL05vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9zdGFjay9Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dC5qYXZhCmluZGV4IGUyZTJhMjMuLmMwYWVkN2EgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3N0YWNrL05vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vc3RhY2svTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQuamF2YQpAQCAtNzMyLDE5ICs3MzIsMjggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgdG8gY29udHJvbGxlciwgd2hpY2ggd2lsbCBpbnZva2UgdXBkYXRlRm9vdGVyVmlldyBkaXJlY3RseQotICAgICAgICBib29sZWFuIHNob3dEaXNtaXNzVmlldyA9IG1DbGVhckFsbEVuYWJsZWQgJiYKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5oYXNBY3RpdmVDbGVhcmFibGVOb3RpZmljYXRpb25zKFJPV1NfQUxMKTsKLSAgICAgICAgYm9vbGVhbiBzaG93Rm9vdGVyVmlldyA9IChzaG93RGlzbWlzc1ZpZXcgfHwgbUNvbnRyb2xsZXIuZ2V0VmlzaWJsZU5vdGlmaWNhdGlvbkNvdW50KCkgPiAwKQotICAgICAgICAgICAgICAgICYmIG1Jc0N1cnJlbnRVc2VyU2V0dXAgIC8vIHNlZTogYi8xOTMxNDk1NTAKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzaG93SGlzdG9yeSA9IG1Db250cm9sbGVyLmlzSGlzdG9yeUVuYWJsZWQoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzaG93RGlzbWlzc1ZpZXcgPSBzaG91bGRTaG93RGlzbWlzc1ZpZXcoKTsKKworICAgICAgICB1cGRhdGVGb290ZXJWaWV3KHNob3VsZFNob3dGb290ZXJWaWV3KHNob3dEaXNtaXNzVmlldykvKiB2aXNpYmxlICovLAorICAgICAgICAgICAgICAgIHNob3dEaXNtaXNzVmlldyAvKiBzaG93RGlzbWlzc1ZpZXcgKi8sCisgICAgICAgICAgICAgICAgc2hvd0hpc3RvcnkvKiBzaG93SGlzdG9yeSAqLyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFNob3dEaXNtaXNzVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1DbGVhckFsbEVuYWJsZWQKKyAgICAgICAgICAgICAgICAmJiBtQ29udHJvbGxlci5oYXNBY3RpdmVDbGVhcmFibGVOb3RpZmljYXRpb25zKFJPV1NfQUxMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2hvd0Zvb3RlclZpZXcoYm9vbGVhbiBzaG93RGlzbWlzc1ZpZXcpIHsKKyAgICAgICAgcmV0dXJuIChzaG93RGlzbWlzc1ZpZXcgfHwgbUNvbnRyb2xsZXIuZ2V0VmlzaWJsZU5vdGlmaWNhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICYmIG1Jc0N1cnJlbnRVc2VyU2V0dXAgLy8gc2VlOiBiLzE5MzE0OTU1MAogICAgICAgICAgICAgICAgICYmICFvbktleWd1YXJkKCkKICAgICAgICAgICAgICAgICAmJiBtVXBjb21pbmdTdGF0dXNCYXJTdGF0ZSAhPSBTdGF0dXNCYXJTdGF0ZS5LRVlHVUFSRAogICAgICAgICAgICAgICAgIC8vIHF1aWNrIHNldHRpbmdzIGRvbid0IGFmZmVjdCBub3RpZmljYXRpb25zIHdoZW4gbm90IGluIGZ1bGwgc2NyZWVuCiAgICAgICAgICAgICAgICAgJiYgKG1Rc0V4cGFuc2lvbkZyYWN0aW9uICE9IDEgfHwgIW1Rc0Z1bGxTY3JlZW4pCiAgICAgICAgICAgICAgICAgJiYgIW1TY3JlZW5PZmZBbmltYXRpb25Db250cm9sbGVyLnNob3VsZEhpZGVOb3RpZmljYXRpb25zRm9vdGVyKCkKICAgICAgICAgICAgICAgICAmJiAhbUlzUmVtb3RlSW5wdXRBY3RpdmU7Ci0gICAgICAgIGJvb2xlYW4gc2hvd0hpc3RvcnkgPSBtQ29udHJvbGxlci5pc0hpc3RvcnlFbmFibGVkKCk7Ci0KLSAgICAgICAgdXBkYXRlRm9vdGVyVmlldyhzaG93Rm9vdGVyVmlldywgc2hvd0Rpc21pc3NWaWV3LCBzaG93SGlzdG9yeSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDk5LDcgKzQ1MDgsNyBAQAogICAgICAgICAgICAgICAgIGV4cGFuZGFibGVWaWV3LnNldEZha2VTaGFkb3dJbnRlbnNpdHkoMC4wZiwgMC4wZiwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGZsb2F0IHlMb2NhdGlvbiA9IHByZXZpb3VzLmdldFRyYW5zbGF0aW9uWSgpICsgcHJldmlvdXMuZ2V0QWN0dWFsSGVpZ2h0KCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVZpZXcuZ2V0VHJhbnNsYXRpb25ZKCkgLSBwcmV2aW91cy5nZXRFeHRyYUJvdHRvbVBhZGRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVWaWV3LmdldFRyYW5zbGF0aW9uWSgpOwogICAgICAgICAgICAgICAgIGV4cGFuZGFibGVWaWV3LnNldEZha2VTaGFkb3dJbnRlbnNpdHkoCiAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC8gRmFrZVNoYWRvd1ZpZXcuU0hBRE9XX1NJQkxJTkdfVFJFU0hPTEQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5nZXRPdXRsaW5lQWxwaGEoKSwgKGludCkgeUxvY2F0aW9uLApAQCAtNTI3OCwyOSArNTI4Nyw3MSBAQAogICAgICAgICB9KTsKICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJDb250ZW50czoiKTsKLSAgICAgICAgRHVtcFV0aWxzS3Qud2l0aEluY3JlYXNlZEluZGVudChwdywgKCkgLT4gewotICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJOdW1iZXIgb2YgY2hpbGRyZW46ICIgKyBjaGlsZENvdW50KTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oKTsKKyAgICAgICAgRHVtcFV0aWxzS3Qud2l0aEluY3JlYXNlZEluZGVudCgKKyAgICAgICAgICAgICAgICBwdywKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJOdW1iZXIgb2YgY2hpbGRyZW46ICIgKyBjaGlsZENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIEV4cGFuZGFibGVWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdEluZGV4KGkpOwotICAgICAgICAgICAgICAgIGNoaWxkLmR1bXAocHcsIGFyZ3MpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB0cmFuc2llbnRWaWV3Q291bnQgPSBnZXRUcmFuc2llbnRWaWV3Q291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIlRyYW5zaWVudCBWaWV3czogIiArIHRyYW5zaWVudFZpZXdDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zaWVudFZpZXdDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRXhwYW5kYWJsZVZpZXcgY2hpbGQgPSAoRXhwYW5kYWJsZVZpZXcpIGdldFRyYW5zaWVudFZpZXcoaSk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuZHVtcChwdywgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWaWV3IHN3aXBlZFZpZXcgPSBtU3dpcGVIZWxwZXIuZ2V0U3dpcGVkVmlldygpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiU3dpcGVkIHZpZXc6ICIgKyBzd2lwZWRWaWV3KTsKLSAgICAgICAgICAgIGlmIChzd2lwZWRWaWV3IGluc3RhbmNlb2YgRXhwYW5kYWJsZVZpZXcpIHsKLSAgICAgICAgICAgICAgICBFeHBhbmRhYmxlVmlldyBleHBhbmRhYmxlVmlldyA9IChFeHBhbmRhYmxlVmlldykgc3dpcGVkVmlldzsKLSAgICAgICAgICAgICAgICBleHBhbmRhYmxlVmlldy5kdW1wKHB3LCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlVmlldyBjaGlsZCA9IGdldENoaWxkQXRJbmRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmR1bXAocHcsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRm9vdGVyVmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXBVdGlsc0t0LndpdGhJbmNyZWFzZWRJbmRlbnQocHcsICgpIC0+IGR1bXBGb290ZXJWaWV3VmlzaWJpbGl0eShwdykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2llbnRWaWV3Q291bnQgPSBnZXRUcmFuc2llbnRWaWV3Q291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiVHJhbnNpZW50IFZpZXdzOiAiICsgdHJhbnNpZW50Vmlld0NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2llbnRWaWV3Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZVZpZXcgY2hpbGQgPSAoRXhwYW5kYWJsZVZpZXcpIGdldFRyYW5zaWVudFZpZXcoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kdW1wKHB3LCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBWaWV3IHN3aXBlZFZpZXcgPSBtU3dpcGVIZWxwZXIuZ2V0U3dpcGVkVmlldygpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJTd2lwZWQgdmlldzogIiArIHN3aXBlZFZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3dpcGVkVmlldyBpbnN0YW5jZW9mIEV4cGFuZGFibGVWaWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlVmlldyBleHBhbmRhYmxlVmlldyA9IChFeHBhbmRhYmxlVmlldykgc3dpcGVkVmlldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVWaWV3LmR1bXAocHcsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBGb290ZXJWaWV3VmlzaWJpbGl0eShJbmRlbnRpbmdQcmludFdyaXRlciBwdykgeworICAgICAgICBmaW5hbCBib29sZWFuIHNob3dEaXNtaXNzVmlldyA9IHNob3VsZFNob3dEaXNtaXNzVmlldygpOworCisgICAgICAgIHB3LnByaW50bG4oInNob3dGb290ZXJWaWV3OiAiICsgc2hvdWxkU2hvd0Zvb3RlclZpZXcoc2hvd0Rpc21pc3NWaWV3KSk7CisgICAgICAgIER1bXBVdGlsc0t0LndpdGhJbmNyZWFzZWRJbmRlbnQoCisgICAgICAgICAgICAgICAgcHcsCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJzaG93RGlzbWlzc1ZpZXc6ICIgKyBzaG93RGlzbWlzc1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBEdW1wVXRpbHNLdC53aXRoSW5jcmVhc2VkSW5kZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigibUNsZWFyQWxsRW5hYmxlZDogIiArIG1DbGVhckFsbEVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNBY3RpdmVDbGVhcmFibGVOb3RpZmljYXRpb25zOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db250cm9sbGVyLmhhc0FjdGl2ZUNsZWFyYWJsZU5vdGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPV1NfQUxMKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigic2hvd0hpc3Rvcnk6ICIgKyBtQ29udHJvbGxlci5pc0hpc3RvcnlFbmFibGVkKCkpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpc2libGVOb3RpZmljYXRpb25Db3VudDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udHJvbGxlci5nZXRWaXNpYmxlTm90aWZpY2F0aW9uQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIm1Jc0N1cnJlbnRVc2VyU2V0dXA6ICIgKyBtSXNDdXJyZW50VXNlclNldHVwKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigib25LZXlndWFyZDogIiArIG9uS2V5Z3VhcmQoKSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIm1VcGNvbWluZ1N0YXR1c0JhclN0YXRlOiAiICsgbVVwY29taW5nU3RhdHVzQmFyU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJtUXNFeHBhbnNpb25GcmFjdGlvbjogIiArIG1Rc0V4cGFuc2lvbkZyYWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigibVFzRnVsbFNjcmVlbjogIiArIG1Rc0Z1bGxTY3JlZW4pOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtU2NyZWVuT2ZmQW5pbWF0aW9uQ29udHJvbGxlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5zaG91bGRIaWRlTm90aWZpY2F0aW9uc0Zvb3RlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2NyZWVuT2ZmQW5pbWF0aW9uQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hvdWxkSGlkZU5vdGlmaWNhdGlvbnNGb290ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIm1Jc1JlbW90ZUlucHV0QWN0aXZlOiAiICsgbUlzUmVtb3RlSW5wdXRBY3RpdmUpOworICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIEBTaGFkZVZpZXdSZWZhY3RvcihSZWZhY3RvckNvbXBvbmVudC5TSEFERV9WSUVXKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDBlODM3ZDIuLmEzNWU1YjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTE4LDEyICsxOCwxNSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55TG9uZzsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKIAogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdGluZy5UZXN0YWJsZUxvb3BlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Db25maWd1cmF0aW9uQ29udHJvbGxlcjsKQEAgLTM3LDYgKzQwLDcgQEAKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CiAKIEBTbWFsbFRlc3QKK0BUZXN0YWJsZUxvb3Blci5SdW5XaXRoTG9vcGVyCiBAUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBLZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlclRlc3QgZXh0ZW5kcyBTeXN1aVRlc3RDYXNlIHsKICAgICBATW9jawpAQCAtNDUsMTQgKzQ5LDE0IEBACiAgICAgcHJpdmF0ZSBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbUtleWd1YXJkVXBkYXRlTW9uaXRvcjsKICAgICBATW9jawogICAgIHByaXZhdGUgS2V5Z3VhcmRNZXNzYWdlQXJlYSBtS2V5Z3VhcmRNZXNzYWdlQXJlYTsKLQogICAgIHByaXZhdGUgS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXIgbU1lc3NhZ2VBcmVhQ29udHJvbGxlcjsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOwogICAgICAgICBtTWVzc2FnZUFyZWFDb250cm9sbGVyID0gbmV3IEtleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyLkZhY3RvcnkoCi0gICAgICAgICAgICAgICAgbUtleWd1YXJkVXBkYXRlTW9uaXRvciwgbUNvbmZpZ3VyYXRpb25Db250cm9sbGVyKS5jcmVhdGUobUtleWd1YXJkTWVzc2FnZUFyZWEpOworICAgICAgICAgICAgICAgIG1LZXlndWFyZFVwZGF0ZU1vbml0b3IsIG1Db25maWd1cmF0aW9uQ29udHJvbGxlcikuY3JlYXRlKAorICAgICAgICAgICAgICAgIG1LZXlndWFyZE1lc3NhZ2VBcmVhKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtODksNiArOTMsMTkgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNZXNzYWdlX0Fubm91bmNlRm9yQWNjZXNzaWJpbGl0eSgpIHsKKyAgICAgICAgQXJndW1lbnRDYXB0b3I8UnVubmFibGU+IGFyZ3VtZW50Q2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoUnVubmFibGUuY2xhc3MpOworICAgICAgICB3aGVuKG1LZXlndWFyZE1lc3NhZ2VBcmVhLmdldFRleHQoKSkudGhlblJldHVybigiYWJjIik7CisgICAgICAgIG1NZXNzYWdlQXJlYUNvbnRyb2xsZXIuc2V0TWVzc2FnZSgiYWJjIik7CisKKyAgICAgICAgdmVyaWZ5KG1LZXlndWFyZE1lc3NhZ2VBcmVhKS5zZXRNZXNzYWdlKCJhYmMiLCAvKiBhbmltYXRlPSAqLyB0cnVlKTsKKyAgICAgICAgdmVyaWZ5KG1LZXlndWFyZE1lc3NhZ2VBcmVhKS5yZW1vdmVDYWxsYmFja3MoYW55KFJ1bm5hYmxlLmNsYXNzKSk7CisgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRNZXNzYWdlQXJlYSkucG9zdERlbGF5ZWQoYXJndW1lbnRDYXB0b3IuY2FwdHVyZSgpLCBhbnlMb25nKCkpOworICAgICAgICBhcmd1bWVudENhcHRvci5nZXRWYWx1ZSgpLnJ1bigpOworICAgICAgICB2ZXJpZnkobUtleWd1YXJkTWVzc2FnZUFyZWEpLmFubm91bmNlRm9yQWNjZXNzaWJpbGl0eSgiYWJjIik7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qm91bmNlclZpc2libGUoKSB7CiAgICAgICAgIG1NZXNzYWdlQXJlYUNvbnRyb2xsZXIuc2V0SXNWaXNpYmxlKHRydWUpOwogICAgICAgICB2ZXJpZnkobUtleWd1YXJkTWVzc2FnZUFyZWEpLnNldElzVmlzaWJsZSh0cnVlKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAzOGQzYTNlLi5mOTY2ZWIzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyVGVzdC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuY2xhc3NpZmllci5GYWxzaW5nQTExeURlbGVnYXRlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GZWF0dXJlRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3M7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLlNlc3Npb25UcmFja2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQWN0aXZpdHlTdGFydGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuRmFsc2luZ01hbmFnZXI7CkBAIC02MTksMTMgKzYyMCwyNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVpbmZsYXRlVmlld0ZsaXBwZXIoKSB7Ci0gICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5yZWluZmxhdGVWaWV3RmxpcHBlcigpOworICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVpbmZsYXRlVmlld0ZsaXBwZXIoKCkgLT4ge30pOwogICAgICAgICB2ZXJpZnkobUtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIpLmNsZWFyVmlld3MoKTsKICAgICAgICAgdmVyaWZ5KG1LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyKS5nZXRTZWN1cml0eVZpZXcoYW55KFNlY3VyaXR5TW9kZS5jbGFzcyksCiAgICAgICAgICAgICAgICAgYW55KEtleWd1YXJkU2VjdXJpdHlDYWxsYmFjay5jbGFzcykpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlaW5mbGF0ZVZpZXdGbGlwcGVyX2FzeW5jQm91bmNlckZsYWdPbigpIHsKKyAgICAgICAgd2hlbihtRmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5BU1lOQ19JTkZMQVRFX0JPVU5DRVIpKS50aGVuUmV0dXJuKHRydWUpOworICAgICAgICBLZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLk9uVmlld0luZmxhdGVkTGlzdGVuZXIgb25WaWV3SW5mbGF0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgIH07CisgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5yZWluZmxhdGVWaWV3RmxpcHBlcihvblZpZXdJbmZsYXRlZExpc3RlbmVyKTsKKyAgICAgICAgdmVyaWZ5KG1LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyKS5jbGVhclZpZXdzKCk7CisgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcikuYXN5bmNocm9ub3VzbHlJbmZsYXRlVmlldygKKyAgICAgICAgICAgICAgICBhbnkoU2VjdXJpdHlNb2RlLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBhbnkoS2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrLmNsYXNzKSwgZXEob25WaWV3SW5mbGF0ZWRMaXN0ZW5lcikpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNpZGVGcHNDb250cm9sbGVyU2hvdygpIHsKICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLnVwZGF0ZVNpZGVGcHNWaXNpYmlsaXR5KC8qIGlzVmlzaWJsZT0gKi8gdHJ1ZSk7CiAgICAgICAgIHZlcmlmeShtU2lkZUZwc0NvbnRyb2xsZXIpLnNob3coCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDE2MTRiNTcuLmFmYjU0ZDIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0zMSwxMCArMzEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dJbnNldHNDb250cm9sbGVyOwogCitpbXBvcnQgYW5kcm9pZHguYXN5bmNsYXlvdXRpbmZsYXRlci52aWV3LkFzeW5jTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLktleWd1YXJkU2VjdXJpdHlNb2RlbC5TZWN1cml0eU1vZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GZWF0dXJlRmxhZ3M7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtNTcsNiArNTksOCBAQAogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtTGF5b3V0SW5mbGF0ZXI7CiAgICAgQE1vY2sKKyAgICBwcml2YXRlIEFzeW5jTGF5b3V0SW5mbGF0ZXIgbUFzeW5jTGF5b3V0SW5mbGF0ZXI7CisgICAgQE1vY2sKICAgICBwcml2YXRlIEtleWd1YXJkSW5wdXRWaWV3Q29udHJvbGxlci5GYWN0b3J5IG1LZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5OwogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBFbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyLkZhY3RvcnkgbUVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5OwpAQCAtNzAsNiArNzQsOCBAQAogICAgIHByaXZhdGUgV2luZG93SW5zZXRzQ29udHJvbGxlciBtV2luZG93SW5zZXRzQ29udHJvbGxlcjsKICAgICBATW9jawogICAgIHByaXZhdGUgS2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrIG1LZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2s7CisgICAgQE1vY2sKKyAgICBwcml2YXRlIEZlYXR1cmVGbGFncyBtRmVhdHVyZUZsYWdzOwogCiAgICAgcHJpdmF0ZSBLZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyIG1LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyOwogCkBAIC04MiwxMCArODgsMTEgQEAKICAgICAgICAgd2hlbihtVmlldy5nZXRXaW5kb3dJbnNldHNDb250cm9sbGVyKCkpLnRoZW5SZXR1cm4obVdpbmRvd0luc2V0c0NvbnRyb2xsZXIpOwogICAgICAgICB3aGVuKG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeS5jcmVhdGUoYW55KEVtZXJnZW5jeUJ1dHRvbi5jbGFzcykpKQogICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyKTsKKyAgICAgICAgd2hlbihtVmlldy5nZXRDb250ZXh0KCkpLnRoZW5SZXR1cm4oZ2V0Q29udGV4dCgpKTsKIAogICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlciA9IG5ldyBLZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyKG1WaWV3LAotICAgICAgICAgICAgICAgIG1MYXlvdXRJbmZsYXRlciwgbUtleWd1YXJkU2VjdXJpdHlWaWV3Q29udHJvbGxlckZhY3RvcnksCi0gICAgICAgICAgICAgICAgbUVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBtTGF5b3V0SW5mbGF0ZXIsIG1Bc3luY0xheW91dEluZmxhdGVyLCBtS2V5Z3VhcmRTZWN1cml0eVZpZXdDb250cm9sbGVyRmFjdG9yeSwKKyAgICAgICAgICAgICAgICBtRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlckZhY3RvcnksIG1GZWF0dXJlRmxhZ3MpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMDgsNiArMTE1LDE0IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhc3luY2hyb25vdXNseUluZmxhdGVWaWV3KCkgeworICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5hc3luY2hyb25vdXNseUluZmxhdGVWaWV3KFNlY3VyaXR5TW9kZS5QSU4sCisgICAgICAgICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDYWxsYmFjaywgbnVsbCk7CisgICAgICAgIHZlcmlmeShtQXN5bmNMYXlvdXRJbmZsYXRlcikuaW5mbGF0ZShhbnlJbnQoKSwgZXEobVZpZXcpLCBhbnkoCisgICAgICAgICAgICAgICAgQXN5bmNMYXlvdXRJbmZsYXRlci5PbkluZmxhdGVGaW5pc2hlZExpc3RlbmVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBvbkRlbnNpdHlPckZvbnRTY2FsZUNoYW5nZWQoKSB7CiAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmNsZWFyVmlld3MoKTsKICAgICAgICAgdmVyaWZ5KG1WaWV3KS5yZW1vdmVBbGxWaWV3cygpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9Gb250VmFyaWF0aW9uVXRpbHNUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9Gb250VmFyaWF0aW9uVXRpbHNUZXN0Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGNhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL0ZvbnRWYXJpYXRpb25VdGlsc1Rlc3Qua3QKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5hbmltYXRpb24KKworaW1wb3J0IGFuZHJvaWQudGVzdGluZy5BbmRyb2lkVGVzdGluZ1J1bm5lcgoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydAoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCisKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19XR0hUID0gIndnaHQiCitwcml2YXRlIGNvbnN0IHZhbCBUQUdfV0RUSCA9ICJ3ZHRoIgorcHJpdmF0ZSBjb25zdCB2YWwgVEFHX09QU1ogPSAib3BzeiIKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19ST05EID0gIlJPTkQiCisKK0BSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyOjpjbGFzcykKK0BTbWFsbFRlc3QKK2NsYXNzIEZvbnRWYXJpYXRpb25VdGlsc1Rlc3QgOiBTeXN1aVRlc3RDYXNlKCkgeworICAgIEBUZXN0CisgICAgZnVuIHRlc3RVcGRhdGVGb250VmFyaWF0aW9uX2dldENvcnJlY3RGdmFyU3RyKCkgeworICAgICAgICB2YWwgZm9udFZhcmlhdGlvblV0aWxzID0gRm9udFZhcmlhdGlvblV0aWxzKCkKKyAgICAgICAgdmFsIGluaXRGdmFyID0KKyAgICAgICAgICAgIGZvbnRWYXJpYXRpb25VdGlscy51cGRhdGVGb250VmFyaWF0aW9uKAorICAgICAgICAgICAgICAgIHdlaWdodCA9IDEwMCwKKyAgICAgICAgICAgICAgICB3aWR0aCA9IDEwMCwKKyAgICAgICAgICAgICAgICBvcHRpY2FsU2l6ZSA9IC0xLAorICAgICAgICAgICAgICAgIHJvdW5kbmVzcyA9IDEwMAorICAgICAgICAgICAgKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCInJFRBR19XR0hUJyAxMDAsICckVEFHX1dEVEgnIDEwMCwgJyRUQUdfUk9ORCcgMTAwIiwgaW5pdEZ2YXIpCisgICAgICAgIHZhbCB1cGRhdGVkRnZhciA9CisgICAgICAgICAgICBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyMDAsCisgICAgICAgICAgICAgICAgd2lkdGggPSAxMDAsCisgICAgICAgICAgICAgICAgb3B0aWNhbFNpemUgPSAwLAorICAgICAgICAgICAgICAgIHJvdW5kbmVzcyA9IDEwMAorICAgICAgICAgICAgKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIickVEFHX1dHSFQnIDIwMCwgJyRUQUdfV0RUSCcgMTAwLCAnJFRBR19PUFNaJyAwLCAnJFRBR19ST05EJyAxMDAiLAorICAgICAgICAgICAgdXBkYXRlZEZ2YXIKKyAgICAgICAgKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RTdHlsZVZhbHVlVW5jaGFuZ2VfZ2V0QmxhbmtTdHIoKSB7CisgICAgICAgIHZhbCBmb250VmFyaWF0aW9uVXRpbHMgPSBGb250VmFyaWF0aW9uVXRpbHMoKQorICAgICAgICBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigKKyAgICAgICAgICAgIHdlaWdodCA9IDEwMCwKKyAgICAgICAgICAgIHdpZHRoID0gMTAwLAorICAgICAgICAgICAgb3B0aWNhbFNpemUgPSAwLAorICAgICAgICAgICAgcm91bmRuZXNzID0gMTAwCisgICAgICAgICkKKyAgICAgICAgdmFsIHVwZGF0ZWRGdmFyMSA9CisgICAgICAgICAgICBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxMDAsCisgICAgICAgICAgICAgICAgd2lkdGggPSAxMDAsCisgICAgICAgICAgICAgICAgb3B0aWNhbFNpemUgPSAwLAorICAgICAgICAgICAgICAgIHJvdW5kbmVzcyA9IDEwMAorICAgICAgICAgICAgKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCB1cGRhdGVkRnZhcjEpCisgICAgICAgIHZhbCB1cGRhdGVkRnZhcjIgPSBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigpCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIHVwZGF0ZWRGdmFyMikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvclRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvclRlc3Qua3QKaW5kZXggYjM4OTU1OC4uZDdhYTZlMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3JUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vVGV4dEFuaW1hdG9yVGVzdC5rdApAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyCiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcgogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmZvbnRzLkZvbnRWYXJpYXRpb25BeGlzCiBpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyCiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dAogaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXQKQEAgLTE4MCw3MSArMTc5LDQgQEAKIAogICAgICAgICBhc3NlcnRUaGF0KHBhaW50LnR5cGVmYWNlKS5pc1NhbWVJbnN0YW5jZUFzKHByZXZUeXBlZmFjZSkKICAgICB9Ci0KLSAgICBAVGVzdAotICAgIGZ1biB0ZXN0U2V0VGV4dFN0eWxlX2FkZFdlaWdodCgpIHsKLSAgICAgICAgdGVzdFdlaWdodENoYW5nZSgiIiwgMTAwLCBGb250VmFyaWF0aW9uQXhpcy5mcm9tRm9udFZhcmlhdGlvblNldHRpbmdzKCInd2dodCcgMTAwIikhISkKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIGZ1biB0ZXN0U2V0VGV4dFN0eWxlX2NoYW5nZVdlaWdodCgpIHsKLSAgICAgICAgdGVzdFdlaWdodENoYW5nZSgKLSAgICAgICAgICAgICAgICAiJ3dnaHQnIDUwMCIsCi0gICAgICAgICAgICAgICAgMTAwLAotICAgICAgICAgICAgICAgIEZvbnRWYXJpYXRpb25BeGlzLmZyb21Gb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyAxMDAiKSEhCi0gICAgICAgICkKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIGZ1biB0ZXN0U2V0VGV4dFN0eWxlX2FkZFdlaWdodFdpdGhPdGhlckF4aXMoKSB7Ci0gICAgICAgIHRlc3RXZWlnaHRDaGFuZ2UoCi0gICAgICAgICAgICAgICAgIid3ZHRoJyAxMDAiLAotICAgICAgICAgICAgICAgIDEwMCwKLSAgICAgICAgICAgICAgICBGb250VmFyaWF0aW9uQXhpcy5mcm9tRm9udFZhcmlhdGlvblNldHRpbmdzKCInd2dodCcgMTAwLCAnd2R0aCcgMTAwIikhIQotICAgICAgICApCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBmdW4gdGVzdFNldFRleHRTdHlsZV9jaGFuZ2VXZWlnaHRXaXRoT3RoZXJBeGlzKCkgewotICAgICAgICB0ZXN0V2VpZ2h0Q2hhbmdlKAotICAgICAgICAgICAgICAgICInd2dodCcgNTAwLCAnd2R0aCcgMTAwIiwKLSAgICAgICAgICAgICAgICAxMDAsCi0gICAgICAgICAgICAgICAgRm9udFZhcmlhdGlvbkF4aXMuZnJvbUZvbnRWYXJpYXRpb25TZXR0aW5ncygiJ3dnaHQnIDEwMCwgJ3dkdGgnIDEwMCIpISEKLSAgICAgICAgKQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuIHRlc3RXZWlnaHRDaGFuZ2UoCi0gICAgICAgICAgICBpbml0aWFsRm9udFZhcmlhdGlvblNldHRpbmdzOiBTdHJpbmcsCi0gICAgICAgICAgICB3ZWlnaHQ6IEludCwKLSAgICAgICAgICAgIGV4cGVjdGVkRm9udFZhcmlhdGlvblNldHRpbmdzOiBBcnJheTxGb250VmFyaWF0aW9uQXhpcz4KLSAgICApIHsKLSAgICAgICAgdmFsIGxheW91dCA9IG1ha2VMYXlvdXQoIkhlbGxvLCBXb3JsZCIsIFBBSU5UKQotICAgICAgICB2YWwgdmFsdWVBbmltYXRvciA9IG1vY2soVmFsdWVBbmltYXRvcjo6Y2xhc3MuamF2YSkKLSAgICAgICAgdmFsIHRleHRJbnRlcnBvbGF0b3IgPSBtb2NrKFRleHRJbnRlcnBvbGF0b3I6OmNsYXNzLmphdmEpCi0gICAgICAgIHZhbCBwYWludCA9Ci0gICAgICAgICAgICAgICAgVGV4dFBhaW50KCkuYXBwbHkgewotICAgICAgICAgICAgICAgICAgICB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZUZyb21GaWxlKCIvc3lzdGVtL2ZvbnRzL1JvYm90by1SZWd1bGFyLnR0ZiIpCi0gICAgICAgICAgICAgICAgICAgIGZvbnRWYXJpYXRpb25TZXR0aW5ncyA9IGluaXRpYWxGb250VmFyaWF0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGB3aGVuYCh0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50KS50aGVuUmV0dXJuKHBhaW50KQotCi0gICAgICAgIHZhbCB0ZXh0QW5pbWF0b3IgPQotICAgICAgICAgICAgICAgIFRleHRBbmltYXRvcihsYXlvdXQsIHt9KS5hcHBseSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dEludGVycG9sYXRvciA9IHRleHRJbnRlcnBvbGF0b3IKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRvciA9IHZhbHVlQW5pbWF0b3IKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIHRleHRBbmltYXRvci5zZXRUZXh0U3R5bGUod2VpZ2h0ID0gd2VpZ2h0LCBhbmltYXRlID0gZmFsc2UpCi0KLSAgICAgICAgdmFsIHJlc3VsdEZvbnRWYXJpYXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICBGb250VmFyaWF0aW9uQXhpcy5mcm9tRm9udFZhcmlhdGlvblNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICApCi0gICAgICAgIGV4cGVjdGVkRm9udFZhcmlhdGlvblNldHRpbmdzLmZvckVhY2ggeyBleHBlY3RlZEF4aXMgLT4KLSAgICAgICAgICAgIHZhbCByZXN1bHRBeGlzID0gcmVzdWx0Rm9udFZhcmlhdGlvbkxpc3Q/LmZpbHRlciB7IGl0LnRhZyA9PSBleHBlY3RlZEF4aXMudGFnIH0/LmdldCgwKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHRBeGlzKS5pc05vdE51bGwoKQotICAgICAgICAgICAgaWYgKHJlc3VsdEF4aXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRoYXQocmVzdWx0QXhpcy5zdHlsZVZhbHVlKS5pc0VxdWFsVG8oZXhwZWN0ZWRBeGlzLnN0eWxlVmFsdWUpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IGUxYzc0MTcuLmMwNjhlZmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9SZXR1cm47Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uaW5PcmRlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OwpAQCAtOTMwLDYgKzkyOSwxNSBAQAogICAgICAgICBhc3NlcnROb3RTYW1lKGZpcnN0RnBMb2NhdGlvbiwgbUF1dGhDb250cm9sbGVyLmdldEZpbmdlcnByaW50U2Vuc29yTG9jYXRpb24oKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VEaWFsb2dfd2hlbkdsb2JhbEFjdGlvbnNNZW51U2hvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2hvd0RpYWxvZyhuZXcgaW50W117MX0gLyogc2Vuc29ySWRzICovLCBmYWxzZSAvKiBjcmVkZW50aWFsQWxsb3dlZCAqLyk7CisgICAgICAgIG1BdXRoQ29udHJvbGxlci5oYW5kbGVTaG93R2xvYmFsQWN0aW9uc01lbnUoKTsKKyAgICAgICAgdmVyaWZ5KG1SZWNlaXZlcikub25EaWFsb2dEaXNtaXNzZWQoCisgICAgICAgICAgICAgICAgZXEoQmlvbWV0cmljUHJvbXB0LkRJU01JU1NFRF9SRUFTT05fVVNFUl9DQU5DRUwpLAorICAgICAgICAgICAgICAgIGVxKG51bGwpIC8qIGNyZWRlbnRpYWxBdHRlc3RhdGlvbiAqLyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dEaWFsb2coaW50W10gc2Vuc29ySWRzLCBib29sZWFuIGNyZWRlbnRpYWxBbGxvd2VkKSB7CiAgICAgICAgIG1BdXRoQ29udHJvbGxlci5zaG93QXV0aGVudGljYXRpb25EaWFsb2coY3JlYXRlVGVzdFByb21wdEluZm8oKSwKICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIgLyogcmVjZWl2ZXIgKi8sCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvc2V0dGluZ3MvQ29udHJvbHNTZXR0aW5nc0RpYWxvZ01hbmFnZXJJbXBsVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlckltcGxUZXN0Lmt0CmluZGV4IDVhNjEzYWEuLjU5MDk4OWQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlckltcGxUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlckltcGxUZXN0Lmt0CkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlCb29sZWFuCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jawogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYW55SW50CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5kb0Fuc3dlcgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXIKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeQogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYHdoZW5gCkBAIC0yMzQsNiArMjM1LDM2IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBmdW4gZGlhbG9nUG9zaXRpdmVCdXR0b25XaGVuQ2FsbGVkT25Db21wbGV0ZVNldHRpbmdJc1RydWUoKSB7CisgICAgICAgIHNoYXJlZFByZWZlcmVuY2VzLnB1dEF0dGVtcHRzKDApCisgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEJvb2woU0VUVElOR19TSE9XLCB0cnVlKQorICAgICAgICBzZWN1cmVTZXR0aW5ncy5wdXRCb29sKFNFVFRJTkdfQUNUSU9OLCBmYWxzZSkKKworICAgICAgICBkb0Fuc3dlciB7IGFzc2VydFRoYXQoc2VjdXJlU2V0dGluZ3MuZ2V0Qm9vbChTRVRUSU5HX0FDVElPTiwgZmFsc2UpKS5pc1RydWUoKSB9CisgICAgICAgICAgICAuYHdoZW5gKGNvbXBsZXRlZFJ1bm5hYmxlKQorICAgICAgICAgICAgLmludm9rZSgpCisKKyAgICAgICAgdW5kZXJUZXN0Lm1heWJlU2hvd0RpYWxvZyhjb250ZXh0LCBjb21wbGV0ZWRSdW5uYWJsZSkKKyAgICAgICAgY2xpY2tCdXR0b24oRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9QT1NJVElWRSkKKworICAgICAgICB2ZXJpZnkoY29tcGxldGVkUnVubmFibGUpLmludm9rZSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gZGlhbG9nUG9zaXRpdmVDYW5jZWxLZXlndWFyZFN0aWxsQ2FsbHNPbkNvbXBsZXRlKCkgeworICAgICAgICBgd2hlbmAoYWN0aXZpdHlTdGFydGVyLmRpc21pc3NLZXlndWFyZFRoZW5FeGVjdXRlKGFueSgpLCBudWxsYWJsZSgpLCBhbnlCb29sZWFuKCkpKQorICAgICAgICAgICAgLnRoZW5BbnN3ZXIgeyAoaXQuYXJndW1lbnRzWzFdIGFzIFJ1bm5hYmxlKS5ydW4oKSB9CisgICAgICAgIHNoYXJlZFByZWZlcmVuY2VzLnB1dEF0dGVtcHRzKDApCisgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEJvb2woU0VUVElOR19TSE9XLCB0cnVlKQorICAgICAgICBzZWN1cmVTZXR0aW5ncy5wdXRCb29sKFNFVFRJTkdfQUNUSU9OLCBmYWxzZSkKKworICAgICAgICB1bmRlclRlc3QubWF5YmVTaG93RGlhbG9nKGNvbnRleHQsIGNvbXBsZXRlZFJ1bm5hYmxlKQorICAgICAgICBjbGlja0J1dHRvbihEaWFsb2dJbnRlcmZhY2UuQlVUVE9OX1BPU0lUSVZFKQorCisgICAgICAgIHZlcmlmeShjb21wbGV0ZWRSdW5uYWJsZSkuaW52b2tlKCkKKyAgICB9CisKKyAgICBAVGVzdAogICAgIGZ1biBkaWFsb2dDYW5jZWxEb2VzbnRDaGFuZ2VTZXR0aW5nKCkgewogICAgICAgICBzaGFyZWRQcmVmZXJlbmNlcy5wdXRBdHRlbXB0cygwKQogICAgICAgICBzZWN1cmVTZXR0aW5ncy5wdXRCb29sKFNFVFRJTkdfU0hPVywgdHJ1ZSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlckltcGxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbFRlc3Qua3QKaW5kZXggM2Y2MWJmNy4uMTA3NTdhZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbFRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbFRlc3Qua3QKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgICB3aGVuZXZlcihjb250cm9sc0NvbnRyb2xsZXIucmVtb3ZlRmF2b3JpdGVzKGVxKGNvbXBvbmVudE5hbWUpKSkudGhlblJldHVybih0cnVlKQogICAgICAgICB2YWwgcGFuZWwgPSBTZWxlY3RlZEl0ZW0uUGFuZWxJdGVtKCJBcHAgbmFtZSIsIGNvbXBvbmVudE5hbWUpCiAgICAgICAgIHByZWZlcnJlZFBhbmVsUmVwb3NpdG9yeS5zZXRTZWxlY3RlZENvbXBvbmVudCgKLSAgICAgICAgICAgICAgICBTZWxlY3RlZENvbXBvbmVudFJlcG9zaXRvcnkuU2VsZWN0ZWRDb21wb25lbnQocGFuZWwpCisgICAgICAgICAgICBTZWxlY3RlZENvbXBvbmVudFJlcG9zaXRvcnkuU2VsZWN0ZWRDb21wb25lbnQocGFuZWwpCiAgICAgICAgICkKICAgICAgICAgdW5kZXJUZXN0LnNob3cocGFyZW50LCB7fSwgY29udGV4dCkKICAgICAgICAgdW5kZXJUZXN0LnN0YXJ0UmVtb3ZpbmdBcHAoY29tcG9uZW50TmFtZSwgIlRlc3QgQXBwIikKQEAgLTM2Miw2ICszNjIsMjYgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIGZ1biB0ZXN0Q2FuY2VsUmVtb3ZpbmdBcHBzRG9lc250UmVtb3ZlRmF2b3JpdGUoKSB7CisgICAgICAgIHZhbCBjb21wb25lbnROYW1lID0gQ29tcG9uZW50TmFtZShjb250ZXh0LCAiY2xzIikKKyAgICAgICAgd2hlbmV2ZXIoY29udHJvbHNDb250cm9sbGVyLnJlbW92ZUZhdm9yaXRlcyhlcShjb21wb25lbnROYW1lKSkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgdmFsIHBhbmVsID0gU2VsZWN0ZWRJdGVtLlBhbmVsSXRlbSgiQXBwIG5hbWUiLCBjb21wb25lbnROYW1lKQorICAgICAgICBwcmVmZXJyZWRQYW5lbFJlcG9zaXRvcnkuc2V0U2VsZWN0ZWRDb21wb25lbnQoCisgICAgICAgICAgICBTZWxlY3RlZENvbXBvbmVudFJlcG9zaXRvcnkuU2VsZWN0ZWRDb21wb25lbnQocGFuZWwpCisgICAgICAgICkKKyAgICAgICAgdW5kZXJUZXN0LnNob3cocGFyZW50LCB7fSwgY29udGV4dCkKKyAgICAgICAgdW5kZXJUZXN0LnN0YXJ0UmVtb3ZpbmdBcHAoY29tcG9uZW50TmFtZSwgIlRlc3QgQXBwIikKKworICAgICAgICBmYWtlRGlhbG9nQ29udHJvbGxlci5jbGlja05ldXRyYWwoKQorCisgICAgICAgIHZlcmlmeShjb250cm9sc0NvbnRyb2xsZXIsIG5ldmVyKCkpLnJlbW92ZUZhdm9yaXRlcyhlcShjb21wb25lbnROYW1lKSkKKyAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3QuZ2V0UHJlZmVycmVkU2VsZWN0ZWRJdGVtKGVtcHR5TGlzdCgpKSkuaXNFcXVhbFRvKHBhbmVsKQorICAgICAgICBhc3NlcnRUaGF0KHByZWZlcnJlZFBhbmVsUmVwb3NpdG9yeS5zaG91bGRBZGREZWZhdWx0Q29tcG9uZW50KCkpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQocHJlZmVycmVkUGFuZWxSZXBvc2l0b3J5LmdldFNlbGVjdGVkQ29tcG9uZW50KCkpCisgICAgICAgICAgICAuaXNFcXVhbFRvKFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkpCisgICAgfQorCisgICAgQFRlc3QKICAgICBmdW4gdGVzdEhpZGVDYW5jZWxzVGhlUmVtb3ZlQXBwRGlhbG9nKCkgewogICAgICAgICB2YWwgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudE5hbWUoY29udGV4dCwgImNscyIpCiAgICAgICAgIHVuZGVyVGVzdC5zaG93KHBhcmVudCwge30sIGNvbnRleHQpCkBAIC0zNzIsMTAgKzM5Miw0MiBAQAogICAgICAgICB2ZXJpZnkoZmFrZURpYWxvZ0NvbnRyb2xsZXIuZGlhbG9nKS5jYW5jZWwoKQogICAgIH0KIAorICAgIEBUZXN0CisgICAgZnVuIHRlc3RPblJvdGF0aW9uV2l0aFBhbmVsVXBkYXRlQm91bmRzQ2FsbGVkKCkgeworICAgICAgICBtb2NrTGF5b3V0SW5mbGF0ZXIoKQorICAgICAgICB2YWwgcGFja2FnZU5hbWUgPSAicGtnIgorICAgICAgICBgd2hlbmAoYXV0aG9yaXplZFBhbmVsc1JlcG9zaXRvcnkuZ2V0QXV0aG9yaXplZFBhbmVscygpKS50aGVuUmV0dXJuKHNldE9mKHBhY2thZ2VOYW1lKSkKKyAgICAgICAgdmFsIHBhbmVsID0gU2VsZWN0ZWRJdGVtLlBhbmVsSXRlbSgiQXBwIG5hbWUiLCBDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCAiY2xzIikpCisgICAgICAgIHZhbCBzZXJ2aWNlSW5mbyA9IHNldFVwUGFuZWwocGFuZWwpCisKKyAgICAgICAgdW5kZXJUZXN0LnNob3cocGFyZW50LCB7fSwgY29udGV4dCkKKworICAgICAgICB2YWwgY2FwdG9yID0gYXJndW1lbnRDYXB0b3I8Q29udHJvbHNMaXN0aW5nQ29udHJvbGxlci5Db250cm9sc0xpc3RpbmdDYWxsYmFjaz4oKQorCisgICAgICAgIHZlcmlmeShjb250cm9sc0xpc3RpbmdDb250cm9sbGVyKS5hZGRDYWxsYmFjayhjYXB0dXJlKGNhcHRvcikpCisgICAgICAgIGNhcHRvci52YWx1ZS5vblNlcnZpY2VzVXBkYXRlZChsaXN0T2Yoc2VydmljZUluZm8pKQorICAgICAgICBGYWtlRXhlY3V0b3IuZXhoYXVzdEV4ZWN1dG9ycyh1aUV4ZWN1dG9yLCBiZ0V4ZWN1dG9yKQorCisgICAgICAgIHZhbCB0YXNrVmlld0NvbnN1bWVyQ2FwdG9yID0gYXJndW1lbnRDYXB0b3I8Q29uc3VtZXI8VGFza1ZpZXc+PigpCisgICAgICAgIHZlcmlmeSh0YXNrVmlld0ZhY3RvcnkpLmNyZWF0ZShlcShjb250ZXh0KSwgZXEodWlFeGVjdXRvciksIGNhcHR1cmUodGFza1ZpZXdDb25zdW1lckNhcHRvcikpCisKKyAgICAgICAgdmFsIHRhc2tWaWV3OiBUYXNrVmlldyA9IG1vY2sgeworICAgICAgICAgICAgYHdoZW5gKHRoaXMucG9zdChhbnkoKSkpLnRoZW5BbnN3ZXIgeworICAgICAgICAgICAgICAgIHVpRXhlY3V0b3IuZXhlY3V0ZShpdC5hcmd1bWVudHNbMF0gYXMgUnVubmFibGUpCisgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGFza1ZpZXdDb25zdW1lckNhcHRvci52YWx1ZS5hY2NlcHQodGFza1ZpZXcpCisKKyAgICAgICAgdW5kZXJUZXN0Lm9uT3JpZW50YXRpb25DaGFuZ2UoKQorICAgICAgICB2ZXJpZnkodGFza1ZpZXcpLm9uTG9jYXRpb25DaGFuZ2VkKCkKKyAgICB9CisKICAgICBwcml2YXRlIGZ1biBzZXRVcFBhbmVsKHBhbmVsOiBTZWxlY3RlZEl0ZW0uUGFuZWxJdGVtKTogQ29udHJvbHNTZXJ2aWNlSW5mbyB7CiAgICAgICAgIHZhbCBhY3Rpdml0eSA9IENvbXBvbmVudE5hbWUoY29udGV4dCwgImFjdGl2aXR5IikKICAgICAgICAgcHJlZmVycmVkUGFuZWxSZXBvc2l0b3J5LnNldFNlbGVjdGVkQ29tcG9uZW50KAotICAgICAgICAgICAgICAgIFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkKKyAgICAgICAgICAgIFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkKICAgICAgICAgKQogICAgICAgICByZXR1cm4gQ29udHJvbHNTZXJ2aWNlSW5mbyhwYW5lbC5jb21wb25lbnROYW1lLCBwYW5lbC5hcHBOYW1lLCBhY3Rpdml0eSkKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvUGFuZWxUYXNrVmlld0NvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL1BhbmVsVGFza1ZpZXdDb250cm9sbGVyVGVzdC5rdAppbmRleCBkZTA0ZWY4Li45ZGY3OTkyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvUGFuZWxUYXNrVmlld0NvbnRyb2xsZXJUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlclRlc3Qua3QKQEAgLTE1Miw0ICsxNTIsMTIgQEAKICAgICAgICAgbGlzdGVuZXJDYXB0b3IudmFsdWUub25UYXNrUmVtb3ZhbFN0YXJ0ZWQoMCkKICAgICAgICAgdmVyaWZ5KHRhc2tWaWV3KS5yZWxlYXNlKCkKICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0T25SZWZyZXNoQm91bmRzKCkgeworICAgICAgICB1bmRlclRlc3QubGF1bmNoVGFza1ZpZXcoKQorCisgICAgICAgIHVuZGVyVGVzdC5yZWZyZXNoQm91bmRzKCkKKyAgICAgICAgdmVyaWZ5KHRhc2tWaWV3KS5vbkxvY2F0aW9uQ2hhbmdlZCgpCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9jb21wbGljYXRpb24vQ29tcGxpY2F0aW9uVHlwZXNVcGRhdGVyVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9jb21wbGljYXRpb24vQ29tcGxpY2F0aW9uVHlwZXNVcGRhdGVyVGVzdC5qYXZhCmluZGV4IGIzMzI5ZWIuLjBlMTZiNDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL2NvbXBsaWNhdGlvbi9Db21wbGljYXRpb25UeXBlc1VwZGF0ZXJUZXN0LmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLmNvbXBsaWNhdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUludDsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKQEAgLTM2LDcgKzM1LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kcmVhbXMuRHJlYW1PdmVybGF5U3RhdGVDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYXJlZC5jb25kaXRpb24uTW9uaXRvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLmNvbmN1cnJlbmN5LkZha2VFeGVjdXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnNldHRpbmdzLlNlY3VyZVNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuc2V0dGluZ3MuRmFrZVNldHRpbmdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5GYWtlU3lzdGVtQ2xvY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNTcsOCArNTYsNyBAQAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBATW9jawogICAgIHByaXZhdGUgRHJlYW1CYWNrZW5kIG1EcmVhbUJhY2tlbmQ7Ci0gICAgQE1vY2sKLSAgICBwcml2YXRlIFNlY3VyZVNldHRpbmdzIG1TZWN1cmVTZXR0aW5nczsKKyAgICBwcml2YXRlIEZha2VTZXR0aW5ncyBtU2VjdXJlU2V0dGluZ3M7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIERyZWFtT3ZlcmxheVN0YXRlQ29udHJvbGxlciBtRHJlYW1PdmVybGF5U3RhdGVDb250cm9sbGVyOwogICAgIEBDYXB0b3IKQEAgLTc0LDYgKzcyLDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKICAgICAgICAgd2hlbihtRHJlYW1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLnRoZW5SZXR1cm4obmV3IEhhc2hTZXQ8PigpKTsKKyAgICAgICAgbVNlY3VyZVNldHRpbmdzID0gbmV3IEZha2VTZXR0aW5ncygpOwogCiAgICAgICAgIG1Nb25pdG9yID0gU2VsZkV4ZWN1dGluZ01vbml0b3IuY3JlYXRlSW5zdGFuY2UoKTsKICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgQ29tcGxpY2F0aW9uVHlwZXNVcGRhdGVyKG1EcmVhbUJhY2tlbmQsIG1FeGVjdXRvciwKQEAgLTEwMCwxOSArOTksMTUgQEAKICAgICAgICAgd2hlbihtRHJlYW1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLnRoZW5SZXR1cm4obmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KAogICAgICAgICAgICAgICAgIERyZWFtQmFja2VuZC5DT01QTElDQVRJT05fVFlQRV9USU1FLCBEcmVhbUJhY2tlbmQuQ09NUExJQ0FUSU9OX1RZUEVfV0VBVEhFUiwKICAgICAgICAgICAgICAgICBEcmVhbUJhY2tlbmQuQ09NUExJQ0FUSU9OX1RZUEVfQUlSX1FVQUxJVFkpKSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRPYnNlcnZlciBzZXR0aW5nc09ic2VydmVyID0gY2FwdHVyZVNldHRpbmdzT2JzZXJ2ZXIoKTsKLSAgICAgICAgc2V0dGluZ3NPYnNlcnZlci5vbkNoYW5nZShmYWxzZSk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzZXR0aW5nIHRvIHRyaWdnZXIgYW55IGNvbnRlbnQgb2JzZXJ2ZXJzCisgICAgICAgIG1TZWN1cmVTZXR0aW5ncy5wdXRCb29sRm9yVXNlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUExJQ0FUSU9OU19FTkFCTEVELCB0cnVlLAorICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUubXlVc2VySWQoKSk7CiAgICAgICAgIG1FeGVjdXRvci5ydW5BbGxSZWFkeSgpOwogCiAgICAgICAgIHZlcmlmeShtRHJlYW1PdmVybGF5U3RhdGVDb250cm9sbGVyKS5zZXRBdmFpbGFibGVDb21wbGljYXRpb25UeXBlcygKICAgICAgICAgICAgICAgICBDb21wbGljYXRpb24uQ09NUExJQ0FUSU9OX1RZUEVfVElNRSB8IENvbXBsaWNhdGlvbi5DT01QTElDQVRJT05fVFlQRV9XRUFUSEVSCiAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbXBsaWNhdGlvbi5DT01QTElDQVRJT05fVFlQRV9BSVJfUVVBTElUWSk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZW50T2JzZXJ2ZXIgY2FwdHVyZVNldHRpbmdzT2JzZXJ2ZXIoKSB7Ci0gICAgICAgIHZlcmlmeShtU2VjdXJlU2V0dGluZ3MpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyRm9yVXNlcigKLSAgICAgICAgICAgICAgICBlcShTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUExJQ0FUSU9OU19FTkFCTEVEKSwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NPYnNlcnZlckNhcHRvci5jYXB0dXJlKCksIGVxKFVzZXJIYW5kbGUubXlVc2VySWQoKSkpOwotICAgICAgICByZXR1cm4gbVNldHRpbmdzT2JzZXJ2ZXJDYXB0b3IuZ2V0VmFsdWUoKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWdUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc0RlYnVnVGVzdC5rdAppbmRleCAyYmNkNzViLi4xOGY3ZGIxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWdUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NEZWJ1Z1Rlc3Qua3QKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmFueUJvb2xlYW4KIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmFueVN0cmluZwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uaW5PcmRlcgoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXIKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnkKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeU5vTW9yZUludGVyYWN0aW9ucwpAQCAtNTMsNyArNTQsNyBAQAogICovCiBAU21hbGxUZXN0CiBjbGFzcyBGZWF0dXJlRmxhZ3NEZWJ1Z1Rlc3QgOiBTeXN1aVRlc3RDYXNlKCkgewotICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIG1GZWF0dXJlRmxhZ3NEZWJ1ZzogRmVhdHVyZUZsYWdzRGVidWcKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBmZWF0dXJlRmxhZ3NEZWJ1ZzogRmVhdHVyZUZsYWdzRGVidWcKIAogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgZmxhZ01hbmFnZXI6IEZsYWdNYW5hZ2VyCkBAIC04NSw3ICs4Niw3IEBACiAgICAgICAgIGZsYWdNYXAucHV0KEZsYWdzLlRFQU1GT09ELm5hbWUsIEZsYWdzLlRFQU1GT09EKQogICAgICAgICBmbGFnTWFwLnB1dCh0ZWFtZm9vZGFibGVGbGFnQS5uYW1lLCB0ZWFtZm9vZGFibGVGbGFnQSkKICAgICAgICAgZmxhZ01hcC5wdXQodGVhbWZvb2RhYmxlRmxhZ0IubmFtZSwgdGVhbWZvb2RhYmxlRmxhZ0IpCi0gICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1ZyA9IEZlYXR1cmVGbGFnc0RlYnVnKAorICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1ZyA9IEZlYXR1cmVGbGFnc0RlYnVnKAogICAgICAgICAgICAgZmxhZ01hbmFnZXIsCiAgICAgICAgICAgICBtb2NrQ29udGV4dCwKICAgICAgICAgICAgIGdsb2JhbFNldHRpbmdzLApAQCAtOTUsNyArOTYsNyBAQAogICAgICAgICAgICAgZmxhZ01hcCwKICAgICAgICAgICAgIHJlc3RhcnRlcgogICAgICAgICApCi0gICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pbml0KCkKKyAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaW5pdCgpCiAgICAgICAgIHZlcmlmeShmbGFnTWFuYWdlcikub25TZXR0aW5nc0NoYW5nZWRBY3Rpb24gPSBhbnkoKQogICAgICAgICBicm9hZGNhc3RSZWNlaXZlciA9IHdpdGhBcmdDYXB0b3IgewogICAgICAgICAgICAgdmVyaWZ5KG1vY2tDb250ZXh0KS5yZWdpc3RlclJlY2VpdmVyKApAQCAtMTE2LDcgKzExNyw3IEBACiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8Qm9vbGVhbj4oZXEoIjQiKSwgYW55KCkpKS50aGVuUmV0dXJuKGZhbHNlKQogCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAogICAgICAgICAgICAgICAgIFJlbGVhc2VkRmxhZygKICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIyIiwKQEAgLTEyNSw3ICsxMjYsNyBAQAogICAgICAgICAgICAgKQogICAgICAgICApLmlzVHJ1ZSgpCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAogICAgICAgICAgICAgICAgIFVucmVsZWFzZWRGbGFnKAogICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIjMiLApAQCAtMTM0LDcgKzEzNSw3IEBACiAgICAgICAgICAgICApCiAgICAgICAgICkuaXNUcnVlKCkKICAgICAgICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCiAgICAgICAgICAgICAgICAgUmVsZWFzZWRGbGFnKAogICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIjQiLApAQCAtMTQzLDcgKzE0NCw3IEBACiAgICAgICAgICAgICApCiAgICAgICAgICkuaXNGYWxzZSgpCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAogICAgICAgICAgICAgICAgIFVucmVsZWFzZWRGbGFnKAogICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIjUiLApAQCAtMTU3LDggKzE1OCw4IEBACiAgICAgZnVuIHRlYW1Gb29kRmxhZ19GYWxzZSgpIHsKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxCb29sZWFuPigKICAgICAgICAgICAgIGVxKEZsYWdzLlRFQU1GT09ELm5hbWUpLCBhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzRmFsc2UoKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0IpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQikpLmlzVHJ1ZSgpCiAKICAgICAgICAgLy8gUmVndWxhciBib29sZWFuIGZsYWdzIHNob3VsZCBzdGlsbCB0ZXN0IHRoZSBzYW1lLgogICAgICAgICAvLyBPbmx5IG91ciB0ZWFtZm9vZGFibGVGbGFnIHNob3VsZCBjaGFuZ2UuCkBAIC0xNjksOCArMTcwLDggQEAKICAgICBmdW4gdGVhbUZvb2RGbGFnX1RydWUoKSB7CiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8Qm9vbGVhbj4oCiAgICAgICAgICAgICBlcShGbGFncy5URUFNRk9PRC5uYW1lKSwgYW55KCkpKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQikpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdBKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0IpKS5pc1RydWUoKQogCiAgICAgICAgIC8vIFJlZ3VsYXIgYm9vbGVhbiBmbGFncyBzaG91bGQgc3RpbGwgdGVzdCB0aGUgc2FtZS4KICAgICAgICAgLy8gT25seSBvdXIgdGVhbWZvb2RhYmxlRmxhZyBzaG91bGQgY2hhbmdlLgpAQCAtMTg1LDggKzE4Niw4IEBACiAgICAgICAgICAgICAudGhlblJldHVybihmYWxzZSkKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxCb29sZWFuPigKICAgICAgICAgICAgIGVxKEZsYWdzLlRFQU1GT09ELm5hbWUpLCBhbnkoKSkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdBKSkuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdCKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdBKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0IpKS5pc0ZhbHNlKCkKIAogICAgICAgICAvLyBSZWd1bGFyIGJvb2xlYW4gZmxhZ3Mgc2hvdWxkIHN0aWxsIHRlc3QgdGhlIHNhbWUuCiAgICAgICAgIC8vIE9ubHkgb3VyIHRlYW1mb29kYWJsZUZsYWcgc2hvdWxkIGNoYW5nZS4KQEAgLTIwNSw3ICsyMDYsNyBAQAogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEJvb2xlYW4+KGVxKCI1IiksIGFueSgpKSkudGhlblJldHVybihmYWxzZSkKIAogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKICAgICAgICAgICAgICAgICBSZXNvdXJjZUJvb2xlYW5GbGFnKAogICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAiMSIsCkBAIC0yMTQsMTYgKzIxNSwxNiBAQAogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICkKICAgICAgICAgKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoMiwgIjIiLCAidGVzdCIsIDEwMDIpKSkuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoMywgIjMiLCAidGVzdCIsIDEwMDMpKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZygyLCAiMiIsICJ0ZXN0IiwgMTAwMikpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChSZXNvdXJjZUJvb2xlYW5GbGFnKDMsICIzIiwgInRlc3QiLCAxMDAzKSkpLmlzVHJ1ZSgpCiAKICAgICAgICAgQXNzZXJ0LmFzc2VydFRocm93cyhOYW1lTm90Rm91bmRFeGNlcHRpb246OmNsYXNzLmphdmEpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCiAgICAgICAgIH0KICAgICAgICAgLy8gVGVzdCB0aGF0IHJlc291cmNlIGlzIGxvYWRlZCAoYW5kIHZhbGlkYXRlZCkgZXZlbiB3aGVuIHRoZSBzZXR0aW5nIGlzIHNldC4KICAgICAgICAgLy8gIFRoaXMgcHJldmVudHMgZGV2ZWxvcGVycyBmcm9tIG5vdCBub3RpY2luZyB3aGVuIHRoZXkgcmVmZXJlbmNlIGFuIGludmFsaWQgcmVzb3VyY2UuCiAgICAgICAgIEFzc2VydC5hc3NlcnRUaHJvd3MoTmFtZU5vdEZvdW5kRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoNSwgIjUiLCAidGVzdCIsIDEwMDUpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoNSwgIjUiLCAidGVzdCIsIDEwMDUpKQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzYsMTEgKzIzNywxMSBAQAogICAgICAgICAgICAgcmV0dXJuQHRoZW5BbnN3ZXIgaXQuZ2V0QXJndW1lbnQoMSkKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMSwgImEiLCAidGVzdCIpKSkuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMiwgImIiLCAidGVzdCIpKSkuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZygzLCAiYyIsICJ0ZXN0IiwgdHJ1ZSkpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMSwgImEiLCAidGVzdCIpKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZygyLCAiYiIsICJ0ZXN0IikpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMywgImMiLCAidGVzdCIsIHRydWUpKSkuaXNUcnVlKCkKICAgICAgICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCiAgICAgICAgICAgICAgICAgU3lzUHJvcEJvb2xlYW5GbGFnKAogICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAiZCIsCkBAIC0yNDksMTcgKzI1MCwxNyBAQAogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICkKICAgICAgICAgKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZyg1LCAiZSIsICJ0ZXN0IikpKS5pc0ZhbHNlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoU3lzUHJvcEJvb2xlYW5GbGFnKDUsICJlIiwgInRlc3QiKSkpLmlzRmFsc2UoKQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgZnVuIHJlYWRTdHJpbmdGbGFnKCkgewogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPFN0cmluZz4oZXEoIjMiKSwgYW55KCkpKS50aGVuUmV0dXJuKCJmb28iKQogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPFN0cmluZz4oZXEoIjQiKSwgYW55KCkpKS50aGVuUmV0dXJuKCJiYXIiKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZygxLCAiMSIsICJ0ZXN0IiwgImJpeiIpKSkuaXNFcXVhbFRvKCJiaXoiKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZygyLCAiMiIsICJ0ZXN0IiwgImJheiIpKSkuaXNFcXVhbFRvKCJiYXoiKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZygzLCAiMyIsICJ0ZXN0IiwgImJ1eiIpKSkuaXNFcXVhbFRvKCJmb28iKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgImJ1eiIpKSkuaXNFcXVhbFRvKCJiYXIiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhTdHJpbmdGbGFnKDEsICIxIiwgInRlc3QiLCAiYml6IikpKS5pc0VxdWFsVG8oImJpeiIpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoMiwgIjIiLCAidGVzdCIsICJiYXoiKSkpLmlzRXF1YWxUbygiYmF6IikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZygzLCAiMyIsICJ0ZXN0IiwgImJ1eiIpKSkuaXNFcXVhbFRvKCJmb28iKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhTdHJpbmdGbGFnKDQsICI0IiwgInRlc3QiLCAiYnV6IikpKS5pc0VxdWFsVG8oImJhciIpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3Niw3ICsyNzcsNyBAQAogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPFN0cmluZz4oZXEoIjYiKSwgYW55KCkpKS50aGVuUmV0dXJuKCJvdmVycmlkZTYiKQogCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIFJlc291cmNlU3RyaW5nRmxhZygKICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgIjEiLApAQCAtMjg2LDcgKzI4Nyw3IEBACiAgICAgICAgICAgICApCiAgICAgICAgICkuaXNFcXVhbFRvKCIiKQogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZygKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZygKICAgICAgICAgICAgICAgICBSZXNvdXJjZVN0cmluZ0ZsYWcoCiAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICIyIiwKQEAgLTI5Niw3ICsyOTcsNyBAQAogICAgICAgICAgICAgKQogICAgICAgICApLmlzRXF1YWxUbygicmVzb3VyY2UyIikKICAgICAgICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgUmVzb3VyY2VTdHJpbmdGbGFnKAogICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAiMyIsCkBAIC0zMDcsMTUgKzMwOCwxNSBAQAogICAgICAgICApLmlzRXF1YWxUbygib3ZlcnJpZGUzIikKIAogICAgICAgICBBc3NlcnQuYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDQsICI0IiwgInRlc3QiLCAxMDA0KSkKICAgICAgICAgfQogICAgICAgICBBc3NlcnQuYXNzZXJ0VGhyb3dzKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoNSwgIjUiLCAidGVzdCIsIDEwMDUpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg1LCAiNSIsICJ0ZXN0IiwgMTAwNSkpCiAgICAgICAgIH0KICAgICAgICAgLy8gVGVzdCB0aGF0IHJlc291cmNlIGlzIGxvYWRlZCAoYW5kIHZhbGlkYXRlZCkgZXZlbiB3aGVuIHRoZSBzZXR0aW5nIGlzIHNldC4KICAgICAgICAgLy8gIFRoaXMgcHJldmVudHMgZGV2ZWxvcGVycyBmcm9tIG5vdCBub3RpY2luZyB3aGVuIHRoZXkgcmVmZXJlbmNlIGFuIGludmFsaWQgcmVzb3VyY2UuCiAgICAgICAgIEFzc2VydC5hc3NlcnRUaHJvd3MoTmFtZU5vdEZvdW5kRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg2LCAiNiIsICJ0ZXN0IiwgMTAwNSkpCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDYsICI2IiwgInRlc3QiLCAxMDA1KSkKICAgICAgICAgfQogICAgIH0KIApAQCAtMzIzLDEwICszMjQsMTAgQEAKICAgICBmdW4gcmVhZEludEZsYWcoKSB7CiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8SW50PihlcSgiMyIpLCBhbnkoKSkpLnRoZW5SZXR1cm4oMjIpCiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8SW50PihlcSgiNCIpLCBhbnkoKSkpLnRoZW5SZXR1cm4oNDgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDEsICIxIiwgInRlc3QiLCAxMikpKS5pc0VxdWFsVG8oMTIpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDIsICIyIiwgInRlc3QiLCA5MykpKS5pc0VxdWFsVG8oOTMpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDMsICIzIiwgInRlc3QiLCA4KSkpLmlzRXF1YWxUbygyMikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KEludEZsYWcoNCwgIjQiLCAidGVzdCIsIDIzNCkpKS5pc0VxdWFsVG8oNDgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KEludEZsYWcoMSwgIjEiLCAidGVzdCIsIDEyKSkpLmlzRXF1YWxUbygxMikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZygyLCAiMiIsICJ0ZXN0IiwgOTMpKSkuaXNFcXVhbFRvKDkzKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDMsICIzIiwgInRlc3QiLCA4KSkpLmlzRXF1YWxUbygyMikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZyg0LCAiNCIsICJ0ZXN0IiwgMjM0KSkpLmlzRXF1YWxUbyg0OCkKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzQyLDE3ICszNDMsMTcgQEAKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxJbnQ+KGVxKDQpLCBhbnkoKSkpLnRoZW5SZXR1cm4oNTAwKQogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEludD4oZXEoNSksIGFueSgpKSkudGhlblJldHVybig5NTE5KQogCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoMSwgIjEiLCAidGVzdCIsIDEwMDEpKSkuaXNFcXVhbFRvKDg4KQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoUmVzb3VyY2VJbnRGbGFnKDIsICIyIiwgInRlc3QiLCAxMDAyKSkpLmlzRXF1YWxUbyg2MSkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZygzLCAiMyIsICJ0ZXN0IiwgMTAwMykpKS5pc0VxdWFsVG8oMjApCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZygxLCAiMSIsICJ0ZXN0IiwgMTAwMSkpKS5pc0VxdWFsVG8oODgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZygyLCAiMiIsICJ0ZXN0IiwgMTAwMikpKS5pc0VxdWFsVG8oNjEpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZygzLCAiMyIsICJ0ZXN0IiwgMTAwMykpKS5pc0VxdWFsVG8oMjApCiAKICAgICAgICAgQXNzZXJ0LmFzc2VydFRocm93cyhOb3RGb3VuZEV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCiAgICAgICAgIH0KICAgICAgICAgLy8gVGVzdCB0aGF0IHJlc291cmNlIGlzIGxvYWRlZCAoYW5kIHZhbGlkYXRlZCkgZXZlbiB3aGVuIHRoZSBzZXR0aW5nIGlzIHNldC4KICAgICAgICAgLy8gIFRoaXMgcHJldmVudHMgZGV2ZWxvcGVycyBmcm9tIG5vdCBub3RpY2luZyB3aGVuIHRoZXkgcmVmZXJlbmNlIGFuIGludmFsaWQgcmVzb3VyY2UuCiAgICAgICAgIEFzc2VydC5hc3NlcnRUaHJvd3MoTm90Rm91bmRFeGNlcHRpb246OmNsYXNzLmphdmEpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoUmVzb3VyY2VJbnRGbGFnKDUsICI1IiwgInRlc3QiLCAxMDA1KSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoNSwgIjUiLCAidGVzdCIsIDEwMDUpKQogICAgICAgICB9CiAgICAgfQogCkBAIC00MzIsMTEgKzQzMywxMSBAQAogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPFN0cmluZz4oZXEoIjEiKSwgYW55KCkpKS50aGVuUmV0dXJuKCJvcmlnaW5hbCIpCiAKICAgICAgICAgLy8gZ2V0cyB0aGUgZmxhZyAmIGNhY2hlIGl0Ci0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygib3JpZ2luYWwiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygib3JpZ2luYWwiKQogICAgICAgICB2ZXJpZnkoZmxhZ01hbmFnZXIsIHRpbWVzKDEpKS5yZWFkRmxhZ1ZhbHVlKGVxKCIxIiksIGVxKFN0cmluZ0ZsYWdTZXJpYWxpemVyKSkKIAogICAgICAgICAvLyBoaXQgdGhlIGNhY2hlCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygib3JpZ2luYWwiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygib3JpZ2luYWwiKQogICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoZmxhZ01hbmFnZXIpCiAKICAgICAgICAgLy8gc2V0IHRoZSBmbGFnCkBAIC00NDQsNyArNDQ1LDcgQEAKICAgICAgICAgdmVyaWZ5UHV0RGF0YSgiMSIsICJ7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInZhbHVlXCI6XCJuZXdcIn0iLCBudW1SZWFkcyA9IDIpCiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8U3RyaW5nPihlcSgiMSIpLCBhbnkoKSkpLnRoZW5SZXR1cm4oIm5ldyIpCiAKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWcxKSkuaXNFcXVhbFRvKCJuZXciKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygibmV3IikKICAgICAgICAgdmVyaWZ5KGZsYWdNYW5hZ2VyLCB0aW1lcygzKSkucmVhZEZsYWdWYWx1ZShlcSgiMSIpLCBlcShTdHJpbmdGbGFnU2VyaWFsaXplcikpCiAgICAgfQogCkBAIC00NTQsNyArNDU1LDcgQEAKIAogICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZShmbGFnLm5hbWVzcGFjZSwgZmxhZy5uYW1lLCBmYWxzZSkKIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnKSkuaXNGYWxzZSgpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTQ2Miw3ICs0NjMsMzMgQEAKICAgICAgICAgdmFsIGZsYWcgPSBVbnJlbGVhc2VkRmxhZygxMDAsIG5hbWUgPSAiMTAwIiwgbmFtZXNwYWNlID0gInRlc3QiKQogCiAgICAgICAgIHNlcnZlckZsYWdSZWFkZXIuc2V0RmxhZ1ZhbHVlKGZsYWcubmFtZXNwYWNlLCBmbGFnLm5hbWUsIHRydWUpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZykpLmlzVHJ1ZSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2VydmVyU2lkZV9PdmVycmlkZVVuY2FjaGVkX05vUmVzdGFydCgpIHsKKyAgICAgICAgLy8gTm8gb25lIGhhcyByZWFkIHRoZSBmbGFnLCBzbyBpdCdzIG5vdCBpbiB0aGUgY2FjaGUuCisgICAgICAgIHNlcnZlckZsYWdSZWFkZXIuc2V0RmxhZ1ZhbHVlKAorICAgICAgICAgICAgdGVhbWZvb2RhYmxlRmxhZ0EubmFtZXNwYWNlLCB0ZWFtZm9vZGFibGVGbGFnQS5uYW1lLCAhdGVhbWZvb2RhYmxlRmxhZ0EuZGVmYXVsdCkKKyAgICAgICAgdmVyaWZ5KHJlc3RhcnRlciwgbmV2ZXIoKSkucmVzdGFydFN5c3RlbVVJKGFueVN0cmluZygpKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNlcnZlclNpZGVfT3ZlcnJpZGVfUmVzdGFydHMoKSB7CisgICAgICAgIC8vIFJlYWQgaXQgdG8gcHV0IGl0IGluIHRoZSBjYWNoZS4KKyAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdBKQorICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZSgKKyAgICAgICAgICAgIHRlYW1mb29kYWJsZUZsYWdBLm5hbWVzcGFjZSwgdGVhbWZvb2RhYmxlRmxhZ0EubmFtZSwgIXRlYW1mb29kYWJsZUZsYWdBLmRlZmF1bHQpCisgICAgICAgIHZlcmlmeShyZXN0YXJ0ZXIpLnJlc3RhcnRTeXN0ZW1VSShhbnlTdHJpbmcoKSkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzZXJ2ZXJTaWRlX1JlZHVuZGFudE92ZXJyaWRlX05vUmVzdGFydCgpIHsKKyAgICAgICAgLy8gUmVhZCBpdCB0byBwdXQgaXQgaW4gdGhlIGNhY2hlLgorICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0EpCisgICAgICAgIHNlcnZlckZsYWdSZWFkZXIuc2V0RmxhZ1ZhbHVlKAorICAgICAgICAgICAgdGVhbWZvb2RhYmxlRmxhZ0EubmFtZXNwYWNlLCB0ZWFtZm9vZGFibGVGbGFnQS5uYW1lLCB0ZWFtZm9vZGFibGVGbGFnQS5kZWZhdWx0KQorICAgICAgICB2ZXJpZnkocmVzdGFydGVyLCBuZXZlcigpKS5yZXN0YXJ0U3lzdGVtVUkoYW55U3RyaW5nKCkpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTQ4MiwxMyArNTA5LDEzIEBACiAgICAgICAgICAgICAudGhlblJldHVybigib3ZlcnJpZGU3IikKIAogICAgICAgICAvLyBXSEVOIHRoZSBmbGFncyBoYXZlIGJlZW4gYWNjZXNzZWQKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWcxKSkuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWcyKSkuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWczKSkuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnNCkpLmlzRW1wdHkoKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzUpKS5pc0VxdWFsVG8oImZsYWc1ZGVmYXVsdCIpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnNikpLmlzRXF1YWxUbygicmVzb3VyY2UxMDA2IikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWc3KSkuaXNFcXVhbFRvKCJvdmVycmlkZTciKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnMSkpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWcyKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZzMpKS5pc0ZhbHNlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzQpKS5pc0VtcHR5KCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzUpKS5pc0VxdWFsVG8oImZsYWc1ZGVmYXVsdCIpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWc2KSkuaXNFcXVhbFRvKCJyZXNvdXJjZTEwMDYiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnNykpLmlzRXF1YWxUbygib3ZlcnJpZGU3IikKIAogICAgICAgICAvLyBUSEVOIHRoZSBkdW1wIGNvbnRhaW5zIHRoZSBmbGFncyBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgIHZhbCBkdW1wID0gZHVtcFRvU3RyaW5nKCkKQEAgLTUyNyw3ICs1NTQsNyBAQAogICAgIHByaXZhdGUgZnVuIGR1bXBUb1N0cmluZygpOiBTdHJpbmcgewogICAgICAgICB2YWwgc3cgPSBTdHJpbmdXcml0ZXIoKQogICAgICAgICB2YWwgcHcgPSBQcmludFdyaXRlcihzdykKLSAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmR1bXAocHcsIGVtcHR5QXJyYXk8U3RyaW5nPigpKQorICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5kdW1wKHB3LCBlbXB0eUFycmF5PFN0cmluZz4oKSkKICAgICAgICAgcHcuZmx1c2goKQogICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NSZWxlYXNlVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NSZWxlYXNlVGVzdC5rdAppbmRleCA0YzYwMjhjLi45MTcxNDdiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZVRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc1JlbGVhc2VUZXN0Lmt0CkBAIC0yNCw2ICsyNCw4IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jaworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8KK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5gd2hlbmAgYXMgd2hlbmV2ZXIKIApAQCAtMzMsNyArMzUsNyBAQAogICovCiBAU21hbGxUZXN0CiBjbGFzcyBGZWF0dXJlRmxhZ3NSZWxlYXNlVGVzdCA6IFN5c3VpVGVzdENhc2UoKSB7Ci0gICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbUZlYXR1cmVGbGFnc1JlbGVhc2U6IEZlYXR1cmVGbGFnc1JlbGVhc2UKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBmZWF0dXJlRmxhZ3NSZWxlYXNlOiBGZWF0dXJlRmxhZ3NSZWxlYXNlCiAKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBtUmVzb3VyY2VzOiBSZXNvdXJjZXMKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBtU3lzdGVtUHJvcGVydGllczogU3lzdGVtUHJvcGVydGllc0hlbHBlcgpAQCAtNDEsMTUgKzQzLDIxIEBACiAgICAgcHJpdmF0ZSB2YWwgZmxhZ01hcCA9IG11dGFibGVNYXBPZjxTdHJpbmcsIEZsYWc8Kj4+KCkKICAgICBwcml2YXRlIHZhbCBzZXJ2ZXJGbGFnUmVhZGVyID0gU2VydmVyRmxhZ1JlYWRlckZha2UoKQogCisKKyAgICBwcml2YXRlIHZhbCBmbGFnQSA9IFJlbGVhc2VkRmxhZyg1MDEsIG5hbWUgPSAiYSIsIG5hbWVzcGFjZSA9ICJ0ZXN0IikKKwogICAgIEBCZWZvcmUKICAgICBmdW4gc2V0dXAoKSB7CiAgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcykKLSAgICAgICAgbUZlYXR1cmVGbGFnc1JlbGVhc2UgPSBGZWF0dXJlRmxhZ3NSZWxlYXNlKAorICAgICAgICBmbGFnTWFwLnB1dChmbGFnQS5uYW1lLCBmbGFnQSkKKyAgICAgICAgZmVhdHVyZUZsYWdzUmVsZWFzZSA9IEZlYXR1cmVGbGFnc1JlbGVhc2UoCiAgICAgICAgICAgICBtUmVzb3VyY2VzLAogICAgICAgICAgICAgbVN5c3RlbVByb3BlcnRpZXMsCiAgICAgICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLAogICAgICAgICAgICAgZmxhZ01hcCwKICAgICAgICAgICAgIHJlc3RhcnRlcikKKworICAgICAgICBmZWF0dXJlRmxhZ3NSZWxlYXNlLmluaXQoKQogICAgIH0KIAogICAgIEBUZXN0CkBAIC02MCw3ICs2OCw3IEBACiAgICAgICAgIHZhbCBmbGFnTmFtZXNwYWNlID0gInRlc3QiCiAgICAgICAgIHZhbCBmbGFnID0gUmVzb3VyY2VCb29sZWFuRmxhZyhmbGFnSWQsIGZsYWdOYW1lLCBmbGFnTmFtZXNwYWNlLCBmbGFnUmVzb3VyY2VJZCkKICAgICAgICAgd2hlbmV2ZXIobVJlc291cmNlcy5nZXRCb29sZWFuKGZsYWdSZXNvdXJjZUlkKSkudGhlblJldHVybih0cnVlKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnKSkuaXNUcnVlKCkKICAgICB9CiAKICAgICBAVGVzdApAQCAtNzAsMTYgKzc4LDE2IEBACiAgICAgICAgIHdoZW5ldmVyKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKDEwMDMpKS50aGVuUmV0dXJuKG51bGwpCiAgICAgICAgIHdoZW5ldmVyKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKDEwMDQpKS50aGVuQW5zd2VyIHsgdGhyb3cgTmFtZU5vdEZvdW5kRXhjZXB0aW9uKCkgfQogCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKAorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKAogICAgICAgICAgICAgUmVzb3VyY2VTdHJpbmdGbGFnKDEsICIxIiwgInRlc3QiLCAxMDAxKSkpLmlzRXF1YWxUbygiIikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzUmVsZWFzZS5nZXRTdHJpbmcoCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzUmVsZWFzZS5nZXRTdHJpbmcoCiAgICAgICAgICAgICBSZXNvdXJjZVN0cmluZ0ZsYWcoMiwgIjIiLCAidGVzdCIsIDEwMDIpKSkuaXNFcXVhbFRvKCJyZXMyIikKIAogICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb246OmNsYXNzLmphdmEpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NSZWxlYXNlLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoMywgIjMiLCAidGVzdCIsIDEwMDMpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzUmVsZWFzZS5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDMsICIzIiwgInRlc3QiLCAxMDAzKSkKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUaHJvd3MoTmFtZU5vdEZvdW5kRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzUmVsZWFzZS5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDQsICI0IiwgInRlc3QiLCAxMDA0KSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyLDcgKzEwMCw3IEBACiAKICAgICAgICAgdmFsIGZsYWcgPSBTeXNQcm9wQm9vbGVhbkZsYWcoZmxhZ0lkLCBmbGFnTmFtZSwgZmxhZ05hbWVzcGFjZSwgZmxhZ0RlZmF1bHQpCiAgICAgICAgIHdoZW5ldmVyKG1TeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oZmxhZ05hbWUsIGZsYWdEZWZhdWx0KSkudGhlblJldHVybihmbGFnRGVmYXVsdCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRXF1YWxUbyhmbGFnRGVmYXVsdCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnKSkuaXNFcXVhbFRvKGZsYWdEZWZhdWx0KQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMDEsNyArMTA5LDcgQEAKIAogICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZShmbGFnLm5hbWVzcGFjZSwgZmxhZy5uYW1lLCBmYWxzZSkKIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMTAsNiArMTE4LDMyIEBACiAKICAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoZmxhZy5uYW1lc3BhY2UsIGZsYWcubmFtZSwgdHJ1ZSkKIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNlcnZlclNpZGVfT3ZlcnJpZGVVbmNhY2hlZF9Ob1Jlc3RhcnQoKSB7CisgICAgICAgIC8vIE5vIG9uZSBoYXMgcmVhZCB0aGUgZmxhZywgc28gaXQncyBub3QgaW4gdGhlIGNhY2hlLgorICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZSgKKyAgICAgICAgICAgIGZsYWdBLm5hbWVzcGFjZSwgZmxhZ0EubmFtZSwgIWZsYWdBLmRlZmF1bHQpCisgICAgICAgIE1vY2tpdG8udmVyaWZ5KHJlc3RhcnRlciwgbmV2ZXIoKSkucmVzdGFydFN5c3RlbVVJKE1vY2tpdG8uYW55U3RyaW5nKCkpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2VydmVyU2lkZV9PdmVycmlkZV9SZXN0YXJ0cygpIHsKKyAgICAgICAgLy8gUmVhZCBpdCB0byBwdXQgaXQgaW4gdGhlIGNhY2hlLgorICAgICAgICBmZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnQSkKKyAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoCisgICAgICAgICAgICBmbGFnQS5uYW1lc3BhY2UsIGZsYWdBLm5hbWUsICFmbGFnQS5kZWZhdWx0KQorICAgICAgICBNb2NraXRvLnZlcmlmeShyZXN0YXJ0ZXIpLnJlc3RhcnRTeXN0ZW1VSShNb2NraXRvLmFueVN0cmluZygpKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNlcnZlclNpZGVfUmVkdW5kYW50T3ZlcnJpZGVfTm9SZXN0YXJ0KCkgeworICAgICAgICAvLyBSZWFkIGl0IHRvIHB1dCBpdCBpbiB0aGUgY2FjaGUuCisgICAgICAgIGZlYXR1cmVGbGFnc1JlbGVhc2UuaXNFbmFibGVkKGZsYWdBKQorICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZSgKKyAgICAgICAgICAgIGZsYWdBLm5hbWVzcGFjZSwgZmxhZ0EubmFtZSwgZmxhZ0EuZGVmYXVsdCkKKyAgICAgICAgTW9ja2l0by52ZXJpZnkocmVzdGFydGVyLCBuZXZlcigpKS5yZXN0YXJ0U3lzdGVtVUkoTW9ja2l0by5hbnlTdHJpbmcoKSkKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvU2VydmVyRmxhZ1JlYWRlckltcGxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXJJbXBsVGVzdC5rdAppbmRleCAyZTk4MDA2Li45NTNiN2ZiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvU2VydmVyRmxhZ1JlYWRlckltcGxUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVySW1wbFRlc3Qua3QKQEAgLTIxLDExICsyMSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLkRldmljZUNvbmZpZ1Byb3h5RmFrZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuY29uY3VycmVuY3kuRmFrZUV4ZWN1dG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFueQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5GYWtlU3lzdGVtQ2xvY2sKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlCiBpbXBvcnQgb3JnLmp1bml0LlRlc3QKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlTdHJpbmcKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnkKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnMKQEAgLTU3LDE4ICs1OSwxOCBAQAogICAgICAgICBkZXZpY2VDb25maWcuc2V0UHJvcGVydHkoTkFNRVNQQUNFLCAiZmxhZ18xIiwgIjEiLCBmYWxzZSkKICAgICAgICAgZXhlY3V0b3IucnVuQWxsUmVhZHkoKQogCi0gICAgICAgIHZlcmlmeShjaGFuZ2VMaXN0ZW5lcikub25DaGFuZ2UoZmxhZykKKyAgICAgICAgdmVyaWZ5KGNoYW5nZUxpc3RlbmVyKS5vbkNoYW5nZShmbGFnLCAiMSIpCiAgICAgfQogCiAgICAgQFRlc3QKICAgICBmdW4gdGVzdENoYW5nZV9pZ25vcmVzTGlzdGVuZXJzRHVyaW5nVGVzdCgpIHsKICAgICAgICAgdmFsIHNlcnZlckZsYWdSZWFkZXIgPSBTZXJ2ZXJGbGFnUmVhZGVySW1wbChOQU1FU1BBQ0UsIGRldmljZUNvbmZpZywgZXhlY3V0b3IsIHRydWUpCi0gICAgICAgIHZhbCBmbGFnID0gUmVsZWFzZWRGbGFnKDEsICIxIiwgInRlc3QiKQorICAgICAgICB2YWwgZmxhZyA9IFJlbGVhc2VkRmxhZygxLCAiMSIsICIgICB0ZXN0IikKICAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5saXN0ZW5Gb3JDaGFuZ2VzKGxpc3RPZihmbGFnKSwgY2hhbmdlTGlzdGVuZXIpCiAKICAgICAgICAgZGV2aWNlQ29uZmlnLnNldFByb3BlcnR5KE5BTUVTUEFDRSwgImZsYWdfb3ZlcnJpZGVfMSIsICIxIiwgZmFsc2UpCiAgICAgICAgIGV4ZWN1dG9yLnJ1bkFsbFJlYWR5KCkKIAotICAgICAgICB2ZXJpZnkoY2hhbmdlTGlzdGVuZXIsIG5ldmVyKCkpLm9uQ2hhbmdlKGZsYWcpCisgICAgICAgIHZlcmlmeShjaGFuZ2VMaXN0ZW5lciwgbmV2ZXIoKSkub25DaGFuZ2UoYW55KCksIGFueVN0cmluZygpKQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsVGVzdC5rdAppbmRleCBlNjZiZTA4Li4yYWIxYjk5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvdmlld21vZGVsL0tleWd1YXJkQm91bmNlclZpZXdNb2RlbFRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ZpZXdtb2RlbC9LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWxUZXN0Lmt0CkBAIC05Myw3ICs5Myw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gc2hvdWxkVXBkYXRlU2lkZUZwcygpID0gcnVuVGVzdCB7CisgICAgZnVuIHNob3VsZFVwZGF0ZVNpZGVGcHNfc2hvdygpID0gcnVuVGVzdCB7CiAgICAgICAgIHZhciBjb3VudCA9IDAKICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5zaG91bGRVcGRhdGVTaWRlRnBzLm9uRWFjaCB7IGNvdW50KysgfS5sYXVuY2hJbih0aGlzKQogICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCkBAIC0xMDQsNiArMTA0LDE4IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBmdW4gc2hvdWxkVXBkYXRlU2lkZUZwc19oaWRlKCkgPSBydW5UZXN0IHsKKyAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyh0cnVlKQorICAgICAgICB2YXIgY291bnQgPSAwCisgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3Quc2hvdWxkVXBkYXRlU2lkZUZwcy5vbkVhY2ggeyBjb3VudCsrIH0ubGF1bmNoSW4odGhpcykKKyAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyhmYWxzZSkKKyAgICAgICAgLy8gUnVuIHRoZSB0YXNrcyB0aGF0IGFyZSBwZW5kaW5nIGF0IHRoaXMgcG9pbnQgb2YgdmlydHVhbCB0aW1lLgorICAgICAgICBydW5DdXJyZW50KCkKKyAgICAgICAgYXNzZXJ0VGhhdChjb3VudCkuaXNFcXVhbFRvKDEpCisgICAgICAgIGpvYi5jYW5jZWwoKQorICAgIH0KKworICAgIEBUZXN0CiAgICAgZnVuIHNpZGVGcHNTaG93aW5nKCkgPSBydW5UZXN0IHsKICAgICAgICAgdmFyIHNpZGVGcHNJc1Nob3dpbmcgPSBmYWxzZQogICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LnNpZGVGcHNTaG93aW5nLm9uRWFjaCB7IHNpZGVGcHNJc1Nob3dpbmcgPSBpdCB9LmxhdW5jaEluKHRoaXMpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvY29udHJvbHMvdWkvTWVkaWFDb250cm9sUGFuZWxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsVGVzdC5rdAppbmRleCBmZDM1M2FmLi5kZjEzZmRkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvY29udHJvbHMvdWkvTWVkaWFDb250cm9sUGFuZWxUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUNvbnRyb2xQYW5lbFRlc3Qua3QKQEAgLTk0LDcgKzk0LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uYW55CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFyZ3VtZW50Q2FwdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmVxCi1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLm51bGxhYmxlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLndpdGhBcmdDYXB0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuRmFrZVN5c3RlbUNsb2NrCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdApAQCAtMTc2Myw3ICsxNzYyLDcgQEAKICAgICBmdW4gdGFwQ29udGVudFZpZXdfc2hvd092ZXJMb2Nrc2NyZWVuX29wZW5BY3Rpdml0eSgpIHsKICAgICAgICAgLy8gV0hFTiB3ZSBhcmUgb24gbG9ja3NjcmVlbiBhbmQgdGhpcyBhY3Rpdml0eSBjYW4gc2hvdyBvdmVyIGxvY2tzY3JlZW4KICAgICAgICAgd2hlbmV2ZXIoa2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIHdoZW5ldmVyKGFjdGl2aXR5SW50ZW50SGVscGVyLndvdWxkU2hvd092ZXJMb2Nrc2NyZWVuKGFueSgpLCBhbnkoKSkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgd2hlbmV2ZXIoYWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRQZW5kaW5nU2hvd092ZXJMb2Nrc2NyZWVuKGFueSgpLCBhbnkoKSkpLnRoZW5SZXR1cm4odHJ1ZSkKIAogICAgICAgICB2YWwgY2xpY2tJbnRlbnQgPSBtb2NrKEludGVudDo6Y2xhc3MuamF2YSkKICAgICAgICAgdmFsIHBlbmRpbmdJbnRlbnQgPSBtb2NrKFBlbmRpbmdJbnRlbnQ6OmNsYXNzLmphdmEpCkBAIC0xNzc0LDE2ICsxNzczLDIwIEBACiAgICAgICAgIHBsYXllci5iaW5kUGxheWVyKGRhdGEsIEtFWSkKICAgICAgICAgdmVyaWZ5KHZpZXdIb2xkZXIucGxheWVyKS5zZXRPbkNsaWNrTGlzdGVuZXIoY2FwdG9yLmNhcHR1cmUoKSkKIAotICAgICAgICAvLyBUSEVOIGl0IHNob3dzIHdpdGhvdXQgZGlzbWlzc2luZyBrZXlndWFyZCBmaXJzdAorICAgICAgICAvLyBUSEVOIGl0IHNlbmRzIHRoZSBQZW5kaW5nSW50ZW50IHdpdGhvdXQgZGlzbWlzc2luZyBrZXlndWFyZCBmaXJzdCwKKyAgICAgICAgLy8gYW5kIGRvZXMgbm90IHVzZSB0aGUgSW50ZW50IGRpcmVjdGx5IChzZWUgYi8yNzE4NDUwMDgpCiAgICAgICAgIGNhcHRvci52YWx1ZS5vbkNsaWNrKHZpZXdIb2xkZXIucGxheWVyKQotICAgICAgICB2ZXJpZnkoYWN0aXZpdHlTdGFydGVyKS5zdGFydEFjdGl2aXR5KGVxKGNsaWNrSW50ZW50KSwgZXEodHJ1ZSksIG51bGxhYmxlKCksIGVxKHRydWUpKQorICAgICAgICB2ZXJpZnkocGVuZGluZ0ludGVudCkuc2VuZCgpCisgICAgICAgIHZlcmlmeShwZW5kaW5nSW50ZW50LCBuZXZlcigpKS5nZXRJbnRlbnQoKQorICAgICAgICB2ZXJpZnkoYWN0aXZpdHlTdGFydGVyLCBuZXZlcigpKS5wb3N0U3RhcnRBY3Rpdml0eURpc21pc3NpbmdLZXlndWFyZChlcShjbGlja0ludGVudCksIGFueSgpKQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgZnVuIHRhcENvbnRlbnRWaWV3X25vU2hvd092ZXJMb2Nrc2NyZWVuX2Rpc21pc3NLZXlndWFyZCgpIHsKICAgICAgICAgLy8gV0hFTiB3ZSBhcmUgb24gbG9ja3NjcmVlbiBhbmQgdGhlIGFjdGl2aXR5IGNhbm5vdCBzaG93IG92ZXIgbG9ja3NjcmVlbgogICAgICAgICB3aGVuZXZlcihrZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIoYWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRTaG93T3ZlckxvY2tzY3JlZW4oYW55KCksIGFueSgpKSkudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgd2hlbmV2ZXIoYWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRQZW5kaW5nU2hvd092ZXJMb2Nrc2NyZWVuKGFueSgpLCBhbnkoKSkpCisgICAgICAgICAgICAudGhlblJldHVybihmYWxzZSkKIAogICAgICAgICB2YWwgY2xpY2tJbnRlbnQgPSBtb2NrKEludGVudDo6Y2xhc3MuamF2YSkKICAgICAgICAgdmFsIHBlbmRpbmdJbnRlbnQgPSBtb2NrKFBlbmRpbmdJbnRlbnQ6OmNsYXNzLmphdmEpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyVGVzdC5qYXZhCmluZGV4IDU2ZTA2MGQuLjE3ZDg3OTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyVGVzdC5qYXZhCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tZWRpYS5kaWFsb2c7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU0VMRUNUSU9OX0JFSEFWSU9SX0dPX1RPX0FQUDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU0VMRUNUSU9OX0JFSEFWSU9SX05PTkU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfQURfUk9VVElOR19ESVNBTExPV0VEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0NVU1RPTTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU1VCVEVYVF9TVUJTQ1JJUFRJT05fUkVRVUlSRUQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIubWVkaWEuTWVkaWFEZXZpY2UuU2VsZWN0aW9uQmVoYXZpb3IuU0VMRUNUSU9OX0JFSEFWSU9SX0dPX1RPX0FQUDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIubWVkaWEuTWVkaWFEZXZpY2UuU2VsZWN0aW9uQmVoYXZpb3IuU0VMRUNUSU9OX0JFSEFWSU9SX05PTkU7CisKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL3JlcG9zaXRvcnkvTXVsdGlTaGFkZVJlcG9zaXRvcnlUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9yZXBvc2l0b3J5L011bHRpU2hhZGVSZXBvc2l0b3J5VGVzdC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWFjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9yZXBvc2l0b3J5L011bHRpU2hhZGVSZXBvc2l0b3J5VGVzdC5rdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZXBvc2l0b3J5CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNvcm91dGluZXMuY29sbGVjdExhc3RWYWx1ZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5tb2RlbC5NdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXAKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5ydW5UZXN0CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0CisKK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEpVbml0NDo6Y2xhc3MpCitjbGFzcyBNdWx0aVNoYWRlUmVwb3NpdG9yeVRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgeworCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHkKKworICAgIEBCZWZvcmUKKyAgICBmdW4gc2V0VXAoKSB7CisgICAgICAgIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gcHJveGllZElucHV0KCkgPSBydW5UZXN0IHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgIHZhbCBsYXRlc3Q6IFByb3hpZWRJbnB1dE1vZGVsPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5wcm94aWVkSW5wdXQpCisKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInByb3hpZWRJbnB1dCBzaG91bGQgc3RhcnQgd2l0aCBudWxsIikudGhhdChsYXRlc3QpLmlzTnVsbCgpCisKKyAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PblRhcCkKKyAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzRXF1YWxUbyhQcm94aWVkSW5wdXRNb2RlbC5PblRhcCkKKworICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwZiwgMTAwZikpCisgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0VxdWFsVG8oUHJveGllZElucHV0TW9kZWwuT25EcmFnKDBmLCAxMDBmKSkKKworICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwZiwgMTIwZikpCisgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0VxdWFsVG8oUHJveGllZElucHV0TW9kZWwuT25EcmFnKDBmLCAxMjBmKSkKKworICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCkKKyAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzRXF1YWxUbyhQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2hhZGVDb25maWdfZHVhbFNoYWRlRW5hYmxlZCgpID0gcnVuVGVzdCB7CisgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgdHJ1ZSkKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgIHZhbCBzaGFkZUNvbmZpZzogU2hhZGVDb25maWc/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnNoYWRlQ29uZmlnKQorCisgICAgICAgIGFzc2VydFRoYXQoc2hhZGVDb25maWcpLmlzSW5zdGFuY2VPZihTaGFkZUNvbmZpZy5EdWFsU2hhZGVDb25maWc6OmNsYXNzLmphdmEpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2hhZGVDb25maWdfZHVhbFNoYWRlTm90RW5hYmxlZCgpID0gcnVuVGVzdCB7CisgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgZmFsc2UpCisgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICB2YWwgc2hhZGVDb25maWc6IFNoYWRlQ29uZmlnPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5zaGFkZUNvbmZpZykKKworICAgICAgICBhc3NlcnRUaGF0KHNoYWRlQ29uZmlnKS5pc0luc3RhbmNlT2YoU2hhZGVDb25maWcuU2luZ2xlU2hhZGVDb25maWc6OmNsYXNzLmphdmEpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gZm9yY2VDb2xsYXBzZUFsbCgpID0gcnVuVGVzdCB7CisgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICB2YWwgZm9yY2VDb2xsYXBzZUFsbDogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuZm9yY2VDb2xsYXBzZUFsbCkKKworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZm9yY2VDb2xsYXBzZUFsbCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgIC50aGF0KGZvcmNlQ29sbGFwc2VBbGwpCisgICAgICAgICAgICAuaXNGYWxzZSgpCisKKyAgICAgICAgdW5kZXJUZXN0LnNldEZvcmNlQ29sbGFwc2VBbGwodHJ1ZSkKKyAgICAgICAgYXNzZXJ0VGhhdChmb3JjZUNvbGxhcHNlQWxsKS5pc1RydWUoKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRGb3JjZUNvbGxhcHNlQWxsKGZhbHNlKQorICAgICAgICBhc3NlcnRUaGF0KGZvcmNlQ29sbGFwc2VBbGwpLmlzRmFsc2UoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNoYWRlSW50ZXJhY3Rpb24oKSA9IHJ1blRlc3QgeworICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgdmFsIHNoYWRlSW50ZXJhY3Rpb246IE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsPyBieQorICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3Quc2hhZGVJbnRlcmFjdGlvbikKKworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgic2hhZGVJbnRlcmFjdGlvbiBzaG91bGQgc3RhcnQgYXMgbnVsbCEiKS50aGF0KHNoYWRlSW50ZXJhY3Rpb24pLmlzTnVsbCgpCisKKyAgICAgICAgdW5kZXJUZXN0LnNldFNoYWRlSW50ZXJhY3Rpb24oCisgICAgICAgICAgICBNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbChzaGFkZUlkID0gU2hhZGVJZC5MRUZULCBpc1Byb3hpZWQgPSBmYWxzZSkKKyAgICAgICAgKQorICAgICAgICBhc3NlcnRUaGF0KHNoYWRlSW50ZXJhY3Rpb24pCisgICAgICAgICAgICAuaXNFcXVhbFRvKE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsKHNoYWRlSWQgPSBTaGFkZUlkLkxFRlQsIGlzUHJveGllZCA9IGZhbHNlKSkKKworICAgICAgICB1bmRlclRlc3Quc2V0U2hhZGVJbnRlcmFjdGlvbigKKyAgICAgICAgICAgIE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsKHNoYWRlSWQgPSBTaGFkZUlkLlJJR0hULCBpc1Byb3hpZWQgPSB0cnVlKQorICAgICAgICApCisgICAgICAgIGFzc2VydFRoYXQoc2hhZGVJbnRlcmFjdGlvbikKKyAgICAgICAgICAgIC5pc0VxdWFsVG8oTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwoc2hhZGVJZCA9IFNoYWRlSWQuUklHSFQsIGlzUHJveGllZCA9IHRydWUpKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRTaGFkZUludGVyYWN0aW9uKG51bGwpCisgICAgICAgIGFzc2VydFRoYXQoc2hhZGVJbnRlcmFjdGlvbikuaXNOdWxsKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBleHBhbnNpb24oKSA9IHJ1blRlc3QgeworICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgdmFsIGxlZnRFeHBhbnNpb246IEZsb2F0PyBieQorICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuZ2V0U2hhZGUoU2hhZGVJZC5MRUZUKS5tYXAgeyBpdC5leHBhbnNpb24gfSkKKyAgICAgICAgdmFsIHJpZ2h0RXhwYW5zaW9uOiBGbG9hdD8gYnkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmdldFNoYWRlKFNoYWRlSWQuUklHSFQpLm1hcCB7IGl0LmV4cGFuc2lvbiB9KQorICAgICAgICB2YWwgc2luZ2xlRXhwYW5zaW9uOiBGbG9hdD8gYnkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmdldFNoYWRlKFNoYWRlSWQuU0lOR0xFKS5tYXAgeyBpdC5leHBhbnNpb24gfSkKKworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZXhwYW5zaW9uIHNob3VsZCBzdGFydCBhcyAwISIpLnRoYXQobGVmdEV4cGFuc2lvbikuaXNaZXJvKCkKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4cGFuc2lvbiBzaG91bGQgc3RhcnQgYXMgMCEiKS50aGF0KHJpZ2h0RXhwYW5zaW9uKS5pc1plcm8oKQorICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZXhwYW5zaW9uIHNob3VsZCBzdGFydCBhcyAwISIpLnRoYXQoc2luZ2xlRXhwYW5zaW9uKS5pc1plcm8oKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oCisgICAgICAgICAgICBzaGFkZUlkID0gU2hhZGVJZC5MRUZULAorICAgICAgICAgICAgMC40ZiwKKyAgICAgICAgKQorICAgICAgICBhc3NlcnRUaGF0KGxlZnRFeHBhbnNpb24pLmlzRXF1YWxUbygwLjRmKQorICAgICAgICBhc3NlcnRUaGF0KHJpZ2h0RXhwYW5zaW9uKS5pc0VxdWFsVG8oMGYpCisgICAgICAgIGFzc2VydFRoYXQoc2luZ2xlRXhwYW5zaW9uKS5pc0VxdWFsVG8oMGYpCisKKyAgICAgICAgdW5kZXJUZXN0LnNldEV4cGFuc2lvbigKKyAgICAgICAgICAgIHNoYWRlSWQgPSBTaGFkZUlkLlJJR0hULAorICAgICAgICAgICAgMC43M2YsCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0VGhhdChsZWZ0RXhwYW5zaW9uKS5pc0VxdWFsVG8oMC40ZikKKyAgICAgICAgYXNzZXJ0VGhhdChyaWdodEV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNzNmKQorICAgICAgICBhc3NlcnRUaGF0KHNpbmdsZUV4cGFuc2lvbikuaXNFcXVhbFRvKDBmKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oCisgICAgICAgICAgICBzaGFkZUlkID0gU2hhZGVJZC5MRUZULAorICAgICAgICAgICAgMC4xZiwKKyAgICAgICAgKQorICAgICAgICB1bmRlclRlc3Quc2V0RXhwYW5zaW9uKAorICAgICAgICAgICAgc2hhZGVJZCA9IFNoYWRlSWQuU0lOR0xFLAorICAgICAgICAgICAgMC44OGYsCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0VGhhdChsZWZ0RXhwYW5zaW9uKS5pc0VxdWFsVG8oMC4xZikKKyAgICAgICAgYXNzZXJ0VGhhdChyaWdodEV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNzNmKQorICAgICAgICBhc3NlcnRUaGF0KHNpbmdsZUV4cGFuc2lvbikuaXNFcXVhbFRvKDAuODhmKQorICAgIH0KKworICAgIHByaXZhdGUgZnVuIGNyZWF0ZSgpOiBNdWx0aVNoYWRlUmVwb3NpdG9yeSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoCisgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICApCisgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIGZ1biBjcmVhdGUoCisgICAgICAgICAgICBjb250ZXh0OiBDb250ZXh0LAorICAgICAgICAgICAgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHksCisgICAgICAgICk6IE11bHRpU2hhZGVSZXBvc2l0b3J5IHsKKyAgICAgICAgICAgIHJldHVybiBNdWx0aVNoYWRlUmVwb3NpdG9yeSgKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICAgICAgKQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZG9tYWluL2ludGVyYWN0b3IvTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZG9tYWluL2ludGVyYWN0b3IvTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWU2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kb21haW4vaW50ZXJhY3Rvci9NdWx0aVNoYWRlSW50ZXJhY3RvclRlc3Qua3QKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yCisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNvcm91dGluZXMuY29sbGVjdExhc3RWYWx1ZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZXBvc2l0b3J5Lk11bHRpU2hhZGVSZXBvc2l0b3J5VGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVJZAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5FeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVGVzdFNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QucnVuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NAorCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAU21hbGxUZXN0CitAUnVuV2l0aChKVW5pdDQ6OmNsYXNzKQorY2xhc3MgTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRlc3RTY29wZTogVGVzdFNjb3BlCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHkKKworICAgIEBCZWZvcmUKKyAgICBmdW4gc2V0VXAoKSB7CisgICAgICAgIHRlc3RTY29wZSA9IFRlc3RTY29wZSgpCisgICAgICAgIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gbWF4U2hhZGVFeHBhbnNpb24oKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIG1heFNoYWRlRXhwYW5zaW9uOiBGbG9hdD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QubWF4U2hhZGVFeHBhbnNpb24pCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibWF4U2hhZGVFeHBhbnNpb24gbXVzdCBzdGFydCB3aXRoIDAuMCEiKQorICAgICAgICAgICAgICAgIC50aGF0KG1heFNoYWRlRXhwYW5zaW9uKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oMGYpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oc2hhZGVJZCA9IFNoYWRlSWQuTEVGVCwgZXhwYW5zaW9uID0gMC40NDFmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChtYXhTaGFkZUV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNDQxZikKKworICAgICAgICAgICAgdW5kZXJUZXN0LnNldEV4cGFuc2lvbihzaGFkZUlkID0gU2hhZGVJZC5SSUdIVCwgZXhwYW5zaW9uID0gMC40NDJmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChtYXhTaGFkZUV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNDQyZikKKworICAgICAgICAgICAgdW5kZXJUZXN0LnNldEV4cGFuc2lvbihzaGFkZUlkID0gU2hhZGVJZC5SSUdIVCwgZXhwYW5zaW9uID0gMGYpCisgICAgICAgICAgICBhc3NlcnRUaGF0KG1heFNoYWRlRXhwYW5zaW9uKS5pc0VxdWFsVG8oMC40NDFmKQorCisgICAgICAgICAgICB1bmRlclRlc3Quc2V0RXhwYW5zaW9uKHNoYWRlSWQgPSBTaGFkZUlkLkxFRlQsIGV4cGFuc2lvbiA9IDBmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChtYXhTaGFkZUV4cGFuc2lvbikuaXNFcXVhbFRvKDBmKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc1Zpc2libGVfZHVhbFNoYWRlQ29uZmlnKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIHRydWUpCisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzVmlzaWJsZShTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNWaXNpYmxlKFNoYWRlSWQuUklHSFQpKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzVmlzaWJsZShTaGFkZUlkLlNJTkdMRSkpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVWaXNpYmxlKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVWaXNpYmxlKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlVmlzaWJsZSkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGlzVmlzaWJsZV9zaW5nbGVTaGFkZUNvbmZpZygpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCBmYWxzZSkKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNWaXNpYmxlKFNoYWRlSWQuTEVGVCkpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1Zpc2libGUoU2hhZGVJZC5SSUdIVCkpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNWaXNpYmxlKFNoYWRlSWQuU0lOR0xFKSkKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZVZpc2libGUpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVWaXNpYmxlKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZVZpc2libGUpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGlzTm9uUHJveGllZElucHV0QWxsb3dlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgaXNMZWZ0U2hhZGVOb25Qcm94aWVkSW5wdXRBbGxvd2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzTm9uUHJveGllZElucHV0QWxsb3dlZChTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzTm9uUHJveGllZElucHV0QWxsb3dlZCBzaG91bGQgc3RhcnQgYXMgdHJ1ZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzTGVmdFNoYWRlTm9uUHJveGllZElucHV0QWxsb3dlZCkKKyAgICAgICAgICAgICAgICAuaXNUcnVlKCkKKworICAgICAgICAgICAgLy8gTmVlZCB0byBjb2xsZWN0IHByb3hpZWQgaW5wdXQgc28gdGhlIGZsb3dzIGJlY29tZSBob3QgYXMgdGhlIGdlc3R1cmUgY2FuY2VsYXRpb24gY29kZQorICAgICAgICAgICAgLy8gbG9naWMgc2l0cyBpbiBzaWRlIHRoZSBwcm94aWVkSW5wdXQgZmxvdyBmb3IgZWFjaCBzaGFkZS4KKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnByb3hpZWRJbnB1dChTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QucHJveGllZElucHV0KFNoYWRlSWQuUklHSFQpKQorCisgICAgICAgICAgICAvLyBTdGFydGluZyBhIHByb3hpZWQgaW50ZXJhY3Rpb24gb24gdGhlIExFRlQgc2hhZGUgZGlzYWxsb3dzIG5vbi1wcm94aWVkIGludGVyYWN0aW9uIG9uCisgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgIC8vIHNhbWUgc2hhZGUuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KAorICAgICAgICAgICAgICAgIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZyh4RnJhY3Rpb24gPSAwZiwgeURyYWdBbW91bnRQeCA9IDEyM2YpCisgICAgICAgICAgICApCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlTm9uUHJveGllZElucHV0QWxsb3dlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIHByb3hpZWQgaW50ZXJhY3Rpb24gcmUtYWxsb3dzIGl0LgorICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlTm9uUHJveGllZElucHV0QWxsb3dlZCkuaXNUcnVlKCkKKworICAgICAgICAgICAgLy8gU3RhcnRpbmcgYSBwcm94aWVkIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSBmb3JjZS1jb2xsYXBzZXMgdGhlIExFRlQgc2hhZGUsCisgICAgICAgICAgICAvLyBkaXNhbGxvd2luZyBub24tcHJveGllZCBpbnB1dCBvbiB0aGUgTEVGVCBzaGFkZS4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoCisgICAgICAgICAgICAgICAgUHJveGllZElucHV0TW9kZWwuT25EcmFnKHhGcmFjdGlvbiA9IDFmLCB5RHJhZ0Ftb3VudFB4ID0gMTIzZikKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVOb25Qcm94aWVkSW5wdXRBbGxvd2VkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnRW5kKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZU5vblByb3hpZWRJbnB1dEFsbG93ZWQpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGlzRm9yY2VDb2xsYXBzZWRfd2hlbk90aGVyU2hhZGVJbnRlcmFjdGlvblVuZGVyd2F5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5MRUZUKSkKKyAgICAgICAgICAgIHZhbCBpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuUklHSFQpKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuU0lOR0xFKSkKKworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgc3RhcnQgb2YgYW4gaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIGZvcmNlLWNvbGxhcHNlcyB0aGUgTEVGVAorICAgICAgICAgICAgLy8gc2hhZGUuCisgICAgICAgICAgICB1bmRlclRlc3Qub25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKFNoYWRlSWQuUklHSFQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIHVuZGVyVGVzdC5vblVzZXJJbnRlcmFjdGlvbkVuZGVkKFNoYWRlSWQuUklHSFQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBzdGFydCBvZiBhbiBpbnRlcmFjdGlvbiBvbiB0aGUgTEVGVCBzaGFkZSBmb3JjZS1jb2xsYXBzZXMgdGhlIFJJR0hUCisgICAgICAgICAgICAvLyBzaGFkZS4KKyAgICAgICAgICAgIHVuZGVyVGVzdC5vblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoU2hhZGVJZC5MRUZUKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBMRUZUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIHVuZGVyVGVzdC5vblVzZXJJbnRlcmFjdGlvbkVuZGVkKFNoYWRlSWQuTEVGVCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gY29sbGFwc2VBbGwoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5SSUdIVCkpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5TSU5HTEUpKQorCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5jb2xsYXBzZUFsbCgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisKKyAgICAgICAgICAgIC8vIFJlY2VpdmluZyBwcm94aWVkIGlucHV0IG9uIHRoYXQncyBub3QgYSB0YXAgZ2VzdHVyZSwgb24gdGhlIGxlZnQtaGFuZCBzaWRlIHJlc2V0cyB0aGUKKyAgICAgICAgICAgIC8vICJjb2xsYXBzZSBhbGwiLiBOb3RlIHRoYXQgbm93IHRoZSBSSUdIVCBzaGFkZSBpcyBmb3JjZS1jb2xsYXBzZWQgYmVjYXVzZSB3ZSdyZQorICAgICAgICAgICAgLy8gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgTEVGVCBzaGFkZS4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnKDBmLCAwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gb25UYXBPdXRzaWRlX2NvbGxhcHNlc0FsbCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuTEVGVCkpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLlJJR0hUKSkKKyAgICAgICAgICAgIHZhbCBpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLlNJTkdMRSkpCisKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PblRhcCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gcHJveGllZElucHV0X2lnbm9yZWRXaGlsZU5vblByb3hpZWRHZXN0dXJlVW5kZXJ3YXkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIHByb3hpZWRJbnB1dDogUHJveGllZElucHV0TW9kZWw/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QucHJveGllZElucHV0KFNoYWRlSWQuUklHSFQpKQorICAgICAgICAgICAgdW5kZXJUZXN0Lm9uVXNlckludGVyYWN0aW9uU3RhcnRlZChzaGFkZUlkID0gU2hhZGVJZC5SSUdIVCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMC45ZiwgMTAwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3hpZWRJbnB1dCkuaXNOdWxsKCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMC44ZiwgMTEwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3hpZWRJbnB1dCkuaXNOdWxsKCkKKworICAgICAgICAgICAgdW5kZXJUZXN0Lm9uVXNlckludGVyYWN0aW9uRW5kZWQoc2hhZGVJZCA9IFNoYWRlSWQuUklHSFQpCisKKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnKDAuOWYsIDEwMGYpKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChwcm94aWVkSW5wdXQpLmlzTm90TnVsbCgpCisgICAgICAgIH0KKworICAgIHByaXZhdGUgZnVuIGNyZWF0ZSgpOiBNdWx0aVNoYWRlSW50ZXJhY3RvciB7CisgICAgICAgIHJldHVybiBjcmVhdGUoCisgICAgICAgICAgICB0ZXN0U2NvcGUgPSB0ZXN0U2NvcGUsCisgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICApCisgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIGZ1biBjcmVhdGUoCisgICAgICAgICAgICB0ZXN0U2NvcGU6IFRlc3RTY29wZSwKKyAgICAgICAgICAgIGNvbnRleHQ6IENvbnRleHQsCisgICAgICAgICAgICBpbnB1dFByb3h5OiBNdWx0aVNoYWRlSW5wdXRQcm94eSwKKyAgICAgICAgKTogTXVsdGlTaGFkZUludGVyYWN0b3IgeworICAgICAgICAgICAgcmV0dXJuIE11bHRpU2hhZGVJbnRlcmFjdG9yKAorICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NvcGUgPSB0ZXN0U2NvcGUuYmFja2dyb3VuZFNjb3BlLAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPQorICAgICAgICAgICAgICAgICAgICBNdWx0aVNoYWRlUmVwb3NpdG9yeVRlc3QuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICkKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9NdWx0aVNoYWRlVmlld01vZGVsVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9NdWx0aVNoYWRlVmlld01vZGVsVGVzdC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDg0NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL011bHRpU2hhZGVWaWV3TW9kZWxUZXN0Lmt0CkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNvcm91dGluZXMuY29sbGVjdExhc3RWYWx1ZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5FeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVGVzdFNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QucnVuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NAorCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAU21hbGxUZXN0CitAUnVuV2l0aChKVW5pdDQ6OmNsYXNzKQorY2xhc3MgTXVsdGlTaGFkZVZpZXdNb2RlbFRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgeworCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdGVzdFNjb3BlOiBUZXN0U2NvcGUKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBpbnB1dFByb3h5OiBNdWx0aVNoYWRlSW5wdXRQcm94eQorCisgICAgQEJlZm9yZQorICAgIGZ1biBzZXRVcCgpIHsKKyAgICAgICAgdGVzdFNjb3BlID0gVGVzdFNjb3BlKCkKKyAgICAgICAgaW5wdXRQcm94eSA9IE11bHRpU2hhZGVJbnB1dFByb3h5KCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzY3JpbV93aGVuRHVhbFNoYWRlQ29sbGFwc2VkKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgYWxwaGEgPSAwLjVmCisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuZGltZW4uZHVhbF9zaGFkZV9zY3JpbV9hbHBoYSwgYWxwaGEpCisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIHRydWUpCisKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIHNjcmltQWxwaGE6IEZsb2F0PyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5zY3JpbUFscGhhKQorICAgICAgICAgICAgdmFsIGlzU2NyaW1FbmFibGVkOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1NjcmltRW5hYmxlZCkKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChzY3JpbUFscGhhKS5pc1plcm8oKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NjcmltRW5hYmxlZCkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNjcmltX3doZW5EdWFsU2hhZGVFeHBhbmRlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGFscGhhID0gMC41ZgorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmRpbWVuLmR1YWxfc2hhZGVfc2NyaW1fYWxwaGEsIGFscGhhKQorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCB0cnVlKQorICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgc2NyaW1BbHBoYTogRmxvYXQ/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnNjcmltQWxwaGEpCisgICAgICAgICAgICB2YWwgaXNTY3JpbUVuYWJsZWQ6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzU2NyaW1FbmFibGVkKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChzY3JpbUFscGhhKS5pc1plcm8oKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NjcmltRW5hYmxlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5sZWZ0U2hhZGUub25FeHBhbnNpb25DaGFuZ2VkKDAuNWYpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHNjcmltQWxwaGEpLmlzRXF1YWxUbyhhbHBoYSAqIDAuNWYpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2NyaW1FbmFibGVkKS5pc1RydWUoKQorCisgICAgICAgICAgICB1bmRlclRlc3QucmlnaHRTaGFkZS5vbkV4cGFuc2lvbkNoYW5nZWQoMWYpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHNjcmltQWxwaGEpLmlzRXF1YWxUbyhhbHBoYSAqIDFmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NjcmltRW5hYmxlZCkuaXNUcnVlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2NyaW1fd2hlblNpbmdsZVNoYWRlQ29sbGFwc2VkKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgYWxwaGEgPSAwLjVmCisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuZGltZW4uZHVhbF9zaGFkZV9zY3JpbV9hbHBoYSwgYWxwaGEpCisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIGZhbHNlKQorCisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBzY3JpbUFscGhhOiBGbG9hdD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3Quc2NyaW1BbHBoYSkKKyAgICAgICAgICAgIHZhbCBpc1NjcmltRW5hYmxlZDogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNTY3JpbUVuYWJsZWQpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2NyaW1BbHBoYSkuaXNaZXJvKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTY3JpbUVuYWJsZWQpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzY3JpbV93aGVuU2luZ2xlU2hhZGVFeHBhbmRlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGFscGhhID0gMC41ZgorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmRpbWVuLmR1YWxfc2hhZGVfc2NyaW1fYWxwaGEsIGFscGhhKQorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCBmYWxzZSkKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIHNjcmltQWxwaGE6IEZsb2F0PyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5zY3JpbUFscGhhKQorICAgICAgICAgICAgdmFsIGlzU2NyaW1FbmFibGVkOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1NjcmltRW5hYmxlZCkKKworICAgICAgICAgICAgdW5kZXJUZXN0LnNpbmdsZVNoYWRlLm9uRXhwYW5zaW9uQ2hhbmdlZCgwLjk1ZikKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChzY3JpbUFscGhhKS5pc1plcm8oKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NjcmltRW5hYmxlZCkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIHByaXZhdGUgZnVuIGNyZWF0ZSgpOiBNdWx0aVNoYWRlVmlld01vZGVsIHsKKyAgICAgICAgcmV0dXJuIE11bHRpU2hhZGVWaWV3TW9kZWwoCisgICAgICAgICAgICB2aWV3TW9kZWxTY29wZSA9IHRlc3RTY29wZS5iYWNrZ3JvdW5kU2NvcGUsCisgICAgICAgICAgICBpbnRlcmFjdG9yID0KKyAgICAgICAgICAgICAgICBNdWx0aVNoYWRlSW50ZXJhY3RvclRlc3QuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICB0ZXN0U2NvcGUgPSB0ZXN0U2NvcGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL1NoYWRlVmlld01vZGVsVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9TaGFkZVZpZXdNb2RlbFRlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyYWFjNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9TaGFkZVZpZXdNb2RlbFRlc3Qua3QKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbAorCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuY29yb3V0aW5lcy5jb2xsZWN0TGFzdFZhbHVlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlbW90ZXByb3h5Lk11bHRpU2hhZGVJbnB1dFByb3h5CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5UZXN0U2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5ydW5UZXN0CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0CisKK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEpVbml0NDo6Y2xhc3MpCitjbGFzcyBTaGFkZVZpZXdNb2RlbFRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgeworCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdGVzdFNjb3BlOiBUZXN0U2NvcGUKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBpbnB1dFByb3h5OiBNdWx0aVNoYWRlSW5wdXRQcm94eQorICAgIHByaXZhdGUgdmFyIGludGVyYWN0b3I6IE11bHRpU2hhZGVJbnRlcmFjdG9yPyA9IG51bGwKKworICAgIEBCZWZvcmUKKyAgICBmdW4gc2V0VXAoKSB7CisgICAgICAgIHRlc3RTY29wZSA9IFRlc3RTY29wZSgpCisgICAgICAgIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gaXNWaXNpYmxlX2R1YWxTaGFkZUNvbmZpZygpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCB0cnVlKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5MRUZUKS5pc1Zpc2libGUpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5SSUdIVCkuaXNWaXNpYmxlKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlNJTkdMRSkuaXNWaXNpYmxlKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlVmlzaWJsZSkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlVmlzaWJsZSkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZVZpc2libGUpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc1Zpc2libGVfc2luZ2xlU2hhZGVDb25maWcoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgZmFsc2UpCisgICAgICAgICAgICB2YWwgaXNMZWZ0U2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLkxFRlQpLmlzVmlzaWJsZSkKKyAgICAgICAgICAgIHZhbCBpc1JpZ2h0U2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlJJR0hUKS5pc1Zpc2libGUpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuU0lOR0xFKS5pc1Zpc2libGUpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVWaXNpYmxlKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlVmlzaWJsZSkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVWaXNpYmxlKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc1N3aXBpbmdFbmFibGVkKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKFNoYWRlSWQuTEVGVCkKKyAgICAgICAgICAgIHZhbCBpc1N3aXBpbmdFbmFibGVkOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1N3aXBpbmdFbmFibGVkKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzU3dpcGluZ0VuYWJsZWQgc2hvdWxkIHN0YXJ0IGFzIHRydWUhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1N3aXBpbmdFbmFibGVkKQorICAgICAgICAgICAgICAgIC5pc1RydWUoKQorCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbGxlY3QgcHJveGllZCBpbnB1dCBzbyB0aGUgZmxvd3MgYmVjb21lIGhvdCBhcyB0aGUgZ2VzdHVyZSBjYW5jZWxhdGlvbiBjb2RlCisgICAgICAgICAgICAvLyBsb2dpYyBzaXRzIGluIHNpZGUgdGhlIHByb3hpZWRJbnB1dCBmbG93IGZvciBlYWNoIHNoYWRlLgorICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QucHJveGllZElucHV0KQorICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5SSUdIVCkucHJveGllZElucHV0KQorCisgICAgICAgICAgICAvLyBTdGFydGluZyBhIHByb3hpZWQgaW50ZXJhY3Rpb24gb24gdGhlIExFRlQgc2hhZGUgZGlzYWxsb3dzIG5vbi1wcm94aWVkIGludGVyYWN0aW9uIG9uCisgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgIC8vIHNhbWUgc2hhZGUuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KAorICAgICAgICAgICAgICAgIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZyh4RnJhY3Rpb24gPSAwZiwgeURyYWdBbW91bnRQeCA9IDEyM2YpCisgICAgICAgICAgICApCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU3dpcGluZ0VuYWJsZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgZW5kIG9mIHRoZSBwcm94aWVkIGludGVyYWN0aW9uIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnRW5kKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1N3aXBpbmdFbmFibGVkKS5pc1RydWUoKQorCisgICAgICAgICAgICAvLyBTdGFydGluZyBhIHByb3hpZWQgaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIGZvcmNlLWNvbGxhcHNlcyB0aGUgTEVGVCBzaGFkZSwKKyAgICAgICAgICAgIC8vIGRpc2FsbG93aW5nIG5vbi1wcm94aWVkIGlucHV0IG9uIHRoZSBMRUZUIHNoYWRlLgorICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dCgKKyAgICAgICAgICAgICAgICBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoeEZyYWN0aW9uID0gMWYsIHlEcmFnQW1vdW50UHggPSAxMjNmKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1N3aXBpbmdFbmFibGVkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnRW5kKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1N3aXBpbmdFbmFibGVkKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc0ZvcmNlQ29sbGFwc2VkX3doZW5PdGhlclNoYWRlSW50ZXJhY3Rpb25VbmRlcndheSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGxlZnRTaGFkZSA9IGNyZWF0ZShTaGFkZUlkLkxFRlQpCisgICAgICAgICAgICB2YWwgcmlnaHRTaGFkZSA9IGNyZWF0ZShTaGFkZUlkLlJJR0hUKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUobGVmdFNoYWRlLmlzRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZShyaWdodFNoYWRlLmlzRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuU0lOR0xFKS5pc0ZvcmNlQ29sbGFwc2VkKQorCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBzdGFydCBvZiBhbiBpbnRlcmFjdGlvbiBvbiB0aGUgUklHSFQgc2hhZGUgZm9yY2UtY29sbGFwc2VzIHRoZSBMRUZUCisgICAgICAgICAgICAvLyBzaGFkZS4KKyAgICAgICAgICAgIHJpZ2h0U2hhZGUub25EcmFnU3RhcnRlZCgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIHJpZ2h0U2hhZGUub25EcmFnRW5kZWQoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgc3RhcnQgb2YgYW4gaW50ZXJhY3Rpb24gb24gdGhlIExFRlQgc2hhZGUgZm9yY2UtY29sbGFwc2VzIHRoZSBSSUdIVAorICAgICAgICAgICAgLy8gc2hhZGUuCisgICAgICAgICAgICBsZWZ0U2hhZGUub25EcmFnU3RhcnRlZCgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIExFRlQgc2hhZGUgcmUtYWxsb3dzIGl0LgorICAgICAgICAgICAgbGVmdFNoYWRlLm9uRHJhZ0VuZGVkKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gb25UYXBPdXRzaWRlX2NvbGxhcHNlc0FsbCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5MRUZUKS5pc0ZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuUklHSFQpLmlzRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuU0lOR0xFKS5pc0ZvcmNlQ29sbGFwc2VkKQorCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25UYXApCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHByb3hpZWRJbnB1dF9pZ25vcmVkV2hpbGVOb25Qcm94aWVkR2VzdHVyZVVuZGVyd2F5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKFNoYWRlSWQuUklHSFQpCisgICAgICAgICAgICB2YWwgcHJveGllZElucHV0OiBQcm94aWVkSW5wdXRNb2RlbD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QucHJveGllZElucHV0KQorICAgICAgICAgICAgdW5kZXJUZXN0Lm9uRHJhZ1N0YXJ0ZWQoKQorCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwLjlmLCAxMDBmKSkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocHJveGllZElucHV0KS5pc051bGwoKQorCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwLjhmLCAxMTBmKSkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocHJveGllZElucHV0KS5pc051bGwoKQorCisgICAgICAgICAgICB1bmRlclRlc3Qub25EcmFnRW5kZWQoKQorCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwLjlmLCAxMDBmKSkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocHJveGllZElucHV0KS5pc05vdE51bGwoKQorICAgICAgICB9CisKKyAgICBwcml2YXRlIGZ1biBjcmVhdGUoCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgKTogU2hhZGVWaWV3TW9kZWwgeworICAgICAgICByZXR1cm4gU2hhZGVWaWV3TW9kZWwoCisgICAgICAgICAgICB2aWV3TW9kZWxTY29wZSA9IHRlc3RTY29wZS5iYWNrZ3JvdW5kU2NvcGUsCisgICAgICAgICAgICBzaGFkZUlkID0gc2hhZGVJZCwKKyAgICAgICAgICAgIGludGVyYWN0b3IgPSBpbnRlcmFjdG9yCisgICAgICAgICAgICAgICAgICAgID86IE11bHRpU2hhZGVJbnRlcmFjdG9yVGVzdC5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFNjb3BlID0gdGVzdFNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFsc28geyBpbnRlcmFjdG9yID0gaXQgfSwKKyAgICAgICAgKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGV0YXNrL05vdGVUYXNrQ29udHJvbGxlclRlc3Qua3QKaW5kZXggM2Y5NDBkNi4uNDBjNzMzYSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGV0YXNrL05vdGVUYXNrQ29udHJvbGxlclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGV0YXNrL05vdGVUYXNrQ29udHJvbGxlclRlc3Qua3QKQEAgLTIzMiw3ICsyMzIsNyBAQAogCiAgICAgICAgIHZlcmlmeVplcm9JbnRlcmFjdGlvbnMoY29udGV4dCkKICAgICAgICAgdmFsIGludGVudENhcHRvciA9IGFyZ3VtZW50Q2FwdG9yPEludGVudD4oKQotICAgICAgICB2ZXJpZnkoYnViYmxlcykuc2hvd09ySGlkZUFwcEJ1YmJsZShjYXB0dXJlKGludGVudENhcHRvcikpCisgICAgICAgIHZlcmlmeShidWJibGVzKS5zaG93T3JIaWRlQXBwQnViYmxlKGNhcHR1cmUoaW50ZW50Q2FwdG9yKSwgZXEodXNlclRyYWNrZXIudXNlckhhbmRsZSkpCiAgICAgICAgIGludGVudENhcHRvci52YWx1ZS5sZXQgeyBpbnRlbnQgLT4KICAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZW50LmFjdGlvbikuaXNFcXVhbFRvKEludGVudC5BQ1RJT05fQ1JFQVRFX05PVEUpCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVudC5gcGFja2FnZWApLmlzRXF1YWxUbyhOT1RFU19QQUNLQUdFX05BTUUpCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgICAgY3JlYXRlTm90ZVRhc2tDb250cm9sbGVyKCkuc2hvd05vdGVUYXNrKGVudHJ5UG9pbnQgPSBOb3RlVGFza0VudHJ5UG9pbnQuUVVJQ0tfQUZGT1JEQU5DRSkKIAogICAgICAgICB2YWwgaW50ZW50Q2FwdG9yID0gYXJndW1lbnRDYXB0b3I8SW50ZW50PigpCi0gICAgICAgIHZlcmlmeShidWJibGVzKS5zaG93T3JIaWRlQXBwQnViYmxlKGNhcHR1cmUoaW50ZW50Q2FwdG9yKSkKKyAgICAgICAgdmVyaWZ5KGJ1YmJsZXMpLnNob3dPckhpZGVBcHBCdWJibGUoY2FwdHVyZShpbnRlbnRDYXB0b3IpLCBlcSh1c2VyVHJhY2tlci51c2VySGFuZGxlKSkKICAgICAgICAgaW50ZW50Q2FwdG9yLnZhbHVlLmxldCB7IGludGVudCAtPgogICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlbnQuYWN0aW9uKS5pc0VxdWFsVG8oSW50ZW50LkFDVElPTl9DUkVBVEVfTk9URSkKICAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZW50LmBwYWNrYWdlYCkuaXNFcXVhbFRvKE5PVEVTX1BBQ0tBR0VfTkFNRSkKQEAgLTM4OSw3ICszODksNyBAQAogICAgICAgICBjcmVhdGVOb3RlVGFza0NvbnRyb2xsZXIoKS5zaG93Tm90ZVRhc2soZW50cnlQb2ludCA9IE5vdGVUYXNrRW50cnlQb2ludC5RVUlDS19BRkZPUkRBTkNFKQogCiAgICAgICAgIHZhbCBpbnRlbnRDYXB0b3IgPSBhcmd1bWVudENhcHRvcjxJbnRlbnQ+KCkKLSAgICAgICAgdmVyaWZ5KGJ1YmJsZXMpLnNob3dPckhpZGVBcHBCdWJibGUoY2FwdHVyZShpbnRlbnRDYXB0b3IpKQorICAgICAgICB2ZXJpZnkoYnViYmxlcykuc2hvd09ySGlkZUFwcEJ1YmJsZShjYXB0dXJlKGludGVudENhcHRvciksIGVxKHVzZXJUcmFja2VyLnVzZXJIYW5kbGUpKQogICAgICAgICBpbnRlbnRDYXB0b3IudmFsdWUubGV0IHsgaW50ZW50IC0+CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVudC5hY3Rpb24pLmlzRXF1YWxUbyhJbnRlbnQuQUNUSU9OX0NSRUFURV9OT1RFKQogICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlbnQuYHBhY2thZ2VgKS5pc0VxdWFsVG8oTk9URVNfUEFDS0FHRV9OQU1FKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXJUZXN0Lmt0CmluZGV4IDUxNDkyZWIuLmJkYjBlN2UgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlclRlc3Qua3QKQEAgLTI5LDEyICsyOSwxNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmJpb21ldHJpY3MuZG9tYWluLmludGVyYWN0b3IuVWRmcHNPdmVybGF5SW50ZXJhY3RvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvckZha2UKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kb2NrLkRvY2tNYW5hZ2VyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmFrZUZlYXR1cmVGbGFncworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuZG9tYWluLmludGVyYWN0b3IuQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5LZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsLlRyYW5zaXRpb25TdGVwCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLktleWd1YXJkQm91bmNlclZpZXdNb2RlbAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLnZpZXdtb2RlbC5QcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVwb3NpdG9yeS5NdWx0aVNoYWRlUmVwb3NpdG9yeQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFkZS5Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcuSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcgpAQCAtNDgsOCArNTMsMTIgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci53aW5kb3cuU3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFueQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5GYWtlU3lzdGVtQ2xvY2sKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5lbXB0eUZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5UZXN0U2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5ydW5UZXN0CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCkBAIC02MywxMCArNzIsMTIgQEAKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmB3aGVuYCBhcyB3aGVuZXZlcgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9ucwogCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lcjo6Y2xhc3MpCiBAUnVuV2l0aExvb3BlcihzZXRBc01haW5Mb29wZXIgPSB0cnVlKQogY2xhc3MgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlclRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgeworCiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdmlldzogTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3CiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgc3lzdWlTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI6IFN5c3VpU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyCiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgY2VudHJhbFN1cmZhY2VzOiBDZW50cmFsU3VyZmFjZXMKQEAgLTEwMCw2ICsxMTEsOCBAQAogCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdW5kZXJUZXN0OiBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyCiAKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciB0ZXN0U2NvcGU6IFRlc3RTY29wZQorCiAgICAgQEJlZm9yZQogICAgIGZ1biBzZXRVcCgpIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKQpAQCAtMTEyLDYgKzEyNSwxMyBAQAogICAgICAgICAgICAgLnRoZW5SZXR1cm4oa2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIpCiAgICAgICAgIHdoZW5ldmVyKGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IubG9ja3NjcmVlblRvRHJlYW1pbmdUcmFuc2l0aW9uKQogICAgICAgICAgICAgLnRoZW5SZXR1cm4oZW1wdHlGbG93PFRyYW5zaXRpb25TdGVwPigpKQorCisgICAgICAgIHZhbCBmZWF0dXJlRmxhZ3MgPSBGYWtlRmVhdHVyZUZsYWdzKCkKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldChGbGFncy5UUkFDS1BBRF9HRVNUVVJFX0JBQ0ssIGZhbHNlKQorICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0KEZsYWdzLkRVQUxfU0hBREUsIGZhbHNlKQorCisgICAgICAgIHZhbCBpbnB1dFByb3h5ID0gTXVsdGlTaGFkZUlucHV0UHJveHkoKQorICAgICAgICB0ZXN0U2NvcGUgPSBUZXN0U2NvcGUoKQogICAgICAgICB1bmRlclRlc3QgPQogICAgICAgICAgICAgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlcigKICAgICAgICAgICAgICAgICBsb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlciwKQEAgLTEzOCw2ICsxNTgsMTkgQEAKICAgICAgICAgICAgICAgICB1ZGZwc092ZXJsYXlJbnRlcmFjdG9yLAogICAgICAgICAgICAgICAgIGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IsCiAgICAgICAgICAgICAgICAgcHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsLAorICAgICAgICAgICAgICAgIGZlYXR1cmVGbGFncywKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE11bHRpU2hhZGVJbnRlcmFjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25TY29wZSA9IHRlc3RTY29wZS5iYWNrZ3JvdW5kU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVNoYWRlUmVwb3NpdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25Db250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBGYWtlU3lzdGVtQ2xvY2soKSwKICAgICAgICAgICAgICkKICAgICAgICAgdW5kZXJUZXN0LnNldHVwRXhwYW5kZWRTdGF0dXNCYXIoKQogCkBAIC0xNTAsMTQ3ICsxODMsMTYyIEBACiAgICAgLy8gdGVzdHMgbmVlZCB0byBiZSBhZGRlZCB0byB0ZXN0IHRoZSByZXN0IG9mIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudC4KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9udWxsU3RhdHVzQmFyVmlld0NvbnRyb2xsZXJfcmV0dXJuc0ZhbHNlKCkgewotICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIobnVsbCkKKyAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X251bGxTdGF0dXNCYXJWaWV3Q29udHJvbGxlcl9yZXR1cm5zRmFsc2UoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihudWxsKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChET1dOX0VWRU5UKQogCi0gICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc0ZhbHNlKCkKLSAgICB9CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNGYWxzZSgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duVG91Y2hCZWxvd1ZpZXdfc2VuZHNUb3VjaFRvU2IoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB2YWwgZXYgPSBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgMGYsIFZJRVdfQk9UVE9NICsgNGYsIDApCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KGV2KSkudGhlblJldHVybih0cnVlKQorICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfZG93blRvdWNoQmVsb3dWaWV3X3NlbmRzVG91Y2hUb1NiKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKKyAgICAgICAgICAgIHZhbCBldiA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCAwZiwgVklFV19CT1RUT00gKyA0ZiwgMCkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KGV2KSkudGhlblJldHVybih0cnVlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZXYpCisgICAgICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KGV2KQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcoZXYpCi0gICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQotICAgIH0KKyAgICAgICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcoZXYpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X2Rvd25Ub3VjaEJlbG93Vmlld1RoZW5Bbm90aGVyVG91Y2hfc2VuZHNUb3VjaFRvU2IoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB2YWwgZG93bkV2QmVsb3cgPQotICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCBWSUVXX0JPVFRPTSArIDRmLCAwKQotICAgICAgICBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2QmVsb3cpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duVG91Y2hCZWxvd1ZpZXdUaGVuQW5vdGhlclRvdWNoX3NlbmRzVG91Y2hUb1NiKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKKyAgICAgICAgICAgIHZhbCBkb3duRXZCZWxvdyA9CisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCBWSUVXX0JPVFRPTSArIDRmLCAwKQorICAgICAgICAgICAgaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KGRvd25FdkJlbG93KQogCi0gICAgICAgIHZhbCBuZXh0RXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgMGYsIFZJRVdfQk9UVE9NICsgNWYsIDApCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KG5leHRFdmVudCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHZhbCBuZXh0RXZlbnQgPQorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCAwZiwgVklFV19CT1RUT00gKyA1ZiwgMCkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KG5leHRFdmVudCkpLnRoZW5SZXR1cm4odHJ1ZSkKIAotICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KG5leHRFdmVudCkKKyAgICAgICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQobmV4dEV2ZW50KQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KQotICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKLSAgICB9CisgICAgICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikuc2VuZFRvdWNoVG9WaWV3KG5leHRFdmVudCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQorICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfZG93bkFuZFBhbmVsQ29sbGFwc2VkQW5kSW5TYkJvdW5kQW5kU2JXaW5kb3dTaG93X3NlbmRzVG91Y2hUb1NiKCkgewotICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKLSAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIHdoZW5ldmVyKG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIuaXNGdWxseUNvbGxhcHNlZCkudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQotICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcoZG93bkV2KSkudGhlblJldHVybih0cnVlKQorICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfZG93bkFuZFBhbmVsQ29sbGFwc2VkQW5kSW5TYkJvdW5kQW5kU2JXaW5kb3dTaG93X3NlbmRzVG91Y2hUb1NiKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKKyAgICAgICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnNlbmRUb3VjaFRvVmlldyhET1dOX0VWRU5UKSkudGhlblJldHVybih0cnVlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChET1dOX0VWRU5UKQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcoZG93bkV2KQotICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKLSAgICB9CisgICAgICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikuc2VuZFRvdWNoVG9WaWV3KERPV05fRVZFTlQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X3BhbmVsTm90Q29sbGFwc2VkX3JldHVybnNOdWxsKCkgewotICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKLSAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCi0gICAgICAgICAgICAudGhlblJldHVybih0cnVlKQotICAgICAgICAvLyBJdGVtIHdlJ3JlIHRlc3RpbmcKLSAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKGZhbHNlKQorICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfcGFuZWxOb3RDb2xsYXBzZWRfcmV0dXJuc051bGwoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICAvLyBJdGVtIHdlJ3JlIHRlc3RpbmcKKyAgICAgICAgICAgIHdoZW5ldmVyKG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIuaXNGdWxseUNvbGxhcHNlZCkudGhlblJldHVybihmYWxzZSkKIAotICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KGRvd25FdikKKyAgICAgICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoRE9XTl9FVkVOVCkKIAotICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KGRvd25FdikKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzTnVsbCgpCi0gICAgfQorICAgICAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIsIG5ldmVyKCkpLnNlbmRUb3VjaFRvVmlldyhET1dOX0VWRU5UKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzTnVsbCgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF90b3VjaE5vdEluU2JCb3VuZHNfcmV0dXJuc051bGwoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZwotICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQotICAgICAgICAgICAgLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF90b3VjaE5vdEluU2JCb3VuZHNfcmV0dXJuc051bGwoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZworICAgICAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci50b3VjaElzV2l0aGluVmlldyhhbnlGbG9hdCgpLCBhbnlGbG9hdCgpKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihmYWxzZSkKIAotICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KGRvd25FdikKKyAgICAgICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoRE9XTl9FVkVOVCkKIAotICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KGRvd25FdikKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzTnVsbCgpCi0gICAgfQorICAgICAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIsIG5ldmVyKCkpLnNlbmRUb3VjaFRvVmlldyhET1dOX0VWRU5UKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzTnVsbCgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9zYldpbmRvd05vdFNob3dpbmdfbm9TZW5kVG91Y2hUb1NiQW5kUmV0dXJuc1RydWUoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci50b3VjaElzV2l0aGluVmlldyhhbnlGbG9hdCgpLCBhbnlGbG9hdCgpKSkKLSAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZwotICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9zYldpbmRvd05vdFNob3dpbmdfbm9TZW5kVG91Y2hUb1NiQW5kUmV0dXJuc1RydWUoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICAvLyBJdGVtIHdlJ3JlIHRlc3RpbmcKKyAgICAgICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybihmYWxzZSkKIAotICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KGRvd25FdikKKyAgICAgICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoRE9XTl9FVkVOVCkKIAotICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KGRvd25FdikKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCi0gICAgfQorICAgICAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIsIG5ldmVyKCkpLnNlbmRUb3VjaFRvVmlldyhET1dOX0VWRU5UKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duRXZlbnRTZW50VG9TYlRoZW5Bbm90aGVyRXZlbnRfc2VuZHNUb3VjaFRvU2IoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCi0gICAgICAgICAgICAudGhlblJldHVybih0cnVlKQorICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfZG93bkV2ZW50U2VudFRvU2JUaGVuQW5vdGhlckV2ZW50X3NlbmRzVG91Y2hUb1NiKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB1bmRlclRlc3Quc2V0U3RhdHVzQmFyVmlld0NvbnRyb2xsZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikKKyAgICAgICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCiAKLSAgICAgICAgLy8gRG93biBldmVudCBmaXJzdAotICAgICAgICBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgLy8gRG93biBldmVudCBmaXJzdAorICAgICAgICAgICAgaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KERPV05fRVZFTlQpCiAKLSAgICAgICAgLy8gVGhlbiBhbm90aGVyIGV2ZW50Ci0gICAgICAgIHZhbCBuZXh0RXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgMGYsIDBmLCAwKQotICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnNlbmRUb3VjaFRvVmlldyhuZXh0RXZlbnQpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICAvLyBUaGVuIGFub3RoZXIgZXZlbnQKKyAgICAgICAgICAgIHZhbCBuZXh0RXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgMGYsIDBmLCAwKQorICAgICAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KSkudGhlblJldHVybih0cnVlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQobmV4dEV2ZW50KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChuZXh0RXZlbnQpCiAKLSAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhuZXh0RXZlbnQpCi0gICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQotICAgIH0KKyAgICAgICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KQorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIHNob3VsZEludGVyY2VwdFRvdWNoRXZlbnRfZG93bkV2ZW50QWx0ZXJuYXRlQm91bmNlcl9pZ25vcmVJZkluVWRmcHNPdmVybGF5KCkgewotICAgICAgICAvLyBEb3duIGV2ZW50IHdpdGhpbiB1ZGZwc092ZXJsYXkgYm91bmRzIHdoaWxlIGFsdGVybmF0ZUJvdW5jZXIgaXMgc2hvd2luZwotICAgICAgICB3aGVuZXZlcih1ZGZwc092ZXJsYXlJbnRlcmFjdG9yLmNhbkludGVyY2VwdFRvdWNoSW5VZGZwc0JvdW5kcyhkb3duRXYpKS50aGVuUmV0dXJuKGZhbHNlKQotICAgICAgICB3aGVuZXZlcihhbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKHRydWUpCisgICAgZnVuIHNob3VsZEludGVyY2VwdFRvdWNoRXZlbnRfZG93bkV2ZW50QWx0ZXJuYXRlQm91bmNlcl9pZ25vcmVJZkluVWRmcHNPdmVybGF5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICAvLyBEb3duIGV2ZW50IHdpdGhpbiB1ZGZwc092ZXJsYXkgYm91bmRzIHdoaWxlIGFsdGVybmF0ZUJvdW5jZXIgaXMgc2hvd2luZworICAgICAgICAgICAgd2hlbmV2ZXIodWRmcHNPdmVybGF5SW50ZXJhY3Rvci5jYW5JbnRlcmNlcHRUb3VjaEluVWRmcHNCb3VuZHMoRE9XTl9FVkVOVCkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgICAgICAgICB3aGVuZXZlcihhbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKHRydWUpCiAKLSAgICAgICAgLy8gVGhlbiB0b3VjaCBzaG91bGQgbm90IGJlIGludGVyY2VwdGVkCi0gICAgICAgIHZhbCBzaG91bGRJbnRlcmNlcHQgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5zaG91bGRJbnRlcmNlcHRUb3VjaEV2ZW50KGRvd25FdikKLSAgICAgICAgYXNzZXJ0VGhhdChzaG91bGRJbnRlcmNlcHQpLmlzRmFsc2UoKQotICAgIH0KKyAgICAgICAgICAgIC8vIFRoZW4gdG91Y2ggc2hvdWxkIG5vdCBiZSBpbnRlcmNlcHRlZAorICAgICAgICAgICAgdmFsIHNob3VsZEludGVyY2VwdCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLnNob3VsZEludGVyY2VwdFRvdWNoRXZlbnQoRE9XTl9FVkVOVCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2hvdWxkSW50ZXJjZXB0KS5pc0ZhbHNlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gdGVzdEdldEJvdW5jZXJDb250YWluZXIoKSB7Ci0gICAgICAgIE1vY2tpdG8uY2xlYXJJbnZvY2F0aW9ucyh2aWV3KQotICAgICAgICB1bmRlclRlc3QuYm91bmNlckNvbnRhaW5lcgotICAgICAgICB2ZXJpZnkodmlldykuZmluZFZpZXdCeUlkPFZpZXdHcm91cD4oUi5pZC5rZXlndWFyZF9ib3VuY2VyX2NvbnRhaW5lcikKLSAgICB9CisgICAgZnVuIHRlc3RHZXRCb3VuY2VyQ29udGFpbmVyKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICBNb2NraXRvLmNsZWFySW52b2NhdGlvbnModmlldykKKyAgICAgICAgICAgIHVuZGVyVGVzdC5ib3VuY2VyQ29udGFpbmVyCisgICAgICAgICAgICB2ZXJpZnkodmlldykuZmluZFZpZXdCeUlkPFZpZXdHcm91cD4oUi5pZC5rZXlndWFyZF9ib3VuY2VyX2NvbnRhaW5lcikKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gdGVzdEdldEtleWd1YXJkTWVzc2FnZUFyZWEoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5rZXlndWFyZE1lc3NhZ2VBcmVhCi0gICAgICAgIHZlcmlmeSh2aWV3KS5maW5kVmlld0J5SWQ8Vmlld0dyb3VwPihSLmlkLmtleWd1YXJkX21lc3NhZ2VfYXJlYSkKKyAgICBmdW4gdGVzdEdldEtleWd1YXJkTWVzc2FnZUFyZWEoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5rZXlndWFyZE1lc3NhZ2VBcmVhCisgICAgICAgICAgICB2ZXJpZnkodmlldykuZmluZFZpZXdCeUlkPFZpZXdHcm91cD4oUi5pZC5rZXlndWFyZF9tZXNzYWdlX2FyZWEpCisgICAgICAgIH0KKworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICBwcml2YXRlIHZhbCBET1dOX0VWRU5UID0gTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCAwZiwgMCkKKyAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgVklFV19CT1RUT00gPSAxMDAKICAgICB9CiB9Ci0KLXByaXZhdGUgdmFsIGRvd25FdiA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCAwZiwgMGYsIDApCi1wcml2YXRlIGNvbnN0IHZhbCBWSUVXX0JPVFRPTSA9IDEwMApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld1Rlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTI4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFkZTsKLQotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwotCi1pbXBvcnQgc3RhdGljIGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3dLdC5lbXB0eUZsb3c7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudGVzdGluZy5BbmRyb2lkVGVzdGluZ1J1bm5lcjsKLWltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuTG9ja0ljb25WaWV3Q29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5kYWdnZXIuS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5iaW9tZXRyaWNzLmRvbWFpbi5pbnRlcmFjdG9yLlVkZnBzT3ZlcmxheUludGVyYWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuY2xhc3NpZmllci5GYWxzaW5nQ29sbGVjdG9yRmFrZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kb2NrLkRvY2tNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLktleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5LZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLnZpZXdtb2RlbC5LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLlByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuRHJhZ0Rvd25IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TeXN1aVN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnN0YWNrLkFtYmllbnRTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnN0YWNrLk5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uc3RhY2suTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5DZW50cmFsU3VyZmFjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLlN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLndpbmRvdy5TdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudHVuZXIuVHVuZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uQ2FwdG9yOwotaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOwotCi1AUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lci5jbGFzcykKLUBUZXN0YWJsZUxvb3Blci5SdW5XaXRoTG9vcGVyKHNldEFzTWFpbkxvb3BlciA9IHRydWUpCi1AU21hbGxUZXN0Ci1wdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdCBleHRlbmRzIFN5c3VpVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcgbVZpZXc7Ci0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyIG1Db250cm9sbGVyOwotCi0gICAgQE1vY2sgcHJpdmF0ZSBUdW5lclNlcnZpY2UgbVR1bmVyU2VydmljZTsKLSAgICBATW9jayBwcml2YXRlIERyYWdEb3duSGVscGVyIG1EcmFnRG93bkhlbHBlcjsKLSAgICBATW9jayBwcml2YXRlIFN5c3VpU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBTaGFkZUNvbnRyb2xsZXIgbVNoYWRlQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIENlbnRyYWxTdXJmYWNlcyBtQ2VudHJhbFN1cmZhY2VzOwotICAgIEBNb2NrIHByaXZhdGUgRG9ja01hbmFnZXIgbURvY2tNYW5hZ2VyOwotICAgIEBNb2NrIHByaXZhdGUgTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlciBtTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIE5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0IG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dDsKLSAgICBATW9jayBwcml2YXRlIE5vdGlmaWNhdGlvblNoYWRlRGVwdGhDb250cm9sbGVyIG1Ob3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIE5vdGlmaWNhdGlvblNoYWRlV2luZG93Q29udHJvbGxlciBtTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyIG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBTdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyIG1TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyOwotICAgIEBNb2NrIHByaXZhdGUgU3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyIG1TdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBMb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlciBtTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBMb2NrSWNvblZpZXdDb250cm9sbGVyIG1Mb2NrSWNvblZpZXdDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyIG1LZXlndWFyZFVubG9ja0FuaW1hdGlvbkNvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBBbWJpZW50U3RhdGUgbUFtYmllbnRTdGF0ZTsKLSAgICBATW9jayBwcml2YXRlIFB1bHNpbmdHZXN0dXJlTGlzdGVuZXIgbVB1bHNpbmdHZXN0dXJlTGlzdGVuZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBLZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwgbUtleWd1YXJkQm91bmNlclZpZXdNb2RlbDsKLSAgICBATW9jayBwcml2YXRlIEtleWd1YXJkQm91bmNlckNvbXBvbmVudC5GYWN0b3J5IG1LZXlndWFyZEJvdW5jZXJDb21wb25lbnRGYWN0b3J5OwotICAgIEBNb2NrIHByaXZhdGUgS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50IG1LZXlndWFyZEJvdW5jZXJDb21wb25lbnQ7Ci0gICAgQE1vY2sgcHJpdmF0ZSBLZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlciBtS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBOb3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyIG1Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IgbUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOwotICAgIEBNb2NrIHByaXZhdGUgVWRmcHNPdmVybGF5SW50ZXJhY3RvciBtVWRmcHNPdmVybGF5SW50ZXJhY3RvcjsKLSAgICBATW9jayBwcml2YXRlIEtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IgbUtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3I7Ci0gICAgQE1vY2sgcHJpdmF0ZSBQcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwgbVByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbDsKLQotICAgIEBDYXB0b3IgcHJpdmF0ZSBBcmd1bWVudENhcHRvcjxOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcuSW50ZXJhY3Rpb25FdmVudEhhbmRsZXI+Ci0gICAgICAgICAgICBtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXJDYXB0b3I7Ci0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcuSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIgbUludGVyYWN0aW9uRXZlbnRIYW5kbGVyOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOwotCi0gICAgICAgIG1WaWV3ID0gc3B5KG5ldyBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcoZ2V0Q29udGV4dCgpLCBudWxsKSk7Ci0gICAgICAgIHdoZW4obVZpZXcuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uX3N0YWNrX3Njcm9sbGVyKSkKLSAgICAgICAgICAgICAgICAudGhlblJldHVybihtTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQpOwotCi0gICAgICAgIHdoZW4obVZpZXcuZmluZFZpZXdCeUlkKFIuaWQua2V5Z3VhcmRfYm91bmNlcl9jb250YWluZXIpKS50aGVuUmV0dXJuKG1vY2soVmlld0dyb3VwLmNsYXNzKSk7Ci0gICAgICAgIHdoZW4obUtleWd1YXJkQm91bmNlckNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueShWaWV3R3JvdXAuY2xhc3MpKSkudGhlblJldHVybigKLSAgICAgICAgICAgICAgICBtS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50KTsKLSAgICAgICAgd2hlbihtS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50LmdldFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcigpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcik7Ci0KLSAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICBtRGVwZW5kZW5jeS5pbmplY3RUZXN0RGVwZW5kZW5jeShTaGFkZUNvbnRyb2xsZXIuY2xhc3MsIG1TaGFkZUNvbnRyb2xsZXIpOwotCi0gICAgICAgIHdoZW4obURvY2tNYW5hZ2VyLmlzRG9ja2VkKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotCi0gICAgICAgIHdoZW4obUtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IuZ2V0TG9ja3NjcmVlblRvRHJlYW1pbmdUcmFuc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4oZW1wdHlGbG93KCkpOwotCi0gICAgICAgIG1Db250cm9sbGVyID0gbmV3IE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgbUxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyLAotICAgICAgICAgICAgICAgIG5ldyBGYWxzaW5nQ29sbGVjdG9yRmFrZSgpLAotICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbURvY2tNYW5hZ2VyLAotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtVmlldywKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBuZXcgU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyLAotICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLAotICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbUxvY2tJY29uVmlld0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbUNlbnRyYWxTdXJmYWNlcywKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyLAotICAgICAgICAgICAgICAgIG1LZXlndWFyZFVubG9ja0FuaW1hdGlvbkNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbUFtYmllbnRTdGF0ZSwKLSAgICAgICAgICAgICAgICBtUHVsc2luZ0dlc3R1cmVMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBtS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLAotICAgICAgICAgICAgICAgIG1LZXlndWFyZEJvdW5jZXJDb21wb25lbnRGYWN0b3J5LAotICAgICAgICAgICAgICAgIG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvciwKLSAgICAgICAgICAgICAgICBtVWRmcHNPdmVybGF5SW50ZXJhY3RvciwKLSAgICAgICAgICAgICAgICBtS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvciwKLSAgICAgICAgICAgICAgICBtUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsCi0gICAgICAgICk7Ci0gICAgICAgIG1Db250cm9sbGVyLnNldHVwRXhwYW5kZWRTdGF0dXNCYXIoKTsKLSAgICAgICAgbUNvbnRyb2xsZXIuc2V0RHJhZ0Rvd25IZWxwZXIobURyYWdEb3duSGVscGVyKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REcmFnRG93bkhlbHBlckNhbGxlZFdoZW5EcmFnZ2luZ0Rvd24oKSB7Ci0gICAgICAgIHdoZW4obURyYWdEb3duSGVscGVyLmlzRHJhZ2dpbmdEb3duKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgIE1vdGlvbkV2ZW50IGV2ID0gTW90aW9uRXZlbnQub2J0YWluKG5vdywgbm93LCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsIDAgLyogeCAqLywgMCAvKiB5ICovLAotICAgICAgICAgICAgICAgIDAgLyogbWV0YSAqLyk7Ci0gICAgICAgIG1WaWV3Lm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgIHZlcmlmeShtRHJhZ0Rvd25IZWxwZXIpLm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgIGV2LnJlY3ljbGUoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmNlcHRUb3VjaFdoZW5TaG93aW5nQWx0QXV0aCgpIHsKLSAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCk7Ci0KLSAgICAgICAgLy8gV0hFTiBzaG93aW5nIGFsdCBhdXRoLCBub3QgZG96aW5nLCBkcmFnIGRvd24gaGVscGVyIGRvZXNuJ3Qgd2FudCB0byBpbnRlcmNlcHQKLSAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1VZGZwc092ZXJsYXlJbnRlcmFjdG9yLmNhbkludGVyY2VwdFRvdWNoSW5VZGZwc0JvdW5kcyhhbnkoKSkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyYWdEb3duSGVscGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOwotCi0gICAgICAgIC8vIFRIRU4gd2Ugc2hvdWxkIGludGVyY2VwdCB0b3VjaAotICAgICAgICBhc3NlcnRUcnVlKG1JbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5zaG91bGRJbnRlcmNlcHRUb3VjaEV2ZW50KG1vY2soTW90aW9uRXZlbnQuY2xhc3MpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9JbnRlcmNlcHRUb3VjaCgpIHsKLSAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCk7Ci0KLSAgICAgICAgLy8gV0hFTiBub3Qgc2hvd2luZyBhbHQgYXV0aCwgbm90IGRvemluZywgZHJhZyBkb3duIGhlbHBlciBkb2Vzbid0IHdhbnQgdG8gaW50ZXJjZXB0Ci0gICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RvemluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyYWdEb3duSGVscGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOwotCi0gICAgICAgIC8vIFRIRU4gd2Ugc2hvdWxkbid0IGludGVyY2VwdCB0b3VjaAotICAgICAgICBhc3NlcnRGYWxzZShtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuc2hvdWxkSW50ZXJjZXB0VG91Y2hFdmVudChtb2NrKE1vdGlvbkV2ZW50LmNsYXNzKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZVRvdWNoRXZlbnRXaGVuU2hvd2luZ0FsdEF1dGgoKSB7Ci0gICAgICAgIGNhcHR1cmVJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcigpOwotCi0gICAgICAgIC8vIFdIRU4gc2hvd2luZyBhbHQgYXV0aCwgbm90IGRvemluZywgZHJhZyBkb3duIGhlbHBlciBkb2Vzbid0IHdhbnQgdG8gaW50ZXJjZXB0Ci0gICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RvemluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSk7Ci0KLSAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGQgaGFuZGxlIHRoZSB0b3VjaAotICAgICAgICBhc3NlcnRUcnVlKG1JbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVUb3VjaEV2ZW50KG1vY2soTW90aW9uRXZlbnQuY2xhc3MpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhcHR1cmVJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcigpIHsKLSAgICAgICAgdmVyaWZ5KG1WaWV3KS5zZXRJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcihtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXJDYXB0b3IuY2FwdHVyZSgpKTsKLSAgICAgICAgbUludGVyYWN0aW9uRXZlbnRIYW5kbGVyID0gbUludGVyYWN0aW9uRXZlbnRIYW5kbGVyQ2FwdG9yLmdldFZhbHVlKCk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGY0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdC5rdApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYWRlCisKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrCitpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyCitpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLlRlc3RhYmxlTG9vcGVyLlJ1bldpdGhMb29wZXIKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLkxvY2tJY29uVmlld0NvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5kYWdnZXIuS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5iaW9tZXRyaWNzLmRvbWFpbi5pbnRlcmFjdG9yLlVkZnBzT3ZlcmxheUludGVyYWN0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3JGYWtlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZG9jay5Eb2NrTWFuYWdlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZha2VGZWF0dXJlRmxhZ3MKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GbGFncworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLktleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLkFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuZG9tYWluLmludGVyYWN0b3IuS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLnZpZXdtb2RlbC5LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC51aS52aWV3bW9kZWwuUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlbW90ZXByb3h5Lk11bHRpU2hhZGVJbnB1dFByb3h5CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlcG9zaXRvcnkuTXVsdGlTaGFkZVJlcG9zaXRvcnkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2hhZGUuTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3LkludGVyYWN0aW9uRXZlbnRIYW5kbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkRyYWdEb3duSGVscGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLk5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uU2hhZGVEZXB0aENvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN5c3VpU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5zdGFjay5BbWJpZW50U3RhdGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnN0YWNrLk5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5zdGFjay5Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuQ2VudHJhbFN1cmZhY2VzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLlN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIud2luZG93LlN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by5hbnkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ubW9jaworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by53aGVuZXZlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5GYWtlU3lzdGVtQ2xvY2sKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5lbXB0eUZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5UZXN0U2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5ydW5UZXN0CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3IKK2ltcG9ydCBvcmcubW9ja2l0by5DYXB0b3IKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHkKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeQoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9ucworCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lcjo6Y2xhc3MpCitAUnVuV2l0aExvb3BlcihzZXRBc01haW5Mb29wZXIgPSB0cnVlKQorQFNtYWxsVGVzdAorY2xhc3MgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdCA6IFN5c3VpVGVzdENhc2UoKSB7CisKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBkcmFnRG93bkhlbHBlcjogRHJhZ0Rvd25IZWxwZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI6IFN5c3VpU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgc2hhZGVDb250cm9sbGVyOiBTaGFkZUNvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBjZW50cmFsU3VyZmFjZXM6IENlbnRyYWxTdXJmYWNlcworICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGRvY2tNYW5hZ2VyOiBEb2NrTWFuYWdlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXI6IE5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBub3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dDogTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBub3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlcjogTm90aWZpY2F0aW9uU2hhZGVEZXB0aENvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBub3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXI6IE5vdGlmaWNhdGlvblNoYWRlV2luZG93Q29udHJvbGxlcgorICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyOgorICAgICAgICBOb3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBzdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyOiBTdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyOiBTdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIKKyAgICBATW9jaworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyOiBMb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGxvY2tJY29uVmlld0NvbnRyb2xsZXI6IExvY2tJY29uVmlld0NvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBrZXlndWFyZFVubG9ja0FuaW1hdGlvbkNvbnRyb2xsZXI6IEtleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGFtYmllbnRTdGF0ZTogQW1iaWVudFN0YXRlCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgcHVsc2luZ0dlc3R1cmVMaXN0ZW5lcjogUHVsc2luZ0dlc3R1cmVMaXN0ZW5lcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGtleWd1YXJkQm91bmNlclZpZXdNb2RlbDogS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIga2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50RmFjdG9yeTogS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50LkZhY3RvcnkKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBrZXlndWFyZEJvdW5jZXJDb21wb25lbnQ6IEtleWd1YXJkQm91bmNlckNvbXBvbmVudAorICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIga2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXI6IEtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcjogTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOiBBbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3I6IEtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IKKyAgICBATW9jaworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbDoKKyAgICAgICAgUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsCisgICAgQENhcHRvcgorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGludGVyYWN0aW9uRXZlbnRIYW5kbGVyQ2FwdG9yOiBBcmd1bWVudENhcHRvcjxJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcj4KKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciB1ZGZwc092ZXJsYXlJbnRlcmFjdG9yOiBVZGZwc092ZXJsYXlJbnRlcmFjdG9yCisKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciB1bmRlclRlc3Q6IE5vdGlmaWNhdGlvblNoYWRlV2luZG93VmlldworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGNvbnRyb2xsZXI6IE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlcjogSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciB0ZXN0U2NvcGU6IFRlc3RTY29wZQorCisgICAgQEJlZm9yZQorICAgIGZ1biBzZXRVcCgpIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKQorICAgICAgICB1bmRlclRlc3QgPSBzcHkoTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3KGNvbnRleHQsIG51bGwpKQorICAgICAgICB3aGVuZXZlcigKKyAgICAgICAgICAgICAgICB1bmRlclRlc3QuZmluZFZpZXdCeUlkPE5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0PigKKyAgICAgICAgICAgICAgICAgICAgUi5pZC5ub3RpZmljYXRpb25fc3RhY2tfc2Nyb2xsZXIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgICAudGhlblJldHVybihub3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dCkKKyAgICAgICAgd2hlbmV2ZXIodW5kZXJUZXN0LmZpbmRWaWV3QnlJZDxGcmFtZUxheW91dD4oUi5pZC5rZXlndWFyZF9ib3VuY2VyX2NvbnRhaW5lcikpCisgICAgICAgICAgICAudGhlblJldHVybihtb2NrKCkpCisgICAgICAgIHdoZW5ldmVyKGtleWd1YXJkQm91bmNlckNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueSgpKSkudGhlblJldHVybihrZXlndWFyZEJvdW5jZXJDb21wb25lbnQpCisgICAgICAgIHdoZW5ldmVyKGtleWd1YXJkQm91bmNlckNvbXBvbmVudC5zZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIpCisgICAgICAgICAgICAudGhlblJldHVybihrZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcikKKyAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICBtRGVwZW5kZW5jeS5pbmplY3RUZXN0RGVwZW5kZW5jeShTaGFkZUNvbnRyb2xsZXI6OmNsYXNzLmphdmEsIHNoYWRlQ29udHJvbGxlcikKKyAgICAgICAgd2hlbmV2ZXIoZG9ja01hbmFnZXIuaXNEb2NrZWQpLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgICAgIHdoZW5ldmVyKGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IubG9ja3NjcmVlblRvRHJlYW1pbmdUcmFuc2l0aW9uKQorICAgICAgICAgICAgLnRoZW5SZXR1cm4oZW1wdHlGbG93KCkpCisKKyAgICAgICAgdmFsIGZlYXR1cmVGbGFncyA9IEZha2VGZWF0dXJlRmxhZ3MoKQorICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0KEZsYWdzLlRSQUNLUEFEX0dFU1RVUkVfQkFDSywgZmFsc2UpCisgICAgICAgIGZlYXR1cmVGbGFncy5zZXQoRmxhZ3MuRFVBTF9TSEFERSwgZmFsc2UpCisgICAgICAgIHZhbCBpbnB1dFByb3h5ID0gTXVsdGlTaGFkZUlucHV0UHJveHkoKQorICAgICAgICB0ZXN0U2NvcGUgPSBUZXN0U2NvcGUoKQorICAgICAgICBjb250cm9sbGVyID0KKyAgICAgICAgICAgIE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgbG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgRmFsc2luZ0NvbGxlY3RvckZha2UoKSwKKyAgICAgICAgICAgICAgICBzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgZG9ja01hbmFnZXIsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2hhZGVEZXB0aENvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgdW5kZXJUZXN0LAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXIoKSwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgc3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlciwKKyAgICAgICAgICAgICAgICBzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgbG9ja0ljb25WaWV3Q29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBjZW50cmFsU3VyZmFjZXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIGtleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIGFtYmllbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICBwdWxzaW5nR2VzdHVyZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgIGtleWd1YXJkQm91bmNlclZpZXdNb2RlbCwKKyAgICAgICAgICAgICAgICBrZXlndWFyZEJvdW5jZXJDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgIGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLAorICAgICAgICAgICAgICAgIHVkZnBzT3ZlcmxheUludGVyYWN0b3IsCisgICAgICAgICAgICAgICAga2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvciwKKyAgICAgICAgICAgICAgICBwcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwsCisgICAgICAgICAgICAgICAgZmVhdHVyZUZsYWdzLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlTaGFkZUludGVyYWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvblNjb3BlID0gdGVzdFNjb3BlLmJhY2tncm91bmRTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpU2hhZGVSZXBvc2l0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEZha2VTeXN0ZW1DbG9jaygpLAorICAgICAgICAgICAgKQorCisgICAgICAgIGNvbnRyb2xsZXIuc2V0dXBFeHBhbmRlZFN0YXR1c0JhcigpCisgICAgICAgIGNvbnRyb2xsZXIuc2V0RHJhZ0Rvd25IZWxwZXIoZHJhZ0Rvd25IZWxwZXIpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gdGVzdERyYWdEb3duSGVscGVyQ2FsbGVkV2hlbkRyYWdnaW5nRG93bigpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgd2hlbmV2ZXIoZHJhZ0Rvd25IZWxwZXIuaXNEcmFnZ2luZ0Rvd24pLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHZhbCBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKQorICAgICAgICAgICAgdmFsIGV2ID0gTW90aW9uRXZlbnQub2J0YWluKG5vdywgbm93LCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsIDBmLCAwZiwgMCAvKiBtZXRhICovKQorICAgICAgICAgICAgdW5kZXJUZXN0Lm9uVG91Y2hFdmVudChldikKKyAgICAgICAgICAgIHZlcmlmeShkcmFnRG93bkhlbHBlcikub25Ub3VjaEV2ZW50KGV2KQorICAgICAgICAgICAgZXYucmVjeWNsZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RJbnRlcmNlcHRUb3VjaFdoZW5TaG93aW5nQWx0QXV0aCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCkKKworICAgICAgICAgICAgLy8gV0hFTiBzaG93aW5nIGFsdCBhdXRoLCBub3QgZG96aW5nLCBkcmFnIGRvd24gaGVscGVyIGRvZXNuJ3Qgd2FudCB0byBpbnRlcmNlcHQKKyAgICAgICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RvemluZykudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHVkZnBzT3ZlcmxheUludGVyYWN0b3IuY2FuSW50ZXJjZXB0VG91Y2hJblVkZnBzQm91bmRzKGFueSgpKSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgd2hlbmV2ZXIoZHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSkKKworICAgICAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGQgaW50ZXJjZXB0IHRvdWNoCisgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLnNob3VsZEludGVyY2VwdFRvdWNoRXZlbnQobW9jaygpKSkuaXNUcnVlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gdGVzdE5vSW50ZXJjZXB0VG91Y2goKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIGNhcHR1cmVJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcigpCisKKyAgICAgICAgICAgIC8vIFdIRU4gbm90IHNob3dpbmcgYWx0IGF1dGgsIG5vdCBkb3ppbmcsIGRyYWcgZG93biBoZWxwZXIgZG9lc24ndCB3YW50IHRvIGludGVyY2VwdAorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICAgICAgd2hlbmV2ZXIoYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKGRyYWdEb3duSGVscGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpCisKKyAgICAgICAgICAgIC8vIFRIRU4gd2Ugc2hvdWxkbid0IGludGVyY2VwdCB0b3VjaAorICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5zaG91bGRJbnRlcmNlcHRUb3VjaEV2ZW50KG1vY2soKSkpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0SGFuZGxlVG91Y2hFdmVudFdoZW5TaG93aW5nQWx0QXV0aCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCkKKworICAgICAgICAgICAgLy8gV0hFTiBzaG93aW5nIGFsdCBhdXRoLCBub3QgZG96aW5nLCBkcmFnIGRvd24gaGVscGVyIGRvZXNuJ3Qgd2FudCB0byBpbnRlcmNlcHQKKyAgICAgICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RvemluZykudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKGRyYWdEb3duSGVscGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpCisKKyAgICAgICAgICAgIC8vIFRIRU4gd2Ugc2hvdWxkIGhhbmRsZSB0aGUgdG91Y2gKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlVG91Y2hFdmVudChtb2NrKCkpKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBwcml2YXRlIGZ1biBjYXB0dXJlSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoKSB7CisgICAgICAgIHZlcmlmeSh1bmRlclRlc3QpLnNldEludGVyYWN0aW9uRXZlbnRIYW5kbGVyKGludGVyYWN0aW9uRXZlbnRIYW5kbGVyQ2FwdG9yLmNhcHR1cmUoKSkKKyAgICAgICAgaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlckNhcHRvci52YWx1ZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zbWFydHNwYWNlL0RyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKaW5kZXggYTI4MDUxMC4uNThiNDRhZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXIKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLnNtYXJ0c3BhY2UuRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlcgpAQCAtNDYsNiArNDcsNyBAQAogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8KIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeQogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYHdoZW5gCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlJbnQKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnMKIGltcG9ydCBvcmcubW9ja2l0by5TcHkKIApAQCAtNjksMTIgKzcxLDIxIEBACiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdmlld0NvbXBvbmVudDogU21hcnRzcGFjZVZpZXdDb21wb25lbnQKIAogICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgd2VhdGhlclZpZXdDb21wb25lbnQ6IFNtYXJ0c3BhY2VWaWV3Q29tcG9uZW50CisKKyAgICBAU3B5CisgICAgcHJpdmF0ZSB2YXIgd2VhdGhlclNtYXJ0c3BhY2VWaWV3OiBTbWFydHNwYWNlVmlldyA9IFRlc3RWaWV3KGNvbnRleHQpCisKKyAgICBATW9jawogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRhcmdldEZpbHRlcjogU21hcnRzcGFjZVRhcmdldEZpbHRlcgogCiAgICAgQE1vY2sKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4KIAogICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgd2VhdGhlclBsdWdpbjogQmNTbWFydHNwYWNlRGF0YVBsdWdpbgorCisgICAgQE1vY2sKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBwcmVjb25kaXRpb246IFNtYXJ0c3BhY2VQcmVjb25kaXRpb24KIAogICAgIEBTcHkKQEAgLTg4LDYgKzk5LDkgQEAKIAogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGNvbnRyb2xsZXI6IERyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIKIAorICAgIC8vIFRPRE8oYi8yNzI4MTEyODApOiBSZW1vdmUgdXNhZ2Ugb2YgcmVhbCB2aWV3CisgICAgcHJpdmF0ZSB2YWwgZmFrZVBhcmVudCA9IEZyYW1lTGF5b3V0KGNvbnRleHQpCisKICAgICAvKioKICAgICAgKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgU21hcnRzcGFjZVZpZXcgYW5kIGV4dGVuZHMgVmlldy4gVGhpcyBpcyBtb2NrZWQgdG8gcHJvdmlkZSB0aGUgcmlnaHQKICAgICAgKiBvYmplY3QgaW5oZXJpdGFuY2UgYW5kIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIERyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIKQEAgLTEyMSwxMyArMTM1LDE3IEBACiAgICAgQEJlZm9yZQogICAgIGZ1biBzZXR1cCgpIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKQotICAgICAgICBgd2hlbmAodmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueSgpLCBlcShwbHVnaW4pLCBhbnkoKSkpCisgICAgICAgIGB3aGVuYCh2aWV3Q29tcG9uZW50RmFjdG9yeS5jcmVhdGUoYW55KCksIGVxKHBsdWdpbiksIGFueSgpLCBlcShudWxsKSkpCiAgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odmlld0NvbXBvbmVudCkKICAgICAgICAgYHdoZW5gKHZpZXdDb21wb25lbnQuZ2V0VmlldygpKS50aGVuUmV0dXJuKHNtYXJ0c3BhY2VWaWV3KQorICAgICAgICBgd2hlbmAodmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueSgpLCBlcSh3ZWF0aGVyUGx1Z2luKSwgYW55KCksIGFueSgpKSkKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKHdlYXRoZXJWaWV3Q29tcG9uZW50KQorICAgICAgICBgd2hlbmAod2VhdGhlclZpZXdDb21wb25lbnQuZ2V0VmlldygpKS50aGVuUmV0dXJuKHdlYXRoZXJTbWFydHNwYWNlVmlldykKICAgICAgICAgYHdoZW5gKHNtYXJ0c3BhY2VNYW5hZ2VyLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKGFueSgpKSkudGhlblJldHVybihzZXNzaW9uKQogCiAgICAgICAgIGNvbnRyb2xsZXIgPSBEcmVhbVNtYXJ0c3BhY2VDb250cm9sbGVyKGNvbnRleHQsIHNtYXJ0c3BhY2VNYW5hZ2VyLCBleGVjdXRpb24sIHVpRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgdmlld0NvbXBvbmVudEZhY3RvcnksIHByZWNvbmRpdGlvbiwgT3B0aW9uYWwub2YodGFyZ2V0RmlsdGVyKSwgT3B0aW9uYWwub2YocGx1Z2luKSkKKyAgICAgICAgICAgICAgICB2aWV3Q29tcG9uZW50RmFjdG9yeSwgcHJlY29uZGl0aW9uLCBPcHRpb25hbC5vZih0YXJnZXRGaWx0ZXIpLCBPcHRpb25hbC5vZihwbHVnaW4pLAorICAgICAgICBPcHRpb25hbC5vZih3ZWF0aGVyUGx1Z2luKSkKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCwxMSArMTg2LDExIEBACiAgICAgICAgIGB3aGVuYChwcmVjb25kaXRpb24uY29uZGl0aW9uc01ldCgpKS50aGVuUmV0dXJuKHRydWUpCiAgICAgICAgIGNvbnRyb2xsZXIuYnVpbGRBbmRDb25uZWN0VmlldyhNb2NraXRvLm1vY2soVmlld0dyb3VwOjpjbGFzcy5qYXZhKSkKIAotICAgICAgICB2YXIgc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHdpdGhBcmdDYXB0b3I8Vmlldy5PbkF0dGFjaFN0YXRlQ2hhbmdlTGlzdGVuZXI+IHsKLSAgICAgICAgICAgIHZlcmlmeSh2aWV3Q29tcG9uZW50RmFjdG9yeSkuY3JlYXRlKGFueSgpLCBlcShwbHVnaW4pLCBjYXB0dXJlKCkpCisgICAgICAgIHZhbCBzdGF0ZUNoYW5nZUxpc3RlbmVyID0gd2l0aEFyZ0NhcHRvcjxWaWV3Lk9uQXR0YWNoU3RhdGVDaGFuZ2VMaXN0ZW5lcj4geworICAgICAgICAgICAgdmVyaWZ5KHZpZXdDb21wb25lbnRGYWN0b3J5KS5jcmVhdGUoYW55KCksIGVxKHBsdWdpbiksIGNhcHR1cmUoKSwgZXEobnVsbCkpCiAgICAgICAgIH0KIAotICAgICAgICB2YXIgbW9ja1ZpZXcgPSBNb2NraXRvLm1vY2soVGVzdFZpZXc6OmNsYXNzLmphdmEpCisgICAgICAgIHZhbCBtb2NrVmlldyA9IE1vY2tpdG8ubW9jayhUZXN0Vmlldzo6Y2xhc3MuamF2YSkKICAgICAgICAgYHdoZW5gKHByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpLnRoZW5SZXR1cm4odHJ1ZSkKICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZW5lci5vblZpZXdBdHRhY2hlZFRvV2luZG93KG1vY2tWaWV3KQogCkBAIC0xODMsNCArMjAxLDc0IEBACiAKICAgICAgICAgdmVyaWZ5KHNlc3Npb24pLmNsb3NlKCkKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHNlc3Npb24gaXMgY3JlYXRlZCB3aGVuIHdlYXRoZXIgc21hcnRzcGFjZSB2aWV3IGlzIGNyZWF0ZWQgYW5kIGF0dGFjaGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3RDb25uZWN0T25XZWF0aGVyVmlld0NyZWF0ZSgpIHsKKyAgICAgICAgYHdoZW5gKHByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpLnRoZW5SZXR1cm4odHJ1ZSkKKworICAgICAgICB2YWwgY3VzdG9tVmlldyA9IE1vY2tpdG8ubW9jayhUZXN0Vmlldzo6Y2xhc3MuamF2YSkKKyAgICAgICAgdmFsIHdlYXRoZXJWaWV3ID0gY29udHJvbGxlci5idWlsZEFuZENvbm5lY3RXZWF0aGVyVmlldyhmYWtlUGFyZW50LCBjdXN0b21WaWV3KQorICAgICAgICB2YWwgd2VhdGhlclNtYXJ0c3BhY2VWaWV3ID0gd2VhdGhlclZpZXcgYXMgU21hcnRzcGFjZVZpZXcKKyAgICAgICAgZmFrZVBhcmVudC5hZGRWaWV3KHdlYXRoZXJWaWV3KQorCisgICAgICAgIC8vIFRoZW4gd2VhdGhlciB2aWV3IGlzIGNyZWF0ZWQgd2l0aCBjdXN0b20gdmlldyBhbmQgdGhlIGRlZmF1bHQgd2VhdGhlclBsdWdpbi5nZXRWaWV3CisgICAgICAgIC8vIHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICAgIHZlcmlmeSh2aWV3Q29tcG9uZW50RmFjdG9yeSkuY3JlYXRlKGVxKGZha2VQYXJlbnQpLCBlcSh3ZWF0aGVyUGx1Z2luKSwgYW55KCksCisgICAgICAgICAgICBlcShjdXN0b21WaWV3KSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4sIE1vY2tpdG8ubmV2ZXIoKSkuZ2V0VmlldyhmYWtlUGFyZW50KQorCisgICAgICAgIC8vIEFuZCB0aGVuIHNlc3Npb24gaXMgY3JlYXRlZAorICAgICAgICBjb250cm9sbGVyLnN0YXRlQ2hhbmdlTGlzdGVuZXIub25WaWV3QXR0YWNoZWRUb1dpbmRvdyh3ZWF0aGVyVmlldykKKyAgICAgICAgdmVyaWZ5KHNtYXJ0c3BhY2VNYW5hZ2VyKS5jcmVhdGVTbWFydHNwYWNlU2Vzc2lvbihhbnkoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJTbWFydHNwYWNlVmlldykuc2V0UHJpbWFyeVRleHRDb2xvcihhbnlJbnQoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJTbWFydHNwYWNlVmlldykuc2V0RG96ZUFtb3VudCgwZikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHdlYXRoZXIgcGx1Z2luIHJlZ2lzdGVycyB0YXJnZXQgbGlzdGVuZXIgd2hlbiBpdCBpcyBhZGRlZCBmcm9tIHRoZSBjb250cm9sbGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3RBZGRMaXN0ZW5lckluQ29udHJvbGxlcl9yZWdpc3RlcnNMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4oKSB7CisgICAgICAgIHZhbCBjdXN0b21WaWV3ID0gTW9ja2l0by5tb2NrKFRlc3RWaWV3OjpjbGFzcy5qYXZhKQorICAgICAgICBgd2hlbmAocHJlY29uZGl0aW9uLmNvbmRpdGlvbnNNZXQoKSkudGhlblJldHVybih0cnVlKQorCisgICAgICAgIC8vIEdpdmVuIGEgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgICAgIHZhbCB3ZWF0aGVyVmlldyA9IGNvbnRyb2xsZXIuYnVpbGRBbmRDb25uZWN0V2VhdGhlclZpZXcoZmFrZVBhcmVudCwgY3VzdG9tVmlldykKKyAgICAgICAgY29udHJvbGxlci5zdGF0ZUNoYW5nZUxpc3RlbmVyLm9uVmlld0F0dGFjaGVkVG9XaW5kb3cod2VhdGhlclZpZXcpCisgICAgICAgIHZlcmlmeShzbWFydHNwYWNlTWFuYWdlcikuY3JlYXRlU21hcnRzcGFjZVNlc3Npb24oYW55KCkpCisKKyAgICAgICAgLy8gV2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCisgICAgICAgIGNvbnRyb2xsZXIuYWRkTGlzdGVuZXJGb3JXZWF0aGVyUGx1Z2luKGxpc3RlbmVyKQorCisgICAgICAgIC8vIFRoZW4gdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIHdlYXRoZXIgcGx1Z2luIG9ubHkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpCisgICAgICAgIHZlcmlmeShwbHVnaW4sIE1vY2tpdG8ubmV2ZXIoKSkucmVnaXN0ZXJMaXN0ZW5lcihhbnkoKSkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHNlc3Npb24gaXMgY2xvc2VkIGFuZCB3ZWF0aGVyIHBsdWdpbiB1bnJlZ2lzdGVycyB0aGUgbm90aWZpZXIgd2hlbiB3ZWF0aGVyIHNtYXJ0c3BhY2UKKyAgICAgKiB2aWV3IGlzIGRldGFjaGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3REaXNjb25uZWN0X2VtaXRzRW1wdHlMaXN0QW5kUmVtb3Zlc05vdGlmaWVyKCkgeworICAgICAgICBgd2hlbmAocHJlY29uZGl0aW9uLmNvbmRpdGlvbnNNZXQoKSkudGhlblJldHVybih0cnVlKQorCisgICAgICAgIC8vIEdpdmVuIGEgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgICAgIHZhbCBjdXN0b21WaWV3ID0gTW9ja2l0by5tb2NrKFRlc3RWaWV3OjpjbGFzcy5qYXZhKQorICAgICAgICB2YWwgd2VhdGhlclZpZXcgPSBjb250cm9sbGVyLmJ1aWxkQW5kQ29ubmVjdFdlYXRoZXJWaWV3KGZha2VQYXJlbnQsIGN1c3RvbVZpZXcpCisgICAgICAgIGNvbnRyb2xsZXIuc3RhdGVDaGFuZ2VMaXN0ZW5lci5vblZpZXdBdHRhY2hlZFRvV2luZG93KHdlYXRoZXJWaWV3KQorICAgICAgICB2ZXJpZnkoc21hcnRzcGFjZU1hbmFnZXIpLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKGFueSgpKQorCisgICAgICAgIC8vIFdoZW4gdmlldyBpcyBkZXRhY2hlZAorICAgICAgICBjb250cm9sbGVyLnN0YXRlQ2hhbmdlTGlzdGVuZXIub25WaWV3RGV0YWNoZWRGcm9tV2luZG93KHdlYXRoZXJWaWV3KQorICAgICAgICAvLyBUaGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZAorICAgICAgICB2ZXJpZnkoc2Vzc2lvbikuY2xvc2UoKQorCisgICAgICAgIC8vIEFuZCB0aGUgbGlzdGVuZXIgcmVjZWl2ZXMgYW4gZW1wdHkgbGlzdCBvZiB0YXJnZXRzIGFuZCB1bnJlZ2lzdGVycyB0aGUgbm90aWZpZXIKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLm9uVGFyZ2V0c0F2YWlsYWJsZShlbXB0eUxpc3QoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIobnVsbCkKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TWFuYWdlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDUxNzA2NzguLmNlZDA3MzQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHVtcC5EdW1wTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5Ob3RpZlBpcGVsaW5lRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLk5vdGlmaWNhdGlvbkVudHJ5OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeUJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLnJlbmRlci5Ob3RpZmljYXRpb25WaXNpYmlsaXR5UHJvdmlkZXI7CkBAIC00MSw2ICs0Miw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLkNlbnRyYWxTdXJmYWNlczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlJlbW90ZUlucHV0VXJpQ29udHJvbGxlcjsKIAoraW1wb3J0IGRhZ2dlci5MYXp5OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC00OSw4ICs1Miw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKLWltcG9ydCBkYWdnZXIuTGF6eTsKLQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZFRlc3RpbmdSdW5uZXIuY2xhc3MpCiBAVGVzdGFibGVMb29wZXIuUnVuV2l0aExvb3BlcgpAQCAtODQsNiArODUsNyBAQAogICAgICAgICAgICAgICAgICgpIC0+IE9wdGlvbmFsLm9mKG1vY2soQ2VudHJhbFN1cmZhY2VzLmNsYXNzKSksCiAgICAgICAgICAgICAgICAgbVN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICBtUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIG1vY2soUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtQ2xpY2tOb3RpZmllciwKICAgICAgICAgICAgICAgICBtb2NrKEFjdGlvbkNsaWNrTG9nZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtb2NrKER1bXBNYW5hZ2VyLmNsYXNzKSk7CkBAIC0xNDEsNiArMTQzLDcgQEAKICAgICAgICAgICAgICAgICBMYXp5PE9wdGlvbmFsPENlbnRyYWxTdXJmYWNlcz4+IGNlbnRyYWxTdXJmYWNlc09wdGlvbmFsTGF6eSwKICAgICAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgICAgIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyIHJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciwKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGlja05vdGlmaWVyIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICAgICAgQWN0aW9uQ2xpY2tMb2dnZXIgYWN0aW9uQ2xpY2tMb2dnZXIsCiAgICAgICAgICAgICAgICAgRHVtcE1hbmFnZXIgZHVtcE1hbmFnZXIpIHsKQEAgLTE1Myw2ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjZW50cmFsU3VyZmFjZXNPcHRpb25hbExhenksCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgcmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIsCiAgICAgICAgICAgICAgICAgICAgIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNsaWNrTG9nZ2VyLAogICAgICAgICAgICAgICAgICAgICBkdW1wTWFuYWdlcik7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXJJbXBsVGVzdC5rdAppbmRleCBlNmYyNzJiLi4zMzI3ZTQyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGxUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbFRlc3Qua3QKQEAgLTE2Nyw0ICsxNjcsMTMgQEAKICAgICAgICAgY29udHJvbGxlci5zZXRJc0RyZWFtaW5nKGZhbHNlKQogICAgICAgICB2ZXJpZnkobGlzdGVuZXIpLm9uRHJlYW1pbmdDaGFuZ2VkKGZhbHNlKQogICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RTZXREcmVhbVN0YXRlX2dldHRlclJldHVybnNDdXJyZW50U3RhdGUoKSB7CisgICAgICAgIGNvbnRyb2xsZXIuc2V0SXNEcmVhbWluZyh0cnVlKQorICAgICAgICBhc3NlcnRUcnVlKGNvbnRyb2xsZXIuaXNEcmVhbWluZygpKQorCisgICAgICAgIGNvbnRyb2xsZXIuc2V0SXNEcmVhbWluZyhmYWxzZSkKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29udHJvbGxlci5pc0RyZWFtaW5nKCkpCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhCmluZGV4IDhhY2Y1MDcuLjY1M2IwYzcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbFRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGxUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmRyZWFtcy5JRHJlYW1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdGluZy5BbmRyb2lkVGVzdGluZ1J1bm5lcjsKIAogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CkBAIC05NCw4ICs5Myw2IEBACiAgICAgQE1vY2sKICAgICBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKICAgICBATW9jawotICAgIElEcmVhbU1hbmFnZXIgbURyZWFtTWFuYWdlcjsKLSAgICBATW9jawogICAgIEFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiBtQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uOwogICAgIEBNb2NrCiAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CkBAIC0xMzMsNyArMTMwLDYgQEAKICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRHJlYW1NYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5Q29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCkBAIC0xNTcsNyArMTUzLDcgQEAKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKGFueSgpKSkudGhlblJldHVybihmYWxzZSk7CiAKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgfQogCkBAIC0zNTksNyArMzU1LDcgQEAKIAogICAgICAgICAvLyBBbHNvIG5vdCBpbiB1c2UgaWYgc2NyZWVuIGlzIG9uIGJ1dCB3ZSdyZSBzaG93aW5nIHNjcmVlbiBzYXZlciAvICJkcmVhbWluZyIKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzRGV2aWNlSWRsZU1vZGUoKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLnNob3VsZEhlYWRzVXAoZW50cnkpKS5pc0ZhbHNlKCk7CiAgICAgfQogCkBAIC01MzksNyArNTM1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkTm90RnVsbFNjcmVlbl9ub3RQZW5kaW5nSW50ZW50KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNTU4LDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgLnNldFN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKFNVUFBSRVNTRURfRUZGRUNUX0ZVTExfU0NSRUVOX0lOVEVOVCkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNTc3LDcgKzU3Myw3IEBACiAgICAgICAgICAgICAgICAgLnNldFN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKFNVUFBSRVNTRURfRUZGRUNUX0ZVTExfU0NSRUVOX0lOVEVOVCkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNTk5LDcgKzU5NSw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZE5vdEZ1bGxTY3JlZW5fbm90SGlnaEltcG9ydGFuY2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ERUZBVUxULCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNjIxLDcgKzYxNyw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZE5vdEZ1bGxTY3JlZW5faXNHcm91cEFsZXJ0U2lsZW5jZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyB0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKEtFWUdVQVJEKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5KSkKQEAgLTY1MSw3ICs2NDcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGdWxsU2NyZWVuX25vdEludGVyYWN0aXZlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCkBAIC02NzMsNyArNjY5LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkRnVsbFNjcmVlbl9pc0RyZWFtaW5nKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKHRydWUpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCkBAIC02OTUsNyArNjkxLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkRnVsbFNjcmVlbl9vbktleWd1YXJkKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKEtFWUdVQVJEKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5KSkKQEAgLTcxOCw3ICs3MTQsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCkBAIC03MzUsNyArNzMxLDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoImEiKSkudGhlblJldHVybih0cnVlKTsKIApAQCAtNzU0LDcgKzc1MCw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKCJhIikpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpOwpAQCAtNzc1LDcgKzc3MSw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKCJhIikpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpOwpAQCAtODAwLDcgKzc5Niw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFX0xPQ0tFRCk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZCgiYSIpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1LZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKTsKQEAgLTgyMSw3ICs4MTcsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERV9MT0NLRUQpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoImEiKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CkBAIC04NDYsNyArODQyLDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoImEiKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwpAQCAtODkyLDcgKzg4OCw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKCJhIikpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbFRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbFRlc3QuamF2YQppbmRleCAwMzFjMTdmLi43ZGIyMTk3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL0NlbnRyYWxTdXJmYWNlc0ltcGxUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9DZW50cmFsU3VyZmFjZXNJbXBsVGVzdC5qYXZhCkBAIC0zNDcsNyArMzQ3LDYgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBUZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlciwKQEAgLTczMCw3ICs3MjksNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRIZWFkc1VwX25vblN1cHByZXNzZWRHcm91cFN1bW1hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKGFueVN0cmluZygpKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKIAogICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihnZXRDb250ZXh0KCksICJhIikKICAgICAgICAgICAgICAgICAuc2V0R3JvdXAoImEiKQpAQCAtNzUzLDcgKzc1Miw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEhlYWRzVXBfc3VwcHJlc3NlZEdyb3VwU3VtbWFyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogCiAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKGdldENvbnRleHQoKSwgImEiKQogICAgICAgICAgICAgICAgIC5zZXRHcm91cCgiYSIpCkBAIC03NzYsNyArNzc1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkSGVhZHNVcF9zdXBwcmVzc2VkSGVhZHNVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogCiAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKGdldENvbnRleHQoKSwgImEiKS5idWlsZCgpOwogCkBAIC03OTcsNyArNzk2LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkSGVhZHNVcF9ub1N1cHByZXNzZWRIZWFkc1VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZChhbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAKICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIoZ2V0Q29udGV4dCgpLCAiYSIpLmJ1aWxkKCk7CiAKQEAgLTE0MDAsNyArMTM5OSw2IEBACiAgICAgICAgIFRlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwoCiAgICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciwKICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgICAgIElEcmVhbU1hbmFnZXIgZHJlYW1NYW5hZ2VyLAogICAgICAgICAgICAgICAgIEFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiBhbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIGNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIsCkBAIC0xNDE1LDcgKzE0MTMsNiBAQAogICAgICAgICAgICAgc3VwZXIoCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKICAgICAgICAgICAgICAgICAgICAgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgIGFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgYmF0dGVyeUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvd21zaGVsbC9CdWJibGVzVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvQnViYmxlc1Rlc3QuamF2YQppbmRleCBlMTg1OTIyLi44ZTM5ODhiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvd21zaGVsbC9CdWJibGVzVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL0J1YmJsZXNUZXN0LmphdmEKQEAgLTI5Myw2ICsyOTMsOCBAQAogCiAgICAgcHJpdmF0ZSBGYWtlRGlzcGxheVRyYWNrZXIgbURpc3BsYXlUcmFja2VyID0gbmV3IEZha2VEaXNwbGF5VHJhY2tlcihtQ29udGV4dCk7CiAKKyAgICBwcml2YXRlIFVzZXJIYW5kbGUgbVVzZXIwOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CkBAIC0zMDEsNiArMzAzLDggQEAKICAgICAgICAgLy8gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRlc3QsIGp1c3QgcnVuIGV2ZXJ5dGhpbmcgc3luY2hyb25vdXNseQogICAgICAgICBTaGVsbEV4ZWN1dG9yIHN5bmNFeGVjdXRvciA9IG5ldyBTeW5jRXhlY3V0b3IoKTsKIAorICAgICAgICBtVXNlcjAgPSBjcmVhdGVVc2VySGFuZGUoLyogdXNlcklkPSAqLyAwKTsKKwogICAgICAgICB3aGVuKG1Db2xvckV4dHJhY3Rvci5nZXROZXV0cmFsQ29sb3JzKCkpLnRoZW5SZXR1cm4obUdyYWRpZW50Q29sb3JzKTsKICAgICAgICAgd2hlbihtTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKSkKICAgICAgICAgICAgICAgICAudGhlblJldHVybihtb2NrKFZpZXdUcmVlT2JzZXJ2ZXIuY2xhc3MpKTsKQEAgLTMzOSw3ICszNDMsNiBAQAogICAgICAgICBUZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsIGludGVycnVwdGlvblN0YXRlUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBUZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9jayhQb3dlck1hbmFnZXIuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9jayhJRHJlYW1NYW5hZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2soQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLmNsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2soU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmNsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2soS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuY2xhc3MpLApAQCAtMTY1MCw3ICsxNjUzLDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNGYWxzZSgpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZUluU3RhY2tXaXRoS2V5KEtFWV9BUFBfQlVCQkxFKSkuaXNOdWxsKCk7CiAKLSAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50KTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOwogCiAgICAgICAgIHZlcmlmeShtQnViYmxlQ29udHJvbGxlcikuaW5mbGF0ZUFuZEFkZChhbnkoQnViYmxlLmNsYXNzKSwgLyogc3VwcHJlc3NGbHlvdXQ9ICovIGVxKHRydWUpLAogICAgICAgICAgICAgICAgIC8qIHNob3dJblNoYWRlPSAqLyBlcShmYWxzZSkpOwpAQCAtMTY2MCwxMyArMTY2MywxMyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd09ySGlkZUFwcEJ1YmJsZV9leHBhbmRJZkNvbGxhcHNlZCgpIHsKLSAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50KTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOwogICAgICAgICBtQnViYmxlQ29udHJvbGxlci51cGRhdGVCdWJibGUobUJ1YmJsZUVudHJ5KTsKICAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuY29sbGFwc2VTdGFjaygpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc0ZhbHNlKCk7CiAKICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIHdoaWxlIGNvbGxhcHNlZCB3aWxsIGV4cGFuZCB0aGUgYXBwIGJ1YmJsZQotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpLmdldEtleSgpKS5pc0VxdWFsVG8oS0VZX0FQUF9CVUJCTEUpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc1RydWUoKTsKQEAgLTE2NzUsMjcgKzE2NzgsNDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNob3dPckhpZGVBcHBCdWJibGVfY29sbGFwc2VJZlNlbGVjdGVkKCkgewotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0U2VsZWN0ZWRCdWJibGUoKS5nZXRLZXkoKSkuaXNFcXVhbFRvKEtFWV9BUFBfQlVCQkxFKTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNUcnVlKCk7CiAKICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIHdoaWxlIHRoZSBhcHAgYnViYmxlIGlzIGV4cGFuZGVkIHNob3VsZCBjb2xsYXBzZSB0aGUgc3RhY2sKLSAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50KTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOwogCiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0U2VsZWN0ZWRCdWJibGUoKS5nZXRLZXkoKSkuaXNFcXVhbFRvKEtFWV9BUFBfQlVCQkxFKTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNGYWxzZSgpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZXMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRCdWJibGVzKCkuZ2V0KDApLmdldFVzZXIoKSkuaXNFcXVhbFRvKG1Vc2VyMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd09ySGlkZUFwcEJ1YmJsZVdpdGhOb25QcmltYXJ5VXNlcl9idWJibGVDb2xsYXBzZWRXaXRoRXhwZWN0ZWRVc2VyKCkgeworICAgICAgICBVc2VySGFuZGxlIHVzZXIxMCA9IGNyZWF0ZVVzZXJIYW5kZSgvKiB1c2VySWQgPSAqLyAxMCk7CisgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCwgdXNlcjEwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpLmdldEtleSgpKS5pc0VxdWFsVG8oS0VZX0FQUF9CVUJCTEUpOworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRCdWJibGVzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7CisgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0QnViYmxlcygpLmdldCgwKS5nZXRVc2VyKCkpLmlzRXF1YWxUbyh1c2VyMTApOworCisgICAgICAgIC8vIENhbGxpbmcgdGhpcyB3aGlsZSB0aGUgYXBwIGJ1YmJsZSBpcyBleHBhbmRlZCBzaG91bGQgY29sbGFwc2UgdGhlIHN0YWNrCisgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCwgdXNlcjEwKTsKKworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldFNlbGVjdGVkQnViYmxlKCkuZ2V0S2V5KCkpLmlzRXF1YWxUbyhLRVlfQVBQX0JVQkJMRSk7CisgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZUNvbnRyb2xsZXIuaXNTdGFja0V4cGFuZGVkKCkpLmlzRmFsc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRCdWJibGVzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7CisgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0QnViYmxlcygpLmdldCgwKS5nZXRVc2VyKCkpLmlzRXF1YWxUbyh1c2VyMTApOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNob3dPckhpZGVBcHBCdWJibGVfc2VsZWN0SWZOb3RTZWxlY3RlZCgpIHsKLSAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50KTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOwogICAgICAgICBtQnViYmxlQ29udHJvbGxlci51cGRhdGVCdWJibGUobUJ1YmJsZUVudHJ5KTsKICAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuZXhwYW5kU3RhY2tBbmRTZWxlY3RCdWJibGUobUJ1YmJsZUVudHJ5KTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpLmdldEtleSgpKS5pc0VxdWFsVG8obUJ1YmJsZUVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNUcnVlKCk7CiAKLSAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50KTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldFNlbGVjdGVkQnViYmxlKCkuZ2V0S2V5KCkpLmlzRXF1YWxUbyhLRVlfQVBQX0JVQkJMRSk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZUNvbnRyb2xsZXIuaXNTdGFja0V4cGFuZGVkKCkpLmlzVHJ1ZSgpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZXMoKS5zaXplKCkpLmlzRXF1YWxUbygyKTsKQEAgLTE4MzAsNiArMTg1MiwxMiBAQAogICAgICAgICBtQnViYmxlQ29udHJvbGxlci5vblVzZXJDaGFuZ2VkKHVzZXJJZCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBVc2VySGFuZGxlIGNyZWF0ZVVzZXJIYW5kZShpbnQgdXNlcklkKSB7CisgICAgICAgIFVzZXJIYW5kbGUgdXNlciA9IG1vY2soVXNlckhhbmRsZS5jbGFzcyk7CisgICAgICAgIHdoZW4odXNlci5nZXRJZGVudGlmaWVyKCkpLnRoZW5SZXR1cm4odXNlcklkKTsKKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBidWJibGUgc3RhY2sgaXMgZXhwYW5kZWQgYW5kIGFsc28gdmFsaWRhdGVzIHRoZSBjYWNoZWQgc3RhdGUgaXMgdXBkYXRlZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL1Rlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL1Rlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwuamF2YQppbmRleCBjZWVlMGJjLi40ZTE0YmJmNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvVGVzdGFibGVOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL1Rlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5BbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuSURyZWFtTWFuYWdlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmxvZ2dpbmcuVWlFdmVudExvZ2dlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CkBAIC0zOSw3ICszOCw2IEBACiAgICAgVGVzdGFibGVOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbCgKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIsCiAgICAgICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgSURyZWFtTWFuYWdlciBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICBBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24gYW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIGtleWd1YXJkU3RhdGVDb250cm9sbGVyLApAQCAtNTMsNyArNTEsNiBAQAogICAgICAgICAgICAgVXNlclRyYWNrZXIgdXNlclRyYWNrZXIpIHsKICAgICAgICAgc3VwZXIoY29udGVudFJlc29sdmVyLAogICAgICAgICAgICAgICAgIHBvd2VyTWFuYWdlciwKLSAgICAgICAgICAgICAgICBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgYW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGJhdHRlcnlDb250cm9sbGVyLAogICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbXBhbmlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvbXBhbmlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXIuamF2YQppbmRleCA2MDc0MzliLi5iZDY3ODg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb21wYW5pb24vamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29tcGFuaW9uL3ZpcnR1YWwvSW5wdXRDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29tcGFuaW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NvbXBhbmlvbi92aXJ0dWFsL0lucHV0Q29udHJvbGxlci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dERldmljZUlkZW50aWZpZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXJHbG9iYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5WaXJ0dWFsS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5WaXJ0dWFsTW91c2VCdXR0b25FdmVudDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LlZpcnR1YWxNb3VzZVJlbGF0aXZlRXZlbnQ7CkBAIC02ODYsNyArNjg3LDcgQEAKICAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBJbnB1dE1hbmFnZXIuSW5wdXREZXZpY2VMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0RGV2aWNlQWRkZWQoaW50IGRldmljZUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGRldmljZSA9IElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGV2aWNlLCAiTmV3bHkgYWRkZWQgaW5wdXQgZGV2aWNlIHdhcyBudWxsLiIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZS5nZXROYW1lKCkuZXF1YWxzKGRldmljZU5hbWUpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhdHRlcnlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhdHRlcnlTZXJ2aWNlLmphdmEKaW5kZXggZTlhN2YyMC4uZDk0ZjRmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYXR0ZXJ5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQmF0dGVyeVNlcnZpY2UuamF2YQpAQCAtMTk0LDE5ICsxOTQsMTkgQEAKIAogICAgIHByaXZhdGUgQnVuZGxlIG1CYXR0ZXJ5Q2hhbmdlZE9wdGlvbnMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpCiAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFTElWRVJZX0dST1VQX1BPTElDWV9NT1NUX1JFQ0VOVCkKLSAgICAgICAgICAgIC5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpCisgICAgICAgICAgICAuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKQogICAgICAgICAgICAgLnRvQnVuZGxlKCk7CiAgICAgLyoqIFVzZWQgZm9yIGJvdGggY29ubmVjdGVkL2Rpc2Nvbm5lY3RlZCwgc28gbWF0Y2ggdXNpbmcga2V5ICovCiAgICAgcHJpdmF0ZSBCdW5kbGUgbVBvd2VyT3B0aW9ucyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCkKICAgICAgICAgICAgIC5zZXREZWxpdmVyeUdyb3VwUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKQogICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBNYXRjaGluZ0tleSgiYW5kcm9pZCIsIEludGVudC5BQ1RJT05fUE9XRVJfQ09OTkVDVEVEKQotICAgICAgICAgICAgLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSkKKyAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAudG9CdW5kbGUoKTsKICAgICAvKiogVXNlZCBmb3IgYm90aCBsb3cvb2theSwgc28gbWF0Y2ggdXNpbmcga2V5ICovCiAgICAgcHJpdmF0ZSBCdW5kbGUgbUJhdHRlcnlPcHRpb25zID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKQogICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpCiAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nS2V5KCJhbmRyb2lkIiwgSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpCi0gICAgICAgICAgICAuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKQorICAgICAgICAgICAgLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSkKICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogCiAgICAgcHJpdmF0ZSBNZXRyaWNzTG9nZ2VyIG1NZXRyaWNzTG9nZ2VyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRHJvcEJveE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMTllNWNiMS4uYTNkYzIxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Ryb3BCb3hNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTUVSR0VEKQogICAgICAgICAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nRmlsdGVyKG1hdGNoaW5nRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cEV4dHJhc01lcmdlcihleHRyYXNNZXJnZXIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvT1dORVJTIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKaW5kZXggYzQ0MTg1OS4uNDA5ZjA1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKQEAgLTM1LDcgKzM1LDcgQEAKIHBlci1maWxlIE5ldElkTWFuYWdlci5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvT1dORVJTCiBwZXItZmlsZSBQYWNrYWdlV2F0Y2hkb2cuamF2YSwgUmVzY3VlUGFydHkuamF2YSA9IGZpbGU6L3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcm9sbGJhY2svT1dORVJTCiBwZXItZmlsZSBQaW5uZXJTZXJ2aWNlLmphdmEgPSBmaWxlOi9hcGN0LXRlc3RzL3BlcmZ0ZXN0cy9PV05FUlMKLXBlci1maWxlIFJlc2N1ZVBhcnR5LmphdmEgPSBmZHVubGFwQGdvb2dsZS5jb20sIHNodWNAZ29vZ2xlLmNvbQorcGVyLWZpbGUgUmVzY3VlUGFydHkuamF2YSA9IGZkdW5sYXBAZ29vZ2xlLmNvbSwgc2h1Y0Bnb29nbGUuY29tLCBhbmNyQGdvb2dsZS5jb20sIGhhcnNoaXRtYWhhamFuQGdvb2dsZS5jb20KIHBlci1maWxlIFN5c3RlbUNsb2NrVGltZS5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90aW1lZGV0ZWN0b3IvT1dORVJTCiBwZXItZmlsZSBTeXN0ZW1UaW1lWm9uZS5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90aW1lem9uZWRldGVjdG9yL09XTkVSUwogcGVyLWZpbGUgVGVsZXBob255UmVnaXN0cnkuamF2YSA9IGZpbGU6L3RlbGVwaG9ueS9PV05FUlMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHkuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHkuamF2YQppbmRleCBkMWUwZjE2Li4zZGU2NWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Jlc2N1ZVBhcnR5LmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9SZXNjdWVQYXJ0eS5qYXZhCkBAIC03OSw2ICs3OSw3IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FUVEVNUFRJTkdfRkFDVE9SWV9SRVNFVCA9ICJzeXMuYXR0ZW1wdGluZ19mYWN0b3J5X3Jlc2V0IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVRURU1QVElOR19SRUJPT1QgPSAic3lzLmF0dGVtcHRpbmdfcmVib290IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUFYX1JFU0NVRV9MRVZFTF9BVFRFTVBURUQgPSAic3lzLm1heF9yZXNjdWVfbGV2ZWxfYXR0ZW1wdGVkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMgPSAicGVyc2lzdC5zeXMubGFzdF9mYWN0b3J5X3Jlc2V0IjsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgZmluYWwgaW50IExFVkVMX05PTkUgPSAwOwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwpAQCAtMTA1LDEwICsxMDYsMTEgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9UT19QQUNLQUdFX01BUFBJTkdfRkxBRyA9CiAgICAgICAgICAgICAibmFtZXNwYWNlX3RvX3BhY2thZ2VfbWFwcGluZyI7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIGxvbmcgRkFDVE9SWV9SRVNFVF9USFJPVFRMRV9EVVJBVElPTl9NUyA9IFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoMTApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAicmVzY3VlLXBhcnR5LW9ic2VydmVyIjsKIAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElTQUJMRV9SRVNDVUUgPSAicGVyc2lzdC5zeXMuZGlzYWJsZV9yZXNjdWUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZJUlRVQUxfREVWSUNFID0gInJvLmhhcmR3YXJlLnZpcnR1YWxfZGV2aWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ERVZJQ0VfQ09ORklHX0RJU0FCTEVfRkxBRyA9CkBAIC0zMjcsOCArMzI5LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRNYXhSZXNjdWVMZXZlbChib29sZWFuIG1heVBlcmZvcm1GYWN0b3J5UmVzZXQpIHsKLSAgICAgICAgaWYgKCFtYXlQZXJmb3JtRmFjdG9yeVJlc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1heFJlc2N1ZUxldmVsKGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdCkgeworICAgICAgICBpZiAoIW1heVBlcmZvcm1SZWJvb3QKICAgICAgICAgICAgICAgICB8fCBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oUFJPUF9ESVNBQkxFX0ZBQ1RPUllfUkVTRVRfRkxBRywgZmFsc2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gTEVWRUxfUkVTRVRfU0VUVElOR1NfVFJVU1RFRF9ERUZBVUxUUzsKICAgICAgICAgfQpAQCAtMzM5LDExICszNDEsMTEgQEAKICAgICAgKiBHZXQgdGhlIHJlc2N1ZSBsZXZlbCB0byBwZXJmb3JtIGlmIHRoaXMgaXMgdGhlIG4tdGggYXR0ZW1wdCBhdCBtaXRpZ2F0aW5nIGZhaWx1cmUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWl0aWdhdGlvbkNvdW50OiB0aGUgbWl0aWdhdGlvbiBhdHRlbXB0IG51bWJlciAoMSA9IGZpcnN0IGF0dGVtcHQgZXRjLikKLSAgICAgKiBAcGFyYW0gbWF5UGVyZm9ybUZhY3RvcnlSZXNldDogd2hldGhlciBvciBub3QgYSBmYWN0b3J5IHJlc2V0IG1heSBiZSBwZXJmb3JtZWQgZm9yIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAcGFyYW0gbWF5UGVyZm9ybVJlYm9vdDogd2hldGhlciBvciBub3QgYSByZWJvb3QgYW5kIGZhY3RvcnkgcmVzZXQgbWF5IGJlIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGdpdmVuIGZhaWx1cmUuCiAgICAgICogQHJldHVybiB0aGUgcmVzY3VlIGxldmVsIGZvciB0aGUgbi10aCBtaXRpZ2F0aW9uIGF0dGVtcHQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJlc2N1ZUxldmVsKGludCBtaXRpZ2F0aW9uQ291bnQsIGJvb2xlYW4gbWF5UGVyZm9ybUZhY3RvcnlSZXNldCkgeworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRSZXNjdWVMZXZlbChpbnQgbWl0aWdhdGlvbkNvdW50LCBib29sZWFuIG1heVBlcmZvcm1SZWJvb3QpIHsKICAgICAgICAgaWYgKG1pdGlnYXRpb25Db3VudCA9PSAxKSB7CiAgICAgICAgICAgICByZXR1cm4gTEVWRUxfUkVTRVRfU0VUVElOR1NfVU5UUlVTVEVEX0RFRkFVTFRTOwogICAgICAgICB9IGVsc2UgaWYgKG1pdGlnYXRpb25Db3VudCA9PSAyKSB7CkBAIC0zNTEsOSArMzUzLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChtaXRpZ2F0aW9uQ291bnQgPT0gMykgewogICAgICAgICAgICAgcmV0dXJuIExFVkVMX1JFU0VUX1NFVFRJTkdTX1RSVVNURURfREVGQVVMVFM7CiAgICAgICAgIH0gZWxzZSBpZiAobWl0aWdhdGlvbkNvdW50ID09IDQpIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihnZXRNYXhSZXNjdWVMZXZlbChtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KSwgTEVWRUxfV0FSTV9SRUJPT1QpOworICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKGdldE1heFJlc2N1ZUxldmVsKG1heVBlcmZvcm1SZWJvb3QpLCBMRVZFTF9XQVJNX1JFQk9PVCk7CiAgICAgICAgIH0gZWxzZSBpZiAobWl0aWdhdGlvbkNvdW50ID49IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihnZXRNYXhSZXNjdWVMZXZlbChtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KSwgTEVWRUxfRkFDVE9SWV9SRVNFVCk7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oZ2V0TWF4UmVzY3VlTGV2ZWwobWF5UGVyZm9ybVJlYm9vdCksIExFVkVMX0ZBQ1RPUllfUkVTRVQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4cGVjdGVkIHBvc2l0aXZlIG1pdGlnYXRpb24gY291bnQsIHdhcyAiICsgbWl0aWdhdGlvbkNvdW50KTsKICAgICAgICAgICAgIHJldHVybiBMRVZFTF9OT05FOwpAQCAtNDUwLDYgKzQ1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChQUk9QX0FUVEVNUFRJTkdfRkFDVE9SWV9SRVNFVCwgInRydWUiKTsKKyAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcobm93KSk7CiAgICAgICAgICAgICAgICAgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC02MjcsNyArNjMxLDcgQEAKICAgICAgICAgICAgIGlmICghaXNEaXNhYmxlZCgpICYmIChmYWlsdXJlUmVhc29uID09IFBhY2thZ2VXYXRjaGRvZy5GQUlMVVJFX1JFQVNPTl9BUFBfQ1JBU0gKICAgICAgICAgICAgICAgICAgICAgfHwgZmFpbHVyZVJlYXNvbiA9PSBQYWNrYWdlV2F0Y2hkb2cuRkFJTFVSRV9SRUFTT05fQVBQX05PVF9SRVNQT05ESU5HKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXNjdWVMZXZlbFRvVXNlckltcGFjdChnZXRSZXNjdWVMZXZlbChtaXRpZ2F0aW9uQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KGZhaWxlZFBhY2thZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtUmVib290KGZhaWxlZFBhY2thZ2UpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBQYWNrYWdlSGVhbHRoT2JzZXJ2ZXJJbXBhY3QuVVNFUl9JTVBBQ1RfTk9ORTsKICAgICAgICAgICAgIH0KQEAgLTY0Miw3ICs2NDYsNyBAQAogICAgICAgICAgICAgaWYgKGZhaWx1cmVSZWFzb24gPT0gUGFja2FnZVdhdGNoZG9nLkZBSUxVUkVfUkVBU09OX0FQUF9DUkFTSAogICAgICAgICAgICAgICAgICAgICB8fCBmYWlsdXJlUmVhc29uID09IFBhY2thZ2VXYXRjaGRvZy5GQUlMVVJFX1JFQVNPTl9BUFBfTk9UX1JFU1BPTkRJTkcpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGV2ZWwgPSBnZXRSZXNjdWVMZXZlbChtaXRpZ2F0aW9uQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KGZhaWxlZFBhY2thZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heVBlcmZvcm1SZWJvb3QoZmFpbGVkUGFja2FnZSkpOwogICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXNjdWVMZXZlbChtQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFBhY2thZ2UgPT0gbnVsbCA/IG51bGwgOiBmYWlsZWRQYWNrYWdlLmdldFBhY2thZ2VOYW1lKCksIGxldmVsKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY4Myw4ICs2ODcsOSBAQAogICAgICAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdCA9ICFzaG91bGRUaHJvdHRsZVJlYm9vdCgpOwogICAgICAgICAgICAgZXhlY3V0ZVJlc2N1ZUxldmVsKG1Db250ZXh0LCAvKmZhaWxlZFBhY2thZ2U9Ki8gbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzY3VlTGV2ZWwobWl0aWdhdGlvbkNvdW50LCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIGdldFJlc2N1ZUxldmVsKG1pdGlnYXRpb25Db3VudCwgbWF5UGVyZm9ybVJlYm9vdCkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIApAQCAtNjk4LDE0ICs3MDMsMjcgQEAKICAgICAgICAgICogcHJvbXB0aW5nIGEgZmFjdG9yeSByZXNldCBpcyBhbiBhY2NlcHRhYmxlIG1pdGlnYXRpb24gc3RyYXRlZ3kgZm9yIHRoZSBwYWNrYWdlJ3MKICAgICAgICAgICogZmFpbHVyZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF5UGVyZm9ybUZhY3RvcnlSZXNldChATnVsbGFibGUgVmVyc2lvbmVkUGFja2FnZSBmYWlsaW5nUGFja2FnZSkgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdChATnVsbGFibGUgVmVyc2lvbmVkUGFja2FnZSBmYWlsaW5nUGFja2FnZSkgewogICAgICAgICAgICAgaWYgKGZhaWxpbmdQYWNrYWdlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkVGhyb3R0bGVSZWJvb3QoKSkgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBpc1BlcnNpc3RlbnRTeXN0ZW1BcHAoZmFpbGluZ1BhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgUmVzY3VlIFBhcnR5IGlzIGFsbG93ZWQgdG8gYXR0ZW1wdCBhIHJlYm9vdCBvciBmYWN0b3J5IHJlc2V0LgorICAgICAgICAgKiBXaWxsIHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIGEgZmFjdG9yeSByZXNldCB3YXMgYWxyZWFkeSBvZmZlcmVkIHJlY2VudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFRocm90dGxlUmVib290KCkgeworICAgICAgICAgICAgTG9uZyBsYXN0UmVzZXRUaW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIDApOworICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHJldHVybiBub3cgPCBsYXN0UmVzZXRUaW1lICsgRkFDVE9SWV9SRVNFVF9USFJPVFRMRV9EVVJBVElPTl9NUzsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1BlcnNpc3RlbnRTeXN0ZW1BcHAoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3RpdmVTZXJ2aWNlcy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3RpdmVTZXJ2aWNlcy5qYXZhCmluZGV4IGM1MDA4ZmEuLjRhMGEyMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZlU2VydmljZXMuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2ZVNlcnZpY2VzLmphdmEKQEAgLTI1MiwxMiArMjUyLDYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX1NFUlZJQ0VfU1RBUlRfU1RPUCA9IERFQlVHX1NFUlZJQ0U7CiAKLSAgICAvLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciBhIHNlcnZpY2UgdG8gZmluaXNoIGV4ZWN1dGluZy4KLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVElNRU9VVCA9IDIwICogMTAwMCAqIEJ1aWxkLkhXX1RJTUVPVVRfTVVMVElQTElFUjsKLQotICAgIC8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIGEgc2VydmljZSB0byBmaW5pc2ggZXhlY3V0aW5nLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQgPSBTRVJWSUNFX1RJTUVPVVQgKiAxMDsKLQogICAgIC8vIEZvcmVncm91bmQgc2VydmljZSB0eXBlcyB0aGF0IGFsd2F5cyBnZXQgaW1tZWRpYXRlIG5vdGlmaWNhdGlvbiBkaXNwbGF5LAogICAgIC8vIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSBiaXRtYXNrIGZvcm1hdCB0aGF0IFNlcnZpY2VSZWNvcmQuZm9yZWdyb3VuZFNlcnZpY2VUeXBlCiAgICAgLy8gdXNlcy4KQEAgLTMzNyw2ICszMzEsMTMgQEAKICAgICBmaW5hbCBBcnJheU1hcDxGb3JlZ3JvdW5kU2VydmljZURlbGVnYXRpb24sIFNlcnZpY2VSZWNvcmQ+IG1GZ3NEZWxlZ2F0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CiAKICAgICAvKioKKyAgICAgKiBBIGdsb2JhbCBjb3VudGVyIGZvciBnZW5lcmF0aW5nIHNlcXVlbmNlIG51bWJlcnMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYmluZFNlcnZpY2UgcmVxdWVzdHMuCisgICAgICogSXQgaXMgcHVyZWx5IGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqLworICAgIEBHdWFyZGVkQnkoIm1BbSIpCisgICAgcHJpdmF0ZSBsb25nIG1CaW5kU2VydmljZVNlcUNvdW50ZXIgPSAwOworCisgICAgLyoqCiAgICAgICogV2hldGhlciB0aGVyZSBpcyBhIHJhdGUgbGltaXQgdGhhdCBzdXBwcmVzc2VzIGltbWVkaWF0ZSByZS1kZWZlcnJhbCBvZiBuZXcgRkdTCiAgICAgICogbm90aWZpY2F0aW9ucyBmcm9tIGVhY2ggYXBwLiAgT24gYnkgZGVmYXVsdCwgZGlzYWJsZWQgb25seSBieSBzaGVsbCBjb21tYW5kIGZvcgogICAgICAqIHRlc3Qtc3VpdGUgcHVycG9zZXMuICBUbyBkaXNhYmxlIHRoZSBiZWhhdmlvciBtb3JlIGdlbmVyYWxseSwgdXNlIHRoZSB1c3VhbApAQCAtNDQyOSw4ICs0NDMwLDEyIEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGJ1bXBTZXJ2aWNlRXhlY3V0aW5nTG9ja2VkKHIsIGV4ZWNJbkZnLCAiYmluZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPb21BZGp1c3Rlci5PT01fQURKX1JFQVNPTl9CSU5EX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIGlmIChUcmFjZS5pc1RhZ0VuYWJsZWQoVHJhY2UuVFJBQ0VfVEFHX0FDVElWSVRZX01BTkFHRVIpKSB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNlLmluc3RhbnQoVHJhY2UuVFJBQ0VfVEFHX0FDVElWSVRZX01BTkFHRVIsICJyZXF1ZXN0U2VydmljZUJpbmRpbmc9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaS5pbnRlbnQuZ2V0SW50ZW50KCkgKyAiLiBiaW5kU2VxPSIgKyBtQmluZFNlcnZpY2VTZXFDb3VudGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgci5hcHAuZ2V0VGhyZWFkKCkuc2NoZWR1bGVCaW5kU2VydmljZShyLCBpLmludGVudC5nZXRJbnRlbnQoKSwgcmViaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgci5hcHAubVN0YXRlLmdldFJlcG9ydGVkUHJvY1N0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgci5hcHAubVN0YXRlLmdldFJlcG9ydGVkUHJvY1N0YXRlKCksIG1CaW5kU2VydmljZVNlcUNvdW50ZXIrKyk7CiAgICAgICAgICAgICAgICAgaWYgKCFyZWJpbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaS5yZXF1ZXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OTgsMTMgKzY2MDMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBQcm9jZXNzU2VydmljZVJlY29yZCBwc3IgPSBwcm9jLm1TZXJ2aWNlczsKLSAgICAgICAgICAgICAgICBpZiAocHNyLm51bWJlck9mRXhlY3V0aW5nU2VydmljZXMoKSA9PSAwIHx8IHByb2MuZ2V0VGhyZWFkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwc3IubnVtYmVyT2ZFeGVjdXRpbmdTZXJ2aWNlcygpID09IDAgfHwgcHJvYy5nZXRUaHJlYWQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9jLmlzS2lsbGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbWF4VGltZSA9ICBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHBzci5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFNFUlZJQ0VfVElNRU9VVCA6IFNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbUFtLm1Db25zdGFudHMuU0VSVklDRV9USU1FT1VUCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1BbS5tQ29uc3RhbnRzLlNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlUmVjb3JkIHRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgIGxvbmcgbmV4dFRpbWUgPSAwOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwc3IubnVtYmVyT2ZFeGVjdXRpbmdTZXJ2aWNlcygpIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTY2MzUsOCArNjY0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TRVJWSUNFX1RJTUVPVVRfTVNHKTsKICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHByb2M7CiAgICAgICAgICAgICAgICAgICAgIG1BbS5tSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtc2csIHBzci5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV4dFRpbWUgKyBTRVJWSUNFX1RJTUVPVVQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dFRpbWUgKyBTRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG5leHRUaW1lICsgbUFtLm1Db25zdGFudHMuU0VSVklDRV9USU1FT1VUKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRUaW1lICsgbUFtLm1Db25zdGFudHMuU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY3MzIsNyArNjczOSw3IEBACiAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TRVJWSUNFX1RJTUVPVVRfTVNHKTsKICAgICAgICAgbXNnLm9iaiA9IHByb2M7CiAgICAgICAgIG1BbS5tSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBwcm9jLm1TZXJ2aWNlcy5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgPyBTRVJWSUNFX1RJTUVPVVQgOiBTRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgPyBtQW0ubUNvbnN0YW50cy5TRVJWSUNFX1RJTUVPVVQgOiBtQW0ubUNvbnN0YW50cy5TRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCk7CiAgICAgfQogCiAgICAgdm9pZCBzY2hlZHVsZVNlcnZpY2VGb3JlZ3JvdW5kVHJhbnNpdGlvblRpbWVvdXRMb2NrZWQoU2VydmljZVJlY29yZCByKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckNvbnN0YW50cy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJDb25zdGFudHMuamF2YQppbmRleCA1Njk2MDA0Li40ZmEyOGExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckNvbnN0YW50cy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyQ29uc3RhbnRzLmphdmEKQEAgLTI0OCw3ICsyNDgsMTYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TRVJWSUNFX0JJTkRfQUxNT1NUX1BFUkNFUFRJQkxFX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7CiAKLSAgICAvLyBGbGFnIHN0b3JlZCBpbiB0aGUgRGV2aWNlQ29uZmlnIEFQSS4KKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIHRvIHtAbGluayAjU0VSVklDRV9USU1FT1VUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0VSVklDRV9USU1FT1VUID0gMjAgKiAxMDAwICogQnVpbGQuSFdfVElNRU9VVF9NVUxUSVBMSUVSOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSB0byB7QGxpbmsgI1NFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQgPSBERUZBVUxUX1NFUlZJQ0VfVElNRU9VVCAqIDEwOworCiAgICAgLyoqCiAgICAgICogTWF4aW11bSBudW1iZXIgb2YgY2FjaGVkIHByb2Nlc3Nlcy4KICAgICAgKi8KQEAgLTUwNiw2ICs1MTUsMTIgQEAKICAgICAvLyB0byByZXN0YXJ0IGxlc3MgdGhhbiB0aGlzIGFtb3VudCBvZiB0aW1lIGZyb20gdGhlIGxhc3Qgb25lLgogICAgIHB1YmxpYyBsb25nIFNFUlZJQ0VfTUlOX1JFU1RBUlRfVElNRV9CRVRXRUVOID0gREVGQVVMVF9TRVJWSUNFX01JTl9SRVNUQVJUX1RJTUVfQkVUV0VFTjsKIAorICAgIC8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIGEgc2VydmljZSB0byBmaW5pc2ggZXhlY3V0aW5nLgorICAgIGxvbmcgU0VSVklDRV9USU1FT1VUID0gREVGQVVMVF9TRVJWSUNFX1RJTUVPVVQ7CisKKyAgICAvLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciBhIHNlcnZpY2UgdG8gZmluaXNoIGV4ZWN1dGluZy4KKyAgICBsb25nIFNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUID0gREVGQVVMVF9TRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVDsKKwogICAgIC8vIE1heGltdW0gYW1vdW50IG9mIHRpbWUgZm9yIHRoZXJlIHRvIGJlIG5vIGFjdGl2aXR5IG9uIGEgc2VydmljZSBiZWZvcmUKICAgICAvLyB3ZSBjb25zaWRlciBpdCBub24tZXNzZW50aWFsIGFuZCBhbGxvdyBpdHMgcHJvY2VzcyB0byBnbyBvbiB0aGUKICAgICAvLyBMUlUgYmFja2dyb3VuZCBsaXN0LgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAyYTFlODYwLi43NTUwMTk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTQ1MDcsMTggKzE0NTA3LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHJlc3VsdFRvIGJyb2FkY2FzdHMgYXJlIGFsd2F5cyBpbmZpbml0ZWx5IGRlZmVycmFibGUuCi0gICAgICAgIGlmICgocmVzdWx0VG8gIT0gbnVsbCkgJiYgIW9yZGVyZWQgJiYgbUVuYWJsZU1vZGVyblF1ZXVlKSB7Ci0gICAgICAgICAgICBpZiAoYnJPcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBick9wdGlvbnMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJPcHRpb25zLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuYWJsZU1vZGVyblF1ZXVlICYmIG9yZGVyZWQgJiYgYnJPcHRpb25zICE9IG51bGwgJiYgYnJPcHRpb25zLmlzRGVmZXJVbnRpbEFjdGl2ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcmRlcmVkIGJyb2FkY2FzdHMgY2FuJ3QgYmUgZGVmZXJyZWQgdW50aWwgYWN0aXZlIik7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBWZXJpZnkgdGhhdCBwcm90ZWN0ZWQgYnJvYWRjYXN0cyBhcmUgb25seSBiZWluZyBzZW50IGJ5IHN5c3RlbSBjb2RlLAogICAgICAgICAvLyBhbmQgdGhhdCBzeXN0ZW0gY29kZSBpcyBvbmx5IHNlbmRpbmcgcHJvdGVjdGVkIGJyb2FkY2FzdHMuCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcm90ZWN0ZWRCcm9hZGNhc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdENvbnN0YW50cy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RDb25zdGFudHMuamF2YQppbmRleCA1M2ZjZGRmLi4zM2Q0MDA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdENvbnN0YW50cy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0Q29uc3RhbnRzLmphdmEKQEAgLTIzNiw2ICsyMzYsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfSElTVE9SWV9TVU1NQVJZX1NJWkUgPQogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlU3RhdGljKCkgPyAyNTYgOiAxMDI0OwogCisgICAgLyoqCisgICAgICogRm9yIHtAbGluayBCcm9hZGNhc3RSZWNvcmR9OiBEZWZhdWx0IHRvIHRyZWF0aW5nIGFsbCBicm9hZGNhc3RzIHNlbnQgYnkKKyAgICAgKiB0aGUgc3lzdGVtIGFzIGJlIHtAbGluayBCcm9hZGNhc3RPcHRpb25zI0RFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIENPUkVfREVGRVJfVU5USUxfQUNUSVZFID0gREVGQVVMVF9DT1JFX0RFRkVSX1VOVElMX0FDVElWRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUkVfREVGRVJfVU5USUxfQUNUSVZFID0gImJjYXN0X2NvcmVfZGVmZXJfdW50aWxfYWN0aXZlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgPSBmYWxzZTsKKwogICAgIC8vIFNldHRpbmdzIG92ZXJyaWRlIHRyYWNraW5nIGZvciB0aGlzIGluc3RhbmNlCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNldHRpbmdzS2V5OwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKQEAgLTM3Myw3ICszODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfSElTVE9SWV9DT01QTEVURV9TSVpFKTsKICAgICAgICAgICAgIE1BWF9ISVNUT1JZX1NVTU1BUllfU0laRSA9IGdldERldmljZUNvbmZpZ0ludChLRVlfTUFYX0hJU1RPUllfU1VNTUFSWV9TSVpFLAogICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ISVNUT1JZX1NVTU1BUllfU0laRSk7CisgICAgICAgICAgICBDT1JFX0RFRkVSX1VOVElMX0FDVElWRSA9IGdldERldmljZUNvbmZpZ0Jvb2xlYW4oS0VZX0NPUkVfREVGRVJfVU5USUxfQUNUSVZFLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0NPUkVfREVGRVJfVU5USUxfQUNUSVZFKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IG1pZ3JhdGUgQnJvYWRjYXN0UmVjb3JkIHRvIGFjY2VwdCBhIEJyb2FkY2FzdENvbnN0YW50cworICAgICAgICBCcm9hZGNhc3RSZWNvcmQuQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgPSBDT1JFX0RFRkVSX1VOVElMX0FDVElWRTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxOCw2ICs0MzEsOCBAQAogICAgICAgICAgICAgICAgICAgICBNQVhfQ09OU0VDVVRJVkVfVVJHRU5UX0RJU1BBVENIRVMpLnByaW50bG4oKTsKICAgICAgICAgICAgIHB3LnByaW50KEtFWV9NQVhfQ09OU0VDVVRJVkVfTk9STUFMX0RJU1BBVENIRVMsCiAgICAgICAgICAgICAgICAgICAgIE1BWF9DT05TRUNVVElWRV9OT1JNQUxfRElTUEFUQ0hFUykucHJpbnRsbigpOworICAgICAgICAgICAgcHcucHJpbnQoS0VZX0NPUkVfREVGRVJfVU5USUxfQUNUSVZFLAorICAgICAgICAgICAgICAgICAgICBDT1JFX0RFRkVSX1VOVElMX0FDVElWRSkucHJpbnRsbigpOwogICAgICAgICAgICAgcHcuZGVjcmVhc2VJbmRlbnQoKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0UmVjb3JkLmphdmEKaW5kZXggNTlmMzNkZC4uNmJkM2M3OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZC5qYXZhCkBAIC05MCw2ICs5MCw3IEBACiAgICAgZmluYWwgYm9vbGVhbiBwcmlvcml0aXplZDsgLy8gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBwcmlvcml0eSB0cmFuY2hlCiAgICAgZmluYWwgYm9vbGVhbiBkZWZlclVudGlsQWN0aXZlOyAvLyBpbmZpbml0ZWx5IGRlZmVycmFibGUgYnJvYWRjYXN0CiAgICAgZmluYWwgYm9vbGVhbiBzaGFyZUlkZW50aXR5OyAgLy8gd2hldGhlciB0aGUgYnJvYWRjYXN0ZXIncyBpZGVudGl0eSBzaG91bGQgYmUgc2hhcmVkCisgICAgZmluYWwgYm9vbGVhbiB1cmdlbnQ7ICAgIC8vIGhhcyBiZWVuIGNsYXNzaWZpZWQgYXMgInVyZ2VudCIKICAgICBmaW5hbCBpbnQgdXNlcklkOyAgICAgICAvLyB1c2VyIGlkIHRoaXMgYnJvYWRjYXN0IHdhcyBmb3IKICAgICBmaW5hbCBATnVsbGFibGUgU3RyaW5nIHJlc29sdmVkVHlwZTsgLy8gdGhlIHJlc29sdmVkIGRhdGEgdHlwZQogICAgIGZpbmFsIEBOdWxsYWJsZSBTdHJpbmdbXSByZXF1aXJlZFBlcm1pc3Npb25zOyAvLyBwZXJtaXNzaW9ucyB0aGUgY2FsbGVyIGhhcyByZXF1aXJlZApAQCAtMTQ2LDYgKzE0NywxMyBAQAogICAgIHByaXZhdGUgQE51bGxhYmxlIFN0cmluZyBtQ2FjaGVkVG9TdHJpbmc7CiAgICAgcHJpdmF0ZSBATnVsbGFibGUgU3RyaW5nIG1DYWNoZWRUb1Nob3J0U3RyaW5nOwogCisgICAgLyoqCisgICAgICogV2hlbiBlbmFibGVkLCBhc3N1bWUgdGhhdCB7QGxpbmsgVXNlckhhbmRsZSNpc0NvcmUoaW50KX0gYXBwcyBzaG91bGQKKyAgICAgKiB0cmVhdCB7QGxpbmsgQnJvYWRjYXN0T3B0aW9ucyNERUZFUlJBTF9QT0xJQ1lfREVGQVVMVH0gYXMKKyAgICAgKiB7QGxpbmsgQnJvYWRjYXN0T3B0aW9ucyNERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBDT1JFX0RFRkVSX1VOVElMX0FDVElWRSA9IGZhbHNlOworCiAgICAgLyoqIEVtcHR5IGltbXV0YWJsZSBsaXN0IG9mIHJlY2VpdmVycyAqLwogICAgIHN0YXRpYyBmaW5hbCBMaXN0PE9iamVjdD4gRU1QVFlfUkVDRUlWRVJTID0gTGlzdC5vZigpOwogCkBAIC00MDAsNyArNDA4LDkgQEAKICAgICAgICAgcmVjZWl2ZXJzID0gKF9yZWNlaXZlcnMgIT0gbnVsbCkgPyBfcmVjZWl2ZXJzIDogRU1QVFlfUkVDRUlWRVJTOwogICAgICAgICBkZWxpdmVyeSA9IG5ldyBpbnRbX3JlY2VpdmVycyAhPSBudWxsID8gX3JlY2VpdmVycy5zaXplKCkgOiAwXTsKICAgICAgICAgZGVsaXZlcnlSZWFzb25zID0gbmV3IFN0cmluZ1tkZWxpdmVyeS5sZW5ndGhdOwotICAgICAgICBkZWZlclVudGlsQWN0aXZlID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5pc0RlZmVyVW50aWxBY3RpdmUoKSA6IGZhbHNlOworICAgICAgICB1cmdlbnQgPSBjYWxjdWxhdGVVcmdlbnQoX2ludGVudCwgX29wdGlvbnMpOworICAgICAgICBkZWZlclVudGlsQWN0aXZlID0gY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShfY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICBfb3B0aW9ucywgX3Jlc3VsdFRvLCBfc2VyaWFsaXplZCwgdXJnZW50KTsKICAgICAgICAgZGVmZXJyZWRVbnRpbEFjdGl2ZSA9IG5ldyBib29sZWFuW2RlZmVyVW50aWxBY3RpdmUgPyBkZWxpdmVyeS5sZW5ndGggOiAwXTsKICAgICAgICAgYmxvY2tlZFVudGlsVGVybWluYWxDb3VudCA9IGNhbGN1bGF0ZUJsb2NrZWRVbnRpbFRlcm1pbmFsQ291bnQocmVjZWl2ZXJzLCBfc2VyaWFsaXplZCk7CiAgICAgICAgIHNjaGVkdWxlZFRpbWUgPSBuZXcgbG9uZ1tkZWxpdmVyeS5sZW5ndGhdOwpAQCAtNDg4LDYgKzQ5OCw3IEBACiAgICAgICAgIHB1c2hNZXNzYWdlT3ZlclF1b3RhID0gZnJvbS5wdXNoTWVzc2FnZU92ZXJRdW90YTsKICAgICAgICAgaW50ZXJhY3RpdmUgPSBmcm9tLmludGVyYWN0aXZlOwogICAgICAgICBzaGFyZUlkZW50aXR5ID0gZnJvbS5zaGFyZUlkZW50aXR5OworICAgICAgICB1cmdlbnQgPSBmcm9tLnVyZ2VudDsKICAgICAgICAgZmlsdGVyRXh0cmFzRm9yUmVjZWl2ZXIgPSBmcm9tLmZpbHRlckV4dHJhc0ZvclJlY2VpdmVyOwogICAgIH0KIApAQCAtNjgxLDE1ICs2OTIsOCBAQAogICAgICAgICByZXR1cm4gZGVmZXJVbnRpbEFjdGl2ZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb3JlIHBvbGljeSBkZXRlcm1pbmF0aW9uIGFib3V0IHRoaXMgYnJvYWRjYXN0J3MgZGVsaXZlcnkgcHJpb3JpdGl6YXRpb24KLSAgICAgKi8KICAgICBib29sZWFuIGlzVXJnZW50KCkgewotICAgICAgICAvLyBUT0RPOiBmbGFncyBmb3IgY29udHJvbGxpbmcgcG9saWN5Ci0gICAgICAgIC8vIFRPRE86IG1pZ3JhdGUgYWxhcm0tcHJpb3JpdGl6YXRpb24gZmxhZyB0byBCcm9hZGNhc3RDb25zdGFudHMKLSAgICAgICAgcmV0dXJuIChpc0ZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgIHx8IGludGVyYWN0aXZlCi0gICAgICAgICAgICAgICAgfHwgYWxhcm0pOworICAgICAgICByZXR1cm4gdXJnZW50OwogICAgIH0KIAogICAgIEBOb25OdWxsIFN0cmluZyBnZXRIb3N0aW5nUmVjb3JkVHJpZ2dlclR5cGUoKSB7CkBAIC04NDksNiArODUzLDY5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb3JlIHBvbGljeSBkZXRlcm1pbmF0aW9uIGFib3V0IHRoaXMgYnJvYWRjYXN0J3MgZGVsaXZlcnkgcHJpb3JpdGl6YXRpb24KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgYm9vbGVhbiBjYWxjdWxhdGVVcmdlbnQoQE5vbk51bGwgSW50ZW50IGludGVudCwgQE51bGxhYmxlIEJyb2FkY2FzdE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAvLyBUT0RPOiBmbGFncyBmb3IgY29udHJvbGxpbmcgcG9saWN5CisgICAgICAgIC8vIFRPRE86IG1pZ3JhdGUgYWxhcm0tcHJpb3JpdGl6YXRpb24gZmxhZyB0byBCcm9hZGNhc3RDb25zdGFudHMKKyAgICAgICAgaWYgKChpbnRlbnQuZ2V0RmxhZ3MoKSAmIEludGVudC5GTEFHX1JFQ0VJVkVSX0ZPUkVHUk9VTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmlzSW50ZXJhY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNBbGFybUJyb2FkY2FzdCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhlIHJlcXVlc3RlZCB7QGxpbmsgQnJvYWRjYXN0T3B0aW9ucyNzZXREZWZlcnJhbFBvbGljeShpbnQpfQorICAgICAqIGFnYWluc3QgdGhpcyBicm9hZGNhc3Qgc3RhdGUgdG8gZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBtYXJrZWQgYXMKKyAgICAgKiAiZGVmZXIgdW50aWwgYWN0aXZlIi4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKGludCBjYWxsaW5nVWlkLCBATnVsbGFibGUgQnJvYWRjYXN0T3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgQE51bGxhYmxlIElJbnRlbnRSZWNlaXZlciByZXN1bHRUbywgYm9vbGVhbiBvcmRlcmVkLCBib29sZWFuIHVyZ2VudCkgeworICAgICAgICAvLyBPcmRlcmVkIGJyb2FkY2FzdHMgY2FuIG5ldmVyIGJlIGRlZmVycmVkIHVudGlsIGFjdGl2ZQorICAgICAgICBpZiAob3JkZXJlZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVW5vcmRlcmVkIHJlc3VsdFRvIGJyb2FkY2FzdHMgYXJlIGFsd2F5cyBkZWZlcnJlZCB1bnRpbCBhY3RpdmUKKyAgICAgICAgaWYgKCFvcmRlcmVkICYmIHJlc3VsdFRvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgc3Ryb25nIHByZWZlcmVuY2UgaW4gZWl0aGVyIGRpcmVjdGlvbiB3YXMgZXhwcmVzc2VkOworICAgICAgICAvLyBhIHByZWZlcmVuY2UgaGVyZSBvdmVycmlkZXMgYWxsIHJlbWFpbmluZyBwb2xpY2llcworICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuZ2V0RGVmZXJyYWxQb2xpY3koKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX05PTkU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFVyZ2VudCBicm9hZGNhc3RzIGFyZW4ndCBkZWZlcnJlZCB1bnRpbCBhY3RpdmUKKyAgICAgICAgaWYgKHVyZ2VudCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaG9vc2UgYSByZWFzb25hYmxlIGRlZmF1bHQKKyAgICAgICAgaWYgKENPUkVfREVGRVJfVU5USUxfQUNUSVZFICYmIFVzZXJIYW5kbGUuaXNDb3JlKGNhbGxpbmdVaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBCcm9hZGNhc3RSZWNvcmQgbWF5YmVTdHJpcEZvckhpc3RvcnkoKSB7CiAgICAgICAgIGlmICghaW50ZW50LmNhblN0cmlwRm9ySGlzdG9yeSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQ29yZVNldHRpbmdzT2JzZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQ29yZVNldHRpbmdzT2JzZXJ2ZXIuamF2YQppbmRleCBkZGM5ZTkxLi44NDRmMTc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0NvcmVTZXR0aW5nc09ic2VydmVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db3JlU2V0dGluZ3NPYnNlcnZlci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dEZsYWdzOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LldpZGdldEZsYWdzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKQEAgLTE2Miw2ICsxNjMsMTEgQEAKICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuTkFNRVNQQUNFX1dJREdFVCwgV2lkZ2V0RmxhZ3MuTUFHTklGSUVSX0FTUEVDVF9SQVRJTywKICAgICAgICAgICAgICAgICBXaWRnZXRGbGFncy5LRVlfTUFHTklGSUVSX0FTUEVDVF9SQVRJTywgZmxvYXQuY2xhc3MsCiAgICAgICAgICAgICAgICAgV2lkZ2V0RmxhZ3MuTUFHTklGSUVSX0FTUEVDVF9SQVRJT19ERUZBVUxUKSk7CisKKyAgICAgICAgc0RldmljZUNvbmZpZ0VudHJpZXMuYWRkKG5ldyBEZXZpY2VDb25maWdFbnRyeTxCb29sZWFuPigKKyAgICAgICAgICAgICAgICBUZXh0RmxhZ3MuTkFNRVNQQUNFLCBUZXh0RmxhZ3MuRU5BQkxFX05FV19DT05URVhUX01FTlUsCisgICAgICAgICAgICAgICAgVGV4dEZsYWdzLktFWV9FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVSwgYm9vbGVhbi5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXh0RmxhZ3MuRU5BQkxFX05FV19DT05URVhUX01FTlVfREVGQVVMVCkpOwogICAgICAgICAvLyBhZGQgb3RoZXIgZGV2aWNlIGNvbmZpZ3MgaGVyZS4uLgogICAgIH0KICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHNEZXZpY2VDb25maWdDb250ZXh0RW50cmllc0xvYWRlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Qcm9jZXNzU3RhdHNTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NTdGF0c1NlcnZpY2UuamF2YQppbmRleCBiYWM5MjUzLi44ZTkzYzFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NTdGF0c1NlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NTdGF0c1NlcnZpY2UuamF2YQpAQCAtNjksNyArNjksNyBAQAogICAgIC8vIGRlZmluZSB0aGUgZW5jb2Rpbmcgb2YgdGhhdCBkYXRhIGluIGFuIGludGVnZXIuCiAKICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JJQ19TVEFURVMgPSA4OyAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGhpc3RvcmljIHN0YXRlcyB3ZSB3aWxsIGtlZXAuCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9GSUxFX1BSRUZJWCA9ICJzdGF0ZS0iOyAvLyBQcmVmaXggdG8gdXNlIGZvciBzdGF0ZSBmaWxlbmFtZXMuCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9GSUxFX1BSRUZJWCA9ICJzdGF0ZS12Mi0iOyAvLyBQcmVmaXggdG8gdXNlIGZvciBzdGF0ZSBmaWxlbmFtZXMuCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9GSUxFX1NVRkZJWCA9ICIuYmluIjsgLy8gU3VmZml4IHRvIHVzZSBmb3Igc3RhdGUgZmlsZW5hbWVzLgogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfRklMRV9DSEVDS0lOX1NVRkZJWCA9ICIuY2kiOyAvLyBTdGF0ZSBmaWxlcyB0aGF0IGhhdmUgY2hlY2tlZCBpbi4KICAgICBzdGF0aWMgbG9uZyBXUklURV9QRVJJT0QgPSAzMCo2MCoxMDAwOyAgICAgIC8vIFdyaXRlIGZpbGUgZXZlcnkgMzAgbWludXRlcyBvciBzby4KQEAgLTQ2Miw2ICs0NjIsMTAgQEAKICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwogICAgICAgICAgICAgU3RyaW5nIGZpbGVTdHIgPSBmaWxlLmdldFBhdGgoKTsKICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkNvbGxlY3Rpbmc6ICIgKyBmaWxlU3RyKTsKKyAgICAgICAgICAgIGlmICghZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChTVEFURV9GSUxFX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJTa2lwcGluZzogbWlzbWF0Y2hpbmcgcHJlZml4Iik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWluY2xDaGVja2VkSW4gJiYgZmlsZVN0ci5lbmRzV2l0aChTVEFURV9GSUxFX0NIRUNLSU5fU1VGRklYKSkgewogICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlNraXBwaW5nOiBhbHJlYWR5IGNoZWNrZWQgaW4iKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ3OCw2ICs0ODIsMTQgQEAKIAogICAgIEBHdWFyZGVkQnkoIm1GaWxlTG9jayIpCiAgICAgcHJpdmF0ZSB2b2lkIHRyaW1IaXN0b3JpY1N0YXRlc1dyaXRlTEYoKSB7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IG1CYXNlRGlyLmxpc3RGaWxlcygpOworICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghZmlsZXNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoU1RBVEVfRklMRV9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ldLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBmaWxlc0FycmF5ID0gZ2V0Q29tbWl0dGVkRmlsZXNMRihNQVhfSElTVE9SSUNfU1RBVEVTLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIGlmIChmaWxlc0FycmF5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vQXVkaW9TZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL0F1ZGlvU2VydmljZS5qYXZhCmluZGV4IDQ5MGEzM2UuLjNlODZjNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vQXVkaW9TZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9BdWRpb1NlcnZpY2UuamF2YQpAQCAtMTM3Miw4ICsxMzcyLDggQEAKICAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7CiAgICAgICAgIGlmIChtTW9uaXRvclJvdGF0aW9uKSB7CiAgICAgICAgICAgICBSb3RhdGlvbkhlbHBlci5pbml0KG1Db250ZXh0LCBtQXVkaW9IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICByb3RhdGlvblBhcmFtIC0+IG9uUm90YXRpb25VcGRhdGUocm90YXRpb25QYXJhbSksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRQYXJhbSAtPiBvbkZvbGRVcGRhdGUoZm9sZFBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uIC0+IG9uUm90YXRpb25VcGRhdGUocm90YXRpb24pLAorICAgICAgICAgICAgICAgICAgICBmb2xkU3RhdGUgLT4gb25Gb2xkU3RhdGVVcGRhdGUoZm9sZFN0YXRlKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEF1ZGlvRWZmZWN0LkFDVElPTl9PUEVOX0FVRElPX0VGRkVDVF9DT05UUk9MX1NFU1NJT04pOwpAQCAtMTUxNSwxNiArMTUxNSwyMCBAQAogCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIHJvdGF0aW9uL2ZvbGQgdXBkYXRlcyBjb21pbmcgZnJvbSBSb3RhdGlvbkhlbHBlcgotICAgIHZvaWQgb25Sb3RhdGlvblVwZGF0ZShTdHJpbmcgcm90YXRpb25QYXJhbWV0ZXIpIHsKKyAgICB2b2lkIG9uUm90YXRpb25VcGRhdGUoSW50ZWdlciByb3RhdGlvbikgeworICAgICAgICBtU3BhdGlhbGl6ZXJIZWxwZXIuc2V0RGlzcGxheU9yaWVudGF0aW9uKChmbG9hdCkgKHJvdGF0aW9uICogTWF0aC5QSSAvIDE4MC4pKTsKICAgICAgICAgLy8gdXNlIFJFUExBQ0UgYXMgb25seSB0aGUgbGFzdCByb3RhdGlvbiBtYXR0ZXJzCisgICAgICAgIGZpbmFsIFN0cmluZyByb3RhdGlvblBhcmFtZXRlciA9ICJyb3RhdGlvbj0iICsgcm90YXRpb247CiAgICAgICAgIHNlbmRNc2cobUF1ZGlvSGFuZGxlciwgTVNHX1JPVEFUSU9OX1VQREFURSwgU0VORE1TR19SRVBMQUNFLCAvKmFyZzEqLyAwLCAvKmFyZzIqLyAwLAogICAgICAgICAgICAgICAgIC8qb2JqKi8gcm90YXRpb25QYXJhbWV0ZXIsIC8qZGVsYXkqLyAwKTsKICAgICB9CiAKLSAgICB2b2lkIG9uRm9sZFVwZGF0ZShTdHJpbmcgZm9sZFBhcmFtZXRlcikgeworICAgIHZvaWQgb25Gb2xkU3RhdGVVcGRhdGUoQm9vbGVhbiBmb2xkU3RhdGUpIHsKKyAgICAgICAgbVNwYXRpYWxpemVySGVscGVyLnNldEZvbGRTdGF0ZShmb2xkU3RhdGUpOwogICAgICAgICAvLyB1c2UgUkVQTEFDRSBhcyBvbmx5IHRoZSBsYXN0IGZvbGQgc3RhdGUgbWF0dGVycworICAgICAgICBmaW5hbCBTdHJpbmcgZm9sZFN0YXRlUGFyYW1ldGVyID0gImRldmljZV9mb2xkZWQ9IiArIChmb2xkU3RhdGUgPyAib24iIDogIm9mZiIpOwogICAgICAgICBzZW5kTXNnKG1BdWRpb0hhbmRsZXIsIE1TR19GT0xEX1VQREFURSwgU0VORE1TR19SRVBMQUNFLCAvKmFyZzEqLyAwLCAvKmFyZzIqLyAwLAotICAgICAgICAgICAgICAgIC8qb2JqKi8gZm9sZFBhcmFtZXRlciwgLypkZWxheSovIDApOworICAgICAgICAgICAgICAgIC8qb2JqKi8gZm9sZFN0YXRlUGFyYW1ldGVyLCAvKmRlbGF5Ki8gMCk7CiAgICAgfQogCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTc0MCw2ICsxNzQ0LDkgQEAKICAgICAgICAgbVNwYXRpYWxpemVySGVscGVyLnJlc2V0KC8qIGZlYXR1cmVFbmFibGVkICovIG1IYXNTcGF0aWFsaXplckVmZmVjdCk7CiAgICAgICAgIG1Tb3VuZERvc2VIZWxwZXIucmVzZXQoKTsKIAorICAgICAgICAvLyBSZXN0b3JlIHJvdGF0aW9uIGluZm9ybWF0aW9uLgorICAgICAgICBSb3RhdGlvbkhlbHBlci5mb3JjZVVwZGF0ZSgpOworCiAgICAgICAgIG9uSW5kaWNhdGVTeXN0ZW1SZWFkeSgpOwogICAgICAgICAvLyBpbmRpY2F0ZSB0aGUgZW5kIG9mIHJlY29uZmlndXJhdGlvbiBwaGFzZSB0byBhdWRpbyBIQUwKICAgICAgICAgQXVkaW9TeXN0ZW0uc2V0UGFyYW1ldGVycygicmVzdGFydGluZz1mYWxzZSIpOwpAQCAtODE3MCw3ICs4MTc3LDcgQEAKICAgICAgICAgICAgIHZvbHVtZUNoYW5nZWRPcHRpb25zLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKTsKICAgICAgICAgICAgIHZvbHVtZUNoYW5nZWRPcHRpb25zLnNldERlbGl2ZXJ5R3JvdXBNYXRjaGluZ0tleSgKICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLlZPTFVNRV9DSEFOR0VEX0FDVElPTiwgU3RyaW5nLnZhbHVlT2YobVN0cmVhbVR5cGUpKTsKLSAgICAgICAgICAgIHZvbHVtZUNoYW5nZWRPcHRpb25zLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSk7CisgICAgICAgICAgICB2b2x1bWVDaGFuZ2VkT3B0aW9ucy5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpOwogICAgICAgICAgICAgbVZvbHVtZUNoYW5nZWRPcHRpb25zID0gdm9sdW1lQ2hhbmdlZE9wdGlvbnMudG9CdW5kbGUoKTsKIAogICAgICAgICAgICAgbVN0cmVhbURldmljZXNDaGFuZ2VkID0gbmV3IEludGVudChBdWRpb01hbmFnZXIuU1RSRUFNX0RFVklDRVNfQ0hBTkdFRF9BQ1RJT04pOwpAQCAtODE3OSw3ICs4MTg2LDggQEAKICAgICAgICAgICAgIHN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucy5zZXREZWxpdmVyeUdyb3VwUG9saWN5KERFTElWRVJZX0dST1VQX1BPTElDWV9NT1NUX1JFQ0VOVCk7CiAgICAgICAgICAgICBzdHJlYW1EZXZpY2VzQ2hhbmdlZE9wdGlvbnMuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nS2V5KAogICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX0RFVklDRVNfQ0hBTkdFRF9BQ1RJT04sIFN0cmluZy52YWx1ZU9mKG1TdHJlYW1UeXBlKSk7Ci0gICAgICAgICAgICBzdHJlYW1EZXZpY2VzQ2hhbmdlZE9wdGlvbnMuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKTsKKyAgICAgICAgICAgIHN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucy5zZXREZWZlcnJhbFBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKTsKICAgICAgICAgICAgIG1TdHJlYW1EZXZpY2VzQ2hhbmdlZE9wdGlvbnMgPSBzdHJlYW1EZXZpY2VzQ2hhbmdlZE9wdGlvbnMudG9CdW5kbGUoKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1JvdGF0aW9uSGVscGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1JvdGF0aW9uSGVscGVyLmphdmEKaW5kZXggNWNkZjU4Yi4uMzk0ZTRhZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9Sb3RhdGlvbkhlbHBlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vUm90YXRpb25IZWxwZXIuamF2YQpAQCAtNTUsMTQgKzU1LDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQXVkaW9EaXNwbGF5TGlzdGVuZXIgc0Rpc3BsYXlMaXN0ZW5lcjsKICAgICBwcml2YXRlIHN0YXRpYyBGb2xkU3RhdGVMaXN0ZW5lciBzRm9sZFN0YXRlTGlzdGVuZXI7CiAgICAgLyoqIGNhbGxiYWNrIHRvIHNlbmQgcm90YXRpb24gdXBkYXRlcyB0byBBdWRpb1N5c3RlbSAqLwotICAgIHByaXZhdGUgc3RhdGljIENvbnN1bWVyPFN0cmluZz4gc1JvdGF0aW9uVXBkYXRlQ2I7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3VtZXI8SW50ZWdlcj4gc1JvdGF0aW9uQ2FsbGJhY2s7CiAgICAgLyoqIGNhbGxiYWNrIHRvIHNlbmQgZm9sZGVkIHN0YXRlIHVwZGF0ZXMgdG8gQXVkaW9TeXN0ZW0gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb25zdW1lcjxTdHJpbmc+IHNGb2xkVXBkYXRlQ2I7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3VtZXI8Qm9vbGVhbj4gc0ZvbGRTdGF0ZUNhbGxiYWNrOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNSb3RhdGlvbkxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNGb2xkU3RhdGVMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgc3RhdGljIGludCBzRGV2aWNlUm90YXRpb24gPSBTdXJmYWNlLlJPVEFUSU9OXzA7IC8vIFIvVyBzeW5jaHJvbml6ZWQgb24gc1JvdGF0aW9uTG9jawotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0RldmljZUZvbGQgPSB0cnVlOyAvLyBSL1cgc3luY2hyb25pemVkIG9uIHNGb2xkU3RhdGVMb2NrCisgICAgcHJpdmF0ZSBzdGF0aWMgSW50ZWdlciBzUm90YXRpb24gPSBudWxsOyAvLyBSL1cgc3luY2hyb25pemVkIG9uIHNSb3RhdGlvbkxvY2sKKyAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHNGb2xkU3RhdGUgPSBudWxsOyAvLyBSL1cgc3luY2hyb25pemVkIG9uIHNGb2xkU3RhdGVMb2NrCiAKICAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IHNDb250ZXh0OwogICAgIHByaXZhdGUgc3RhdGljIEhhbmRsZXIgc0hhbmRsZXI7CkBAIC03MywxNSArNzMsMTUgQEAKICAgICAgKiAtIHNDb250ZXh0ICE9IG51bGwKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyLAotICAgICAgICAgICAgQ29uc3VtZXI8U3RyaW5nPiByb3RhdGlvblVwZGF0ZUNiLCBDb25zdW1lcjxTdHJpbmc+IGZvbGRVcGRhdGVDYikgeworICAgICAgICAgICAgQ29uc3VtZXI8SW50ZWdlcj4gcm90YXRpb25DYWxsYmFjaywgQ29uc3VtZXI8Qm9vbGVhbj4gZm9sZFN0YXRlQ2FsbGJhY2spIHsKICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBudWxsIGNvbnRleHQiKTsKICAgICAgICAgfQogICAgICAgICBzQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIHNIYW5kbGVyID0gaGFuZGxlcjsKICAgICAgICAgc0Rpc3BsYXlMaXN0ZW5lciA9IG5ldyBBdWRpb0Rpc3BsYXlMaXN0ZW5lcigpOwotICAgICAgICBzUm90YXRpb25VcGRhdGVDYiA9IHJvdGF0aW9uVXBkYXRlQ2I7Ci0gICAgICAgIHNGb2xkVXBkYXRlQ2IgPSBmb2xkVXBkYXRlQ2I7CisgICAgICAgIHNSb3RhdGlvbkNhbGxiYWNrID0gcm90YXRpb25DYWxsYmFjazsKKyAgICAgICAgc0ZvbGRTdGF0ZUNhbGxiYWNrID0gZm9sZFN0YXRlQ2FsbGJhY2s7CiAgICAgICAgIGVuYWJsZSgpOwogICAgIH0KIApAQCAtMTEyLDkgKzExMiw5IEBACiAgICAgICAgIGludCBuZXdSb3RhdGlvbiA9IERpc3BsYXlNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkKICAgICAgICAgICAgICAgICAuZ2V0RGlzcGxheUluZm8oRGlzcGxheS5ERUZBVUxUX0RJU1BMQVkpLnJvdGF0aW9uOwogICAgICAgICBzeW5jaHJvbml6ZWQoc1JvdGF0aW9uTG9jaykgewotICAgICAgICAgICAgaWYgKG5ld1JvdGF0aW9uICE9IHNEZXZpY2VSb3RhdGlvbikgewotICAgICAgICAgICAgICAgIHNEZXZpY2VSb3RhdGlvbiA9IG5ld1JvdGF0aW9uOwotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3RhdGlvbihzRGV2aWNlUm90YXRpb24pOworICAgICAgICAgICAgaWYgKHNSb3RhdGlvbiA9PSBudWxsIHx8IHNSb3RhdGlvbiAhPSBuZXdSb3RhdGlvbikgeworICAgICAgICAgICAgICAgIHNSb3RhdGlvbiA9IG5ld1JvdGF0aW9uOworICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3RhdGlvbihzUm90YXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTIzLDQzICsxMjMsNTIgQEAKICAgICAgICAgaWYgKERFQlVHX1JPVEFUSU9OKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJwdWJsaXNoaW5nIGRldmljZSByb3RhdGlvbiA9IiArIHJvdGF0aW9uICsgIiAoeDkwZGVnKSIpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByb3RhdGlvblBhcmFtOworICAgICAgICBpbnQgcm90YXRpb25EZWdyZWVzOwogICAgICAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CiAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMDoKLSAgICAgICAgICAgICAgICByb3RhdGlvblBhcmFtID0gInJvdGF0aW9uPTAiOworICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fOTA6Ci0gICAgICAgICAgICAgICAgcm90YXRpb25QYXJhbSA9ICJyb3RhdGlvbj05MCI7CisgICAgICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gOTA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMTgwOgotICAgICAgICAgICAgICAgIHJvdGF0aW9uUGFyYW0gPSAicm90YXRpb249MTgwIjsKKyAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAxODA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMjcwOgotICAgICAgICAgICAgICAgIHJvdGF0aW9uUGFyYW0gPSAicm90YXRpb249MjcwIjsKKyAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAyNzA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gZGV2aWNlIHJvdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgcm90YXRpb25QYXJhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gLTE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJvdGF0aW9uUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgc1JvdGF0aW9uVXBkYXRlQ2IuYWNjZXB0KHJvdGF0aW9uUGFyYW0pOworICAgICAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IC0xKSB7CisgICAgICAgICAgICBzUm90YXRpb25DYWxsYmFjay5hY2NlcHQocm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIHB1Ymxpc2ggdGhlIGNoYW5nZSBvZiBkZXZpY2UgZm9sZGVkIHN0YXRlIGlmIGFueS4KICAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVGb2xkU3RhdGUoYm9vbGVhbiBuZXdGb2xkZWQpIHsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVGb2xkU3RhdGUoYm9vbGVhbiBmb2xkU3RhdGUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzRm9sZFN0YXRlTG9jaykgewotICAgICAgICAgICAgaWYgKHNEZXZpY2VGb2xkICE9IG5ld0ZvbGRlZCkgewotICAgICAgICAgICAgICAgIHNEZXZpY2VGb2xkID0gbmV3Rm9sZGVkOwotICAgICAgICAgICAgICAgIFN0cmluZyBmb2xkUGFyYW07Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0ZvbGRlZCkgewotICAgICAgICAgICAgICAgICAgICBmb2xkUGFyYW0gPSAiZGV2aWNlX2ZvbGRlZD1vbiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9sZFBhcmFtID0gImRldmljZV9mb2xkZWQ9b2ZmIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc0ZvbGRVcGRhdGVDYi5hY2NlcHQoZm9sZFBhcmFtKTsKKyAgICAgICAgICAgIGlmIChzRm9sZFN0YXRlID09IG51bGwgfHwgc0ZvbGRTdGF0ZSAhPSBmb2xkU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBzRm9sZFN0YXRlID0gZm9sZFN0YXRlOworICAgICAgICAgICAgICAgIHNGb2xkU3RhdGVDYWxsYmFjay5hY2NlcHQoZm9sZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBmb3JjZVVwZGF0ZSBpcyBjYWxsZWQgd2hlbiBhdWRpb3NlcnZlciByZXN0YXJ0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBmb3JjZVVwZGF0ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzUm90YXRpb25Mb2NrKSB7CisgICAgICAgICAgICBzUm90YXRpb24gPSBudWxsOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZU9yaWVudGF0aW9uKCk7IC8vIFdlIHdpbGwgZ2V0IGF0IGxlYXN0IG9uZSBvcmllbnRhdGlvbiB1cGRhdGUgbm93LgorICAgICAgICBzeW5jaHJvbml6ZWQgKHNGb2xkU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAoc0ZvbGRTdGF0ZSAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNGb2xkU3RhdGVDYWxsYmFjay5hY2NlcHQoc0ZvbGRTdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xODUsNCArMTk0LDQgQEAKICAgICAgICAgICAgIHVwZGF0ZU9yaWVudGF0aW9uKCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9Tb3VuZERvc2VIZWxwZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vU291bmREb3NlSGVscGVyLmphdmEKaW5kZXggM2RhYzA0Yy4uYzI0ODM2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9Tb3VuZERvc2VIZWxwZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1NvdW5kRG9zZUhlbHBlci5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5NYXRoVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CkBAIC01Miw3ICs1Myw2IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKQEAgLTExMiw2ICsxMTIsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBHTE9CQUxfVElNRV9PRkZTRVRfVU5JTklUSUFMSVpFRCA9IC0xOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQgPSAtMTsKKwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRMb2dnZXIgbUxvZ2dlciA9IG5ldyBFdmVudExvZ2dlcihBdWRpb1NlcnZpY2UuTE9HX05CX0VWRU5UU19TT1VORF9ET1NFLAogICAgICAgICAgICAgIkNTRCB1cGRhdGVzIik7CiAKQEAgLTEzMiwxNSArMTM0LDYgQEAKICAgICAvLyBGb3Igbm93IHVzaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBDU0Qgc3VwcG9ydGVkIGRldmljZXMKICAgICBwcml2YXRlIGZsb2F0IG1TYWZlTWVkaWFWb2x1bWVEYmZzOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FmZURldmljZVZvbHVtZUluZm8gewotICAgICAgICBpbnQgbURldmljZVR5cGU7Ci0gICAgICAgIGludCBtU2FmZVZvbHVtZUluZGV4ID0gLTE7Ci0KLSAgICAgICAgU2FmZURldmljZVZvbHVtZUluZm8oaW50IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGV2aWNlVHlwZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzIGxpc3RzIHRoZSBkZXZpY2VzIGZvciB3aGljaCBzYWZlIG1lZGlhIHZvbHVtZSBpcyBlbmZvcmNlZC4KICAgICAgKiBDb250YWlucyBhIHNhZmUgdm9sdW1lIGluZGV4IGZvciBhIGdpdmVuIGRldmljZSB0eXBlLgpAQCAtMTUyLDI1ICsxNDUsNyBAQAogICAgICAqIFRoaXMgbGV2ZWwgY29ycmVzcG9uZHMgdG8gYSBsb3VkbmVzcyBvZiA4NSBkQiBTUEwgZm9yIHRoZSB3YXJuaW5nIHRvIGJlIGRpc3BsYXllZCB3aGVuCiAgICAgICogdGhlIGhlYWRzZXQgaXMgY29tcGxpYW50IHRvIEVOIDYwOTUwIHdpdGggYSBtYXggbG91ZG5lc3Mgb2YgMTAwZEIgU1BMLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJbnRlZ2VyLCBTYWZlRGV2aWNlVm9sdW1lSW5mbz4gbVNhZmVNZWRpYVZvbHVtZURldmljZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpIHt7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpKTsKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpKTsKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9VU0JfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUKSk7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxFX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTEVfSEVBRFNFVCkpOwotICAgICAgICAgICAgICAgIHB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTEVfQlJPQURDQVNUKSk7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfSEVBUklOR19BSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpOwotICAgICAgICAgICAgICAgIHB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSk7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FmZURldmljZVZvbHVtZUluZm8oQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpOwotICAgICAgICAgICAgfX07CisgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VJbnRBcnJheSBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcyA9IG5ldyBTcGFyc2VJbnRBcnJheSgpOwogCiAgICAgLy8gbU11c2ljQWN0aXZlTXMgaXMgdGhlIGN1bXVsYXRpdmUgdGltZSBvZiBtdXNpYyBhY3Rpdml0eSBzaW5jZSBzYWZlIHZvbHVtZSB3YXMgZGlzYWJsZWQuCiAgICAgLy8gV2hlbiB0aGlzIHRpbWUgcmVhY2hlcyBVTlNBRkVfVk9MVU1FX01VU0lDX0FDVElWRV9NU19NQVgsIHRoZSBzYWZlIG1lZGlhIHZvbHVtZSBpcyByZS1lbmFibGVkCkBAIC0yOTEsNiArMjY2LDcgQEAKIAogICAgICAgICBtRW5hYmxlQ3NkID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2F1ZGlvX2NzZF9lbmFibGVkX2RlZmF1bHQpOwogICAgICAgICBpbml0Q3NkKCk7CisgICAgICAgIGluaXRTYWZlVm9sdW1lcygpOwogCiAgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVTdGF0ZSA9IG1TZXR0aW5ncy5nZXRHbG9iYWxJbnQoYXVkaW9TZXJ2aWNlLmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5BVURJT19TQUZFX1ZPTFVNRV9TVEFURSwgU0FGRV9NRURJQV9WT0xVTUVfTk9UX0NPTkZJR1VSRUQpOwpAQCAtMzA1LDYgKzI4MSwyNSBAQAogICAgICAgICAgICAgICAgIENvbnRleHQuQUxBUk1fU0VSVklDRSk7CiAgICAgfQogCisgICAgdm9pZCBpbml0U2FmZVZvbHVtZXMoKSB7CisgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmFwcGVuZChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmFwcGVuZChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfVVNCX0hFQURTRVQsCisgICAgICAgICAgICAgICAgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmFwcGVuZChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMRV9IRUFEU0VULAorICAgICAgICAgICAgICAgIFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpOworICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5hcHBlbmQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTEVfQlJPQURDQVNULAorICAgICAgICAgICAgICAgIFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpOworICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5hcHBlbmQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9IRUFSSU5HX0FJRCwKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsCisgICAgICAgICAgICAgICAgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCk7CisgICAgfQorCiAgICAgZmxvYXQgZ2V0UnMyVmFsdWUoKSB7CiAgICAgICAgIGlmICghbUVuYWJsZUNzZCkgewogICAgICAgICAgICAgcmV0dXJuIDAuZjsKQEAgLTQzNSwxMiArNDMwLDEyIEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gaW50IHNhZmVNZWRpYVZvbHVtZUluZGV4KGludCBkZXZpY2UpIHsKLSAgICAgICAgZmluYWwgU2FmZURldmljZVZvbHVtZUluZm8gdmkgPSBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgaWYgKHZpID09IG51bGwpIHsKKyAgICAgICAgZmluYWwgaW50IHZvbCA9IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmdldChkZXZpY2UpOworICAgICAgICBpZiAodm9sID09IFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgIHJldHVybiBNQVhfU1RSRUFNX1ZPTFVNRVtBdWRpb1N5c3RlbS5TVFJFQU1fTVVTSUNdOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHZpLm1TYWZlVm9sdW1lSW5kZXg7CisgICAgICAgIHJldHVybiB2b2w7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCByZXN0b3JlTXVzaWNBY3RpdmVNcygpIHsKQEAgLTQ2NSwxNCArNDYwLDE1IEBACiAgICAgICAgIEF1ZGlvU2VydmljZS5Wb2x1bWVTdHJlYW1TdGF0ZSBzdHJlYW1TdGF0ZSA9IG1BdWRpb1NlcnZpY2UuZ2V0VnNzVm9sdW1lRm9yU3RyZWFtKAogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQyk7CiAKLSAgICAgICAgZm9yIChTYWZlRGV2aWNlVm9sdW1lSW5mbyB2aSA6IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBzdHJlYW1TdGF0ZS5nZXRJbmRleCh2aS5tRGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICBpbnQgc2FmZUluZGV4ID0gc2FmZU1lZGlhVm9sdW1lSW5kZXgodmkubURldmljZVR5cGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLnNpemUoKTsgKytpKSAgeworICAgICAgICAgICAgaW50IGRldmljZVR5cGUgPSBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHN0cmVhbVN0YXRlLmdldEluZGV4KGRldmljZVR5cGUpOworICAgICAgICAgICAgaW50IHNhZmVJbmRleCA9IHNhZmVNZWRpYVZvbHVtZUluZGV4KGRldmljZVR5cGUpOwogICAgICAgICAgICAgaWYgKGluZGV4ID4gc2FmZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtU3RhdGUuc2V0SW5kZXgoc2FmZUluZGV4LCB2aS5tRGV2aWNlVHlwZSwgY2FsbGVyLAorICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRlLnNldEluZGV4KHNhZmVJbmRleCwgZGV2aWNlVHlwZSwgY2FsbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmhhc01vZGlmeUF1ZGlvU2V0dGluZ3MqLyk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0hhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX0RFVklDRV9WT0xVTUUsIHZpLm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfREVWSUNFX1ZPTFVNRSwgZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphcmcyPSovMCwgc3RyZWFtU3RhdGUpLCAvKmRlbGF5PSovMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ5NCw3ICs0OTAsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NhZmVNZWRpYVZvbHVtZV9sKGludCBzdHJlYW1UeXBlLCBpbnQgaW5kZXgsIGludCBkZXZpY2UpIHsKICAgICAgICAgcmV0dXJuIChtU2FmZU1lZGlhVm9sdW1lU3RhdGUgPT0gU0FGRV9NRURJQV9WT0xVTUVfQUNUSVZFKQogICAgICAgICAgICAgICAgICAgICAmJiAoQXVkaW9TZXJ2aWNlLm1TdHJlYW1Wb2x1bWVBbGlhc1tzdHJlYW1UeXBlXSA9PSBBdWRpb1N5c3RlbS5TVFJFQU1fTVVTSUMpCi0gICAgICAgICAgICAgICAgICAgICYmIChtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICAmJiBzYWZlRGV2aWNlc0NvbnRhaW5zKGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgJiYgKGluZGV4ID4gc2FmZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlKSk7CiAgICAgfQogCkBAIC01NDYsNyArNTQyLDcgQEAKICAgICAgICAgc3luY2hyb25pemVkIChtU2FmZU1lZGlhVm9sdW1lU3RhdGVMb2NrKSB7CiAgICAgICAgICAgICBpZiAobVNhZmVNZWRpYVZvbHVtZVN0YXRlID09IFNBRkVfTUVESUFfVk9MVU1FX0lOQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgaW50IGRldmljZSA9IG1BdWRpb1NlcnZpY2UuZ2V0RGV2aWNlRm9yU3RyZWFtKEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmNvbnRhaW5zS2V5KGRldmljZSkgJiYgaXNTdHJlYW1BY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2FmZURldmljZXNDb250YWlucyhkZXZpY2UpICYmIGlzU3RyZWFtQWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTXVzaWNBY3RpdmVDaGVjaygpOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtQXVkaW9TZXJ2aWNlLmdldFZzc1ZvbHVtZUZvckRldmljZShBdWRpb1N5c3RlbS5TVFJFQU1fTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKQEAgLTU4OSwxNCArNTg1LDE1IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBpbml0U2FmZU1lZGlhVm9sdW1lSW5kZXgoKSB7Ci0gICAgICAgIGZvciAoU2FmZURldmljZVZvbHVtZUluZm8gdmkgOiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgdmkubVNhZmVWb2x1bWVJbmRleCA9IGdldFNhZmVEZXZpY2VNZWRpYVZvbHVtZUluZGV4KHZpLm1EZXZpY2VUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5zaXplKCk7ICsraSkgIHsKKyAgICAgICAgICAgIGludCBkZXZpY2VUeXBlID0gbVNhZmVNZWRpYVZvbHVtZURldmljZXMua2V5QXQoaSk7CisgICAgICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5wdXQoZGV2aWNlVHlwZSwgZ2V0U2FmZURldmljZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlVHlwZSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gaW50IGdldFNhZmVNZWRpYVZvbHVtZUluZGV4KGludCBkZXZpY2UpIHsKICAgICAgICAgaWYgKG1TYWZlTWVkaWFWb2x1bWVTdGF0ZSA9PSBTQUZFX01FRElBX1ZPTFVNRV9BQ1RJVkUKLSAgICAgICAgICAgICAgICAmJiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgJiYgc2FmZURldmljZXNDb250YWlucyhkZXZpY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2FmZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTYxNCw3ICs2MTEsNyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gc2FmZURldmljZXNDb250YWlucyhpbnQgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpOworICAgICAgICByZXR1cm4gbVNhZmVNZWRpYVZvbHVtZURldmljZXMuaW5kZXhPZktleShkZXZpY2UpID49IDA7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBpbnZhbGlkYXRQZW5kaW5nVm9sdW1lQ29tbWFuZCgpIHsKQEAgLTY2NSw5ICs2NjIsOSBAQAogICAgICAgICBwdy5wcmludCgiICBtU2FmZU1lZGlhVm9sdW1lU3RhdGU9Iik7CiAgICAgICAgIHB3LnByaW50bG4oc2FmZU1lZGlhVm9sdW1lU3RhdGVUb1N0cmluZyhtU2FmZU1lZGlhVm9sdW1lU3RhdGUpKTsKICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZUluZGV4PSIpOyBwdy5wcmludGxuKG1TYWZlTWVkaWFWb2x1bWVJbmRleCk7Ci0gICAgICAgIGZvciAoU2FmZURldmljZVZvbHVtZUluZm8gdmkgOiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZUluZGV4WyIpOyBwdy5wcmludCh2aS5tRGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICBwdy5wcmludCgiXT0iKTsgcHcucHJpbnRsbih2aS5tU2FmZVZvbHVtZUluZGV4KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5zaXplKCk7ICsraSkgIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1TYWZlTWVkaWFWb2x1bWVJbmRleFsiKTsgcHcucHJpbnQobVNhZmVNZWRpYVZvbHVtZURldmljZXMua2V5QXQoaSkpOworICAgICAgICAgICAgcHcucHJpbnQoIl09Iik7IHB3LnByaW50bG4obVNhZmVNZWRpYVZvbHVtZURldmljZXMudmFsdWVBdChpKSk7CiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZURiZnM9Iik7IHB3LnByaW50bG4obVNhZmVNZWRpYVZvbHVtZURiZnMpOwogICAgICAgICBwdy5wcmludCgiICBtTXVzaWNBY3RpdmVNcz0iKTsgcHcucHJpbnRsbihtTXVzaWNBY3RpdmVNcyk7CkBAIC03MjEsNyArNzE4LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKEF1ZGlvU2VydmljZS5tU3RyZWFtVm9sdW1lQWxpYXNbc3RyZWFtVHlwZV0gPT0gQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgc2FmZURldmljZXNDb250YWlucyhkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgc291bmREb3NlLnVwZGF0ZUF0dGVudWF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uZ2V0U3RyZWFtVm9sdW1lREIoQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3SW5kZXggKyA1KSAvIDEwLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9TcGF0aWFsaXplckhlbHBlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9TcGF0aWFsaXplckhlbHBlci5qYXZhCmluZGV4IDNlYTRmNGYuLjhmNTRlNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vU3BhdGlhbGl6ZXJIZWxwZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1NwYXRpYWxpemVySGVscGVyLmphdmEKQEAgLTEwNjYsNyArMTA2Niw3IEBACiAgICAgICAgIGlmICh0cmFuc2Zvcm0ubGVuZ3RoICE9IDYpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYXJyYXkgc2l6ZSIgKyB0cmFuc2Zvcm0ubGVuZ3RoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWNoZWNrU3BhdEZvckhlYWRUcmFja2luZygic2V0R2xvYmFsVHJhbnNmb3JtIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJzZXRHbG9iYWxUcmFuc2Zvcm0iKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogICAgIH0KIAogICAgIHN5bmNocm9uaXplZCB2b2lkIHJlY2VudGVySGVhZFRyYWNrZXIoKSB7Ci0gICAgICAgIGlmICghY2hlY2tTcGF0Rm9ySGVhZFRyYWNraW5nKCJyZWNlbnRlckhlYWRUcmFja2VyIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJyZWNlbnRlckhlYWRUcmFja2VyIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0cnkgewpAQCAtMTA4Nyw4ICsxMDg3LDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgZGlzcGxheU9yaWVudGF0aW9uKSB7CisgICAgICAgIGlmICghY2hlY2tTcGF0aWFsaXplcigic2V0RGlzcGxheU9yaWVudGF0aW9uIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwYXQuc2V0RGlzcGxheU9yaWVudGF0aW9uKGRpc3BsYXlPcmllbnRhdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjYWxsaW5nIHNldERpc3BsYXlPcmllbnRhdGlvbiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0Rm9sZFN0YXRlKGJvb2xlYW4gZm9sZGVkKSB7CisgICAgICAgIGlmICghY2hlY2tTcGF0aWFsaXplcigic2V0Rm9sZFN0YXRlIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwYXQuc2V0Rm9sZFN0YXRlKGZvbGRlZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjYWxsaW5nIHNldEZvbGRTdGF0ZSIsIGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgc3luY2hyb25pemVkIHZvaWQgc2V0RGVzaXJlZEhlYWRUcmFja2luZ01vZGUoQFNwYXRpYWxpemVyLkhlYWRUcmFja2luZ01vZGVTZXQgaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKCFjaGVja1NwYXRGb3JIZWFkVHJhY2tpbmcoInNldERlc2lyZWRIZWFkVHJhY2tpbmdNb2RlIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJzZXREZXNpcmVkSGVhZFRyYWNraW5nTW9kZSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1vZGUgIT0gU3BhdGlhbGl6ZXIuSEVBRF9UUkFDS0lOR19NT0RFX0RJU0FCTEVEKSB7CkBAIC0xMTg2LDcgKzEyMDgsNyBAQAogICAgICAgICByZXR1cm4gbUhlYWRUcmFja2VyQXZhaWxhYmxlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NwYXRGb3JIZWFkVHJhY2tpbmcoU3RyaW5nIGZ1bmNOYW1lKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU3BhdGlhbGl6ZXIoU3RyaW5nIGZ1bmNOYW1lKSB7CiAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICBjYXNlIFNUQVRFX1VOSU5JVElBTElaRUQ6CiAgICAgICAgICAgICBjYXNlIFNUQVRFX05PVF9TVVBQT1JURUQ6CkBAIC0xMTk3LDE0ICsxMjE5LDE4IEBACiAgICAgICAgICAgICBjYXNlIFNUQVRFX0VOQUJMRURfQVZBSUxBQkxFOgogICAgICAgICAgICAgICAgIGlmIChtU3BhdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZWNvdmVyIGJ5IHJlc2V0dGluZyB0aGUgbmF0aXZlIHNwYXRpYWxpemVyIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNoZWNrU3BhdEZvckhlYWRUcmFja2luZygpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmF0aXZlIHNwYXRpYWxpemVyIHNob3VsZCBub3QgYmUgbnVsbCBpbiBzdGF0ZTogIiArIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNoZWNrU3BhdGlhbGl6ZXIoKTogY2FsbGVkIGZyb20gIiArIGZ1bmNOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKCksIG5hdGl2ZSBzcGF0aWFsaXplciBzaG91bGQgbm90IGJlIG51bGwgaW4gc3RhdGU6ICIgKyBtU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICBwb3N0UmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUlzSGVhZFRyYWNraW5nU3VwcG9ydGVkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTcGF0aWFsaXplckZvckhlYWRUcmFja2luZyhTdHJpbmcgZnVuY05hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrU3BhdGlhbGl6ZXIoZnVuY05hbWUpICYmIG1Jc0hlYWRUcmFja2luZ1N1cHBvcnRlZDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hBY3R1YWxIZWFkVHJhY2tpbmdNb2RlKGludCBuZXdNb2RlKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NhbWVyYS9DYW1lcmFTZXJ2aWNlUHJveHkuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCmluZGV4IDRlM2RlM2MuLmU4YWY4NDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCkBAIC0yNDMsMTEgKzI0MywxMyBAQAogICAgICAgICBwdWJsaWMgTGlzdDxDYW1lcmFTdHJlYW1TdGF0cz4gbVN0cmVhbVN0YXRzOwogICAgICAgICBwdWJsaWMgU3RyaW5nIG1Vc2VyVGFnOwogICAgICAgICBwdWJsaWMgaW50IG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlOworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBtTG9nSWQ7CiAKICAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbk9yU3RhcnRUaW1lTXM7ICAvLyBFaXRoZXIgc3RhcnQgdGltZSwgb3IgZHVyYXRpb24gb25jZSBjb21wbGV0ZWQKIAogICAgICAgICBDYW1lcmFVc2FnZUV2ZW50KFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzTmRrLCBpbnQgYWN0aW9uLCBpbnQgbGF0ZW5jeU1zLCBpbnQgb3BlcmF0aW5nTW9kZSwgYm9vbGVhbiBkZXZpY2VFcnJvcikgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNOZGssIGludCBhY3Rpb24sIGludCBsYXRlbmN5TXMsIGludCBvcGVyYXRpbmdNb2RlLCBib29sZWFuIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgIGxvbmcgbG9nSWQpIHsKICAgICAgICAgICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOwogICAgICAgICAgICAgbUNhbWVyYUZhY2luZyA9IGZhY2luZzsKICAgICAgICAgICAgIG1DbGllbnROYW1lID0gY2xpZW50TmFtZTsKQEAgLTI1OSw2ICsyNjEsNyBAQAogICAgICAgICAgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID0gb3BlcmF0aW5nTW9kZTsKICAgICAgICAgICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOworICAgICAgICAgICAgbUxvZ0lkID0gbG9nSWQ7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBtYXJrQ29tcGxldGVkKGludCBpbnRlcm5hbFJlY29uZmlndXJlLCBsb25nIHJlcXVlc3RDb3VudCwKQEAgLTg0MCw3ICs4NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VFcnJvciAiICsgZS5tRGV2aWNlRXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RyZWFtQ291bnQgaXMgIiArIHN0cmVhbUNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHVzZXJUYWcgaXMgIiArIGUubVVzZXJUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSAiICsgZS5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHZpZGVvU3RhYmlsaXphdGlvbk1vZGUgIiArIGUubVZpZGVvU3RhYmlsaXphdGlvbk1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbG9nSWQgIiArIGUubUxvZ0lkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBDYW1lcmFTdHJlYW1TdGF0cyB0byBDYW1lcmFTdHJlYW1Qcm90bwogICAgICAgICAgICAgQ2FtZXJhU3RyZWFtUHJvdG9bXSBzdHJlYW1Qcm90b3MgPSBuZXcgQ2FtZXJhU3RyZWFtUHJvdG9bTUFYX1NUUkVBTV9TVEFUSVNUSUNTXTsKQEAgLTkwMCw3ICs5MDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbMl0pLAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbM10pLAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbNF0pLAotICAgICAgICAgICAgICAgICAgICBlLm1Vc2VyVGFnLCBlLm1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5tVXNlclRhZywgZS5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSwgZS5tTG9nSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDg5LDYgKzEwOTMsNyBAQAogICAgICAgICBMaXN0PENhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0cyA9IGNhbWVyYVN0YXRlLmdldFN0cmVhbVN0YXRzKCk7CiAgICAgICAgIFN0cmluZyB1c2VyVGFnID0gY2FtZXJhU3RhdGUuZ2V0VXNlclRhZygpOwogICAgICAgICBpbnQgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IGNhbWVyYVN0YXRlLmdldFZpZGVvU3RhYmlsaXphdGlvbk1vZGUoKTsKKyAgICAgICAgbG9uZyBsb2dJZCA9IGNhbWVyYVN0YXRlLmdldExvZ0lkKCk7CiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgLy8gVXBkYXRlIGFjdGl2ZSBjYW1lcmEgbGlzdCBhbmQgbm90aWZ5IE5GQyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgIGJvb2xlYW4gd2FzRW1wdHkgPSBtQWN0aXZlQ2FtZXJhVXNhZ2UuaXNFbXB0eSgpOwpAQCAtMTExMCw3ICsxMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVXNhZ2VFdmVudCBvcGVuRXZlbnQgPSBuZXcgQ2FtZXJhVXNhZ2VFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCwgaXNOZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrU3RhdHNMb2cuQ0FNRVJBX0FDVElPTl9FVkVOVF9fQUNUSU9OX19PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TXMsIHNlc3Npb25UeXBlLCBkZXZpY2VFcnJvciwgbG9nSWQpOwogICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhVXNhZ2VIaXN0b3J5LmFkZChvcGVuRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENhbWVyYVNlc3Npb25TdGF0cy5DQU1FUkFfU1RBVEVfQUNUSVZFOgpAQCAtMTEzNyw3ICsxMTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVXNhZ2VFdmVudCBuZXdFdmVudCA9IG5ldyBDYW1lcmFVc2FnZUV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudE5hbWUsIGFwaUxldmVsLCBpc05kaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtTdGF0c0xvZy5DQU1FUkFfQUNUSU9OX0VWRU5UX19BQ1RJT05fX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1zLCBzZXNzaW9uVHlwZSwgZGV2aWNlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yLCBsb2dJZCk7CiAgICAgICAgICAgICAgICAgICAgIENhbWVyYVVzYWdlRXZlbnQgb2xkRXZlbnQgPSBtQWN0aXZlQ2FtZXJhVXNhZ2UucHV0KGNhbWVyYUlkLCBuZXdFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRFdmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgd2FzIGFscmVhZHkgbWFya2VkIGFzIGFjdGl2ZSIpOwpAQCAtMTE4MSw3ICsxMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVVzYWdlRXZlbnQgY2xvc2VFdmVudCA9IG5ldyBDYW1lcmFVc2FnZUV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCwgaXNOZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1N0YXRzTG9nLkNBTUVSQV9BQ1RJT05fRVZFTlRfX0FDVElPTl9fQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1zLCBzZXNzaW9uVHlwZSwgZGV2aWNlRXJyb3IsIGxvZ0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFVc2FnZUhpc3RvcnkuYWRkKGNsb3NlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGUuamF2YQppbmRleCBhNTg5MzEzLi4wMGFmMjI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZS5qYXZhCkBAIC03Niw3ICs3NiwxMyBAQAogICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZSBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgZGV2aWNlIGlzCiAgICAgICogb3ZlcmhlYXRpbmcgYW5kIHJlYWNoaW5nIHRoZSBjcml0aWNhbCBzdGF0dXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwgPSAxIDw8IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMID0gMSA8PCA0OworCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHN0YXRlIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHBvd2VyIHNhdmUgbW9kZQorICAgICAqIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSA9IDEgPDwgNTsKIAogICAgIC8qKiBAaGlkZSAqLwogICAgIEBJbnREZWYocHJlZml4ID0geyJGTEFHXyJ9LCBmbGFnID0gdHJ1ZSwgdmFsdWUgPSB7CkBAIC04NCw3ICs5MCw4IEBACiAgICAgICAgICAgICBGTEFHX0FQUF9JTkFDQ0VTU0lCTEUsCiAgICAgICAgICAgICBGTEFHX0VNVUxBVEVEX09OTFksCiAgICAgICAgICAgICBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QLAotICAgICAgICAgICAgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgIEZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCwKKyAgICAgICAgICAgIEZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUKICAgICB9KQogICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKICAgICBwdWJsaWMgQGludGVyZmFjZSBEZXZpY2VTdGF0ZUZsYWdzIHt9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQzZWU1ZTIuLjk2NDU2OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5EZXZpY2VTdGF0ZS5GTEFHX0NBTkNFTF9PVkVSUklERV9SRVFVRVNUUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLk92ZXJyaWRlUmVxdWVzdC5PVkVSUklERV9SRVFVRVNUX1RZUEVfQkFTRV9TVEFURTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLk92ZXJyaWRlUmVxdWVzdC5PVkVSUklERV9SRVFVRVNUX1RZUEVfRU1VTEFURURfU1RBVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLkZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGUuT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5GTEFHX1RIRVJNQUxfQ1JJVElDQUw7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLlNUQVRVU19BQ1RJVkU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLlNUQVRVU19DQU5DRUxFRDsKQEAgLTYwOSw3ICs2MTAsOCBAQAogCiAgICAgQEd1YXJkZWRCeSgibUxvY2siKQogICAgIHByaXZhdGUgdm9pZCBvbk92ZXJyaWRlUmVxdWVzdFN0YXR1c0NoYW5nZWRMb2NrZWQoQE5vbk51bGwgT3ZlcnJpZGVSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBAT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5SZXF1ZXN0U3RhdHVzIGludCBzdGF0dXMsIGludCBmbGFncykgeworICAgICAgICAgICAgQE92ZXJyaWRlUmVxdWVzdENvbnRyb2xsZXIuUmVxdWVzdFN0YXR1cyBpbnQgc3RhdHVzLAorICAgICAgICAgICAgQE92ZXJyaWRlUmVxdWVzdENvbnRyb2xsZXIuU3RhdHVzQ2hhbmdlZEZsYWcgaW50IGZsYWdzKSB7CiAgICAgICAgIGlmIChyZXF1ZXN0LmdldFJlcXVlc3RUeXBlKCkgPT0gT1ZFUlJJREVfUkVRVUVTVF9UWVBFX0JBU0VfU1RBVEUpIHsKICAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgpAQCAtNjQxLDYgKzY0MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93VGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uSWZOZWVkZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEKSA9PSBGTEFHX1BPV0VSX1NBVkVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93UG93ZXJTYXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU3RhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuamF2YQppbmRleCA5MDA4NzQwLi5hYjI2MWFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGU7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fQkFUVEVSWV9TQVZFUl9TRVRUSU5HUzsKKwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5EcmF3YWJsZVJlczsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CkBAIC0xMDEsMTAgKzEwMywxNiBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZyByZXF1ZXN0ZXJBcHBsaWNhdGlvbkxhYmVsID0gZ2V0QXBwbGljYXRpb25MYWJlbChyZXF1ZXN0aW5nQXBwVWlkKTsKICAgICAgICAgaWYgKHJlcXVlc3RlckFwcGxpY2F0aW9uTGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX0FDVElPTl9DQU5DRUxfU1RBVEUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwIC8qIHJlcXVlc3RDb2RlICovLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUpOwogICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICAgaW5mby5uYW1lLCBpbmZvLmFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KGluZm8uYWN0aXZlTm90aWZpY2F0aW9uQ29udGVudCwgcmVxdWVzdGVyQXBwbGljYXRpb25MYWJlbCksCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogb25nb2luZyAqLywgUi5kcmF3YWJsZS5pY19kdWFsX3NjcmVlbgorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG9uZ29pbmcgKi8sIFIuZHJhd2FibGUuaWNfZHVhbF9zY3JlZW4sCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbikKICAgICAgICAgICAgICk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2Fubm90IGRldGVybWluZSB0aGUgcmVxdWVzdGluZyBhcHAgbmFtZSB3aGVuIHNob3dpbmcgc3RhdGUgYWN0aXZlICIKQEAgLTEyNiw3ICsxMzQsMzMgQEAKICAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICBpbmZvLm5hbWUsIGluZm8udGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uVGl0bGUsCiAgICAgICAgICAgICAgICAgaW5mby50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50LCBmYWxzZSAvKiBvbmdvaW5nICovLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfdGhlcm1vc3RhdAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfdGhlcm1vc3RhdCwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHBlbmRpbmdJbnRlbnQgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBhY3Rpb25UZXh0ICovCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheXMgdGhlIG5vdGlmaWNhdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGRldmljZSBzdGF0ZSBpcyBjYW5jZWxlZCBkdWUgdG8gcG93ZXIKKyAgICAgKiBzYXZlIG1vZGUgYmVpbmcgZW5hYmxlZC4gRG9lcyBub3RoaW5nIGlmIHRoZSBzdGF0ZSBkb2VzIG5vdCBoYXZlIGEgcG93ZXIgc2F2ZSBtb2RlCisgICAgICogbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXZpY2Ugc3RhdGUgYmVpbmcgY2FuY2VsZWQuCisgICAgICovCisgICAgdm9pZCBzaG93UG93ZXJTYXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoaW50IHN0YXRlKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkluZm8gaW5mbyA9IG1Ob3RpZmljYXRpb25JbmZvcy5nZXQoc3RhdGUpOworICAgICAgICBpZiAoaW5mbyA9PSBudWxsIHx8ICFpbmZvLmhhc1Bvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9CQVRURVJZX1NBVkVSX1NFVFRJTkdTKTsKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgMCAvKiByZXF1ZXN0Q29kZSAqLywgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfSU1NVVRBQkxFKTsKKyAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBpbmZvLm5hbWUsIGluZm8ucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlLAorICAgICAgICAgICAgICAgIGluZm8ucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvbkNvbnRlbnQsIGZhbHNlIC8qIG9uZ29pbmcgKi8sCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY190aGVybW9zdGF0LAorICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fc2V0dGluZ3NfYnV0dG9uKQogICAgICAgICApOwogICAgIH0KIApAQCAtMTYxLDcgKzE5NSw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dOb3RpZmljYXRpb24oCiAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwgQE5vbk51bGwgU3RyaW5nIHRpdGxlLCBATm9uTnVsbCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBvbmdvaW5nLAotICAgICAgICAgICAgQERyYXdhYmxlUmVzIGludCBpY29uUmVzKSB7CisgICAgICAgICAgICBARHJhd2FibGVSZXMgaW50IGljb25SZXMsCisgICAgICAgICAgICBATnVsbGFibGUgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50LCBATnVsbGFibGUgU3RyaW5nIGFjdGlvblRleHQpIHsKICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoCiAgICAgICAgICAgICAgICAgQ0hBTk5FTF9JRCwgbmFtZSwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0hJR0gpOwogICAgICAgICBmaW5hbCBOb3RpZmljYXRpb24uQnVpbGRlciBidWlsZGVyID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBDSEFOTkVMX0lEKQpAQCAtMTczLDE0ICsyMDgsMTAgQEAKICAgICAgICAgICAgICAgICAuc2V0T25nb2luZyhvbmdvaW5nKQogICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShOb3RpZmljYXRpb24uQ0FURUdPUllfU1lTVEVNKTsKIAotICAgICAgICBpZiAob25nb2luZykgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX0FDVElPTl9DQU5DRUxfU1RBVEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwIC8qIHJlcXVlc3RDb2RlICovLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUpOworICAgICAgICBpZiAocGVuZGluZ0ludGVudCAhPSBudWxsICYmIGFjdGlvblRleHQgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uLkFjdGlvbiBhY3Rpb24gPSBuZXcgTm90aWZpY2F0aW9uLkFjdGlvbi5CdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGljb24gKi8sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbiksCisgICAgICAgICAgICAgICAgICAgIGFjdGlvblRleHQsCiAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICAgICAgYnVpbGRlci5hZGRBY3Rpb24oYWN0aW9uKTsKQEAgLTIxNSwxMiArMjQ2LDIxIEBACiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnRzID0KICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3RoZXJtYWxfY29udGVudHMpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGVzID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfdGl0bGVzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvbkNvbnRlbnRzID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudHMpOworCiAKICAgICAgICAgaWYgKHN0YXRlSWRlbnRpZmllcnMubGVuZ3RoICE9IG5hbWVzLmxlbmd0aAogICAgICAgICAgICAgICAgIHx8IHN0YXRlSWRlbnRpZmllcnMubGVuZ3RoICE9IGFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlcy5sZW5ndGgKICAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50cy5sZW5ndGgKICAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZXMubGVuZ3RoCiAgICAgICAgICAgICAgICAgfHwgc3RhdGVJZGVudGlmaWVycy5sZW5ndGggIT0gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uQ29udGVudHMubGVuZ3RoCisgICAgICAgICAgICAgICAgfHwgc3RhdGVJZGVudGlmaWVycy5sZW5ndGggIT0gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlcy5sZW5ndGgKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uQ29udGVudHMubGVuZ3RoCiAgICAgICAgICkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlRoZSBsZW5ndGggb2Ygc3RhdGUgaWRlbnRpZmllcnMgYW5kIG5vdGlmaWNhdGlvbiB0ZXh0cyBtdXN0IG1hdGNoISIpOwpAQCAtMjM3LDcgKzI3Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzW2ldLCBhY3RpdmVOb3RpZmljYXRpb25UaXRsZXNbaV0sIGFjdGl2ZU5vdGlmaWNhdGlvbkNvbnRlbnRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50c1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50c1tpXSkKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KIApAQCAtMjcyLDE2ICszMTQsMjEgQEAKICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlOwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50OwogCiAgICAgICAgIE5vdGlmaWNhdGlvbkluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3RpdmVOb3RpZmljYXRpb25UaXRsZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlTm90aWZpY2F0aW9uQ29udGVudCwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlLAotICAgICAgICAgICAgICAgIFN0cmluZyB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnQsIFN0cmluZyBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50KSB7CiAKICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlID0gYWN0aXZlTm90aWZpY2F0aW9uVGl0bGU7CiAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5vdGlmaWNhdGlvbkNvbnRlbnQgPSBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICAgICAgdGhpcy50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZSA9IHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlOwogICAgICAgICAgICAgdGhpcy50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50ID0gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uQ29udGVudDsKKyAgICAgICAgICAgIHRoaXMucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlID0gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlOworICAgICAgICAgICAgdGhpcy5wb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uQ29udGVudCA9IHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBoYXNBY3RpdmVOb3RpZmljYXRpb24oKSB7CkBAIC0yOTIsNSArMzM5LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uVGl0bGUgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAmJiB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZS5sZW5ndGgoKSA+IDA7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc1Bvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlLmxlbmd0aCgpID4gMDsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVQcm92aWRlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKaW5kZXggZmVjYzEzZi4uYWYzM2RlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKQEAgLTUyLDExICs1MiwyNCBAQAogICAgICAqLwogICAgIGludCBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1RIRVJNQUxfQ1JJVElDQUwgPSAzOwogCisgICAgLyoqCisgICAgICogSW5kaWNhdGluZyB0aGF0IHRoZSBzdXBwb3J0ZWQgZGV2aWNlIHN0YXRlcyBoYXZlIGNoYW5nZWQgYmVjYXVzZSBwb3dlciBzYXZlIG1vZGUgd2FzIGVuYWJsZWQuCisgICAgICovCisgICAgaW50IFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9FTkFCTEVEID0gNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRpbmcgdGhhdCB0aGUgc3VwcG9ydGVkIGRldmljZSBzdGF0ZXMgaGF2ZSBjaGFuZ2VkIGJlY2F1c2UgcG93ZXIgc2F2ZSBtb2RlIHdhcworICAgICAqIGRpc2FibGVkLgorICAgICAqLworICAgIGludCBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRElTQUJMRUQgPSA1OworCiAgICAgQEludERlZihwcmVmaXggPSB7ICJTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEXyIgfSwgdmFsdWUgPSB7CiAgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0RFRkFVTFQsCiAgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0lOSVRJQUxJWkVELAogICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX05PUk1BTCwKLSAgICAgICAgICAgIFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfVEhFUk1BTF9DUklUSUNBTAorICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX0NSSVRJQ0FMLAorICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQsCisgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRElTQUJMRUQKICAgICB9KQogICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKICAgICBAaW50ZXJmYWNlIFN1cHBvcnRlZFN0YXRlc1VwZGF0ZWRSZWFzb24ge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKaW5kZXggMmVkNDc2NS4uNDZmMGJjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKQEAgLTY0LDYgKzY0LDE4IEBACiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RIRVJNQUxfQ1JJVElDQUwgPSAxIDw8IDA7CiAKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIHdhcyB0cmlnZ2VyZWQgYnkgcG93ZXIgc2F2ZSBtb2RlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QT1dFUl9TQVZFX0VOQUJMRUQgPSAxIDw8IDE7CisKKyAgICBASW50RGVmKGZsYWcgPSB0cnVlLCBwcmVmaXggPSB7IkZMQUdfIn0sIHZhbHVlID0geworICAgICAgICAgICAgRkxBR19USEVSTUFMX0NSSVRJQ0FMLAorICAgICAgICAgICAgRkxBR19QT1dFUl9TQVZFX0VOQUJMRUQKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBAaW50ZXJmYWNlIFN0YXR1c0NoYW5nZWRGbGFnIHt9CisKICAgICBzdGF0aWMgU3RyaW5nIHN0YXR1c1RvU3RyaW5nKEBSZXF1ZXN0U3RhdHVzIGludCBzdGF0dXMpIHsKICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKQEAgLTIyOCwxMyArMjQwLDE4IEBACiAgICAgICAgICAgICBARGV2aWNlU3RhdGVQcm92aWRlci5TdXBwb3J0ZWRTdGF0ZXNVcGRhdGVkUmVhc29uIGludCByZWFzb24pIHsKICAgICAgICAgYm9vbGVhbiBpc1RoZXJtYWxDcml0aWNhbCA9CiAgICAgICAgICAgICAgICAgcmVhc29uID09IERldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX0NSSVRJQ0FMOworICAgICAgICBib29sZWFuIGlzUG93ZXJTYXZlRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgcmVhc29uID09IERldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQ7CisgICAgICAgIEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MgPSAwOworICAgICAgICBmbGFncyB8PSBpc1RoZXJtYWxDcml0aWNhbCA/IEZMQUdfVEhFUk1BTF9DUklUSUNBTCA6IDA7CisgICAgICAgIGZsYWdzIHw9IGlzUG93ZXJTYXZlRW5hYmxlZCA/IEZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEIDogMDsKICAgICAgICAgaWYgKG1CYXNlU3RhdGVSZXF1ZXN0ICE9IG51bGwgJiYgIWNvbnRhaW5zKG5ld1N1cHBvcnRlZFN0YXRlcywKICAgICAgICAgICAgICAgICBtQmFzZVN0YXRlUmVxdWVzdC5nZXRSZXF1ZXN0ZWRTdGF0ZSgpKSkgewotICAgICAgICAgICAgY2FuY2VsQ3VycmVudEJhc2VTdGF0ZVJlcXVlc3RMb2NrZWQoaXNUaGVybWFsQ3JpdGljYWwgPyBGTEFHX1RIRVJNQUxfQ1JJVElDQUwgOiAwKTsKKyAgICAgICAgICAgIGNhbmNlbEN1cnJlbnRCYXNlU3RhdGVSZXF1ZXN0TG9ja2VkKGZsYWdzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtUmVxdWVzdCAhPSBudWxsICYmICFjb250YWlucyhuZXdTdXBwb3J0ZWRTdGF0ZXMsIG1SZXF1ZXN0LmdldFJlcXVlc3RlZFN0YXRlKCkpKSB7Ci0gICAgICAgICAgICBjYW5jZWxDdXJyZW50UmVxdWVzdExvY2tlZChpc1RoZXJtYWxDcml0aWNhbCA/IEZMQUdfVEhFUk1BTF9DUklUSUNBTCA6IDApOworICAgICAgICAgICAgY2FuY2VsQ3VycmVudFJlcXVlc3RMb2NrZWQoZmxhZ3MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTUsNyArMjcyLDggQEAKICAgICAgICAgY2FuY2VsUmVxdWVzdExvY2tlZChyZXF1ZXN0VG9DYW5jZWwsIDAgLyogZmxhZ3MgKi8pOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZXF1ZXN0TG9ja2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0VG9DYW5jZWwsIGludCBmbGFncykgeworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZXF1ZXN0TG9ja2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0VG9DYW5jZWwsCisgICAgICAgICAgICBAU3RhdHVzQ2hhbmdlZEZsYWcgaW50IGZsYWdzKSB7CiAgICAgICAgIG1MaXN0ZW5lci5vblN0YXR1c0NoYW5nZWQocmVxdWVzdFRvQ2FuY2VsLCBTVEFUVVNfQ0FOQ0VMRUQsIGZsYWdzKTsKICAgICB9CiAKQEAgLTI2Nyw3ICsyODUsNyBAQAogICAgICAgICBjYW5jZWxDdXJyZW50UmVxdWVzdExvY2tlZCgwIC8qIGZsYWdzICovKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsQ3VycmVudFJlcXVlc3RMb2NrZWQoaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEN1cnJlbnRSZXF1ZXN0TG9ja2VkKEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MpIHsKICAgICAgICAgaWYgKG1SZXF1ZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBdHRlbXB0ZWQgdG8gY2FuY2VsIGEgbnVsbCBPdmVycmlkZVJlcXVlc3QiKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTI4NSw3ICszMDMsNyBAQAogICAgICAgICBjYW5jZWxDdXJyZW50QmFzZVN0YXRlUmVxdWVzdExvY2tlZCgwIC8qIGZsYWdzICovKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsQ3VycmVudEJhc2VTdGF0ZVJlcXVlc3RMb2NrZWQoaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEN1cnJlbnRCYXNlU3RhdGVSZXF1ZXN0TG9ja2VkKEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MpIHsKICAgICAgICAgaWYgKG1CYXNlU3RhdGVSZXF1ZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBdHRlbXB0ZWQgdG8gY2FuY2VsIGEgbnVsbCBPdmVycmlkZVJlcXVlc3QiKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTMxMiw2ICszMzAsNiBAQAogICAgICAgICAgKiBjYW5jZWxsZWQgcmVxdWVzdC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0LCBAUmVxdWVzdFN0YXR1cyBpbnQgbmV3U3RhdHVzLAotICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgQFN0YXR1c0NoYW5nZWRGbGFnIGludCBmbGFncyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhCmluZGV4IGRiNjk0NGQwLi4zODY0MjAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Rpc3BsYXkvbW9kZS9EaXNwbGF5TW9kZURpcmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhCkBAIC0yMDg4LDcgKzIwODgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgICAgIHZvaWQgb25SZWZyZXNoUmF0ZVNldHRpbmdDaGFuZ2VkTG9ja2VkKGZsb2F0IG1pbiwgZmxvYXQgbWF4KSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaFJhdGVTZXR0aW5nQ2hhbmdlZExvY2tlZChmbG9hdCBtaW4sIGZsb2F0IG1heCkgewogICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VhYmxlID0gKG1heCAtIG1pbiA+IDFmICYmIG1heCA+IDYwZik7CiAgICAgICAgICAgICBpZiAobVJlZnJlc2hSYXRlQ2hhbmdlYWJsZSAhPSBjaGFuZ2VhYmxlKSB7CiAgICAgICAgICAgICAgICAgbVJlZnJlc2hSYXRlQ2hhbmdlYWJsZSA9IGNoYW5nZWFibGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RyZWFtcy9EcmVhbUNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCmluZGV4IDNlMmVmZGQuLjIwZmY1MWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgb3B0aW9ucy5zZXREZWxpdmVyeUdyb3VwTWF0Y2hpbmdLZXkoCiAgICAgICAgICAgICAgICAgRFJFQU1JTkdfREVMSVZFUllfR1JPVVBfTkFNRVNQQUNFLCBEUkVBTUlOR19ERUxJVkVSWV9HUk9VUF9LRVkpOwogICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgYnJvYWRjYXN0IGRlbGl2ZXJ5IHRvIGJlIGRlbGF5ZWQgdG8gYXBwcyBpbiB0aGUgQ2FjaGVkIHN0YXRlLgotICAgICAgICBvcHRpb25zLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSk7CisgICAgICAgIG9wdGlvbnMuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKTsKICAgICAgICAgcmV0dXJuIG9wdGlvbnMudG9CdW5kbGUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VySW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VySW50ZXJuYWwuamF2YQppbmRleCA0ZDAzZTQ0Li43ZTk5MGM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0lucHV0TWFuYWdlckludGVybmFsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9JbnB1dE1hbmFnZXJJbnRlcm5hbC5qYXZhCkBAIC05Niw3ICs5NiwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmlydHVhbE1vdXNlUG9pbnRlckRpc3BsYXlJZCgpOwogCi0gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIG1vdXNlIGN1cnNvci4gKi8KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5hTi1zIGFzIHRoZSBjb29yZGluYXRlcyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0lucHV0TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGIyYjIyYTAuLmVmYzRmMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yODYzLDkgKzI4NjMsNiBAQAogCiAgICAgICAgIGludCBnZXRQb2ludGVyRGlzcGxheUlkKCk7CiAKLSAgICAgICAgLyoqIEdldHMgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcidzIGN1cnJlbnQgcG9zaXRpb24uICovCi0gICAgICAgIFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBOb3RpZmllcyB3aW5kb3cgbWFuYWdlciB0aGF0IGEge0BsaW5rIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCNBQ1RJT05fRE9XTn0gcG9pbnRlciBldmVudAogICAgICAgICAgKiBvY2N1cnJlZCBvbiBhIHdpbmRvdyB0aGF0IGRpZCBub3QgaGF2ZSBmb2N1cy4KQEAgLTMxODksNyArMzE4NiwxMSBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUG9pbnRGIGdldEN1cnNvclBvc2l0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dNYW5hZ2VyQ2FsbGJhY2tzLmdldEN1cnNvclBvc2l0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIHAgPSBtTmF0aXZlLmdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5sZW5ndGggIT0gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbW91c2UgY3Vyc29yIHBvc2l0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50RihwWzBdLCBwWzFdKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9LZXlib2FyZExheW91dE1hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvS2V5Ym9hcmRMYXlvdXRNYW5hZ2VyLmphdmEKaW5kZXggZjg3M2ExYi4uNGQ0YTg3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9LZXlib2FyZExheW91dE1hbmFnZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0tleWJvYXJkTGF5b3V0TWFuYWdlci5qYXZhCkBAIC02NSw2ICs2NSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubWVzc2FnZXMubmFuby5TeXN0ZW1NZXNzYWdlUHJvdG87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubm90aWZpY2F0aW9uLlN5c3RlbU5vdGlmaWNhdGlvbkNoYW5uZWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlckludGVybmFsOwogCiBpbXBvcnQgbGliY29yZS5pby5TdHJlYW1zOwogCkBAIC0xMjI2LDkgKzEyMjcsMTUgQEAKICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKSk7CiAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbnB1dE1ldGhvZE1hbmFnZXIgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKSk7CisgICAgICAgIC8vIE5lZWQgdG8gdXNlIElucHV0TWV0aG9kTWFuYWdlckludGVybmFsIHRvIGNhbGwgZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdEFzVXNlcigpCisgICAgICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgSW5wdXRNZXRob2RNYW5hZ2VyIHdoaWNoIHVzZXMgZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9ucygpIHRoYXQKKyAgICAgICAgLy8gYnJlYWtzIHdoZW4gd2UgYXJlIGNhbGxpbmcgdGhlIG1ldGhvZCBmb3Igd29yayBwcm9maWxlIHVzZXIgSUQgc2luY2UgaXQgZG9lc24ndCBjaGVjaworICAgICAgICAvLyBzZWxmIHBlcm1pc3Npb25zLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXJJbnRlcm5hbCBpbnB1dE1ldGhvZE1hbmFnZXJJbnRlcm5hbCA9IElucHV0TWV0aG9kTWFuYWdlckludGVybmFsLmdldCgpOwogICAgICAgICBmb3IgKFVzZXJIYW5kbGUgdXNlckhhbmRsZSA6IHVzZXJNYW5hZ2VyLmdldFVzZXJIYW5kbGVzKHRydWUgLyogZXhjbHVkZUR5aW5nICovKSkgewogICAgICAgICAgICAgaW50IHVzZXJJZCA9IHVzZXJIYW5kbGUuZ2V0SWRlbnRpZmllcigpOwotICAgICAgICAgICAgZm9yIChJbnB1dE1ldGhvZEluZm8gaW1lSW5mbyA6IGlucHV0TWV0aG9kTWFuYWdlci5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0QXNVc2VyKAorICAgICAgICAgICAgZm9yIChJbnB1dE1ldGhvZEluZm8gaW1lSW5mbyA6CisgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kTWFuYWdlckludGVybmFsLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RBc1VzZXIoCiAgICAgICAgICAgICAgICAgICAgIHVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICBmb3IgKElucHV0TWV0aG9kU3VidHlwZSBpbWVTdWJ0eXBlIDoKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kTWFuYWdlci5nZXRFbmFibGVkSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9OYXRpdmVJbnB1dE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMjIyMjZlOC4uNTM5NTMwMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yMjQsNiArMjI0LDE2IEBACiAgICAgLyoqIFNldCB3aGV0aGVyIHN0eWx1cyBidXR0b24gcmVwb3J0aW5nIHRocm91Z2ggbW90aW9uIGV2ZW50cyBzaG91bGQgYmUgZW5hYmxlZC4gKi8KICAgICB2b2lkIHNldFN0eWx1c0J1dHRvbk1vdGlvbkV2ZW50c0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yLgorICAgICAqCisgICAgICogSWYgdGhlIG1vdXNlIGN1cnNvciBpcyBub3QgY3VycmVudGx5IHNob3duLCB0aGUgY29vcmRpbmF0ZSB2YWx1ZXMgd2lsbCBiZSBOYU4tcy4KKyAgICAgKgorICAgICAqIE5PVEU6IFRoaXMgd2lsbCBncmFiIHRoZSBQb2ludGVyQ29udHJvbGxlcidzIGxvY2ssIHNvIHdlIG11c3QgYmUgY2FyZWZ1bCBhYm91dCBjYWxsaW5nIHRoaXMKKyAgICAgKiBmcm9tIHRoZSBJbnB1dFJlYWRlciBvciBEaXNwbGF5IHRocmVhZHMsIHdoaWNoIG1heSByZXN1bHQgaW4gYSBkZWFkbG9jay4KKyAgICAgKi8KKyAgICBmbG9hdFtdIGdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKTsKKwogICAgIC8qKiBUaGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIElucHV0TWFuYWdlclNlcnZpY2UgbWV0aG9kcy4gKi8KICAgICBjbGFzcyBOYXRpdmVJbXBsIGltcGxlbWVudHMgTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZSB7CiAgICAgICAgIC8qKiBQb2ludGVyIHRvIG5hdGl2ZSBpbnB1dCBtYW5hZ2VyIHNlcnZpY2Ugb2JqZWN0LCB1c2VkIGJ5IG5hdGl2ZSBjb2RlLiAqLwpAQCAtNDY1LDUgKzQ3NSw4IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBuYXRpdmUgZmxvYXRbXSBnZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvRGVmYXVsdEltZVZpc2liaWxpdHlBcHBsaWVyLmphdmEKaW5kZXggOWY3ZmYzMS4uMGFlMWU4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0RlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllci5qYXZhCkBAIC0xMzYsMTcgKzEzNiwxNiBAQAogICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VySW50ZXJuYWwuc2hvd0ltZVBvc3RMYXlvdXQod2luZG93VG9rZW4sIHN0YXRzVG9rZW4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFURV9ISURFX0lNRToKLSAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UubUN1ckZvY3VzZWRXaW5kb3dDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5oYXNBdHRhY2hlZENsaWVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEltZVRyYWNrZXIuZm9yTG9nZ2luZygpLm9uUHJvZ3Jlc3Moc3RhdHNUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWVUcmFja2VyLlBIQVNFX1NFUlZFUl9BUFBMWV9JTUVfVklTSUJJTElUWSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIElNTVMgb25seSBrbm93cyBvZiBmb2N1c2VkIHdpbmRvdywgbm90IHRoZSBhY3R1YWwgSU1FIHRhcmdldC4KICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBpdCBpc24ndCBhd2FyZSBvZiBhbnkgd2luZG93IHRoYXQgaGFzIGJvdGgKICAgICAgICAgICAgICAgICAgICAgLy8gTk9UX0ZPQ1VTQUJMRSwgQUxUX0ZPQ1VTQUJMRV9JTSBmbGFncyBzZXQgYW5kIGNhbiB0aGUgSU1FIHRhcmdldC4KLSAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBpdCB0byB3aW5kb3cgbWFuYWdlciB0byBoaWRlIElNRSBmcm9tIElNRSB0YXJnZXQgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTM5ODYxMjcwKTogc2VuZCB0byBtQ3VyQ2xpZW50LmNsaWVudCBvbmNlIElNTVMgaXMgYXdhcmUgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsIElNRSB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgaXQgdG8gd2luZG93IG1hbmFnZXIgdG8gaGlkZSBJTUUgZnJvbSB0aGUgYWN0dWFsIElNRSBjb250cm9sIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGFyZ2V0IGRpc3BsYXkuCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VySW50ZXJuYWwuaGlkZUltZSh3aW5kb3dUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5tQ3VyRm9jdXNlZFdpbmRvd0NsaWVudC5tU2VsZlJlcG9ydGVkRGlzcGxheUlkLCBzdGF0c1Rva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXREaXNwbGF5SWRUb1Nob3dJbWVMb2NrZWQoKSwgc3RhdHNUb2tlbik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgSW1lVHJhY2tlci5mb3JMb2dnaW5nKCkub25GYWlsZWQoc3RhdHNUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWVUcmFja2VyLlBIQVNFX1NFUlZFUl9BUFBMWV9JTUVfVklTSUJJTElUWSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDkxZjkxZjguLmIzMzZiOTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNDg4LDE2ICsxNDg4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2UgPSBpc1BhY2thZ2VEaXNhcHBlYXJpbmcoaW1pLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFja2FnZU1vZGlmaWVkKGltaS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsU3VidHlwZU1hcC5yZW1vdmUoaW1pLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxTdWJ0eXBlVXRpbHMuc2F2ZShtQWRkaXRpb25hbFN1YnR5cGVNYXAsIG1NZXRob2RNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3MuZ2V0Q3VycmVudFVzZXJJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9URU1QT1JBUllfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1BFUk1BTkVOVF9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5wdXQgbWV0aG9kIHVuaW5zdGFsbGVkLCBkaXNhYmxpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW1pLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dE1ldGhvZEVuYWJsZWRMb2NrZWQoaW1pLmdldElkKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlID09IFBBQ0tBR0VfVVBEQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklucHV0IG1ldGhvZCByZWluc3RhbGxpbmcsIGNsZWFyaW5nIGFkZGl0aW9uYWwgc3VidHlwZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbWkuZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsU3VidHlwZU1hcC5yZW1vdmUoaW1pLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxTdWJ0eXBlVXRpbHMuc2F2ZShtQWRkaXRpb25hbFN1YnR5cGVNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0aG9kTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldEN1cnJlbnRVc2VySWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yMzM2LDYgKzIzMzksMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIHtAbGluayBDbGllbnRTdGF0ZX0gaGFzIGF0dGFjaGVkIGZyb20gc3RhcnRpbmcgdGhlIGlucHV0IGNvbm5lY3Rpb24uICovCisgICAgQEd1YXJkZWRCeSgiSW1mTG9jay5jbGFzcyIpCisgICAgYm9vbGVhbiBoYXNBdHRhY2hlZENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJDbGllbnQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICB2b2lkIHNldEF0dGFjaGVkQ2xpZW50Rm9yVGVzdGluZyhATm9uTnVsbCBDbGllbnRTdGF0ZSBjcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKEltZkxvY2suY2xhc3MpIHsKKyAgICAgICAgICAgIG1DdXJDbGllbnQgPSBjczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBHdWFyZGVkQnkoIkltZkxvY2suY2xhc3MiKQogICAgIHZvaWQgY2xlYXJJbnB1dFNob3duTG9ja2VkKCkgewogICAgICAgICBtVmlzaWJpbGl0eVN0YXRlQ29tcHV0ZXIuc2V0SW5wdXRTaG93bihmYWxzZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Db25kaXRpb25Qcm92aWRlcnMuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVycy5qYXZhCmluZGV4IDMzMjlmNTQuLjAzMGM5NmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVycy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVycy5qYXZhCkBAIC0yNjEsMTEgKzI2MSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDb25kaXRpb25bXSByZW1vdmVEdXBsaWNhdGVDb25kaXRpb25zKFN0cmluZyBwa2csIENvbmRpdGlvbltdIGNvbmRpdGlvbnMpIHsKKyAgICBwcml2YXRlIENvbmRpdGlvbltdIGdldFZhbGlkQ29uZGl0aW9ucyhTdHJpbmcgcGtnLCBDb25kaXRpb25bXSBjb25kaXRpb25zKSB7CiAgICAgICAgIGlmIChjb25kaXRpb25zID09IG51bGwgfHwgY29uZGl0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CiAgICAgICAgIGZpbmFsIGludCBOID0gY29uZGl0aW9ucy5sZW5ndGg7CiAgICAgICAgIGZpbmFsIEFycmF5TWFwPFVyaSwgQ29uZGl0aW9uPiB2YWxpZCA9IG5ldyBBcnJheU1hcDxVcmksIENvbmRpdGlvbj4oTik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29uZGl0aW9uc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIG51bGwgY29uZGl0aW9uIGZyb20gIiArIHBrZyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBVcmkgaWQgPSBjb25kaXRpb25zW2ldLmlkOwogICAgICAgICAgICAgaWYgKHZhbGlkLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJZ25vcmluZyBjb25kaXRpb24gZnJvbSAiICsgcGtnICsgIiBmb3IgZHVwbGljYXRlIGlkOiAiICsgaWQpOwpAQCAtMzAzLDcgKzMwNyw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZChtTXV0ZXgpIHsKICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm5vdGlmeUNvbmRpdGlvbnMgcGtnPSIgKyBwa2cgKyAiIGluZm89IiArIGluZm8gKyAiIGNvbmRpdGlvbnM9IgogICAgICAgICAgICAgICAgICAgICArIChjb25kaXRpb25zID09IG51bGwgPyBudWxsIDogQXJyYXlzLmFzTGlzdChjb25kaXRpb25zKSkpOwotICAgICAgICAgICAgY29uZGl0aW9ucyA9IHJlbW92ZUR1cGxpY2F0ZUNvbmRpdGlvbnMocGtnLCBjb25kaXRpb25zKTsKKyAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBnZXRWYWxpZENvbmRpdGlvbnMocGtnLCBjb25kaXRpb25zKTsKICAgICAgICAgICAgIGlmIChjb25kaXRpb25zID09IG51bGwgfHwgY29uZGl0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBjb25kaXRpb25zLmxlbmd0aDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBjMmU4ZGYxLi40NjMzN2E5IDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTY4NjQsNyArNjg2NCw4IEBACiAgICAgICogQSBub3RpZmljYXRpb24gc2hvdWxkIGJlIGRpc21pc3NpYmxlLCB1bmxlc3MgaXQncyBleGVtcHRlZCBmb3Igc29tZSByZWFzb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbkJlTm9uRGlzbWlzc2libGUoQXBwbGljYXRpb25JbmZvIGFpLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBub3RpZmljYXRpb24uaXNNZWRpYU5vdGlmaWNhdGlvbigpIHx8IGlzRW50ZXJwcmlzZUV4ZW1wdGVkKGFpKTsKKyAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5pc01lZGlhTm90aWZpY2F0aW9uKCkgfHwgaXNFbnRlcnByaXNlRXhlbXB0ZWQoYWkpCisgICAgICAgICAgICAgICAgfHwgaXNDYWxsTm90aWZpY2F0aW9uKGFpLnBhY2thZ2VOYW1lLCBhaS51aWQsIG5vdGlmaWNhdGlvbik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzRW50ZXJwcmlzZUV4ZW1wdGVkKEFwcGxpY2F0aW9uSW5mbyBhaSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL1ZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLmphdmEKaW5kZXggNWUwYTE4MC4uODQxNzA0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiBwdWJsaWMgY2xhc3MgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TaWduYWxFeHRyYWN0b3IgewogICAgIC8vIFVzaW5nIGEgc2hvcnRlciBsb2cgdGFnIHNpbmNlIHNldHByb3AgaGFzIGEgbGltaXQgb2YgMzJjaGFycyBvbiB2YXJpYWJsZSBuYW1lLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmFsaWRhdGVOb1Blb3BsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRV9QRU9QTEVfVkFMSURBVE9SID0gdHJ1ZTsKQEAgLTEwNSwxMiArMTA1LDEzIEBACiAgICAgcHJpdmF0ZSBpbnQgbUV2aWN0aW9uQ291bnQ7CiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25Vc2FnZVN0YXRzIG1Vc2FnZVN0YXRzOwogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb250ZXh0IGNvbnRleHQsIE5vdGlmaWNhdGlvblVzYWdlU3RhdHMgdXNhZ2VTdGF0cykgewogICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJJbml0aWFsaXppbmcgICIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIik7CiAgICAgICAgIG1Vc2VyVG9Db250ZXh0TWFwID0gbmV3IEFycmF5TWFwPD4oKTsKICAgICAgICAgbUJhc2VDb250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVVzYWdlU3RhdHMgPSB1c2FnZVN0YXRzOwotICAgICAgICBtUGVvcGxlQ2FjaGUgPSBuZXcgTHJ1Q2FjaGU8U3RyaW5nLCBMb29rdXBSZXN1bHQ+KFBFT1BMRV9DQUNIRV9TSVpFKTsKKyAgICAgICAgbVBlb3BsZUNhY2hlID0gbmV3IExydUNhY2hlPD4oUEVPUExFX0NBQ0hFX1NJWkUpOwogICAgICAgICBtRW5hYmxlZCA9IEVOQUJMRV9QRU9QTEVfVkFMSURBVE9SICYmIDEgPT0gU2V0dGluZ3MuR2xvYmFsLmdldEludCgKICAgICAgICAgICAgICAgICBtQmFzZUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNFVFRJTkdfRU5BQkxFX1BFT1BMRV9WQUxJREFUT1IsIDEpOwogICAgICAgICBpZiAobUVuYWJsZWQpIHsKQEAgLTEzNCw3ICsxMzUsNyBAQAogICAgIC8vIEZvciB0ZXN0czoganVzdCBkbyB0aGUgc2V0dGluZyBvZiB2YXJpb3VzIGxvY2FsIHZhcmlhYmxlcyB3aXRob3V0IGFjdHVhbGx5IGRvaW5nIHdvcmsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Rm9yVGVzdHMoQ29udGV4dCBjb250ZXh0LCBOb3RpZmljYXRpb25Vc2FnZVN0YXRzIHVzYWdlU3RhdHMsCi0gICAgICAgICAgICBMcnVDYWNoZSBwZW9wbGVDYWNoZSkgeworICAgICAgICAgICAgTHJ1Q2FjaGU8U3RyaW5nLCBMb29rdXBSZXN1bHQ+IHBlb3BsZUNhY2hlKSB7CiAgICAgICAgIG1Vc2VyVG9Db250ZXh0TWFwID0gbmV3IEFycmF5TWFwPD4oKTsKICAgICAgICAgbUJhc2VDb250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVVzYWdlU3RhdHMgPSB1c2FnZVN0YXRzOwpAQCAtMTQyLDYgKzE0Myw3IEBACiAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUmFua2luZ1JlY29uc2lkZXJhdGlvbiBwcm9jZXNzKE5vdGlmaWNhdGlvblJlY29yZCByZWNvcmQpIHsKICAgICAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICAgICAgaWYgKFZFUkJPU0UpIFNsb2cuaShUQUcsICJkaXNhYmxlZCIpOwpAQCAtMjcyLDcgKzI3NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoVkVSQk9TRSkgU2xvZy5pKFRBRywgIlZhbGlkYXRpbmc6ICIgKyBrZXkgKyAiIGZvciAiICsgY29udGV4dC5nZXRVc2VySWQoKSk7Ci0gICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBwZW5kaW5nTG9va3VwcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IHBlbmRpbmdMb29rdXBzID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgICBpbnQgcGVyc29uSWR4ID0gMDsKICAgICAgICAgZm9yIChTdHJpbmcgaGFuZGxlIDogcGVvcGxlKSB7CiAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoaGFuZGxlKSkgY29udGludWU7CkBAIC0zMjAsNyArMzIyLDYgQEAKICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodXNlcklkKSArICI6IiArIGhhbmRsZTsKICAgICB9CiAKLSAgICAvLyBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RXh0cmFQZW9wbGUoQnVuZGxlIGV4dHJhcykgewogICAgICAgICBTdHJpbmdbXSBwZW9wbGVMaXN0ID0gZ2V0RXh0cmFQZW9wbGVGb3JLZXkoZXh0cmFzLCBOb3RpZmljYXRpb24uRVhUUkFfUEVPUExFX0xJU1QpOwogICAgICAgICBTdHJpbmdbXSBsZWdhY3lQZW9wbGUgPSBnZXRFeHRyYVBlb3BsZUZvcktleShleHRyYXMsIE5vdGlmaWNhdGlvbi5FWFRSQV9QRU9QTEUpOwpAQCAtNDE3LDEwMSArNDE4LDYgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBMb29rdXBSZXN1bHQgcmVzb2x2ZVBob25lQ29udGFjdChDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgVXJpIHBob25lVXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQ29udGFjdHNDb250cmFjdC5QaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksCi0gICAgICAgICAgICAgICAgVXJpLmVuY29kZShudW1iZXIpKTsKLSAgICAgICAgcmV0dXJuIHNlYXJjaENvbnRhY3RzKGNvbnRleHQsIHBob25lVXJpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExvb2t1cFJlc3VsdCByZXNvbHZlRW1haWxDb250YWN0KENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGVtYWlsKSB7Ci0gICAgICAgIFVyaSBudW1iZXJVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aCgKLSAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbC5DT05URU5UX0xPT0tVUF9VUkksCi0gICAgICAgICAgICAgICAgVXJpLmVuY29kZShlbWFpbCkpOwotICAgICAgICByZXR1cm4gc2VhcmNoQ29udGFjdHMoY29udGV4dCwgbnVtYmVyVXJpKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBMb29rdXBSZXN1bHQgc2VhcmNoQ29udGFjdHMoQ29udGV4dCBjb250ZXh0LCBVcmkgbG9va3VwVXJpKSB7Ci0gICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQgPSBuZXcgTG9va3VwUmVzdWx0KCk7Ci0gICAgICAgIGZpbmFsIFVyaSBjb3JwTG9va3VwVXJpID0KLSAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLmNyZWF0ZUNvcnBMb29rdXBVcmlGcm9tRW50ZXJwcmlzZUxvb2t1cFVyaShsb29rdXBVcmkpOwotICAgICAgICBpZiAoY29ycExvb2t1cFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRDb250YWN0cyhsb29rdXBSZXN1bHQsIGNvbnRleHQsIGxvb2t1cFVyaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRXb3JrQ29udGFjdHMobG9va3VwUmVzdWx0LCBjb250ZXh0LCBjb3JwTG9va3VwVXJpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9va3VwUmVzdWx0OwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIC8vIFBlcmZvcm1zIGEgY29udGFjdHMgc2VhcmNoIHVzaW5nIHNlYXJjaENvbnRhY3RzLCBhbmQgdGhlbiBmb2xsb3dzIHVwIGJ5IGxvb2tpbmcgdXAKLSAgICAvLyBhbnkgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdGluZyBjb250YWN0IGluZm9ybWF0aW9uIGFuZCBtZXJnZSB0aG9zZQotICAgIC8vIGludG8gdGhlIGxvb2t1cCByZXN1bHQgYXMgd2VsbC4gV2lsbCBoYXZlIG5vIGFkZGl0aW9uYWwgZWZmZWN0IGlmIHRoZSBjb250YWN0IGRvZXMKLSAgICAvLyBub3QgaGF2ZSBhbnkgcGhvbmUgbnVtYmVycy4KLSAgICBMb29rdXBSZXN1bHQgc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKENvbnRleHQgY29udGV4dCwgVXJpIGxvb2t1cFVyaSkgewotICAgICAgICBMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0ID0gc2VhcmNoQ29udGFjdHMoY29udGV4dCwgbG9va3VwVXJpKTsKLSAgICAgICAgU3RyaW5nIHBob25lTG9va3VwS2V5ID0gbG9va3VwUmVzdWx0LmdldFBob25lTG9va3VwS2V5KCk7Ci0gICAgICAgIGlmIChwaG9uZUxvb2t1cEtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gQ29udGFjdHMuTE9PS1VQX0tFWSArICIgPSA/IjsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10geyBwaG9uZUxvb2t1cEtleSB9OwotICAgICAgICAgICAgdHJ5IChDdXJzb3IgY3Vyc29yID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9VUkksIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIC8qIHNvcnRPcmRlcj0gKi8gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkN1cnNvciBpcyBudWxsIHdoZW4gcXVlcnlpbmcgY29udGFjdCBwaG9uZSBudW1iZXIuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9va3VwUmVzdWx0Lm1lcmdlUGhvbmVOdW1iZXIoY3Vyc29yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJQcm9ibGVtIGdldHRpbmcgY29udGVudCByZXNvbHZlciBvciBxdWVyeWluZyBwaG9uZSBudW1iZXJzLiIsIHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFdvcmtDb250YWN0cyhMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0LCBDb250ZXh0IGNvbnRleHQsIFVyaSBjb3JwTG9va3VwVXJpKSB7Ci0gICAgICAgIGZpbmFsIGludCB3b3JrVXNlcklkID0gZmluZFdvcmtVc2VySWQoY29udGV4dCk7Ci0gICAgICAgIGlmICh3b3JrVXNlcklkID09IC0xKSB7Ci0gICAgICAgICAgICBTbG9nLncoVEFHLCAiV29yayBwcm9maWxlIHVzZXIgSUQgbm90IGZvdW5kIGZvciB3b3JrIGNvbnRhY3Q6ICIgKyBjb3JwTG9va3VwVXJpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBVcmkgY29ycExvb2t1cFVyaVdpdGhVc2VySWQgPQotICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlci5tYXliZUFkZFVzZXJJZChjb3JwTG9va3VwVXJpLCB3b3JrVXNlcklkKTsKLSAgICAgICAgYWRkQ29udGFjdHMobG9va3VwUmVzdWx0LCBjb250ZXh0LCBjb3JwTG9va3VwVXJpV2l0aFVzZXJJZCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIG1hbmFnZWQgcHJvZmlsZSBvciAtMSBpZiBub25lIGlzIGZvdW5kLiAqLwotICAgIHByaXZhdGUgaW50IGZpbmRXb3JrVXNlcklkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIGZpbmFsIGludFtdIHByb2ZpbGVJZHMgPQotICAgICAgICAgICAgICAgIHVzZXJNYW5hZ2VyLmdldFByb2ZpbGVJZHMoY29udGV4dC5nZXRVc2VySWQoKSwgLyogZW5hYmxlZE9ubHk9ICovIHRydWUpOwotICAgICAgICBmb3IgKGludCBwcm9maWxlSWQgOiBwcm9maWxlSWRzKSB7Ci0gICAgICAgICAgICBpZiAodXNlck1hbmFnZXIuaXNNYW5hZ2VkUHJvZmlsZShwcm9maWxlSWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqIE1vZGlmaWVzIHRoZSBnaXZlbiBsb29rdXAgcmVzdWx0IHRvIGFkZCBjb250YWN0cyBmb3VuZCBhdCB0aGUgZ2l2ZW4gVVJJLiAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRDb250YWN0cyhMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0LCBDb250ZXh0IGNvbnRleHQsIFVyaSB1cmkpIHsKLSAgICAgICAgdHJ5IChDdXJzb3IgYyA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCi0gICAgICAgICAgICAgICAgdXJpLCBMT09LVVBfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTnVsbCBjdXJzb3IgZnJvbSBjb250YWN0cyBxdWVyeS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBsb29rdXBSZXN1bHQubWVyZ2VDb250YWN0KGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgU2xvZy53KFRBRywgIlByb2JsZW0gZ2V0dGluZyBjb250ZW50IHJlc29sdmVyIG9yIHBlcmZvcm1pbmcgY29udGFjdHMgcXVlcnkuIiwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvb2t1cFJlc3VsdCB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQ09OVEFDVF9SRUZSRVNIX01JTExJUyA9IDYwICogNjAgKiAxMDAwOyAgLy8gMWhyCkBAIC02MTksMTkgKzUyNSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBQZW9wbGVSYW5raW5nUmVjb25zaWRlcmF0aW9uIGV4dGVuZHMgUmFua2luZ1JlY29uc2lkZXJhdGlvbiB7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgY2xhc3MgUGVvcGxlUmFua2luZ1JlY29uc2lkZXJhdGlvbiBleHRlbmRzIFJhbmtpbmdSZWNvbnNpZGVyYXRpb24gewogICAgICAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBtUGVuZGluZ0xvb2t1cHM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKIAotICAgICAgICAvLyBBbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIHJlc3VsdCBmcm9tIHRoZSBjb250YWN0cyBkYiBiZWZvcmUgcmVjaGVja2luZyBhZmZpbml0eS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMT09LVVBfVElNRSA9IDEwMDA7CiAgICAgICAgIHByaXZhdGUgZmxvYXQgbUNvbnRhY3RBZmZpbml0eSA9IE5PTkU7CiAgICAgICAgIHByaXZhdGUgQXJyYXlTZXQ8U3RyaW5nPiBtUGhvbmVOdW1iZXJzID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25SZWNvcmQgbVJlY29yZDsKIAogICAgICAgICBwcml2YXRlIFBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb24oQ29udGV4dCBjb250ZXh0LCBTdHJpbmcga2V5LAogICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBwZW5kaW5nTG9va3VwcykgewotICAgICAgICAgICAgc3VwZXIoa2V5LCBMT09LVVBfVElNRSk7CisgICAgICAgICAgICBzdXBlcihrZXkpOwogICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICAgICAgbVBlbmRpbmdMb29rdXBzID0gcGVuZGluZ0xvb2t1cHM7CiAgICAgICAgIH0KQEAgLTY0Miw3ICs1NDcsNyBAQAogICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnRNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgaGFuZGxlOiBtUGVuZGluZ0xvb2t1cHMpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShtQ29udGV4dC5nZXRVc2VySWQoKSwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0OwogICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FjaGVIaXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QZW9wbGVDYWNoZSkgewogICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXN1bHQgPSBtUGVvcGxlQ2FjaGUuZ2V0KGNhY2hlS2V5KTsKQEAgLTcwMyw2ICs2MDgsMTAyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBMb29rdXBSZXN1bHQgcmVzb2x2ZVBob25lQ29udGFjdChDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBudW1iZXIpIHsKKyAgICAgICAgICAgIFVyaSBwaG9uZVVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKENvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXAuQ09OVEVOVF9GSUxURVJfVVJJLAorICAgICAgICAgICAgICAgICAgICBVcmkuZW5jb2RlKG51bWJlcikpOworICAgICAgICAgICAgcmV0dXJuIHNlYXJjaENvbnRhY3RzKGNvbnRleHQsIHBob25lVXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExvb2t1cFJlc3VsdCByZXNvbHZlRW1haWxDb250YWN0KENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGVtYWlsKSB7CisgICAgICAgICAgICBVcmkgbnVtYmVyVXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoCisgICAgICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfTE9PS1VQX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgVXJpLmVuY29kZShlbWFpbCkpOworICAgICAgICAgICAgcmV0dXJuIHNlYXJjaENvbnRhY3RzKGNvbnRleHQsIG51bWJlclVyaSk7CisgICAgICAgIH0KKworICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICAgICAgc3RhdGljIExvb2t1cFJlc3VsdCBzZWFyY2hDb250YWN0cyhDb250ZXh0IGNvbnRleHQsIFVyaSBsb29rdXBVcmkpIHsKKyAgICAgICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQgPSBuZXcgTG9va3VwUmVzdWx0KCk7CisgICAgICAgICAgICBmaW5hbCBVcmkgY29ycExvb2t1cFVyaSA9CisgICAgICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuY3JlYXRlQ29ycExvb2t1cFVyaUZyb21FbnRlcnByaXNlTG9va3VwVXJpKGxvb2t1cFVyaSk7CisgICAgICAgICAgICBpZiAoY29ycExvb2t1cFVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkQ29udGFjdHMobG9va3VwUmVzdWx0LCBjb250ZXh0LCBsb29rdXBVcmkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRXb3JrQ29udGFjdHMobG9va3VwUmVzdWx0LCBjb250ZXh0LCBjb3JwTG9va3VwVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICAgICAgLy8gUGVyZm9ybXMgYSBjb250YWN0cyBzZWFyY2ggdXNpbmcgc2VhcmNoQ29udGFjdHMsIGFuZCB0aGVuIGZvbGxvd3MgdXAgYnkgbG9va2luZyB1cAorICAgICAgICAvLyBhbnkgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdGluZyBjb250YWN0IGluZm9ybWF0aW9uIGFuZCBtZXJnZSB0aG9zZQorICAgICAgICAvLyBpbnRvIHRoZSBsb29rdXAgcmVzdWx0IGFzIHdlbGwuIFdpbGwgaGF2ZSBubyBhZGRpdGlvbmFsIGVmZmVjdCBpZiB0aGUgY29udGFjdCBkb2VzCisgICAgICAgIC8vIG5vdCBoYXZlIGFueSBwaG9uZSBudW1iZXJzLgorICAgICAgICBzdGF0aWMgTG9va3VwUmVzdWx0IHNlYXJjaENvbnRhY3RzQW5kTG9va3VwTnVtYmVycyhDb250ZXh0IGNvbnRleHQsIFVyaSBsb29rdXBVcmkpIHsKKyAgICAgICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQgPSBzZWFyY2hDb250YWN0cyhjb250ZXh0LCBsb29rdXBVcmkpOworICAgICAgICAgICAgU3RyaW5nIHBob25lTG9va3VwS2V5ID0gbG9va3VwUmVzdWx0LmdldFBob25lTG9va3VwS2V5KCk7CisgICAgICAgICAgICBpZiAocGhvbmVMb29rdXBLZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBDb250YWN0cy5MT09LVVBfS0VZICsgIiA9ID8iOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10geyBwaG9uZUxvb2t1cEtleSB9OworICAgICAgICAgICAgICAgIHRyeSAoQ3Vyc29yIGN1cnNvciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX1VSSSwgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIC8qIHNvcnRPcmRlcj0gKi8gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ3Vyc29yIGlzIG51bGwgd2hlbiBxdWVyeWluZyBjb250YWN0IHBob25lIG51bWJlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwUmVzdWx0Lm1lcmdlUGhvbmVOdW1iZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJQcm9ibGVtIGdldHRpbmcgY29udGVudCByZXNvbHZlciBvciBxdWVyeWluZyBwaG9uZSBudW1iZXJzLiIsIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdvcmtDb250YWN0cyhMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0LCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgVXJpIGNvcnBMb29rdXBVcmkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB3b3JrVXNlcklkID0gZmluZFdvcmtVc2VySWQoY29udGV4dCk7CisgICAgICAgICAgICBpZiAod29ya1VzZXJJZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJXb3JrIHByb2ZpbGUgdXNlciBJRCBub3QgZm91bmQgZm9yIHdvcmsgY29udGFjdDogIiArIGNvcnBMb29rdXBVcmkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFVyaSBjb3JwTG9va3VwVXJpV2l0aFVzZXJJZCA9CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlci5tYXliZUFkZFVzZXJJZChjb3JwTG9va3VwVXJpLCB3b3JrVXNlcklkKTsKKyAgICAgICAgICAgIGFkZENvbnRhY3RzKGxvb2t1cFJlc3VsdCwgY29udGV4dCwgY29ycExvb2t1cFVyaVdpdGhVc2VySWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIG1hbmFnZWQgcHJvZmlsZSBvciAtMSBpZiBub25lIGlzIGZvdW5kLiAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZFdvcmtVc2VySWQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBwcm9maWxlSWRzID0KKyAgICAgICAgICAgICAgICAgICAgdXNlck1hbmFnZXIuZ2V0UHJvZmlsZUlkcyhjb250ZXh0LmdldFVzZXJJZCgpLCAvKiBlbmFibGVkT25seT0gKi8gdHJ1ZSk7CisgICAgICAgICAgICBmb3IgKGludCBwcm9maWxlSWQgOiBwcm9maWxlSWRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZXJNYW5hZ2VyLmlzTWFuYWdlZFByb2ZpbGUocHJvZmlsZUlkKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNb2RpZmllcyB0aGUgZ2l2ZW4gbG9va3VwIHJlc3VsdCB0byBhZGQgY29udGFjdHMgZm91bmQgYXQgdGhlIGdpdmVuIFVSSS4gKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb250YWN0cyhMb29rdXBSZXN1bHQgbG9va3VwUmVzdWx0LCBDb250ZXh0IGNvbnRleHQsIFVyaSB1cmkpIHsKKyAgICAgICAgICAgIHRyeSAoQ3Vyc29yIGMgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB1cmksIExPT0tVUF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKSkgeworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk51bGwgY3Vyc29yIGZyb20gY29udGFjdHMgcXVlcnkuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlc3VsdC5tZXJnZUNvbnRhY3QoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUHJvYmxlbSBnZXR0aW5nIGNvbnRlbnQgcmVzb2x2ZXIgb3IgcGVyZm9ybWluZyBjb250YWN0cyBxdWVyeS4iLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUNoYW5nZXNMb2NrZWQoTm90aWZpY2F0aW9uUmVjb3JkIG9wZXJhbmQpIHsKICAgICAgICAgICAgIGZsb2F0IGFmZmluaXR5Qm91bmQgPSBvcGVyYW5kLmdldENvbnRhY3RBZmZpbml0eSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Db21wdXRlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Db21wdXRlci5qYXZhCmluZGV4IGMyMzJiMzYuLjk3NDhhYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQ29tcHV0ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmluZ0RldGFpbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5WZXJzaW9uZWRQYWNrYWdlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwpAQCAtNDk5LDcgKzUwMCw3IEBACiAgICAgU3RyaW5nIGdldEluc3RhbGxlclBhY2thZ2VOYW1lKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQFVzZXJJZEludCBpbnQgdXNlcklkKTsKIAogICAgIEBOdWxsYWJsZQotICAgIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSk7CisgICAgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLCBAVXNlcklkSW50IGludCB1c2VySWQpOwogCiAgICAgQFBhY2thZ2VNYW5hZ2VyLkVuYWJsZWRTdGF0ZQogICAgIGludCBnZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQFVzZXJJZEludCBpbnQgdXNlcklkKTsKQEAgLTUxOSwxNCArNTIwLDE1IEBACiAgICAgICogcmV0dXJucyBmYWxzZS4KICAgICAgKi8KICAgICBib29sZWFuIGlzQ29tcG9uZW50RWZmZWN0aXZlbHlFbmFibGVkKEBOb25OdWxsIENvbXBvbmVudEluZm8gY29tcG9uZW50SW5mbywKLSAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCk7CisgICAgICAgICAgICBATm9uTnVsbCBVc2VySGFuZGxlIHVzZXJIYW5kbGUpOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBydW50aW1lIGFwcCB1c2VyIGVuYWJsZWQgc3RhdGUgYW5kIHRoZSBpbnN0YWxsLXRpbWUgYXBwIG1hbmlmZXN0IGVuYWJsZWQKICAgICAgKiBzdGF0ZSBhcmUgYm90aCBlZmZlY3RpdmVseSBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gYXBwLiBPciBpZiB0aGUgYXBwIGNhbm5vdCBiZSBmb3VuZCwKICAgICAgKiByZXR1cm5zIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkVmZmVjdGl2ZWx5RW5hYmxlZChATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBVc2VySWRJbnQgaW50IHVzZXJJZCk7CisgICAgYm9vbGVhbiBpc0FwcGxpY2F0aW9uRWZmZWN0aXZlbHlFbmFibGVkKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFVzZXJIYW5kbGUgdXNlckhhbmRsZSk7CiAKICAgICBATnVsbGFibGUKICAgICBLZXlTZXQgZ2V0S2V5U2V0QnlBbGlhcyhATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIFN0cmluZyBhbGlhcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyRW5naW5lLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyRW5naW5lLmphdmEKaW5kZXggNTk4NDM2MC4uYWNkNGE5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Db21wdXRlckVuZ2luZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQ29tcHV0ZXJFbmdpbmUuamF2YQpAQCAtNDk4Miw5ICs0OTgyLDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgcHVibGljIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCkgewogICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGZpbmFsIGludCB1c2VySWQgPSBVc2VySGFuZGxlLmdldFVzZXJJZChjYWxsaW5nVWlkKTsKKyAgICAgICAgZW5mb3JjZUNyb3NzVXNlclBlcm1pc3Npb24oY2FsbGluZ1VpZCwgdXNlcklkLCBmYWxzZSAvKiByZXF1aXJlRnVsbFBlcm1pc3Npb24gKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLyogY2hlY2tTaGVsbCAqLywgImdldEluc3RhbGxTb3VyY2VJbmZvIik7CiAKICAgICAgICAgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lOwogICAgICAgICBTdHJpbmcgaW5pdGlhdGluZ1BhY2thZ2VOYW1lOwpAQCAtNTEyOSw5ICs1MTMxLDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBvbmVudEVmZmVjdGl2ZWx5RW5hYmxlZChATm9uTnVsbCBDb21wb25lbnRJbmZvIGNvbXBvbmVudEluZm8sCi0gICAgICAgICAgICBAVXNlcklkSW50IGludCB1c2VySWQpIHsKKyAgICAgICAgICAgIEBOb25OdWxsIFVzZXJIYW5kbGUgdXNlckhhbmRsZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29tcG9uZW50SW5mby5wYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIGludCB1c2VySWQgPSB1c2VySGFuZGxlLmdldElkZW50aWZpZXIoKTsKICAgICAgICAgICAgIGludCBhcHBFbmFibGVkU2V0dGluZyA9CiAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5ncy5nZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKHBhY2thZ2VOYW1lLCB1c2VySWQpOwogICAgICAgICAgICAgaWYgKGFwcEVuYWJsZWRTZXR0aW5nID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RFRkFVTFQpIHsKQEAgLTUxNTQsOSArNTE1NywxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkVmZmVjdGl2ZWx5RW5hYmxlZChATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBAVXNlcklkSW50IGludCB1c2VySWQpIHsKKyAgICAgICAgICAgIEBOb25OdWxsIFVzZXJIYW5kbGUgdXNlckhhbmRsZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGFwcEVuYWJsZWRTZXR0aW5nID0gbVNldHRpbmdzLmdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcocGFja2FnZU5hbWUsIHVzZXJJZCk7CisgICAgICAgICAgICBpbnQgYXBwRW5hYmxlZFNldHRpbmcgPSBtU2V0dGluZ3MuZ2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZyhwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZS5nZXRJZGVudGlmaWVyKCkpOwogICAgICAgICAgICAgaWYgKGFwcEVuYWJsZWRTZXR0aW5nID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RFRkFVTFQpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBBbmRyb2lkUGFja2FnZSBwa2cgPSBnZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAocGtnID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vSVBhY2thZ2VNYW5hZ2VyQmFzZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JUGFja2FnZU1hbmFnZXJCYXNlLmphdmEKaW5kZXggZDM5Y2FjMC4uYzI5ZTRkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JUGFja2FnZU1hbmFnZXJCYXNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JUGFja2FnZU1hbmFnZXJCYXNlLmphdmEKQEAgLTQ2Myw4ICs0NjMsOSBAQAogICAgIEBPdmVycmlkZQogICAgIEBOdWxsYWJsZQogICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIGZpbmFsIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICByZXR1cm4gc25hcHNob3QoKS5nZXRJbnN0YWxsU291cmNlSW5mbyhwYWNrYWdlTmFtZSk7CisgICAgcHVibGljIGZpbmFsIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCkgeworICAgICAgICByZXR1cm4gc25hcHNob3QoKS5nZXRJbnN0YWxsU291cmNlSW5mbyhwYWNrYWdlTmFtZSwgdXNlcklkKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vSW5jcmVtZW50YWxQcm9ncmVzc0xpc3RlbmVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0luY3JlbWVudGFsUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCmluZGV4IDcwM2JiZGEuLjQyMGUyZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vSW5jcmVtZW50YWxQcm9ncmVzc0xpc3RlbmVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JbmNyZW1lbnRhbFByb2dyZXNzTGlzdGVuZXIuamF2YQpAQCAtNDcsNiArNDcsOCBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzdGF0ZS5zZXRMb2FkaW5nUHJvZ3Jlc3MocHJvZ3Jlc3MpKTsKICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBzdGF0ZSBjaGFuZ2Ugd2hlbiBsb2FkaW5nIHN0YXRlIGNoYW5nZXMgZnJvbSBsb2FkaW5nIHRvIG5vdAogICAgICAgICAgICAgaWYgKE1hdGguYWJzKDEuMGYgLSBwcm9ncmVzcykgPCAwLjAwMDAwMDAxZikgeworICAgICAgICAgICAgICAgIG1QbS5jb21taXRQYWNrYWdlU3RhdGVNdXRhdGlvbihudWxsLCBtUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzdGF0ZS5zZXRMb2FkaW5nQ29tcGxldGVkVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwogICAgICAgICAgICAgICAgIC8vIFVucmVnaXN0ZXIgcHJvZ3Jlc3MgbGlzdGVuZXIKICAgICAgICAgICAgICAgICBtUG0ubUluY3JlbWVudGFsTWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgICAgLnVucmVnaXN0ZXJMb2FkaW5nUHJvZ3Jlc3NDYWxsYmFja3MocGFja2FnZVN0YXRlLmdldFBhdGhTdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VJbnN0YWxsZXJTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VJbnN0YWxsZXJTZXNzaW9uLmphdmEKaW5kZXggZmE1MzVjMy4uMDNlMGQzNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlSW5zdGFsbGVyU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZUluc3RhbGxlclNlc3Npb24uamF2YQpAQCAtOTI1LDcgKzkyNSw3IEBACiAgICAgICAgIGZpbmFsIGludCB0YXJnZXRQYWNrYWdlVWlkID0gc25hcHNob3QuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCwgdXNlcklkKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VwZGF0ZSA9IHRhcmdldFBhY2thZ2VVaWQgIT0gLTEgfHwgaXNBcGV4U2Vzc2lvbigpOwogICAgICAgICBmaW5hbCBJbnN0YWxsU291cmNlSW5mbyBleGlzdGluZ0luc3RhbGxTb3VyY2VJbmZvID0gaXNVcGRhdGUKLSAgICAgICAgICAgICAgICA/IHNuYXBzaG90LmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgID8gc25hcHNob3QuZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUsIHVzZXJJZCkKICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgIGZpbmFsIFN0cmluZyBleGlzdGluZ0luc3RhbGxlclBhY2thZ2VOYW1lID0gZXhpc3RpbmdJbnN0YWxsU291cmNlSW5mbyAhPSBudWxsCiAgICAgICAgICAgICAgICAgPyBleGlzdGluZ0luc3RhbGxTb3VyY2VJbmZvLmdldEluc3RhbGxpbmdQYWNrYWdlTmFtZSgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBkM2VlNTJjLi42YmM4NzYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTEzMjgsNyArMTMyOCw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyY2VsYWJsZUV4Y2VwdGlvbihuZXcgUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uKHBhY2thZ2VOYW1lKSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBJbnN0YWxsU291cmNlSW5mbyBpbnN0YWxsU291cmNlSW5mbyA9IHNuYXBzaG90LmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgZmluYWwgSW5zdGFsbFNvdXJjZUluZm8gaW5zdGFsbFNvdXJjZUluZm8gPSBzbmFwc2hvdC5nZXRJbnN0YWxsU291cmNlSW5mbyhwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICB1c2VySWQpOwogICAgICAgICBmaW5hbCBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZU5hbWU7CiAgICAgICAgIGlmIChpbnN0YWxsU291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGluc3RhbGxTb3VyY2VJbmZvLmdldEluaXRpYXRpbmdQYWNrYWdlTmFtZSgpKSkgewpAQCAtMjU2OSw3ICsyNTcwLDcgQEAKIAogICAgICAgICAgICAgaWYgKGJlc3QgPT0gbnVsbCB8fCBjdXIucHJpb3JpdHkgPiBiZXN0LnByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVyLmlzQ29tcG9uZW50RWZmZWN0aXZlbHlFbmFibGVkKGN1ci5nZXRDb21wb25lbnRJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLlVTRVJfU1lTVEVNKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5TWVNURU0pKSB7CiAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjdXI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkRvbWFpbiB2ZXJpZmljYXRpb24gYWdlbnQgZm91bmQgYnV0IG5vdCBlbmFibGVkIik7CkBAIC02ODExLDcgKzY4MTIsOCBAQAogICAgICAgICAgICAgaWYgKHBzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxTdGF0ZXNJbmZvKHBzLmlzTG9hZGluZygpLCBwcy5nZXRMb2FkaW5nUHJvZ3Jlc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsU3RhdGVzSW5mbyhwcy5pc0xvYWRpbmcoKSwgcHMuZ2V0TG9hZGluZ1Byb2dyZXNzKCksCisgICAgICAgICAgICAgICAgICAgIHBzLmdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCkpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VTZXR0aW5nLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VTZXR0aW5nLmphdmEKaW5kZXggMmExMTcyYy4uODM5ZmY0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlU2V0dGluZy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZVNldHRpbmcuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Vc2VySW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0ub3ZlcmxheS5PdmVybGF5UGF0aHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuaW5jcmVtZW50YWwuSW5jcmVtZW50YWxNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wbS5QYWNrYWdlUHJvdG87CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CkBAIC0xNDAsNiArMTQxLDcgQEAKICAgICBwcml2YXRlIFN0cmluZyBtUGF0aFN0cmluZzsKIAogICAgIHByaXZhdGUgZmxvYXQgbUxvYWRpbmdQcm9ncmVzczsKKyAgICBwcml2YXRlIGxvbmcgbUxvYWRpbmdDb21wbGV0ZWRUaW1lOwogCiAgICAgQE51bGxhYmxlCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVByaW1hcnlDcHVBYmk7CkBAIC02MzAsNiArNjMyLDcgQEAKICAgICAgICAgc3VwZXIuY29weVNldHRpbmdCYXNlKG90aGVyKTsKICAgICAgICAgbVNoYXJlZFVzZXJBcHBJZCA9IG90aGVyLm1TaGFyZWRVc2VyQXBwSWQ7CiAgICAgICAgIG1Mb2FkaW5nUHJvZ3Jlc3MgPSBvdGhlci5tTG9hZGluZ1Byb2dyZXNzOworICAgICAgICBtTG9hZGluZ0NvbXBsZXRlZFRpbWUgPSBvdGhlci5tTG9hZGluZ0NvbXBsZXRlZFRpbWU7CiAgICAgICAgIGxlZ2FjeU5hdGl2ZUxpYnJhcnlQYXRoID0gb3RoZXIubGVnYWN5TmF0aXZlTGlicmFyeVBhdGg7CiAgICAgICAgIG1OYW1lID0gb3RoZXIubU5hbWU7CiAgICAgICAgIG1SZWFsTmFtZSA9IG90aGVyLm1SZWFsTmFtZTsKQEAgLTExNDYsNiArMTE0OSw5IEBACiAgICAgICAgIHJldHVybiByZWFkVXNlclN0YXRlKHVzZXJJZCkuZ2V0U3BsYXNoU2NyZWVuVGhlbWUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudGFsKCkgeworICAgICAgICByZXR1cm4gSW5jcmVtZW50YWxNYW5hZ2VyLmlzSW5jcmVtZW50YWxQYXRoKG1QYXRoU3RyaW5nKTsKKyAgICB9CiAgICAgLyoqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHBhY2thZ2UgaXMgc3RpbGwgYmVpbmcgbG9hZGVkLCBmYWxzZSBpZiB0aGUgcGFja2FnZSBpcyBmdWxseSBsb2FkZWQuCiAgICAgICovCkBAIC0xMTU5LDYgKzExNjUsMTIgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgcHVibGljIFBhY2thZ2VTZXR0aW5nIHNldExvYWRpbmdDb21wbGV0ZWRUaW1lKGxvbmcgbG9hZGluZ0NvbXBsZXRlZFRpbWUpIHsKKyAgICAgICAgbUxvYWRpbmdDb21wbGV0ZWRUaW1lID0gbG9hZGluZ0NvbXBsZXRlZFRpbWU7CisgICAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldFZlcnNpb25Db2RlKCkgewpAQCAtMTQ4OSw2ICsxNTAxLDExIEBACiAgICAgfQogCiAgICAgQERhdGFDbGFzcy5HZW5lcmF0ZWQuTWVtYmVyCisgICAgcHVibGljIGxvbmcgZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiBtTG9hZGluZ0NvbXBsZXRlZFRpbWU7CisgICAgfQorCisgICAgQERhdGFDbGFzcy5HZW5lcmF0ZWQuTWVtYmVyCiAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3B1QWJpT3ZlcnJpZGUoKSB7CiAgICAgICAgIHJldHVybiBtQ3B1QWJpT3ZlcnJpZGU7CiAgICAgfQpAQCAtMTU2MywxMCArMTU4MCwxMCBAQAogICAgIH0KIAogICAgIEBEYXRhQ2xhc3MuR2VuZXJhdGVkKAotICAgICAgICAgICAgdGltZSA9IDE2NjU3NzkwMDM3NDRMLAorICAgICAgICAgICAgdGltZSA9IDE2NzgyMjg2MjU4NTNMLAogICAgICAgICAgICAgY29kZWdlblZlcnNpb24gPSAiMS4wLjIzIiwKICAgICAgICAgICAgIHNvdXJjZUZpbGUgPSAiZnJhbWV3b3Jrcy9iYXNlL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZVNldHRpbmcuamF2YSIsCi0gICAgICAgICAgICBpbnB1dFNpZ25hdHVyZXMgPSAicHJpdmF0ZSAgaW50IG1TaGFyZWRVc2VyQXBwSWRcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4gbWltZUdyb3Vwc1xucHJpdmF0ZSBAamF2YS5sYW5nLkRlcHJlY2F0ZWQgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+IG1PbGRDb2RlUGF0aHNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nW10gdXNlc1Nka0xpYnJhcmllc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGxvbmdbXSB1c2VzU2RrTGlicmFyaWVzVmVyc2lvbnNNYWpvclxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmdbXSB1c2VzU3RhdGljTGlicmFyaWVzXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgbG9uZ1tdIHVzZXNTdGF0aWNMaWJyYXJpZXNWZXJzaW9uc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuRGVwcmVjYXRlZCBqYXZhLmxhbmcuU3RyaW5nIGxlZ2FjeU5hdGl2ZUxpYnJhcnlQYXRoXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLmxhbmcuU3RyaW5nIG1OYW1lXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBtUmVhbE5hbWVcbnByaXZhdGUgIGludCBtQXBwSWRcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGFyc2luZy5wa2cuQW5kcm9pZFBhY2thZ2VJbnRlcm5hbCBwa2dcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGphdmEuaW8uRmlsZSBtUGF0aFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS5sYW5nLlN0cmluZyBtUGF0aFN0cmluZ1xucHJpdmF0ZSAgZmxvYXQgbUxvYWRpbmdQcm9ncmVzc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbVByaW1hcnlDcHVBYmlcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1TZWNvbmRhcnlDcHVBYmlcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1DcHVBYmlPdmVycmlkZVxucHJpdmF0ZSAgbG9uZyBtTGFzdE1vZGlmaWVkVGltZVxucHJpdmF0ZSAgbG9uZyBsYXN0VXBkYXRlVGltZVxucHJpdmF0ZSAgbG9uZyB2ZXJzaW9uQ29kZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTaWduYXR1cmVzIHNpZ25hdHVyZXNcbnByaXZhdGUgIGJvb2xlYW4gaW5zdGFsbFBlcm1pc3Npb25zRml4ZWRcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlS2V5U2V0RGF0YSBrZXlTZXREYXRhXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk8Y29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbD4gbVVzZXJTdGF0ZXNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5JbnN0YWxsU291cmNlIGluc3RhbGxTb3VyY2VcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIHZvbHVtZVV1aWRcbnByaXZhdGUgIGludCBjYXRlZ29yeU92ZXJyaWRlXG5wcml2YXRlICBib29sZWFuIHVwZGF0ZUF2YWlsYWJsZVxucHJpdmF0ZSAgYm9vbGVhbiBmb3JjZVF1ZXJ5YWJsZU92ZXJyaWRlXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZVVuc2VyaWFsaXplZCBwa2dTdGF0ZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS51dGlsLlVVSUQgbURvbWFpblNldElkXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuU25hcHNob3RDYWNoZTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmc+IG1TbmFwc2hvdFxucHJpdmF0ZSAgY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLlNuYXBzaG90Q2FjaGU8Y29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nPiBtYWtlQ2FjaGUoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc25hcHNob3QoKVxucHVibGljICB2b2lkIGR1bXBEZWJ1ZyhhbmRyb2lkLnV0aWwucHJvdG8uUHJvdG9PdXRwdXRTdHJlYW0sbG9uZyxqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm8+LGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wZXJtaXNzaW9uLkxlZ2FjeVBlcm1pc3Npb25EYXRhUHJvdmlkZXIpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRBcHBJZChpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRDcHVBYmlPdmVycmlkZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rmlyc3RJbnN0YWxsVGltZUZyb21SZXBsYWNlZChjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZUludGVybmFsLGludFtdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rmlyc3RJbnN0YWxsVGltZShsb25nLGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEZvcmNlUXVlcnlhYmxlT3ZlcnJpZGUoYm9vbGVhbilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxlclBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRJbnN0YWxsU291cmNlKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5JbnN0YWxsU291cmNlKVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgcmVtb3ZlSW5zdGFsbGVyUGFja2FnZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0SXNPcnBoYW5lZChib29sZWFuKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0S2V5U2V0RGF0YShjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZUtleVNldERhdGEpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMYXN0TW9kaWZpZWRUaW1lKGxvbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMYXN0VXBkYXRlVGltZShsb25nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TG9uZ1ZlcnNpb25Db2RlKGxvbmcpXG5wdWJsaWMgIGJvb2xlYW4gc2V0TWltZUdyb3VwKGphdmEubGFuZy5TdHJpbmcsYW5kcm9pZC51dGlsLkFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UGtnKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuQW5kcm9pZFBhY2thZ2UpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRQa2dTdGF0ZUxpYnJhcnlGaWxlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbjxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFByaW1hcnlDcHVBYmkoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFNlY29uZGFyeUNwdUFiaShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0U2lnbmF0dXJlcyhjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNpZ25hdHVyZXMpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRWb2x1bWVVdWlkKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBib29sZWFuIGlzRXh0ZXJuYWxTdG9yYWdlKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVwZGF0ZUF2YWlsYWJsZShib29sZWFuKVxucHVibGljICB2b2lkIHNldFNoYXJlZFVzZXJBcHBJZChpbnQpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBpbnQgZ2V0U2hhcmVkVXNlckFwcElkKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaGFzU2hhcmVkVXNlcigpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKClcbnByb3RlY3RlZCAgdm9pZCBjb3B5TWltZUdyb3VwcyhqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4pXG5wdWJsaWMgIHZvaWQgdXBkYXRlRnJvbShjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyB1cGRhdGVNaW1lR3JvdXBzKGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgQGphdmEubGFuZy5EZXByZWNhdGVkIEBqYXZhLmxhbmcuT3ZlcnJpZGUgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBlcm1pc3Npb24uTGVnYWN5UGVybWlzc2lvblN0YXRlIGdldExlZ2FjeVBlcm1pc3Npb25TdGF0ZSgpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRJbnN0YWxsUGVybWlzc2lvbnNGaXhlZChib29sZWFuKVxucHVibGljICBib29sZWFuIGlzUHJpdmlsZWdlZCgpXG5wdWJsaWMgIGJvb2xlYW4gaXNPZW0oKVxucHVibGljICBib29sZWFuIGlzVmVuZG9yKClcbnB1YmxpYyAgYm9vbGVhbiBpc1Byb2R1Y3QoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc1JlcXVpcmVkRm9yU3lzdGVtVXNlcigpXG5wdWJsaWMgIGJvb2xlYW4gaXNTeXN0ZW1FeHQoKVxucHVibGljICBib29sZWFuIGlzT2RtKClcbnB1YmxpYyAgYm9vbGVhbiBpc1N5c3RlbSgpXG5wdWJsaWMgIGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlscyBnZXRTaWduaW5nRGV0YWlscygpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRTaWduaW5nRGV0YWlscyhhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmluZ0RldGFpbHMpXG5wdWJsaWMgIHZvaWQgY29weVBhY2thZ2VTZXR0aW5nKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyxib29sZWFuKVxuIEBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZyBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsIG1vZGlmeVVzZXJTdGF0ZShpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUltcGwgZ2V0T3JDcmVhdGVVc2VyU3RhdGUoaW50KVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbnRlcm5hbCByZWFkVXNlclN0YXRlKGludClcbiAgdm9pZCBzZXRFbmFibGVkKGludCxpbnQsamF2YS5sYW5nLlN0cmluZylcbiAgaW50IGdldEVuYWJsZWQoaW50KVxuICB2b2lkIHNldEluc3RhbGxlZChib29sZWFuLGludClcbiAgYm9vbGVhbiBnZXRJbnN0YWxsZWQoaW50KVxuICBpbnQgZ2V0SW5zdGFsbFJlYXNvbihpbnQpXG4gIHZvaWQgc2V0SW5zdGFsbFJlYXNvbihpbnQsaW50KVxuICBpbnQgZ2V0VW5pbnN0YWxsUmVhc29uKGludClcbiAgdm9pZCBzZXRVbmluc3RhbGxSZWFzb24oaW50LGludClcbiBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgYW5kcm9pZC5jb250ZW50LnBtLm92ZXJsYXkuT3ZlcmxheVBhdGhzIGdldE92ZXJsYXlQYXRocyhpbnQpXG4gIGJvb2xlYW4gc2V0T3ZlcmxheVBhdGhzRm9yTGlicmFyeShqYXZhLmxhbmcuU3RyaW5nLGFuZHJvaWQuY29udGVudC5wbS5vdmVybGF5Lk92ZXJsYXlQYXRocyxpbnQpXG4gIGJvb2xlYW4gaXNBbnlJbnN0YWxsZWQoaW50W10pXG4gIGludFtdIHF1ZXJ5SW5zdGFsbGVkVXNlcnMoaW50W10sYm9vbGVhbilcbiAgbG9uZyBnZXRDZURhdGFJbm9kZShpbnQpXG4gIHZvaWQgc2V0Q2VEYXRhSW5vZGUobG9uZyxpbnQpXG4gIGJvb2xlYW4gZ2V0U3RvcHBlZChpbnQpXG4gIHZvaWQgc2V0U3RvcHBlZChib29sZWFuLGludClcbiAgYm9vbGVhbiBnZXROb3RMYXVuY2hlZChpbnQpXG4gIHZvaWQgc2V0Tm90TGF1bmNoZWQoYm9vbGVhbixpbnQpXG4gIGJvb2xlYW4gZ2V0SGlkZGVuKGludClcbiAgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbixpbnQpXG4gIGludCBnZXREaXN0cmFjdGlvbkZsYWdzKGludClcbiAgdm9pZCBzZXREaXN0cmFjdGlvbkZsYWdzKGludCxpbnQpXG5wdWJsaWMgIGJvb2xlYW4gZ2V0SW5zdGFudEFwcChpbnQpXG4gIHZvaWQgc2V0SW5zdGFudEFwcChib29sZWFuLGludClcbiAgYm9vbGVhbiBnZXRWaXJ0dWFsUHJlbG9hZChpbnQpXG4gIHZvaWQgc2V0VmlydHVhbFByZWxvYWQoYm9vbGVhbixpbnQpXG4gIHZvaWQgc2V0VXNlclN0YXRlKGludCxsb25nLGludCxib29sZWFuLGJvb2xlYW4sYm9vbGVhbixib29sZWFuLGludCxhbmRyb2lkLnV0aWwuQXJyYXlNYXA8amF2YS5sYW5nLlN0cmluZyxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlN1c3BlbmRQYXJhbXM+LGJvb2xlYW4sYm9vbGVhbixqYXZhLmxhbmcuU3RyaW5nLGFuZHJvaWQudXRpbC5BcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixhbmRyb2lkLnV0aWwuQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50LGludCxqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcsbG9uZylcbiAgdm9pZCBzZXRVc2VyU3RhdGUoaW50LGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUludGVybmFsKVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+IGdldEVuYWJsZWRDb21wb25lbnRzKGludClcbiAgY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPiBnZXREaXNhYmxlZENvbXBvbmVudHMoaW50KVxuICB2b2lkIHNldEVuYWJsZWRDb21wb25lbnRzKGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICB2b2lkIHNldERpc2FibGVkQ29tcG9uZW50cyhjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludClcbiAgdm9pZCBzZXRFbmFibGVkQ29tcG9uZW50c0NvcHkoY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQpXG4gIHZvaWQgc2V0RGlzYWJsZWRDb21wb25lbnRzQ29weShjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludClcbiAgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbCBtb2RpZnlVc2VyU3RhdGVDb21wb25lbnRzKGludCxib29sZWFuLGJvb2xlYW4pXG4gIHZvaWQgYWRkRGlzYWJsZWRDb21wb25lbnQoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIHZvaWQgYWRkRW5hYmxlZENvbXBvbmVudChqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgYm9vbGVhbiBlbmFibGVDb21wb25lbnRMUHcoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIGJvb2xlYW4gZGlzYWJsZUNvbXBvbmVudExQdyhqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgYm9vbGVhbiByZXN0b3JlQ29tcG9uZW50TFB3KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBpbnQgZ2V0Q3VycmVudEVuYWJsZWRTdGF0ZUxQcihqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgdm9pZCByZW1vdmVVc2VyKGludClcbnB1YmxpYyAgaW50W10gZ2V0Tm90SW5zdGFsbGVkVXNlcklkcygpXG4gIHZvaWQgd3JpdGVQYWNrYWdlVXNlclBlcm1pc3Npb25zUHJvdG8oYW5kcm9pZC51dGlsLnByb3RvLlByb3RvT3V0cHV0U3RyZWFtLGxvbmcsamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvPixjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGVybWlzc2lvbi5MZWdhY3lQZXJtaXNzaW9uRGF0YVByb3ZpZGVyKVxucHJvdGVjdGVkICB2b2lkIHdyaXRlVXNlcnNJbmZvVG9Qcm90byhhbmRyb2lkLnV0aWwucHJvdG8uUHJvdG9PdXRwdXRTdHJlYW0sbG9uZylcbiAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFBhdGgoamF2YS5pby5GaWxlKVxucHVibGljIEBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZyBib29sZWFuIG92ZXJyaWRlTm9uTG9jYWxpemVkTGFiZWxBbmRJY29uKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLkludGVnZXIsaW50KVxucHVibGljICB2b2lkIHJlc2V0T3ZlcnJpZGVDb21wb25lbnRMYWJlbEljb24oaW50KVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRTcGxhc2hTY3JlZW5UaGVtZShpbnQpXG5wdWJsaWMgIGJvb2xlYW4gaXNMb2FkaW5nKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExvYWRpbmdQcm9ncmVzcyhmbG9hdClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nIGdldFZlcnNpb25Db2RlKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4+IGdldE1pbWVHcm91cHMoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZU5hbWUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLkFuZHJvaWRQYWNrYWdlIGdldEFuZHJvaWRQYWNrYWdlKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25pbmdJbmZvIGdldFNpZ25pbmdJbmZvKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VXNlc1Nka0xpYnJhcmllcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldFVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VXNlc1N0YXRpY0xpYnJhcmllcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldFVzZXNTdGF0aWNMaWJyYXJpZXNWZXJzaW9ucygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLkxpc3Q8Y29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5TaGFyZWRMaWJyYXJ5PiBnZXRVc2VzTGlicmFyaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIGFkZFVzZXNMaWJyYXJ5SW5mbyhhbmRyb2lkLmNvbnRlbnQucG0uU2hhcmVkTGlicmFyeUluZm8pXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gZ2V0VXNlc0xpYnJhcnlGaWxlcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBhZGRVc2VzTGlicmFyeUZpbGUoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNIaWRkZW5VbnRpbEluc3RhbGxlZCgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldExhc3RQYWNrYWdlVXNhZ2VUaW1lKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNVcGRhdGVkU3lzdGVtQXBwKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNBcGtJblVwZGF0ZWRBcGV4KClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldERvbWFpblNldElkKGphdmEudXRpbC5VVUlEKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Q2F0ZWdvcnlPdmVycmlkZShpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMZWdhY3lOYXRpdmVMaWJyYXJ5UGF0aChqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TWltZUdyb3VwcyhqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRPbGRDb2RlUGF0aHMoamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVzZXNTZGtMaWJyYXJpZXMoamF2YS5sYW5nLlN0cmluZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1Nka0xpYnJhcmllc1ZlcnNpb25zTWFqb3IobG9uZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1N0YXRpY0xpYnJhcmllcyhqYXZhLmxhbmcuU3RyaW5nW10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVc2VzU3RhdGljTGlicmFyaWVzVmVyc2lvbnMobG9uZ1tdKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlVW5zZXJpYWxpemVkIGdldFRyYW5zaWVudFN0YXRlKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5PD8gZXh0ZW5kcyBQYWNrYWdlVXNlclN0YXRlSW50ZXJuYWw+IGdldFVzZXJTdGF0ZXMoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgYWRkTWltZVR5cGVzKGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGUgZ2V0U3RhdGVGb3JVc2VyKGFuZHJvaWQub3MuVXNlckhhbmRsZSlcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJpbWFyeUNwdUFiaSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFNlY29uZGFyeUNwdUFiaSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VJbmZvKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJpbWFyeUNwdUFiaUxlZ2FjeSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFNlY29uZGFyeUNwdUFiaUxlZ2FjeSgpXG5jbGFzcyBQYWNrYWdlU2V0dGluZyBleHRlbmRzIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5TZXR0aW5nQmFzZSBpbXBsZW1lbnRzIFtjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZUludGVybmFsXVxuQGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRGF0YUNsYXNzKGdlbkdldHRlcnM9dHJ1ZSwgZ2VuQ29uc3RydWN0b3I9ZmFsc2UsIGdlblNldHRlcnM9ZmFsc2UsIGdlbkJ1aWxkZXI9ZmFsc2UpIikKKyAgICAgICAgICAgIGlucHV0U2lnbmF0dXJlcyA9ICJwcml2YXRlICBpbnQgbVNoYXJlZFVzZXJBcHBJZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+PiBtaW1lR3JvdXBzXG5wcml2YXRlIEBqYXZhLmxhbmcuRGVwcmVjYXRlZCBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4gbU9sZENvZGVQYXRoc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmdbXSB1c2VzU2RrTGlicmFyaWVzXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgbG9uZ1tdIHVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZ1tdIHVzZXNTdGF0aWNMaWJyYXJpZXNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBsb25nW10gdXNlc1N0YXRpY0xpYnJhcmllc1ZlcnNpb25zXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5EZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgbGVnYWN5TmF0aXZlTGlicmFyeVBhdGhcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGphdmEubGFuZy5TdHJpbmcgbU5hbWVcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1SZWFsTmFtZVxucHJpdmF0ZSAgaW50IG1BcHBJZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wYXJzaW5nLnBrZy5BbmRyb2lkUGFja2FnZUludGVybmFsIHBrZ1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS5pby5GaWxlIG1QYXRoXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoU3RyaW5nXG5wcml2YXRlICBmbG9hdCBtTG9hZGluZ1Byb2dyZXNzXG5wcml2YXRlICBsb25nIG1Mb2FkaW5nQ29tcGxldGVkVGltZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbVByaW1hcnlDcHVBYmlcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1TZWNvbmRhcnlDcHVBYmlcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1DcHVBYmlPdmVycmlkZVxucHJpdmF0ZSAgbG9uZyBtTGFzdE1vZGlmaWVkVGltZVxucHJpdmF0ZSAgbG9uZyBsYXN0VXBkYXRlVGltZVxucHJpdmF0ZSAgbG9uZyB2ZXJzaW9uQ29kZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTaWduYXR1cmVzIHNpZ25hdHVyZXNcbnByaXZhdGUgIGJvb2xlYW4gaW5zdGFsbFBlcm1pc3Npb25zRml4ZWRcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlS2V5U2V0RGF0YSBrZXlTZXREYXRhXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk8Y29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbD4gbVVzZXJTdGF0ZXNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5JbnN0YWxsU291cmNlIGluc3RhbGxTb3VyY2VcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIHZvbHVtZVV1aWRcbnByaXZhdGUgIGludCBjYXRlZ29yeU92ZXJyaWRlXG5wcml2YXRlICBib29sZWFuIHVwZGF0ZUF2YWlsYWJsZVxucHJpdmF0ZSAgYm9vbGVhbiBmb3JjZVF1ZXJ5YWJsZU92ZXJyaWRlXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZVVuc2VyaWFsaXplZCBwa2dTdGF0ZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS51dGlsLlVVSUQgbURvbWFpblNldElkXG5wcml2YXRlIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuU25hcHNob3RDYWNoZTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmc+IG1TbmFwc2hvdFxucHJpdmF0ZSAgY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLlNuYXBzaG90Q2FjaGU8Y29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nPiBtYWtlQ2FjaGUoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc25hcHNob3QoKVxucHVibGljICB2b2lkIGR1bXBEZWJ1ZyhhbmRyb2lkLnV0aWwucHJvdG8uUHJvdG9PdXRwdXRTdHJlYW0sbG9uZyxqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm8+LGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wZXJtaXNzaW9uLkxlZ2FjeVBlcm1pc3Npb25EYXRhUHJvdmlkZXIpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRBcHBJZChpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRDcHVBYmlPdmVycmlkZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rmlyc3RJbnN0YWxsVGltZUZyb21SZXBsYWNlZChjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZUludGVybmFsLGludFtdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rmlyc3RJbnN0YWxsVGltZShsb25nLGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEZvcmNlUXVlcnlhYmxlT3ZlcnJpZGUoYm9vbGVhbilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxlclBhY2thZ2UoamF2YS5sYW5nLlN0cmluZyxpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVcGRhdGVPd25lclBhY2thZ2UoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxTb3VyY2UoY29tLmFuZHJvaWQuc2VydmVyLnBtLkluc3RhbGxTb3VyY2UpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyByZW1vdmVJbnN0YWxsZXJQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRJc09ycGhhbmVkKGJvb2xlYW4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRLZXlTZXREYXRhKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlS2V5U2V0RGF0YSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExhc3RNb2RpZmllZFRpbWUobG9uZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExhc3RVcGRhdGVUaW1lKGxvbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMb25nVmVyc2lvbkNvZGUobG9uZylcbnB1YmxpYyAgYm9vbGVhbiBzZXRNaW1lR3JvdXAoamF2YS5sYW5nLlN0cmluZyxhbmRyb2lkLnV0aWwuQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRQa2coY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5BbmRyb2lkUGFja2FnZSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFBrZ1N0YXRlTGlicmFyeUZpbGVzKGphdmEudXRpbC5Db2xsZWN0aW9uPGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UHJpbWFyeUNwdUFiaShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0U2Vjb25kYXJ5Q3B1QWJpKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRTaWduYXR1cmVzKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2lnbmF0dXJlcylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFZvbHVtZVV1aWQoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNFeHRlcm5hbFN0b3JhZ2UoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXBkYXRlQXZhaWxhYmxlKGJvb2xlYW4pXG5wdWJsaWMgIHZvaWQgc2V0U2hhcmVkVXNlckFwcElkKGludClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGludCBnZXRTaGFyZWRVc2VyQXBwSWQoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBoYXNTaGFyZWRVc2VyKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKVxucHJvdGVjdGVkICB2b2lkIGNvcHlNaW1lR3JvdXBzKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+PilcbnB1YmxpYyAgdm9pZCB1cGRhdGVGcm9tKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZylcbiAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHVwZGF0ZU1pbWVHcm91cHMoamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyBAamF2YS5sYW5nLkRlcHJlY2F0ZWQgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGVybWlzc2lvbi5MZWdhY3lQZXJtaXNzaW9uU3RhdGUgZ2V0TGVnYWN5UGVybWlzc2lvblN0YXRlKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxQZXJtaXNzaW9uc0ZpeGVkKGJvb2xlYW4pXG5wdWJsaWMgIGJvb2xlYW4gaXNQcml2aWxlZ2VkKClcbnB1YmxpYyAgYm9vbGVhbiBpc09lbSgpXG5wdWJsaWMgIGJvb2xlYW4gaXNWZW5kb3IoKVxucHVibGljICBib29sZWFuIGlzUHJvZHVjdCgpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBib29sZWFuIGlzUmVxdWlyZWRGb3JTeXN0ZW1Vc2VyKClcbnB1YmxpYyAgYm9vbGVhbiBpc1N5c3RlbUV4dCgpXG5wdWJsaWMgIGJvb2xlYW4gaXNPZG0oKVxucHVibGljICBib29sZWFuIGlzU3lzdGVtKClcbnB1YmxpYyAgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25pbmdEZXRhaWxzIGdldFNpZ25pbmdEZXRhaWxzKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFNpZ25pbmdEZXRhaWxzKGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlscylcbnB1YmxpYyAgdm9pZCBjb3B5UGFja2FnZVNldHRpbmcoY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nLGJvb2xlYW4pXG4gQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUltcGwgbW9kaWZ5VXNlclN0YXRlKGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbCBnZXRPckNyZWF0ZVVzZXJTdGF0ZShpbnQpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUludGVybmFsIHJlYWRVc2VyU3RhdGUoaW50KVxuICB2b2lkIHNldEVuYWJsZWQoaW50LGludCxqYXZhLmxhbmcuU3RyaW5nKVxuICBpbnQgZ2V0RW5hYmxlZChpbnQpXG4gIHZvaWQgc2V0SW5zdGFsbGVkKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldEluc3RhbGxlZChpbnQpXG4gIGludCBnZXRJbnN0YWxsUmVhc29uKGludClcbiAgdm9pZCBzZXRJbnN0YWxsUmVhc29uKGludCxpbnQpXG4gIGludCBnZXRVbmluc3RhbGxSZWFzb24oaW50KVxuICB2b2lkIHNldFVuaW5zdGFsbFJlYXNvbihpbnQsaW50KVxuIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQucG0ub3ZlcmxheS5PdmVybGF5UGF0aHMgZ2V0T3ZlcmxheVBhdGhzKGludClcbiAgYm9vbGVhbiBzZXRPdmVybGF5UGF0aHNGb3JMaWJyYXJ5KGphdmEubGFuZy5TdHJpbmcsYW5kcm9pZC5jb250ZW50LnBtLm92ZXJsYXkuT3ZlcmxheVBhdGhzLGludClcbiAgYm9vbGVhbiBpc0FueUluc3RhbGxlZChpbnRbXSlcbiAgaW50W10gcXVlcnlJbnN0YWxsZWRVc2VycyhpbnRbXSxib29sZWFuKVxuICBsb25nIGdldENlRGF0YUlub2RlKGludClcbiAgdm9pZCBzZXRDZURhdGFJbm9kZShsb25nLGludClcbiAgYm9vbGVhbiBnZXRTdG9wcGVkKGludClcbiAgdm9pZCBzZXRTdG9wcGVkKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldE5vdExhdW5jaGVkKGludClcbiAgdm9pZCBzZXROb3RMYXVuY2hlZChib29sZWFuLGludClcbiAgYm9vbGVhbiBnZXRIaWRkZW4oaW50KVxuICB2b2lkIHNldEhpZGRlbihib29sZWFuLGludClcbiAgaW50IGdldERpc3RyYWN0aW9uRmxhZ3MoaW50KVxuICB2b2lkIHNldERpc3RyYWN0aW9uRmxhZ3MoaW50LGludClcbnB1YmxpYyAgYm9vbGVhbiBnZXRJbnN0YW50QXBwKGludClcbiAgdm9pZCBzZXRJbnN0YW50QXBwKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldFZpcnR1YWxQcmVsb2FkKGludClcbiAgdm9pZCBzZXRWaXJ0dWFsUHJlbG9hZChib29sZWFuLGludClcbiAgdm9pZCBzZXRVc2VyU3RhdGUoaW50LGxvbmcsaW50LGJvb2xlYW4sYm9vbGVhbixib29sZWFuLGJvb2xlYW4saW50LGFuZHJvaWQudXRpbC5BcnJheU1hcDxqYXZhLmxhbmcuU3RyaW5nLGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuU3VzcGVuZFBhcmFtcz4sYm9vbGVhbixib29sZWFuLGphdmEubGFuZy5TdHJpbmcsYW5kcm9pZC51dGlsLkFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGFuZHJvaWQudXRpbC5BcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQsaW50LGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZyxsb25nKVxuICB2b2lkIHNldFVzZXJTdGF0ZShpbnQsY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW50ZXJuYWwpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4gZ2V0RW5hYmxlZENvbXBvbmVudHMoaW50KVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+IGdldERpc2FibGVkQ29tcG9uZW50cyhpbnQpXG4gIHZvaWQgc2V0RW5hYmxlZENvbXBvbmVudHMoY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQpXG4gIHZvaWQgc2V0RGlzYWJsZWRDb21wb25lbnRzKGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICB2b2lkIHNldEVuYWJsZWRDb21wb25lbnRzQ29weShjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludClcbiAgdm9pZCBzZXREaXNhYmxlZENvbXBvbmVudHNDb3B5KGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsIG1vZGlmeVVzZXJTdGF0ZUNvbXBvbmVudHMoaW50LGJvb2xlYW4sYm9vbGVhbilcbiAgdm9pZCBhZGREaXNhYmxlZENvbXBvbmVudChqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgdm9pZCBhZGRFbmFibGVkQ29tcG9uZW50KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBib29sZWFuIGVuYWJsZUNvbXBvbmVudExQdyhqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgYm9vbGVhbiBkaXNhYmxlQ29tcG9uZW50TFB3KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBib29sZWFuIHJlc3RvcmVDb21wb25lbnRMUHcoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIGludCBnZXRDdXJyZW50RW5hYmxlZFN0YXRlTFByKGphdmEubGFuZy5TdHJpbmcsaW50KVxuICB2b2lkIHJlbW92ZVVzZXIoaW50KVxucHVibGljICBpbnRbXSBnZXROb3RJbnN0YWxsZWRVc2VySWRzKClcbiAgdm9pZCB3cml0ZVBhY2thZ2VVc2VyUGVybWlzc2lvbnNQcm90byhhbmRyb2lkLnV0aWwucHJvdG8uUHJvdG9PdXRwdXRTdHJlYW0sbG9uZyxqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm8+LGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wZXJtaXNzaW9uLkxlZ2FjeVBlcm1pc3Npb25EYXRhUHJvdmlkZXIpXG5wcm90ZWN0ZWQgIHZvaWQgd3JpdGVVc2Vyc0luZm9Ub1Byb3RvKGFuZHJvaWQudXRpbC5wcm90by5Qcm90b091dHB1dFN0cmVhbSxsb25nKVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UGF0aChqYXZhLmlvLkZpbGUpXG5wdWJsaWMgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nIGJvb2xlYW4gb3ZlcnJpZGVOb25Mb2NhbGl6ZWRMYWJlbEFuZEljb24oYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuSW50ZWdlcixpbnQpXG5wdWJsaWMgIHZvaWQgcmVzZXRPdmVycmlkZUNvbXBvbmVudExhYmVsSWNvbihpbnQpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFNwbGFzaFNjcmVlblRoZW1lKGludClcbnB1YmxpYyAgYm9vbGVhbiBpc0luY3JlbWVudGFsKClcbnB1YmxpYyAgYm9vbGVhbiBpc0xvYWRpbmcoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TG9hZGluZ1Byb2dyZXNzKGZsb2F0KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUobG9uZylcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nIGdldFZlcnNpb25Db2RlKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4+IGdldE1pbWVHcm91cHMoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZU5hbWUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLkFuZHJvaWRQYWNrYWdlIGdldEFuZHJvaWRQYWNrYWdlKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25pbmdJbmZvIGdldFNpZ25pbmdJbmZvKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VXNlc1Nka0xpYnJhcmllcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldFVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VXNlc1N0YXRpY0xpYnJhcmllcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldFVzZXNTdGF0aWNMaWJyYXJpZXNWZXJzaW9ucygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLkxpc3Q8Y29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5TaGFyZWRMaWJyYXJ5PiBnZXRTaGFyZWRMaWJyYXJ5RGVwZW5kZW5jaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIGFkZFVzZXNMaWJyYXJ5SW5mbyhhbmRyb2lkLmNvbnRlbnQucG0uU2hhcmVkTGlicmFyeUluZm8pXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gZ2V0VXNlc0xpYnJhcnlGaWxlcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBhZGRVc2VzTGlicmFyeUZpbGUoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNIaWRkZW5VbnRpbEluc3RhbGxlZCgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgbG9uZ1tdIGdldExhc3RQYWNrYWdlVXNhZ2VUaW1lKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNVcGRhdGVkU3lzdGVtQXBwKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNBcGtJblVwZGF0ZWRBcGV4KClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyBnZXRBcGV4TW9kdWxlTmFtZSgpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXREb21haW5TZXRJZChqYXZhLnV0aWwuVVVJRClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldENhdGVnb3J5T3ZlcnJpZGUoaW50KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TGVnYWN5TmF0aXZlTGlicmFyeVBhdGgoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldE1pbWVHcm91cHMoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4+KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0T2xkQ29kZVBhdGhzKGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVc2VzU2RrTGlicmFyaWVzKGphdmEubGFuZy5TdHJpbmdbXSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yKGxvbmdbXSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVzZXNTdGF0aWNMaWJyYXJpZXMoamF2YS5sYW5nLlN0cmluZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1N0YXRpY0xpYnJhcmllc1ZlcnNpb25zKGxvbmdbXSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEFwZXhNb2R1bGVOYW1lKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlU3RhdGVVbnNlcmlhbGl6ZWQgZ2V0VHJhbnNpZW50U3RhdGUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk8PyBleHRlbmRzIFBhY2thZ2VVc2VyU3RhdGVJbnRlcm5hbD4gZ2V0VXNlclN0YXRlcygpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBhZGRNaW1lVHlwZXMoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZSBnZXRTdGF0ZUZvclVzZXIoYW5kcm9pZC5vcy5Vc2VySGFuZGxlKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRQcmltYXJ5Q3B1QWJpKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2Vjb25kYXJ5Q3B1QWJpKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyBnZXRTZUluZm8oKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRQcmltYXJ5Q3B1QWJpTGVnYWN5KClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2Vjb25kYXJ5Q3B1QWJpTGVnYWN5KClcbnB1YmxpYyBAYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mby5IaWRkZW5BcGlFbmZvcmNlbWVudFBvbGljeSBAamF2YS5sYW5nLk92ZXJyaWRlIGludCBnZXRIaWRkZW5BcGlFbmZvcmNlbWVudFBvbGljeSgpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBib29sZWFuIGlzQXBleCgpXG5jbGFzcyBQYWNrYWdlU2V0dGluZyBleHRlbmRzIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5TZXR0aW5nQmFzZSBpbXBsZW1lbnRzIFtjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZUludGVybmFsXVxuQGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRGF0YUNsYXNzKGdlbkdldHRlcnM9dHJ1ZSwgZ2VuQ29uc3RydWN0b3I9ZmFsc2UsIGdlblNldHRlcnM9ZmFsc2UsIGdlbkJ1aWxkZXI9ZmFsc2UpIikKICAgICBARGVwcmVjYXRlZAogICAgIHByaXZhdGUgdm9pZCBfX21ldGFkYXRhKCkge30KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhCmluZGV4IGI2NTU3ZDAuLjk0YTAwZDZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1NldHRpbmdzLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhCkBAIC0yOTAyLDYgKzI5MDIsOCBAQAogICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGVJbnQobnVsbCwgInNoYXJlZFVzZXJJZCIsIHBrZy5nZXRBcHBJZCgpKTsKICAgICAgICAgfQogICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZUZsb2F0KG51bGwsICJsb2FkaW5nUHJvZ3Jlc3MiLCBwa2cuZ2V0TG9hZGluZ1Byb2dyZXNzKCkpOworICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZUxvbmdIZXgobnVsbCwgImxvYWRpbmdDb21wbGV0ZWRUaW1lIiwKKyAgICAgICAgICAgICAgICBwa2cuZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSk7CiAKICAgICAgICAgd3JpdGVVc2VzU2RrTGliTFB3KHNlcmlhbGl6ZXIsIHBrZy5nZXRVc2VzU2RrTGlicmFyaWVzKCksCiAgICAgICAgICAgICAgICAgcGtnLmdldFVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yKCkpOwpAQCAtMjk4OCw2ICsyOTkwLDcgQEAKICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlQm9vbGVhbihudWxsLCAiaXNMb2FkaW5nIiwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGVGbG9hdChudWxsLCAibG9hZGluZ1Byb2dyZXNzIiwgcGtnLmdldExvYWRpbmdQcm9ncmVzcygpKTsKKyAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGVMb25nSGV4KG51bGwsICJsb2FkaW5nQ29tcGxldGVkVGltZSIsIHBrZy5nZXRMb2FkaW5nQ29tcGxldGVkVGltZSgpKTsKIAogICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAiZG9tYWluU2V0SWQiLCBwa2cuZ2V0RG9tYWluU2V0SWQoKS50b1N0cmluZygpKTsKIApAQCAtMzY4Nyw5ICszNjkwLDYgQEAKICAgICAgICAgICAgIHBzLnNldEFwcElkKHNoYXJlZFVzZXJBcHBJZCk7CiAgICAgICAgICAgICBwcy5zZXRTaGFyZWRVc2VyQXBwSWQoc2hhcmVkVXNlckFwcElkKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBmbG9hdCBsb2FkaW5nUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVGbG9hdChudWxsLCAibG9hZGluZ1Byb2dyZXNzIiwgMCk7Ci0gICAgICAgIHBzLnNldExvYWRpbmdQcm9ncmVzcyhsb2FkaW5nUHJvZ3Jlc3MpOwogCiAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CiAgICAgICAgIGludCB0eXBlOwpAQCAtMzc2MCw2ICszNzYwLDcgQEAKICAgICAgICAgbG9uZyB2ZXJzaW9uQ29kZSA9IDA7CiAgICAgICAgIGJvb2xlYW4gaW5zdGFsbGVkRm9yY2VRdWVyeWFibGUgPSBmYWxzZTsKICAgICAgICAgZmxvYXQgbG9hZGluZ1Byb2dyZXNzID0gMDsKKyAgICAgICAgbG9uZyBsb2FkaW5nQ29tcGxldGVkVGltZSA9IDA7CiAgICAgICAgIFVVSUQgZG9tYWluU2V0SWQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJfTkFNRSk7CkBAIC0zNzc3LDYgKzM3NzgsNyBAQAogICAgICAgICAgICAgdXBkYXRlQXZhaWxhYmxlID0gcGFyc2VyLmdldEF0dHJpYnV0ZUJvb2xlYW4obnVsbCwgInVwZGF0ZUF2YWlsYWJsZSIsIGZhbHNlKTsKICAgICAgICAgICAgIGluc3RhbGxlZEZvcmNlUXVlcnlhYmxlID0gcGFyc2VyLmdldEF0dHJpYnV0ZUJvb2xlYW4obnVsbCwgImZvcmNlUXVlcnlhYmxlIiwgZmFsc2UpOwogICAgICAgICAgICAgbG9hZGluZ1Byb2dyZXNzID0gcGFyc2VyLmdldEF0dHJpYnV0ZUZsb2F0KG51bGwsICJsb2FkaW5nUHJvZ3Jlc3MiLCAwKTsKKyAgICAgICAgICAgIGxvYWRpbmdDb21wbGV0ZWRUaW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZUxvbmdIZXgobnVsbCwgImxvYWRpbmdDb21wbGV0ZWRUaW1lIiwgMCk7CiAKICAgICAgICAgICAgIGlmIChwcmltYXJ5Q3B1QWJpU3RyaW5nID09IG51bGwgJiYgbGVnYWN5Q3B1QWJpU3RyaW5nICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwcmltYXJ5Q3B1QWJpU3RyaW5nID0gbGVnYWN5Q3B1QWJpU3RyaW5nOwpAQCAtMzkzOSw3ICszOTQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgLnNldFNlY29uZGFyeUNwdUFiaShzZWNvbmRhcnlDcHVBYmlTdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRVcGRhdGVBdmFpbGFibGUodXBkYXRlQXZhaWxhYmxlKQogICAgICAgICAgICAgICAgICAgICAuc2V0Rm9yY2VRdWVyeWFibGVPdmVycmlkZShpbnN0YWxsZWRGb3JjZVF1ZXJ5YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldExvYWRpbmdQcm9ncmVzcyhsb2FkaW5nUHJvZ3Jlc3MpOworICAgICAgICAgICAgICAgICAgICAuc2V0TG9hZGluZ1Byb2dyZXNzKGxvYWRpbmdQcm9ncmVzcykKKyAgICAgICAgICAgICAgICAgICAgLnNldExvYWRpbmdDb21wbGV0ZWRUaW1lKGxvYWRpbmdDb21wbGV0ZWRUaW1lKTsKICAgICAgICAgICAgIC8vIEhhbmRsZSBsZWdhY3kgc3RyaW5nIGhlcmUgZm9yIHNpbmdsZS11c2VyIG1vZGUKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmFibGVkU3RyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJfRU5BQkxFRCk7CiAgICAgICAgICAgICBpZiAoZW5hYmxlZFN0ciAhPSBudWxsKSB7CkBAIC00OTAwLDkgKzQ5MDMsMTEgQEAKICAgICAgICAgfQogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICBwYWNrYWdlU291cmNlPSIpOwogICAgICAgICBwdy5wcmludGxuKHBzLmdldEluc3RhbGxTb3VyY2UoKS5tUGFja2FnZVNvdXJjZSk7Ci0gICAgICAgIGlmIChwcy5pc0xvYWRpbmcoKSkgeworICAgICAgICBpZiAocHMuaXNJbmNyZW1lbnRhbCgpKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCIgIGxvYWRpbmdQcm9ncmVzcz0iICsKICAgICAgICAgICAgICAgICAgICAgKGludCkgKHBzLmdldExvYWRpbmdQcm9ncmVzcygpICogMTAwKSArICIlIik7CisgICAgICAgICAgICBkYXRlLnNldFRpbWUocHMuZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCIgIGxvYWRpbmdDb21wbGV0ZWRUaW1lPSIgKyBzZGYuZm9ybWF0KGRhdGUpKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHMuZ2V0Vm9sdW1lVXVpZCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIHZvbHVtZVV1aWQ9Iik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VySW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJJbnRlcm5hbC5qYXZhCmluZGV4IGViMzczMDIuLjcyMWFkODggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJJbnRlcm5hbC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJJbnRlcm5hbC5qYXZhCkBAIC00OTEsOCArNDkxLDExIEBACiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNVc2VyVmlzaWJsZShAVXNlcklkSW50IGludCB1c2VySWQsIGludCBkaXNwbGF5SWQpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzcGxheSBpZCBhc3NpZ25lZCB0byB0aGUgdXNlciwgb3Ige0Bjb2RlIERpc3BsYXkuSU5WQUxJRF9ESVNQTEFZfSBpZiB0aGUKLSAgICAgKiB1c2VyIGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgZGlzcGxheS4KKyAgICAgKiBSZXR1cm5zIHRoZSBtYWluIGRpc3BsYXkgaWQgYXNzaWduZWQgdG8gdGhlIHVzZXIsIG9yIHtAY29kZSBEaXNwbGF5LklOVkFMSURfRElTUExBWX0gaWYgdGhlCisgICAgICogdXNlciBpcyBub3QgYXNzaWduZWQgdG8gYW55IG1haW4gZGlzcGxheS4KKyAgICAgKgorICAgICAqIDxwPkluIHRoZSBjb250ZXh0IG9mIG11bHRpLXVzZXIgbXVsdGktZGlzcGxheSwgdGhlcmUgY2FuIGJlIG11bHRpcGxlIG1haW4gZGlzcGxheXMsIGF0IG1vc3QKKyAgICAgKiBvbmUgcGVyIGVhY2ggem9uZS4gTWFpbiBkaXNwbGF5cyBhcmUgd2hlcmUgVUkgaXMgbGF1bmNoZWQgd2hpY2ggYSB1c2VyIGludGVyYWN0cyB3aXRoLgogICAgICAqCiAgICAgICogPHA+VGhlIGN1cnJlbnQgZm9yZWdyb3VuZCB1c2VyIGFuZCBpdHMgcnVubmluZyBwcm9maWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuRGlzcGxheSNERUZBVUxUX0RJU1BMQVkgZGVmYXVsdCBkaXNwbGF5fSwgd2hpbGUgb3RoZXIgdXNlcnMgd291bGQgb25seSBiZQpAQCAtNTAzLDkgKzUwNiwyMCBAQAogICAgICAqCiAgICAgICogPHA+SWYgdGhlIHVzZXIgaXMgYSBwcm9maWxlIGFuZCBpcyBydW5uaW5nLCBpdCdzIGFzc2lnbmVkIHRvIGl0cyBwYXJlbnQgZGlzcGxheS4KICAgICAgKi8KKyAgICAvLyBUT0RPKGIvMjcyMzY2NDgzKSByZW5hbWUgdGhpcyBtZXRob2QgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggZ2V0RGlzcGxheXNBc3NpZ25lZFRPVXNlcigpLgogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGlzcGxheUFzc2lnbmVkVG9Vc2VyKEBVc2VySWRJbnQgaW50IHVzZXJJZCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBkaXNwbGF5IGlkcyBhc3NpZ25lZCB0byB0aGUgdXNlciBpbmNsdWRpbmcge0BsaW5rCisgICAgICogI2Fzc2lnblVzZXJUb0V4dHJhRGlzcGxheShpbnQsIGludCkgZXh0cmEgZGlzcGxheXN9LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXMgbm8gZGlzcGxheQorICAgICAqIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQgdXNlci4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBkaWZmZXJlbnQgZnJvbSB7QGxpbmsgI2dldERpc3BsYXlBc3NpZ25lZFRvVXNlcihpbnQpfSwgd2hpY2gKKyAgICAgKiByZXR1cm5zIGEgbWFpbiBkaXNwbGF5IG9ubHkuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBpbnRbXSBnZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKEBVc2VySWRJbnQgaW50IHVzZXJJZCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYWluIHVzZXIgKGkuZS4sIG5vdCBhIHByb2ZpbGUpIHRoYXQgaXMgYXNzaWduZWQgdG8gdGhlIGRpc3BsYXksIG9yIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIjZ2V0Q3VycmVudFVzZXIoKSBjdXJyZW50IGZvcmVncm91bmQgdXNlcn0gaWYgbm8gdXNlciBpcwogICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzcGxheS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGNkZThiZDcuLmZkYzJhZmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTU0NSw3ICsxNTQ1LDggQEAKICAgICAgICAgLy8gaW50ZW50U2VuZGVyCiAgICAgICAgIHVubG9ja0ludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfSU5URU5ULCBwZW5kaW5nSW50ZW50LmdldEludGVudFNlbmRlcigpKTsKICAgICAgICAgdW5sb2NrSW50ZW50LnNldEZsYWdzKEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKLSAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eSh1bmxvY2tJbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5QXNVc2VyKAorICAgICAgICAgICAgICAgIHVubG9ja0ludGVudCwgVXNlckhhbmRsZS5vZihnZXRQcm9maWxlUGFyZW50SWRVbmNoZWNrZWQodXNlcklkKSkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTg2NCwyMCArNTg2NSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsKLSAgICAgKiBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCisgICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFnZW50cyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0CisgICAgICogcmVzdHJpY3Rpb25zLCBlLmcuIGFuIEVudGVycHJpc2UgRFBDIGFuZCBhIFN1cGVydmlzaW9uIGFkbWluLiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuCisgICAgICogdGhlIHJlc3RyaWN0aW9ucyBzZXQgYnkgdGhlIERQQ3MuIFRvIHJldHJpZXZlIHJlc3RyaWN0aW9ucyBzZXQgYnkgYWxsIGFnZW50cywgdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbnNNYW5hZ2VyI2dldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW59IGluc3RlYWQuCiAgICAgICovCi0gICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNGb3JVc2VyKHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlLmdldENhbGxpbmdVc2VySWQoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluawotICAgICAqIGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbnNNYW5hZ2VyI2dldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW59IGluc3RlYWQuCisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIHZlcnNpb24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwKKyAgICAgKiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgbXVsdGlwbGUgbWFuYWdpbmcgYWdlbnRzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKKyAgICAgKiByZXN0cmljdGlvbnMsIGUuZy4gYW4gRW50ZXJwcmlzZSBEUEMgYW5kIGEgU3VwZXJ2aXNpb24gYWRtaW4uIFRoaXMgQVBJIHdpbGwgb25seSB0byByZXR1cm4KKyAgICAgKiB0aGUgcmVzdHJpY3Rpb25zIHNldCBieSB0aGUgRFBDcy4gVG8gcmV0cmlldmUgcmVzdHJpY3Rpb25zIHNldCBieSBhbGwgYWdlbnRzLCB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlJlc3RyaWN0aW9uc01hbmFnZXIjZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNQZXJBZG1pbn0gaW5zdGVhZC4KICAgICAgKi8KLSAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNGb3JVc2VyKFN0cmluZyBwYWNrYWdlTmFtZSwgQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CiAgICAgICAgIGlmIChVc2VySGFuZGxlLmdldENhbGxpbmdVc2VySWQoKSAhPSB1c2VySWQKQEAgLTcxODksNiArNzE5NCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBATnVsbGFibGUgaW50W10gZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlcihAVXNlcklkSW50IGludCB1c2VySWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXNlclZpc2liaWxpdHlNZWRpYXRvci5nZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKHVzZXJJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEBVc2VySWRJbnQgaW50IGdldFVzZXJBc3NpZ25lZFRvRGlzcGxheShpbnQgZGlzcGxheUlkKSB7CiAgICAgICAgICAgICByZXR1cm4gbVVzZXJWaXNpYmlsaXR5TWVkaWF0b3IuZ2V0VXNlckFzc2lnbmVkVG9EaXNwbGF5KGRpc3BsYXlJZCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclN5c3RlbVBhY2thZ2VJbnN0YWxsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclN5c3RlbVBhY2thZ2VJbnN0YWxsZXIuamF2YQppbmRleCAxMmM5ZTk4Li4yZjk5MDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJTeXN0ZW1QYWNrYWdlSW5zdGFsbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyU3lzdGVtUGFja2FnZUluc3RhbGxlci5qYXZhCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHVzZXJBbGxvd2xpc3QgPSBnZXRJbnN0YWxsYWJsZVBhY2thZ2VzRm9yVXNlcklkKHVzZXJJZCk7CiAKICAgICAgICAgICAgIHBtSW50LmZvckVhY2hQYWNrYWdlU3RhdGUocGFja2FnZVN0YXRlIC0+IHsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZVN0YXRlLmdldFBrZygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFja2FnZVN0YXRlLmdldFBrZygpID09IG51bGwgfHwgIXBhY2thZ2VTdGF0ZS5pc1N5c3RlbSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnN0YWxsID0gKHVzZXJBbGxvd2xpc3QgPT0gbnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQppbmRleCBhODYxNWMyLi4zNzEwYWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQpAQCAtNjMsMTkgKzYzLDM5IEBACiAvKioKICAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBkZWNpZGluZyB3aGV0aGVyIGEgdXNlciBpcyB2aXNpYmxlIChvciB2aXNpYmxlIGZvciBhIGdpdmVuIGRpc3BsYXkpLgogICoKLSAqIDxwPkN1cnJlbnRseSwgaXQgaGFzIDIgIm1vZGVzIiAoc2V0IG9uIGNvbnN0cnVjdG9yKSwgd2hpY2ggZGVmaW5lcyB0aGUgY2xhc3MgYmVoYXZpb3IgKGkuZSwgdGhlCisgKiA8cD5DdXJyZW50bHksIGl0IGhhcyAzICJtb2RlcyIgKHNldCBvbiBjb25zdHJ1Y3RvciksIHdoaWNoIGRlZmluZXMgdGhlIGNsYXNzIGJlaGF2aW9yIChpLmUsIHRoZQogICogbG9naWMgdGhhdCBkaWN0YXRlcyB0aGUgcmVzdWx0IG9mIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgI2lzVXNlclZpc2libGUoaW50KX0gYW5kCiAgKiB7QGxpbmsgI2lzVXNlclZpc2libGUoaW50LCBpbnQpfSk6CiAgKgogICogPHVsPgotICogICA8bGk+ZGVmYXVsdDogdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gbW9kZSAodXNlZCBieSBwaG9uZXMsIHRhYmxldHMsIGZvbGRhYmxlcywgYXV0b21vdGl2ZXMgd2l0aAotICogICBqdXN0IGNsdXN0ZXIgYW5kIGRyaXZlciBkaXNwbGF5ZXMsIGV0Yy4uLiksIHdoZXJlIHRoZSBsb2dpYyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGN1cnJlbnQKLSAqICAgZm9yZWdyb3VuZCB1c2VyIChhbmQgaXRzIHN0YXJ0ZWQgcHJvZmlsZXMpCi0gKiAgIDxsaT57QGNvZGUgTVVNRH06IG1vZGUgZm9yICIoY29uY3VycmVudCkgTXVsdGlwbGUgVXNlcnMgb24gTXVsdGlwbGUgRGlzcGxheXMiLCB3aGljaCBpcyB1c2VkIG9uCi0gKiAgIGF1dG9tb3RpdmVzIHdpdGggcGFzc2VuZ2VyIGRpc3BsYXkuIEluIHRoaXMgbW9kZSwgdXNlcnMgc3RhcnRlZCBpbiBiYWNrZ3JvdW5kIG9uIHRoZSBzZWNvbmRhcnkKLSAqICAgZGlzcGxheSBhcmUgc3RvcmVkIGluIG1hcC4KKyAqICAgPGxpPmRlZmF1bHQgKEEuSy5BIHtAY29kZSBTVVNEfSAtIFNpbmdsZSBVc2VyIG9uIFNpbmdsZSBEaXNwbGF5KTogdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gbW9kZQorICogICAodXNlZCBieSBwaG9uZXMsIHRhYmxldHMsIGZvbGRhYmxlcywgY2FycyB3aXRoIGp1c3QgY2x1c3RlciBhbmQgZHJpdmVyIGRpc3BsYXlzLCBldGMuKSwKKyAqICAgd2hlcmUganVzdCB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIHVzZXIgYW5kIGl0cyBwcm9maWxlcyBhcmUgdmlzaWJsZTsgaGVuY2UsIG1vc3QgbWV0aG9kcyBhcmUKKyAqICAgb3B0aW1pemVkIHRvIGp1c3QgY2hlY2sgZm9yIHRoZSBjdXJyZW50IHVzZXIgLyBwcm9maWxlLiBUaGlzIG1vZGUgaXMgdW5pdCB0ZXN0ZWQgYnkKKyAqICAge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yU1VTRFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fS4KKyAqICAgPGxpPmNvbmN1cnJlbnQgdXNlcnMgKEEuSy5BLiB7QGNvZGUgTVVNRH0gLSBNdWx0aXBsZSBVc2VycyBvbiBNdWx0aXBsZSBEaXNwbGF5cyk6IHR5cGljYWxseQorICogICB1c2VkIG9uIGF1dG9tb3RpdmUgYnVpbGRzIHdoZXJlIHRoZSBjYXIgaGFzIGFkZGl0aW9uYWwgZGlzcGxheXMgZm9yIHBhc3NlbmdlcnMsIGl0IGFsbG93cyB1c2VycworICogICB0byBiZSBzdGFydGVkIGluIHRoZSBiYWNrZ3JvdW5kIGJ1dCB2aXNpYmxlIG9uIHRoZXNlIGRpc3BsYXlzOyBoZW5jZSwgaXQgY29udGFpbnMgYWRkaXRpb25hbAorICogICBtYXBzIHRvIGFjY291bnQgZm9yIHRoZSB2aXNpYmlsaXR5IHN0YXRlLiBUaGlzIG1vZGUgaXMgdW5pdCB0ZXN0ZWQgYnkKKyAqICAge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yTVVNRFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fS4KKyAqICAgPGxpPm5vIGRyaXZlciAoQS5LLkEuIHtAY29kZSBNVVBBTkR9IC0gTVVsdGlwbGUgUEFzc2VuZ2VycywgTm8gRHJpdmVyKTogZXh0ZW5zaW9uIG9mIHRoZQorICogICBwcmV2aW91cyBtb2RlIGFuZCB0eXBpY2FsbHkgdXNlZCBvbiBhdXRvbW90aXZlIGJ1aWxkcyB3aGVyZSB0aGUgY2FyIGhhcyBhZGRpdGlvbmFsIGRpc3BsYXlzIGZvcgorICogICBwYXNzZW5nZXJzIGJ1dCB1c2VzIGEgc2Vjb25kYXJ5IEFuZHJvaWQgc3lzdGVtIGZvciB0aGUgYmFjayBwYXNzZW5nZXJzLCBzbyBhbGwgImh1bWFuIiB1c2VycworICogICBhcmUgc3RhcnRlZCBpbiB0aGUgYmFja2dyb3VuZCAoYW5kIHRoZSBjdXJyZW50IGZvcmVncm91bmQgdXNlciBpcyB0aGUgc3lzdGVtIHVzZXIpLCBoZW5jZSB0aGUKKyAqICAgIm5vIGRyaXZlciBuYW1lIi4gVGhpcyBtb2RlIGlzIHVuaXQgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uVXNlclZpc2liaWxpdHlNZWRpYXRvck1VUEFORFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlWaXNpYmxlQmFja2dyb3VuZFVzZXJzT25EZWZhdWx0RGlzcGxheVRlc3R9LgogICogPC91bD4KICAqCisgKiA8cD5XaGVuIHlvdSBtYWtlIGNoYW5nZXMgaW4gdGhpcyBjbGFzcywgeW91IHNob3VsZCBydW4gYXQgbGVhc3QgdGhlIDMgdW5pdCB0ZXN0cyBhbmQKKyAqIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fSAod2hpY2ggYWN0dWFsbHkgYXBwbGllcyBmb3IgYWxsIG1vZGVzKTsgZm9yCisgKiBleGFtcGxlLCBieSBjYWxsaW5nIHtAY29kZSBhdGVzdCBVc2VyVmlzaWJpbGl0eU1lZGlhdG9yU1VTRFRlc3QgVXNlclZpc2liaWxpdHlNZWRpYXRvck1VTURUZXN0CisgKiBVc2VyVmlzaWJpbGl0eU1lZGlhdG9yTVVQQU5EVGVzdCBVc2VyVmlzaWJpbGl0eVRlc3R9LiBJZGVhbGx5LCB5b3Ugc2hvdWxkIHJ1biB0aGUgb3RoZXIgMiBDVFMKKyAqIHRlc3RzIGFzIHdlbGwgKHlvdSBjYW4gZW11bGF0ZSB0aGVzZSBtb2RlcyB1c2luZyB7QGNvZGUgYWRifSBjb21tYW5kczsgdGhlaXIgamF2YWRvYyBwcm92aWRlcworICogaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBkbyBzbykuCisgKgogICogPHA+VGhpcyBjbGFzcyBpcyB0aHJlYWQgc2FmZS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFVzZXJWaXNpYmlsaXR5TWVkaWF0b3IgaW1wbGVtZW50cyBEdW1wYWJsZSB7CkBAIC03ODYsNiArODA2LDQ5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogU2VlIHtAbGluayBVc2VyTWFuYWdlckludGVybmFsI2dldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoaW50KX0uICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIGludFtdIGdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CisgICAgICAgIGludCBtYWluRGlzcGxheUlkID0gZ2V0RGlzcGxheUFzc2lnbmVkVG9Vc2VyKHVzZXJJZCk7CisgICAgICAgIGlmIChtYWluRGlzcGxheUlkID09IElOVkFMSURfRElTUExBWSkgeworICAgICAgICAgICAgLy8gVGhlIHVzZXIgd2lsbCBub3QgaGF2ZSBhbnkgZXh0cmEgZGlzcGxheXMgaWYgdGhleSBoYXZlIG5vIG1haW4gZGlzcGxheS4KKyAgICAgICAgICAgIC8vIFJldHVybiBudWxsIGlmIG5vIGRpc3BsYXkgaXMgYXNzaWduZWQgdG8gdGhlIHVzZXIuCisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZ2YuZChUQUcsICJnZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKCk6IHJldHVybmluZyBudWxsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGlzcGxheSBhc3NpZ25lZCB0byB1c2VyICVkIiwgdXNlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1FeHRyYURpc3BsYXlzQXNzaWduZWRUb1VzZXJzID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGludFtde21haW5EaXNwbGF5SWR9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgaW50W10gZGlzcGxheUlkcyA9IG5ldyBpbnRbbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpICsgMV07CisgICAgICAgICAgICBkaXNwbGF5SWRzW2NvdW50KytdID0gbWFpbkRpc3BsYXlJZDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMudmFsdWVBdChpKSA9PSB1c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheUlkc1tjb3VudCsrXSA9IG1FeHRyYURpc3BsYXlzQXNzaWduZWRUb1VzZXJzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXJyYXkgaWYgdGhlIGFycmF5IGxlbmd0aCBoYXBwZW5zIHRvIGJlIGNvcnJlY3QuCisgICAgICAgICAgICBpZiAoZGlzcGxheUlkcy5sZW5ndGggPT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheUlkczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzdWx0cyB0byBhIG5ldyBhcnJheSB3aXRoIHRoZSBleGFjdCBsZW5ndGguIFRoZSBzaXplIG9mIGRpc3BsYXlJZHNbXSBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgdG8gYDEgKyBtRXh0cmFEaXNwbGF5c0Fzc2lnbmVkVG9Vc2Vycy5zaXplKClgLCB3aGljaCBpcyB1c3VhbGx5IGxhcmdlcgorICAgICAgICAgICAgLy8gdGhhbiB0aGUgYWN0dWFsIGxlbmd0aCwgYmVjYXVzZSBtRXh0cmFEaXNwbGF5c0Fzc2lnbmVkVG9Vc2VycyBjb250YWlucyBkaXNwbGF5SWRzIGZvcgorICAgICAgICAgICAgLy8gb3RoZXIgdXNlcnMuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjb3B5IHRvIGEgbmV3IGFycmF5IHdpdGggdGhlIGNvcnJlY3QgbGVuZ3RoLgorICAgICAgICAgICAgaW50W10gcmVzdWx0cyA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaXNwbGF5SWRzLCAwLCByZXN1bHRzLCAwLCBjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgVXNlck1hbmFnZXJJbnRlcm5hbCNnZXRVc2VyQXNzaWduZWRUb0Rpc3BsYXkoaW50KX0uCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1ZlcmlmeWluZ1Nlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCmluZGV4IDViOTY3ZWMuLmYzNDBmOTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlscy5TaWduYXR1cmVTY2hlbWVWZXJzaW9uLlNJR05JTkdfQkxPQ0tfVjQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUG93ZXJXaGl0ZWxpc3RNYW5hZ2VyLlJFQVNPTl9QQUNLQUdFX1ZFUklGSUVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlBvd2VyV2hpdGVsaXN0TWFuYWdlci5URU1QT1JBUllfQUxMT1dMSVNUX1RZUEVfRk9SRUdST1VORF9TRVJWSUNFX0FMTE9XRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVI7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZS5DSEVDS19QRU5ESU5HX0lOVEVHUklUWV9WRVJJRklDQVRJT047CkBAIC00MDgsNyArNDA3LDcgQEAKICAgICAgICAgZmluYWwgaW50IG51bVJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcyA9IHJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcy5zaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSBudW1SZXF1aXJlZFZlcmlmaWVyUGFja2FnZXMgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgaWYgKCFzbmFwc2hvdC5pc0FwcGxpY2F0aW9uRWZmZWN0aXZlbHlFbmFibGVkKHJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9VSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVyVXNlcikpIHsKICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIHZlcmlmaWVyOiAiICsgcmVxdWlyZWRWZXJpZmllclBhY2thZ2VzLmdldChpKSArICIgaXMgZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICByZXF1aXJlZFZlcmlmaWVyUGFja2FnZXMucmVtb3ZlKGkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvUGFja2FnZVN0YXRlSW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL1BhY2thZ2VTdGF0ZUludGVybmFsLmphdmEKaW5kZXggMmY0YzAyNzcuLjNhMGZmMjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL1BhY2thZ2VTdGF0ZUludGVybmFsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvUGFja2FnZVN0YXRlSW50ZXJuYWwuamF2YQpAQCAtODEsNiArODEsOCBAQAogCiAgICAgZmxvYXQgZ2V0TG9hZGluZ1Byb2dyZXNzKCk7CiAKKyAgICBsb25nIGdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCk7CisKICAgICBATm9uTnVsbAogICAgIFBhY2thZ2VLZXlTZXREYXRhIGdldEtleVNldERhdGEoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZU11dGF0b3IuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL211dGF0ZS9QYWNrYWdlU3RhdGVNdXRhdG9yLmphdmEKaW5kZXggNTk0N2Q0Ny4uODEyNWIwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZU11dGF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlTXV0YXRvci5qYXZhCkBAIC0yNzQsNiArMjc0LDE1IEBACiAKICAgICAgICAgQE5vbk51bGwKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYWNrYWdlU3RhdGVXcml0ZSBzZXRMb2FkaW5nQ29tcGxldGVkVGltZShsb25nIGxvYWRpbmdDb21wbGV0ZWRUaW1lKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUuc2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUobG9hZGluZ0NvbXBsZXRlZFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFBhY2thZ2VTdGF0ZVdyaXRlIHNldE92ZXJyaWRlU2VJbmZvKEBOdWxsYWJsZSBTdHJpbmcgbmV3U2VJbmZvKSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU3RhdGUuZ2V0VHJhbnNpZW50U3RhdGUoKS5zZXRPdmVycmlkZVNlSW5mbyhuZXdTZUluZm8pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZVdyaXRlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQppbmRleCBjNjEwYzAyLi41NWQ5NmYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQpAQCAtNTMsNiArNTMsOSBAQAogICAgIFBhY2thZ2VTdGF0ZVdyaXRlIHNldExvYWRpbmdQcm9ncmVzcyhmbG9hdCBwcm9ncmVzcyk7CiAKICAgICBATm9uTnVsbAorICAgIFBhY2thZ2VTdGF0ZVdyaXRlIHNldExvYWRpbmdDb21wbGV0ZWRUaW1lKGxvbmcgbG9hZGluZ0NvbXBsZXRlZFRpbWUpOworCisgICAgQE5vbk51bGwKICAgICBQYWNrYWdlU3RhdGVXcml0ZSBzZXRPdmVycmlkZVNlSW5mbyhATnVsbGFibGUgU3RyaW5nIG5ld1NlSW5mbyk7CiAKICAgICBATm9uTnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L0RldmljZVN0YXRlUHJvdmlkZXJJbXBsLmphdmEKaW5kZXggOGQ3Zjc4Mi4uMzY0NDA1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGwuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BvbGljeS9EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0yMSw3ICsyMSwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CkBAIC0xMDEsOCArMTA0LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU1VTEFURURfT05MWSA9ICJGTEFHX0VNVUxBVEVEX09OTFkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QID0KICAgICAgICAgICAgICJGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwgPQotICAgICAgICAgICAgIkZMQUdfRElTQUJMRV9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMID0KKyAgICAgICAgICAgICJGTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFID0KKyAgICAgICAgICAgICJGTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFIjsKIAogICAgIC8qKiBJbnRlcmZhY2UgdGhhdCBhbGxvd3MgcmVhZGluZyB0aGUgZGV2aWNlIHN0YXRlIGNvbmZpZ3VyYXRpb24uICovCiAgICAgaW50ZXJmYWNlIFJlYWRhYmxlQ29uZmlnIHsKQEAgLTE2Miw5ICsxNjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUuRkxBR19DQU5DRUxfV0hFTl9SRVFVRVNURVJfTk9UX09OX1RPUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMQUdfRElTQUJMRV9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBhcnNlZCB1bmtub3duIGZsYWcgd2l0aCBuYW1lOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmxhZ1N0cmluZyk7CkBAIC0yMTAsNiArMjE4LDkgQEAKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCiAgICAgcHJpdmF0ZSBAUG93ZXJNYW5hZ2VyLlRoZXJtYWxTdGF0dXMgaW50IG1UaGVybWFsU3RhdHVzID0gUG93ZXJNYW5hZ2VyLlRIRVJNQUxfU1RBVFVTX05PTkU7CiAKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBib29sZWFuIG1Qb3dlclNhdmVNb2RlRW5hYmxlZDsKKwogICAgIHByaXZhdGUgRGV2aWNlU3RhdGVQcm92aWRlckltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxEZXZpY2VTdGF0ZT4gZGV2aWNlU3RhdGVzLAogICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb25kaXRpb25zPiBzdGF0ZUNvbmRpdGlvbnMpIHsKQEAgLTIyNCwxNCArMjM1LDMyIEBACiAKICAgICAgICAgc2V0U3RhdGVDb25kaXRpb25zKGRldmljZVN0YXRlcywgc3RhdGVDb25kaXRpb25zKTsKIAotICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGRldmljZSBzdGF0ZXMgYXJlIHRoZXJtYWwgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotICAgICAgICAvLyBkZXZpY2UgaXMgb3ZlcmhlYXRpbmcsIHRoZW4gd2Ugd2lsbCB1cGRhdGUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHN0YXRlcyB3aGVuIHRoZXJtYWwKLSAgICAgICAgLy8gc3RhdHVzIGNoYW5nZXMuCi0gICAgICAgIGlmIChoYXNUaGVybWFsU2Vuc2l0aXZlU3RhdGUoZGV2aWNlU3RhdGVzKSkgewotICAgICAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHBvd2VyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgaWYgKHBvd2VyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGRldmljZSBzdGF0ZXMgYXJlIHRoZXJtYWwgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGlzIG92ZXJoZWF0aW5nLCB0aGVuIHdlIHdpbGwgdXBkYXRlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0ZXMgd2hlbgorICAgICAgICAgICAgLy8gdGhlcm1hbCBzdGF0dXMgY2hhbmdlcy4KKyAgICAgICAgICAgIGlmIChoYXNUaGVybWFsU2Vuc2l0aXZlU3RhdGUoZGV2aWNlU3RhdGVzKSkgewogICAgICAgICAgICAgICAgIHBvd2VyTWFuYWdlci5hZGRUaGVybWFsU3RhdHVzTGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgZGV2aWNlIHN0YXRlcyBhcmUgcG93ZXIgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuCisgICAgICAgICAgICAvLyBwb3dlciBzYXZlIG1vZGUgaXMgZW5hYmxlZCwgdGhlbiB3ZSB3aWxsIHVwZGF0ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc3RhdGVzIHdoZW4KKyAgICAgICAgICAgIC8vIHBvd2VyIHNhdmUgbW9kZSBpcyB0b2dnbGVkLgorICAgICAgICAgICAgaWYgKGhhc1Bvd2VyU2F2ZVNlbnNpdGl2ZVN0YXRlKGRldmljZVN0YXRlcykpIHsKKyAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5BQ1RJT05fUE9XRVJfU0FWRV9NT0RFX0NIQU5HRURfSU5URVJOQUwpOworICAgICAgICAgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBvd2VyTWFuYWdlci5BQ1RJT05fUE9XRVJfU0FWRV9NT0RFX0NIQU5HRURfSU5URVJOQUwuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Qb3dlclNhdmVNb2RlQ2hhbmdlZChwb3dlck1hbmFnZXIuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zODIsNyArNDExLDExIEBACiAgICAgICAgICAgICBmb3IgKERldmljZVN0YXRlIGRldmljZVN0YXRlIDogbU9yZGVyZWRTdGF0ZXMpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNUaGVybWFsU3RhdHVzQ3JpdGljYWxPckFib3ZlKG1UaGVybWFsU3RhdHVzKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGV2aWNlU3RhdGUuaGFzRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUG93ZXJTYXZlTW9kZUVuYWJsZWQgJiYgZGV2aWNlU3RhdGUuaGFzRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRTdGF0ZXMuYWRkKGRldmljZVN0YXRlKTsKQEAgLTY3NCw2ICs3MDcsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHZvaWQgb25Qb3dlclNhdmVNb2RlQ2hhbmdlZChib29sZWFuIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1Qb3dlclNhdmVNb2RlRW5hYmxlZCAhPSBpc1Bvd2VyU2F2ZU1vZGVFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbVBvd2VyU2F2ZU1vZGVFbmFibGVkID0gaXNQb3dlclNhdmVNb2RlRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBub3RpZnlTdXBwb3J0ZWRTdGF0ZXNDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNQb3dlclNhdmVNb2RlRW5hYmxlZCA/IFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uVGhlcm1hbFN0YXR1c0NoYW5nZWQoQFBvd2VyTWFuYWdlci5UaGVybWFsU3RhdHVzIGludCB0aGVybWFsU3RhdHVzKSB7CiAgICAgICAgIGludCBwcmV2aW91c1RoZXJtYWxTdGF0dXM7CkBAIC03MDksNyArNzU0LDE2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1RoZXJtYWxTZW5zaXRpdmVTdGF0ZShMaXN0PERldmljZVN0YXRlPiBkZXZpY2VTdGF0ZXMpIHsKICAgICAgICAgZm9yIChEZXZpY2VTdGF0ZSBzdGF0ZSA6IGRldmljZVN0YXRlcykgewotICAgICAgICAgICAgaWYgKHN0YXRlLmhhc0ZsYWcoRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuaGFzRmxhZyhEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUG93ZXJTYXZlU2Vuc2l0aXZlU3RhdGUoTGlzdDxEZXZpY2VTdGF0ZT4gZGV2aWNlU3RhdGVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlU3RhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlU3RhdGVzLmdldChpKS5oYXNGbGFnKERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG93ZXIvTm90aWZpZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG93ZXIvTm90aWZpZXIuamF2YQppbmRleCBkYTdhYWE0Li5kMGVkOWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3Bvd2VyL05vdGlmaWVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9Ob3RpZmllci5qYXZhCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgICAgICAgICAgICBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fU0NSRUVOX09OKTsKICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIGJyb2FkY2FzdCBkZWxpdmVyeSB0byBiZSBkZWxheWVkIHRvIGFwcHMgaW4gdGhlIENhY2hlZCBzdGF0ZS4KLSAgICAgICAgb3B0aW9ucy5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpOworICAgICAgICBvcHRpb25zLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSk7CiAgICAgICAgIHJldHVybiBvcHRpb25zLnRvQnVuZGxlKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NwZWVjaC9SZW1vdGVTcGVlY2hSZWNvZ25pdGlvblNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1JlbW90ZVNwZWVjaFJlY29nbml0aW9uU2VydmljZS5qYXZhCmluZGV4IDhlOGFiZjYuLjk2ZjRhMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1JlbW90ZVNwZWVjaFJlY29nbml0aW9uU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1JlbW90ZVNwZWVjaFJlY29nbml0aW9uU2VydmljZS5qYXZhCkBAIC0yNTAsMTUgKzI1MCw3IEBACiAgICAgICAgICAgICAgICAgc2VydmljZS5jaGVja1JlY29nbml0aW9uU3VwcG9ydChyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSwgY2FsbGJhY2spKTsKICAgICB9CiAKLSAgICB2b2lkIHRyaWdnZXJNb2RlbERvd25sb2FkKEludGVudCByZWNvZ25pemVySW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICIjZG93bmxvYWRNb2RlbCBmYWlsZWQgZHVlIHRvIGNvbm5lY3Rpb24uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcnVuKHNlcnZpY2UgLT4gc2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZChyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSkpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgewpAQCAtMjY2LDI1ICsyNTgsMTIgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25FcnJvcihTcGVlY2hSZWNvZ25pemVyLkVSUk9SX1NFUlZFUl9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHRvIHJlcG9ydCB0aGUgY29ubmVjdGlvbiBicm9rZSB0byB0aGUgY2FsbGVyLiIsIGUpOworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICIjZG93bmxvYWRNb2RlbCBmYWlsZWQgZHVlIHRvIGNvbm5lY3Rpb24uIiwgZSk7CiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIHJ1bihzZXJ2aWNlIC0+Ci0gICAgICAgICAgICAgICAgc2VydmljZS5zZXRNb2RlbERvd25sb2FkTGlzdGVuZXIocmVjb2duaXplckludGVudCwgYXR0cmlidXRpb25Tb3VyY2UsIGxpc3RlbmVyKSk7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgIEludGVudCByZWNvZ25pemVySW50ZW50LAotICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKLSAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBydW4oc2VydmljZSAtPgotICAgICAgICAgICAgICAgIHNlcnZpY2UuY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIocmVjb2duaXplckludGVudCwgYXR0cmlidXRpb25Tb3VyY2UpKTsKKyAgICAgICAgcnVuKHNlcnZpY2UgLT4gc2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZChyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSwgbGlzdGVuZXIpKTsKICAgICB9CiAKICAgICB2b2lkIHNodXRkb3duKElCaW5kZXIgY2xpZW50VG9rZW4pIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2VJbXBsLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbk1hbmFnZXJTZXJ2aWNlSW1wbC5qYXZhCmluZGV4IGJjNzNkYjEuLmJmZjZkNTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2VJbXBsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZUltcGwuamF2YQpAQCAtMTkzLDI1ICsxOTMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCByZWNvZ25pemVySW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UudHJpZ2dlck1vZGVsRG93bmxvYWQocmVjb2duaXplckludGVudCwgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UudHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSwgbGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIocmVjb2duaXplckludGVudCwgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgY3JlYXRpbmcgYSBzcGVlY2ggcmVjb2duaXRpb24gc2Vzc2lvbiIsIGUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zdGF0cy9wdWxsL1N0YXRzUHVsbEF0b21TZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3N0YXRzL3B1bGwvU3RhdHNQdWxsQXRvbVNlcnZpY2UuamF2YQppbmRleCA2MDFkMGUyLi4zZDhmNTM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3N0YXRzL3B1bGwvU3RhdHNQdWxsQXRvbVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3N0YXRzL3B1bGwvU3RhdHNQdWxsQXRvbVNlcnZpY2UuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuT0VNX01BTkFHRURfUFJJVkFURTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5EZWJ1Zy5nZXRJb25IZWFwc1NpemVLYjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qcm9jZXNzLkxBU1RfU0hBUkVEX0FQUExJQ0FUSU9OX0dJRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qcm9jZXNzLlNZU1RFTV9VSUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUHJvY2Vzcy5nZXRVaWRGb3JQaWQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3Muc3RvcmFnZS5Wb2x1bWVJbmZvLlRZUEVfUFJJVkFURTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5zdG9yYWdlLlZvbHVtZUluZm8uVFlQRV9QVUJMSUM7CkBAIC04OSw4ICs5MCwxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5jcmVtZW50YWxTdGF0ZXNJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Vc2VySW5mbzsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmJpb21ldHJpY3MuQmlvbWV0cmljc1Byb3RvRW51bXM7CkBAIC00MjEzLDIwICs0MjE2LDI2IEBACiAKICAgICBpbnQgcHVsbEluc3RhbGxlZEluY3JlbWVudGFsUGFja2FnZXNMb2NrZWQoaW50IGF0b21UYWcsIExpc3Q8U3RhdHNFdmVudD4gcHVsbGVkRGF0YSkgewogICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VySW50ZXJuYWwgcG1JbnRlbnJhbCA9CisgICAgICAgICAgICAgICAgTG9jYWxTZXJ2aWNlcy5nZXRTZXJ2aWNlKFBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuY2xhc3MpOwogICAgICAgICBpZiAoIXBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9JTkNSRU1FTlRBTF9ERUxJVkVSWSkpIHsKICAgICAgICAgICAgIC8vIEluY3JlbWVudGFsIGlzIG5vdCBlbmFibGVkIG9uIHRoaXMgZGV2aWNlLiBUaGUgcmVzdWx0IGxpc3Qgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgIHJldHVybiBTdGF0c01hbmFnZXIuUFVMTF9TVUNDRVNTOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludFtdIHVzZXJJZHMgPSBMb2NhbFNlcnZpY2VzLmdldFNlcnZpY2UoVXNlck1hbmFnZXJJbnRlcm5hbC5jbGFzcykuZ2V0VXNlcklkcygpOworICAgICAgICAgICAgZmluYWwgaW50W10gdXNlcklkcyA9IExvY2FsU2VydmljZXMuZ2V0U2VydmljZShVc2VyTWFuYWdlckludGVybmFsLmNsYXNzKS5nZXRVc2VySWRzKCk7CiAgICAgICAgICAgICBmb3IgKGludCB1c2VySWQgOiB1c2VySWRzKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxQYWNrYWdlSW5mbz4gaW5zdGFsbGVkUGFja2FnZXMgPSBwbS5nZXRJbnN0YWxsZWRQYWNrYWdlc0FzVXNlcigwLCB1c2VySWQpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFja2FnZUluZm8+IGluc3RhbGxlZFBhY2thZ2VzID0gcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXNBc1VzZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAwLCB1c2VySWQpOwogICAgICAgICAgICAgICAgIGZvciAoUGFja2FnZUluZm8gcGkgOiBpbnN0YWxsZWRQYWNrYWdlcykgewogICAgICAgICAgICAgICAgICAgICBpZiAoSW5jcmVtZW50YWxNYW5hZ2VyLmlzSW5jcmVtZW50YWxQYXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmFwcGxpY2F0aW9uSW5mby5nZXRCYXNlQ29kZVBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEluY3JlbWVudGFsU3RhdGVzSW5mbyBpbmZvID0gcG1JbnRlbnJhbC5nZXRJbmNyZW1lbnRhbFN0YXRlc0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnBhY2thZ2VOYW1lLCBTWVNURU1fVUlELCB1c2VySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgcHVsbGVkRGF0YS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1N0YXRzTG9nLmJ1aWxkU3RhdHNFdmVudChhdG9tVGFnLCBwaS5hcHBsaWNhdGlvbkluZm8udWlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1N0YXRzTG9nLmJ1aWxkU3RhdHNFdmVudChhdG9tVGFnLCBwaS5hcHBsaWNhdGlvbkluZm8udWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uaXNMb2FkaW5nKCksIGluZm8uZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90di90dW5lcnJlc291cmNlbWFuYWdlci9UdW5lclJlc291cmNlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvVHVuZXJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZWQ5MTc3NS4uMmQzOTI4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90di90dW5lcnJlc291cmNlbWFuYWdlci9UdW5lclJlc291cmNlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xMDE5LDYgKzEwMTksNyBAQAogICAgICAgICBpbnQgaW5Vc2VMb3dlc3RQcmlvcml0eUZySGFuZGxlID0gVHVuZXJSZXNvdXJjZU1hbmFnZXIuSU5WQUxJRF9SRVNPVVJDRV9IQU5ETEU7CiAgICAgICAgIC8vIFByaW9yaXR5IG1heCB2YWx1ZSBpcyAxMDAwCiAgICAgICAgIGludCBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBNQVhfQ0xJRU5UX1BSSU9SSVRZICsgMTsKKyAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSBmYWxzZTsKICAgICAgICAgLy8gSWYgdGhlIGRlc2lyZWQgZnJvbnRlbmQgaWQgd2FzIHNwZWNpZmllZCwgd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBmcm9udGVuZC4KICAgICAgICAgYm9vbGVhbiBoYXNEZXNpcmVkRnJvbnRlbmQgPSByZXF1ZXN0LmRlc2lyZWRJZCAhPSBUdW5lckZyb250ZW5kUmVxdWVzdC5ERUZBVUxUX0RFU0lSRURfSUQ7CiAgICAgICAgIGZvciAoRnJvbnRlbmRSZXNvdXJjZSBmciA6IGdldEZyb250ZW5kUmVzb3VyY2VzKCkudmFsdWVzKCkpIHsKQEAgLTEwNDgsNiArMTA0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93ZXN0UHJpb3JpdHkgPiBwcmlvcml0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VMb3dlc3RQcmlvcml0eUZySGFuZGxlID0gZnIuZ2V0SGFuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IChyZXF1ZXN0Q2xpZW50LmdldFByb2Nlc3NJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gKGdldENsaWVudFByb2ZpbGUoZnIuZ2V0T3duZXJDbGllbnRJZCgpKSkuZ2V0UHJvY2Vzc0lkKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA2Myw3ICsxMDY2LDggQEAKICAgICAgICAgLy8gV2hlbiBhbGwgdGhlIHJlc291cmNlcyBhcmUgb2NjdXBpZWQsIGdyYW50IHRoZSBsb3dlc3QgcHJpb3JpdHkgcmVzb3VyY2UgaWYgdGhlCiAgICAgICAgIC8vIHJlcXVlc3QgY2xpZW50IGhhcyBoaWdoZXIgcHJpb3JpdHkuCiAgICAgICAgIGlmIChpblVzZUxvd2VzdFByaW9yaXR5RnJIYW5kbGUgIT0gVHVuZXJSZXNvdXJjZU1hbmFnZXIuSU5WQUxJRF9SRVNPVVJDRV9IQU5ETEUKLSAgICAgICAgICAgICAgICAmJiAocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KSkgeworICAgICAgICAgICAgJiYgKChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpIHx8ICgKKyAgICAgICAgICAgIChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPT0gY3VycmVudExvd2VzdFByaW9yaXR5KSAmJiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MpKSkgewogICAgICAgICAgICAgaWYgKCFyZWNsYWltUmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgIGdldEZyb250ZW5kUmVzb3VyY2UoaW5Vc2VMb3dlc3RQcmlvcml0eUZySGFuZGxlKS5nZXRPd25lckNsaWVudElkKCksCiAgICAgICAgICAgICAgICAgICAgIFR1bmVyUmVzb3VyY2VNYW5hZ2VyLlRVTkVSX1JFU09VUkNFX1RZUEVfRlJPTlRFTkQpKSB7CkBAIC0xMTgyLDYgKzExODYsNyBAQAogICAgICAgICBpbnQgaW5Vc2VMb3dlc3RQcmlvcml0eUxuYkhhbmRsZSA9IFR1bmVyUmVzb3VyY2VNYW5hZ2VyLklOVkFMSURfUkVTT1VSQ0VfSEFORExFOwogICAgICAgICAvLyBQcmlvcml0eSBtYXggdmFsdWUgaXMgMTAwMAogICAgICAgICBpbnQgY3VycmVudExvd2VzdFByaW9yaXR5ID0gTUFYX0NMSUVOVF9QUklPUklUWSArIDE7CisgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gZmFsc2U7CiAgICAgICAgIGZvciAoTG5iUmVzb3VyY2UgbG5iIDogZ2V0TG5iUmVzb3VyY2VzKCkudmFsdWVzKCkpIHsKICAgICAgICAgICAgIGlmICghbG5iLmlzSW5Vc2UoKSkgewogICAgICAgICAgICAgICAgIC8vIEdyYW50IHRoZSB1bnVzZWQgbG5iIHdpdGggbG93ZXIgaGFuZGxlIGZpcnN0CkBAIC0xMTk0LDYgKzExOTksOCBAQAogICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93ZXN0UHJpb3JpdHkgPiBwcmlvcml0eSkgewogICAgICAgICAgICAgICAgICAgICBpblVzZUxvd2VzdFByaW9yaXR5TG5iSGFuZGxlID0gbG5iLmdldEhhbmRsZSgpOwogICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gKHJlcXVlc3RDbGllbnQuZ2V0UHJvY2Vzc0lkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IChnZXRDbGllbnRQcm9maWxlKGxuYi5nZXRPd25lckNsaWVudElkKCkpKS5nZXRQcm9jZXNzSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjA4LDcgKzEyMTUsOCBAQAogICAgICAgICAvLyBXaGVuIGFsbCB0aGUgcmVzb3VyY2VzIGFyZSBvY2N1cGllZCwgZ3JhbnQgdGhlIGxvd2VzdCBwcmlvcml0eSByZXNvdXJjZSBpZiB0aGUKICAgICAgICAgLy8gcmVxdWVzdCBjbGllbnQgaGFzIGhpZ2hlciBwcmlvcml0eS4KICAgICAgICAgaWYgKGluVXNlTG93ZXN0UHJpb3JpdHlMbmJIYW5kbGUgPiBUdW5lclJlc291cmNlTWFuYWdlci5JTlZBTElEX1JFU09VUkNFX0hBTkRMRQotICAgICAgICAgICAgICAgICYmIChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgICAgICAmJiAoKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgfHwgKAorICAgICAgICAgICAgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA9PSBjdXJyZW50TG93ZXN0UHJpb3JpdHkpICYmIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcykpKSB7CiAgICAgICAgICAgICBpZiAoIXJlY2xhaW1SZXNvdXJjZShnZXRMbmJSZXNvdXJjZShpblVzZUxvd2VzdFByaW9yaXR5TG5iSGFuZGxlKS5nZXRPd25lckNsaWVudElkKCksCiAgICAgICAgICAgICAgICAgICAgIFR1bmVyUmVzb3VyY2VNYW5hZ2VyLlRVTkVSX1JFU09VUkNFX1RZUEVfTE5CKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEyNDAsNiArMTI0OCw3IEBACiAgICAgICAgIGludCBsb3dlc3RQcmlvcml0eU93bmVySWQgPSAtMTsKICAgICAgICAgLy8gUHJpb3JpdHkgbWF4IHZhbHVlIGlzIDEwMDAKICAgICAgICAgaW50IGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IE1BWF9DTElFTlRfUFJJT1JJVFkgKyAxOworICAgICAgICBib29sZWFuIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IGZhbHNlOwogICAgICAgICBpZiAoIWNhcy5pc0Z1bGx5VXNlZCgpKSB7CiAgICAgICAgICAgICBjYXNTZXNzaW9uSGFuZGxlWzBdID0gZ2VuZXJhdGVSZXNvdXJjZUhhbmRsZSgKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9DQVNfU0VTU0lPTiwgY2FzLmdldFN5c3RlbUlkKCkpOwpAQCAtMTI1MiwxMiArMTI2MSwxNSBAQAogICAgICAgICAgICAgaWYgKGN1cnJlbnRMb3dlc3RQcmlvcml0eSA+IHByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICAgbG93ZXN0UHJpb3JpdHlPd25lcklkID0gb3duZXJJZDsKICAgICAgICAgICAgICAgICBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSAocmVxdWVzdENsaWVudC5nZXRQcm9jZXNzSWQoKQorICAgICAgICAgICAgICAgICAgICA9PSAoZ2V0Q2xpZW50UHJvZmlsZShvd25lcklkKSkuZ2V0UHJvY2Vzc0lkKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gV2hlbiBhbGwgdGhlIENhcyBzZXNzaW9ucyBhcmUgb2NjdXBpZWQsIHJlY2xhaW0gdGhlIGxvd2VzdCBwcmlvcml0eSBjbGllbnQgaWYgdGhlCiAgICAgICAgIC8vIHJlcXVlc3QgY2xpZW50IGhhcyBoaWdoZXIgcHJpb3JpdHkuCi0gICAgICAgIGlmIChsb3dlc3RQcmlvcml0eU93bmVySWQgPiAtMSAmJiAocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KSkgeworICAgICAgICBpZiAobG93ZXN0UHJpb3JpdHlPd25lcklkID4gLTEgJiYgKChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpCisgICAgICAgIHx8ICgocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID09IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgJiYgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzKSkpIHsKICAgICAgICAgICAgIGlmICghcmVjbGFpbVJlc291cmNlKGxvd2VzdFByaW9yaXR5T3duZXJJZCwKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9DQVNfU0VTU0lPTikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjg5LDYgKzEzMDEsNyBAQAogICAgICAgICBpbnQgbG93ZXN0UHJpb3JpdHlPd25lcklkID0gLTE7CiAgICAgICAgIC8vIFByaW9yaXR5IG1heCB2YWx1ZSBpcyAxMDAwCiAgICAgICAgIGludCBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBNQVhfQ0xJRU5UX1BSSU9SSVRZICsgMTsKKyAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSBmYWxzZTsKICAgICAgICAgaWYgKCFjaUNhbS5pc0Z1bGx5VXNlZCgpKSB7CiAgICAgICAgICAgICBjaUNhbUhhbmRsZVswXSA9IGdlbmVyYXRlUmVzb3VyY2VIYW5kbGUoCiAgICAgICAgICAgICAgICAgICAgIFR1bmVyUmVzb3VyY2VNYW5hZ2VyLlRVTkVSX1JFU09VUkNFX1RZUEVfRlJPTlRFTkRfQ0lDQU0sIGNpQ2FtLmdldENpQ2FtSWQoKSk7CkBAIC0xMzAxLDEyICsxMzE0LDE2IEBACiAgICAgICAgICAgICBpZiAoY3VycmVudExvd2VzdFByaW9yaXR5ID4gcHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgICBsb3dlc3RQcmlvcml0eU93bmVySWQgPSBvd25lcklkOwogICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgICAgIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IChyZXF1ZXN0Q2xpZW50LmdldFByb2Nlc3NJZCgpCisgICAgICAgICAgICAgICAgICAgID09IChnZXRDbGllbnRQcm9maWxlKG93bmVySWQpKS5nZXRQcm9jZXNzSWQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXaGVuIGFsbCB0aGUgQ2lDYW0gc2Vzc2lvbnMgYXJlIG9jY3VwaWVkLCByZWNsYWltIHRoZSBsb3dlc3QgcHJpb3JpdHkgY2xpZW50IGlmIHRoZQogICAgICAgICAvLyByZXF1ZXN0IGNsaWVudCBoYXMgaGlnaGVyIHByaW9yaXR5LgotICAgICAgICBpZiAobG93ZXN0UHJpb3JpdHlPd25lcklkID4gLTEgJiYgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkpIHsKKyAgICAgICAgaWYgKGxvd2VzdFByaW9yaXR5T3duZXJJZCA+IC0xICYmICgocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KQorICAgICAgICAgICAgfHwgKChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPT0gY3VycmVudExvd2VzdFByaW9yaXR5KQorICAgICAgICAgICAgICAgICYmIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcykpKSB7CiAgICAgICAgICAgICBpZiAoIXJlY2xhaW1SZXNvdXJjZShsb3dlc3RQcmlvcml0eU93bmVySWQsCiAgICAgICAgICAgICAgICAgICAgIFR1bmVyUmVzb3VyY2VNYW5hZ2VyLlRVTkVSX1JFU09VUkNFX1RZUEVfRlJPTlRFTkRfQ0lDQU0pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQyNCw2ICsxNDQxLDcgQEAKICAgICAgICAgaW50IGluVXNlTG93ZXN0UHJpb3JpdHlEckhhbmRsZSA9IFR1bmVyUmVzb3VyY2VNYW5hZ2VyLklOVkFMSURfUkVTT1VSQ0VfSEFORExFOwogICAgICAgICAvLyBQcmlvcml0eSBtYXggdmFsdWUgaXMgMTAwMAogICAgICAgICBpbnQgY3VycmVudExvd2VzdFByaW9yaXR5ID0gTUFYX0NMSUVOVF9QUklPUklUWSArIDE7CisgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gZmFsc2U7CiAgICAgICAgIC8vIElmIHRoZSBkZXNpcmVkIGRlbXV4IGlkIHdhcyBzcGVjaWZpZWQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgZGVtdXguCiAgICAgICAgIGJvb2xlYW4gaGFzRGVzaXJlZERlbXV4Q2FwID0gcmVxdWVzdC5kZXNpcmVkRmlsdGVyVHlwZXMKICAgICAgICAgICAgICAgICAhPSBEZW11eEZpbHRlck1haW5UeXBlLlVOREVGSU5FRDsKQEAgLTE0NDgsNiArMTQ2Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbG93ZXN0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvd2VzdFByaW9yaXR5ID4gcHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSAocmVxdWVzdENsaWVudC5nZXRQcm9jZXNzSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAoZ2V0Q2xpZW50UHJvZmlsZShkci5nZXRPd25lckNsaWVudElkKCkpKS5nZXRQcm9jZXNzSWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzbWFsbGVzdCBjYXBzCkBAIC0xNDczLDcgKzE0OTMsOCBAQAogICAgICAgICAvLyBXaGVuIGFsbCB0aGUgcmVzb3VyY2VzIGFyZSBvY2N1cGllZCwgZ3JhbnQgdGhlIGxvd2VzdCBwcmlvcml0eSByZXNvdXJjZSBpZiB0aGUKICAgICAgICAgLy8gcmVxdWVzdCBjbGllbnQgaGFzIGhpZ2hlciBwcmlvcml0eS4KICAgICAgICAgaWYgKGluVXNlTG93ZXN0UHJpb3JpdHlEckhhbmRsZSAhPSBUdW5lclJlc291cmNlTWFuYWdlci5JTlZBTElEX1JFU09VUkNFX0hBTkRMRQotICAgICAgICAgICAgICAgICYmIChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgICAgICAmJiAoKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgfHwgKAorICAgICAgICAgICAgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA9PSBjdXJyZW50TG93ZXN0UHJpb3JpdHkpICYmIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcykpKSB7CiAgICAgICAgICAgICBpZiAoIXJlY2xhaW1SZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgZ2V0RGVtdXhSZXNvdXJjZShpblVzZUxvd2VzdFByaW9yaXR5RHJIYW5kbGUpLmdldE93bmVyQ2xpZW50SWQoKSwKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9ERU1VWCkpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlDbGllbnRDb250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5Q2xpZW50Q29udHJvbGxlci5qYXZhCmluZGV4IGQxMDhmMGQuLmYxNGE0MzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlDbGllbnRDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eUNsaWVudENvbnRyb2xsZXIuamF2YQpAQCAtMjUxLDExICsyNTEsNiBAQAogICAgICAgICAgICAgICAgICAgICAvLyB7QGxpbmsgI3Jlc3RhcnRBY3Rpdml0eVByb2Nlc3NJZlZpc2libGV9LgogICAgICAgICAgICAgICAgICAgICByZXN0YXJ0aW5nTmFtZSA9IHIuYXBwLm1OYW1lOwogICAgICAgICAgICAgICAgICAgICByZXN0YXJ0aW5nVWlkID0gci5hcHAubVVpZDsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBFbnN1cmVBY3Rpdml0aWVzVmlzaWJsZUhlbHBlciNtYWtlVmlzaWJsZUFuZFJlc3RhcnRJZk5lZWRlZCBub3Qgc2tpcAotICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0aW5nIG5vbi10b3AgYWN0aXZpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChyICE9IHIuZ2V0VGFzaygpLnRvcFJ1bm5pbmdBY3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLnNldFZpc2libGVSZXF1ZXN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHlTdG9wcGVkKGljaWNsZSwgcGVyc2lzdGVudFN0YXRlLCBkZXNjcmlwdGlvbik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5UmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5UmVjb3JkLmphdmEKaW5kZXggZDE1ZDA5NC4uMzI0YTBhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmQuamF2YQpAQCAtNDEzNSw5ICs0MTM1LDcgQEAKICAgICAgICAgfSBlbHNlIGlmICghbVZpc2libGVSZXF1ZXN0ZWQgJiYgbGF1bmNoQ291bnQgPiAyCiAgICAgICAgICAgICAgICAgJiYgbGFzdExhdW5jaFRpbWUgPiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSA2MDAwMCkpIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmUgbGF1bmNoZWQgdGhpcyBhY3Rpdml0eSB0b28gbWFueSB0aW1lcyBzaW5jZSBpdCB3YXMgYWJsZSB0byBydW4sIHNvIGdpdmUgdXAKLSAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgaXQuIChOb3RlIGlmIHRoZSBhY3Rpdml0eSBpcyB2aXNpYmxlLCB3ZSBkb24ndCByZW1vdmUgdGhlIHJlY29yZC4gV2UgbGVhdmUKLSAgICAgICAgICAgIC8vIHRoZSBkZWFkIHdpbmRvdyBvbiB0aGUgc2NyZWVuIGJ1dCB0aGUgcHJvY2VzcyB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQgdW5sZXNzIHVzZXIKLSAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgdGFwIG9uIGl0LikKKyAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgaXQuCiAgICAgICAgICAgICByZW1vdmUgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gVGhlIHByb2Nlc3MgbWF5IGJlIGdvbmUsIGJ1dCB0aGUgYWN0aXZpdHkgbGl2ZXMgb24hCkBAIC00MTU5LDExICs0MTU3LDYgQEAKICAgICAgICAgICAgIGlmIChERUJVR19BUFApIHsKICAgICAgICAgICAgICAgICBTbG9nLnYoVEFHX0FQUCwgIktlZXBpbmcgZW50cnkgZHVyaW5nIHJlbW92ZUhpc3RvcnkgZm9yIGFjdGl2aXR5ICIgKyB0aGlzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNldCBub3dWaXNpYmxlIHRvIHByZXZpb3VzIHZpc2libGUgc3RhdGUuIElmIHRoZSBhcHAgd2FzIHZpc2libGUgd2hpbGUgaXQgZGllZCwgd2UKLSAgICAgICAgICAgIC8vIGxlYXZlIHRoZSBkZWFkIHdpbmRvdyBvbiBzY3JlZW4gc28gaXQncyBiYXNpY2FsbHkgdmlzaWJsZS4gVGhpcyBpcyBuZWVkZWQgd2hlbiB1c2VyCi0gICAgICAgICAgICAvLyBsYXRlciB0YXAgb24gdGhlIGRlYWQgd2luZG93LCB3ZSBuZWVkIHRvIHN0b3Agb3RoZXIgYXBwcyB3aGVuIHVzZXIgdHJhbnNmZXJzIGZvY3VzCi0gICAgICAgICAgICAvLyB0byB0aGUgcmVzdGFydGVkIGFjdGl2aXR5LgotICAgICAgICAgICAgbm93VmlzaWJsZSA9IG1WaXNpYmxlUmVxdWVzdGVkOwogICAgICAgICB9CiAgICAgICAgIC8vIHVwZ3JhZGUgdHJhbnNpdGlvbiB0cmlnZ2VyIHRvIHRhc2sgaWYgdGhpcyBpcyB0aGUgbGFzdCBhY3Rpdml0eSBzaW5jZSBpdCBtZWFucyB3ZSBhcmUKICAgICAgICAgLy8gY2xvc2luZyB0aGUgdGFzay4KQEAgLTUyMzIsNiArNTIyNSwxMSBAQAogICAgICAgICAgICAgU2xvZy53KFRBR19XTSwgIkF0dGVtcHRlZCB0byBzZXQgdmlzaWJpbGl0eSBvZiBub24tZXhpc3RpbmcgYXBwIHRva2VuOiAiICsgdG9rZW4pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmICh2aXNpYmxlID09IG1WaXNpYmxlUmVxdWVzdGVkICYmIHZpc2libGUgPT0gbVZpc2libGUKKyAgICAgICAgICAgICAgICAmJiBtVHJhbnNpdGlvbkNvbnRyb2xsZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvLyBGb3Igc2hlbGwgdHJhbnNpdGlvbiwgaXQgaXMgbm8tb3AgaWYgdGhlcmUgaXMgbm8gc3RhdGUgY2hhbmdlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgICAgICBtRGVmZXJIaWRpbmdDbGllbnQgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtNTI3MCwxMyArNTI2OCwxOCBAQAogCiAgICAgICAgIC8vIEJlZm9yZSBzZXR0aW5nIG1WaXNpYmxlUmVxdWVzdGVkIHNvIHdlIGNhbiB0cmFjayBjaGFuZ2VzLgogICAgICAgICBib29sZWFuIGlzQ29sbGVjdGluZyA9IGZhbHNlOworICAgICAgICBib29sZWFuIGluRmluaXNoaW5nVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICBpZiAobVRyYW5zaXRpb25Db250cm9sbGVyLmlzU2hlbGxUcmFuc2l0aW9uc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgaXNDb2xsZWN0aW5nID0gbVRyYW5zaXRpb25Db250cm9sbGVyLmlzQ29sbGVjdGluZygpOwogICAgICAgICAgICAgaWYgKGlzQ29sbGVjdGluZykgewogICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uQ29udHJvbGxlci5jb2xsZWN0KHRoaXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAic2V0VmlzaWJpbGl0eT0iICsgdmlzaWJsZSArICIgd2hpbGUgdHJhbnNpdGlvbiBpcyBub3QgY29sbGVjdGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMgKyAiIGNhbGxlcj0iICsgRGVidWcuZ2V0Q2FsbGVycyg4KSk7CisgICAgICAgICAgICAgICAgaW5GaW5pc2hpbmdUcmFuc2l0aW9uID0gbVRyYW5zaXRpb25Db250cm9sbGVyLmluRmluaXNoaW5nVHJhbnNpdGlvbih0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluRmluaXNoaW5nVHJhbnNpdGlvbikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAic2V0VmlzaWJpbGl0eT0iICsgdmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGlsZSB0cmFuc2l0aW9uIGlzIG5vdCBjb2xsZWN0aW5nIG9yIGZpbmlzaGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzICsgIiBjYWxsZXI9IiArIERlYnVnLmdldENhbGxlcnMoOCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01MjkwLDEwICs1MjkzLDYgQEAKICAgICAgICAgbUxhc3REZWZlckhpZGluZ0NsaWVudCA9IGRlZmVySGlkaW5nQ2xpZW50OwogCiAgICAgICAgIGlmICghdmlzaWJsZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBpcyBkZWFkIHdoaWxlIGl0IHdhcyB2aXNpYmxlLCB3ZSBrZXB0IGl0cyBkZWFkIHdpbmRvdyBvbiBzY3JlZW4uCi0gICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgYXBwIGlzIGdvaW5nIGludmlzaWJsZSwgd2UgY2FuIHJlbW92ZSBpdC4gSXQgd2lsbCBiZSByZXN0YXJ0ZWQKLSAgICAgICAgICAgIC8vIGlmIG1hZGUgdmlzaWJsZSBhZ2Fpbi4KLSAgICAgICAgICAgIHJlbW92ZURlYWRXaW5kb3dzKCk7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGFjdGl2aXR5IGlzIGFib3V0IHRvIGZpbmlzaC9zdG9wcGVkIGFuZCBub3cgYmVjb21lcyBpbnZpc2libGUsIHJlbW92ZSBpdAogICAgICAgICAgICAgLy8gZnJvbSB0aGUgdW5rbm93bkFwcCBsaXN0IGluIGNhc2UgdGhlIGFjdGl2aXR5IGRvZXMgbm90IHdhbnQgdG8gZHJhdyBhbnl0aGluZywgd2hpY2gKICAgICAgICAgICAgIC8vIGtlZXAgdGhlIHVzZXIgd2FpdGluZyBmb3IgdGhlIG5leHQgdHJhbnNpdGlvbiB0byBzdGFydC4KQEAgLTUzNTcsNiArNTM1NiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkZpbmlzaGluZ1RyYW5zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIExldCB0aGUgZmluaXNoaW5nIHRyYW5zaXRpb24gY29tbWl0IHRoZSB2aXNpYmlsaXR5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIC8vIElmIHdlIGFyZSBwcmVwYXJpbmcgYW4gYXBwIHRyYW5zaXRpb24sIHRoZW4gZGVsYXkgY2hhbmdpbmcKICAgICAgICAgLy8gdGhlIHZpc2liaWxpdHkgb2YgdGhpcyB0b2tlbiB1bnRpbCB3ZSBleGVjdXRlIHRoYXQgdHJhbnNpdGlvbi4KICAgICAgICAgaWYgKGRlZmVyQ29tbWl0VmlzaWJpbGl0eUNoYW5nZSh2aXNpYmxlKSkgewpAQCAtNjY0Miw5ICs2NjQ1LDYgQEAKICAgICAgICAgLy8gc3RvcCB0cmFja2luZwogICAgICAgICBtU3BsYXNoU2NyZWVuU3R5bGVTb2xpZENvbG9yID0gdHJ1ZTsKIAotICAgICAgICAvLyBXZSBub3cgaGF2ZSBhIGdvb2Qgd2luZG93IHRvIHNob3csIHJlbW92ZSBkZWFkIHBsYWNlaG9sZGVycwotICAgICAgICByZW1vdmVEZWFkV2luZG93cygpOwotCiAgICAgICAgIGlmIChtU3RhcnRpbmdXaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgUHJvdG9Mb2cudihXTV9ERUJVR19TVEFSVElOR19XSU5ET1csICJGaW5pc2ggc3RhcnRpbmcgJXMiCiAgICAgICAgICAgICAgICAgICAgICsgIjogZmlyc3QgcmVhbCB3aW5kb3cgaXMgc2hvd24sIG5vIGFuaW1hdGlvbiIsIHdpbi5tVG9rZW4pOwpAQCAtNzM4MCwyMCArNzM4MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHJlbW92ZURlYWRXaW5kb3dzKCkgewotICAgICAgICBmb3IgKGludCB3aW5OZHggPSBtQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgd2luTmR4ID49IDA7IC0td2luTmR4KSB7Ci0gICAgICAgICAgICBXaW5kb3dTdGF0ZSB3aW4gPSBtQ2hpbGRyZW4uZ2V0KHdpbk5keCk7Ci0gICAgICAgICAgICBpZiAod2luLm1BcHBEaWVkKSB7Ci0gICAgICAgICAgICAgICAgUHJvdG9Mb2cudyhXTV9ERUJVR19BRERfUkVNT1ZFLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZURlYWRXaW5kb3dzOiAlcyIsIHdpbik7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IG1EZXN0cm95aW5nLCB3ZSBkb24ndCB3YW50IGFueSBhbmltYXRpb24gb3IgZGVsYXllZCByZW1vdmFsIGhlcmUuCi0gICAgICAgICAgICAgICAgd2luLm1EZXN0cm95aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBBbHNvIHJlbW92ZXMgY2hpbGQgd2luZG93cy4KLSAgICAgICAgICAgICAgICB3aW4ucmVtb3ZlSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgdm9pZCBzZXRXaWxsUmVwbGFjZVdpbmRvd3MoYm9vbGVhbiBhbmltYXRlKSB7CiAgICAgICAgIFByb3RvTG9nLmQoV01fREVCVUdfQUREX1JFTU9WRSwKICAgICAgICAgICAgICAgICAiTWFya2luZyBhcHAgdG9rZW4gJXMgd2l0aCByZXBsYWNpbmcgd2luZG93cy4iLCB0aGlzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmRJbnB1dFNpbmsuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmRJbnB1dFNpbmsuamF2YQppbmRleCA1ZDAzOGRjLi5iZTdkOWI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5UmVjb3JkSW5wdXRTaW5rLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVJlY29yZElucHV0U2luay5qYXZhCkBAIC05Miw2ICs5Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSW5wdXRXaW5kb3dIYW5kbGVXcmFwcGVyLnNldElucHV0Q29uZmlnTWFza2VkKDAsIElucHV0Q29uZmlnLk5PVF9UT1VDSEFCTEUpOwogICAgICAgICB9CisgICAgICAgIG1JbnB1dFdpbmRvd0hhbmRsZVdyYXBwZXIuc2V0RGlzcGxheUlkKG1BY3Rpdml0eVJlY29yZC5nZXREaXNwbGF5SWQoKSk7CiAgICAgICAgIHJldHVybiBtSW5wdXRXaW5kb3dIYW5kbGVXcmFwcGVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVN0YXJ0ZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlTdGFydGVyLmphdmEKaW5kZXggMjExYzIzMC4uY2UyOTU2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVN0YXJ0ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5U3RhcnRlci5qYXZhCkBAIC0xNjgwLDYgKzE2ODAsMTEgQEAKICAgICAgICAgICAgICAgICB0YXJnZXRUYXNrLnJlbW92ZUltbWVkaWF0ZWx5KCJidWxreS10YXNrIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0FCT1JURUQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgdHJhbnNpZW50IHRyYW5zaXRpb24sIHRoZSB0cmFuc2llbnQgbGF1bmNoIHRhcmdldCBzaG91bGQga2VlcCBvbiB0b3AuCisgICAgICAgICAgICAvLyBTbyBkaXNhbGxvdyB0aGUgdHJhbnNpZW50IGhpZGUgYWN0aXZpdHkgdG8gbW92ZSBpdHNlbGYgdG8gZnJvbnQsIGUuZy4gdHJhbXBvbGluZS4KKyAgICAgICAgICAgIGlmICghbUF2b2lkTW92ZVRvRnJvbnQgJiYgci5tVHJhbnNpdGlvbkNvbnRyb2xsZXIuaXNUcmFuc2llbnRIaWRlKHRhcmdldFRhc2spKSB7CisgICAgICAgICAgICAgICAgbUF2b2lkTW92ZVRvRnJvbnQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVByaW9yQWJvdmVUYXNrID0gVGFza0Rpc3BsYXlBcmVhLmdldFJvb3RUYXNrQWJvdmUodGFyZ2V0VGFzay5nZXRSb290VGFzaygpKTsKICAgICAgICAgfQogCkBAIC0xNzk2LDcgKzE4MDEsNyBAQAogICAgICAgICAgICAgICAgIC8vIHJvb3QtdGFzayB0byB0aGUgd2lsbCBub3QgdXBkYXRlIHRoZSBmb2N1c2VkIHJvb3QtdGFzay4gIElmIHN0YXJ0aW5nIHRoZSBuZXcKICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBub3cgYWxsb3dzIHRoZSB0YXNrIHJvb3QtdGFzayB0byBiZSBmb2N1c2FibGUsIHRoZW4gZW5zdXJlIHRoYXQgd2UKICAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBmb2N1c2VkIHJvb3QtdGFzayBhY2NvcmRpbmdseS4KLSAgICAgICAgICAgICAgICBpZiAobVRhcmdldFJvb3RUYXNrLmlzVG9wQWN0aXZpdHlGb2N1c2FibGUoKQorICAgICAgICAgICAgICAgIGlmICghbUF2b2lkTW92ZVRvRnJvbnQgJiYgbVRhcmdldFJvb3RUYXNrLmlzVG9wQWN0aXZpdHlGb2N1c2FibGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1Sb290V2luZG93Q29udGFpbmVyLmlzVG9wRGlzcGxheUZvY3VzZWRSb290VGFzayhtVGFyZ2V0Um9vdFRhc2spKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRSb290VGFzay5tb3ZlVG9Gcm9udCgic3RhcnRBY3Rpdml0eUlubmVyIik7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9CYWNrTmF2aWdhdGlvbkNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQmFja05hdmlnYXRpb25Db250cm9sbGVyLmphdmEKaW5kZXggZjlmOTcyYy4uYjY3YmM2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9CYWNrTmF2aWdhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0JhY2tOYXZpZ2F0aW9uQ29udHJvbGxlci5qYXZhCkBAIC04NjIsOCArODYyLDE2IEBACiAgICAgICAgICAgICAgICAgV2luZG93Q29udGFpbmVyIHRhcmdldCwgYm9vbGVhbiBpc09wZW4pIHsKICAgICAgICAgICAgIGZpbmFsIEJhY2tXaW5kb3dBbmltYXRpb25BZGFwdG9yIGFkYXB0b3IgPQogICAgICAgICAgICAgICAgICAgICBuZXcgQmFja1dpbmRvd0FuaW1hdGlvbkFkYXB0b3IodGFyZ2V0LCBpc09wZW4pOwotICAgICAgICAgICAgdGFyZ2V0LnN0YXJ0QW5pbWF0aW9uKHRhcmdldC5nZXRQZW5kaW5nVHJhbnNhY3Rpb24oKSwgYWRhcHRvciwgZmFsc2UgLyogaGlkZGVuICovLAotICAgICAgICAgICAgICAgICAgICBBTklNQVRJT05fVFlQRV9QUkVESUNUX0JBQ0spOworICAgICAgICAgICAgZmluYWwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gcHQgPSB0YXJnZXQuZ2V0UGVuZGluZ1RyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0YXJnZXQuc3RhcnRBbmltYXRpb24ocHQsIGFkYXB0b3IsIGZhbHNlIC8qIGhpZGRlbiAqLywgQU5JTUFUSU9OX1RZUEVfUFJFRElDVF9CQUNLKTsKKyAgICAgICAgICAgIC8vIFdvcmthcm91bmQgdG8gc2hvdyBUYXNrRnJhZ21lbnQgd2hpY2ggY2FuIGJlIGhpZGUgaW4gVHJhbnNpdGlvbnMgYW5kIHdvbid0IHNob3cKKyAgICAgICAgICAgIC8vIGR1cmluZyBpc0FuaW1hdGluZy4KKyAgICAgICAgICAgIGlmIChpc09wZW4gJiYgdGFyZ2V0LmFzQWN0aXZpdHlSZWNvcmQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGFza0ZyYWdtZW50IGZyYWdtZW50ID0gdGFyZ2V0LmFzQWN0aXZpdHlSZWNvcmQoKS5nZXRUYXNrRnJhZ21lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwdC5zaG93KGZyYWdtZW50Lm1TdXJmYWNlQ29udHJvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9FbnN1cmVBY3Rpdml0aWVzVmlzaWJsZUhlbHBlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9FbnN1cmVBY3Rpdml0aWVzVmlzaWJsZUhlbHBlci5qYXZhCmluZGV4IGRkZTg5ZTkuLjljYzMxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRW5zdXJlQWN0aXZpdGllc1Zpc2libGVIZWxwZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0Vuc3VyZUFjdGl2aXRpZXNWaXNpYmxlSGVscGVyLmphdmEKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIXIuYXR0YWNoZWRUb1Byb2Nlc3MoKSkgewotICAgICAgICAgICAgICAgIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKG1TdGFydGluZywgbUNvbmZpZ0NoYW5nZXMsIGlzVG9wLAorICAgICAgICAgICAgICAgIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKG1TdGFydGluZywgbUNvbmZpZ0NoYW5nZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUb3BBY3Rpdml0eSAmJiBpc1RvcCwgcik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHIuaXNWaXNpYmxlUmVxdWVzdGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFjdGl2aXR5IGlzIGFscmVhZHkgdmlzaWJsZSwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCkBAIC0yNDMsMTUgKzI0Myw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKEFjdGl2aXR5UmVjb3JkIHN0YXJ0aW5nLCBpbnQgY29uZmlnQ2hhbmdlcywKLSAgICAgICAgICAgIGJvb2xlYW4gaXNUb3AsIGJvb2xlYW4gYW5kUmVzdW1lLCBBY3Rpdml0eVJlY29yZCByKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBhcHAgaXMgcnVubmluZyBpZiBpdCdzIHRoZSB0b3AsIG9yIGl0IGlzIGp1c3QgbWFkZSB2aXNpYmxlIGZyb20KLSAgICAgICAgLy8gaW52aXNpYmxlLiBJZiB0aGUgYXBwIGlzIGFscmVhZHkgdmlzaWJsZSwgaXQgbXVzdCBoYXZlIGRpZWQgd2hpbGUgaXQgd2FzIHZpc2libGUuIEluIHRoaXMKLSAgICAgICAgLy8gY2FzZSwgd2UnbGwgc2hvdyB0aGUgZGVhZCB3aW5kb3cgYnV0IHdpbGwgbm90IHJlc3RhcnQgdGhlIGFwcC4gT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAotICAgICAgICAvLyB0aHJhc2hpbmcuCi0gICAgICAgIGlmICghaXNUb3AgJiYgci5pc1Zpc2libGVSZXF1ZXN0ZWQoKSAmJiAhci5pc1N0YXRlKElOSVRJQUxJWklORykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCisgICAgICAgICAgICBib29sZWFuIGFuZFJlc3VtZSwgQWN0aXZpdHlSZWNvcmQgcikgewogICAgICAgICAvLyBUaGlzIGFjdGl2aXR5IG5lZWRzIHRvIGJlIHZpc2libGUsIGJ1dCBpc24ndCBldmVuIHJ1bm5pbmcuLi4KICAgICAgICAgLy8gZ2V0IGl0IHN0YXJ0ZWQgYW5kIHJlc3VtZSBpZiBubyBvdGhlciByb290IHRhc2sgaW4gdGhpcyByb290IHRhc2sgaXMgcmVzdW1lZC4KICAgICAgICAgaWYgKERFQlVHX1ZJU0lCSUxJVFkpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyQ2FsbGJhY2suamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyQ2FsbGJhY2suamF2YQppbmRleCAxZTlkNDUxLi4wYTQ3ZmUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0TWFuYWdlckNhbGxiYWNrLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXJDYWxsYmFjay5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CkBAIC0yMjEsMTEgKzIyMCw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldExhdGVzdE1vdXNlUG9zaXRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblBvaW50ZXJEb3duT3V0c2lkZUZvY3VzKElCaW5kZXIgdG91Y2hlZFRva2VuKSB7CiAgICAgICAgIG1TZXJ2aWNlLm1ILm9idGFpbk1lc3NhZ2UoT05fUE9JTlRFUl9ET1dOX09VVFNJREVfRk9DVVMsIHRvdWNoZWRUb2tlbikuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vTGV0dGVyYm94VWlDb250cm9sbGVyLmphdmEKaW5kZXggZjM1NWYwOC4uNWRiMzlmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0xldHRlcmJveFVpQ29udHJvbGxlci5qYXZhCkBAIC05OTcsNyArOTk3LDggQEAKIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGJvb2xlYW4gc2hvdWxkU2hvd0xldHRlcmJveFVpKFdpbmRvd1N0YXRlIG1haW5XaW5kb3cpIHsKLSAgICAgICAgcmV0dXJuIGlzU3VyZmFjZVZpc2libGUobWFpbldpbmRvdykgJiYgbWFpbldpbmRvdy5hcmVBcHBXaW5kb3dCb3VuZHNMZXR0ZXJib3hlZCgpCisgICAgICAgIHJldHVybiAobUFjdGl2aXR5UmVjb3JkLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKSB8fCBpc1N1cmZhY2VWaXNpYmxlKG1haW5XaW5kb3cpKQorICAgICAgICAgICAgICAgICYmIG1haW5XaW5kb3cuYXJlQXBwV2luZG93Qm91bmRzTGV0dGVyYm94ZWQoKQogICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBGTEFHX1NIT1dfV0FMTFBBUEVSIGV4cGxpY2l0bHkgaW5zdGVhZCBvZiB1c2luZwogICAgICAgICAgICAgICAgIC8vIFdpbmRvd0NvbnRhaW5lciNzaG93V2FsbHBhcGVyIGJlY2F1c2UgdGhlIGxhdGVyIHdpbGwgcmV0dXJuIHRydWUgd2hlbiB0aGlzCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgaXMgdXNpbmcgYmx1cnJlZCB3YWxscGFwZXIgZm9yIGxldHRlcmJveCBiYWNrZ3JvdW5kLgpAQCAtMTEwNCw3ICsxMTA1LDcgQEAKICAgICAvLyBmb3IgYWxsIGNvcm5lcnMgZm9yIGNvbnNpc3RlbmN5IGFuZCBwaWNrIGEgbWluaW1hbCBib3R0b20gb25lIGZvciBjb25zaXN0ZW5jeSB3aXRoIGEKICAgICAvLyB0YXNrYmFyIHJvdW5kZWQgY29ybmVycy4KICAgICBpbnQgZ2V0Um91bmRlZENvcm5lcnNSYWRpdXMoZmluYWwgV2luZG93U3RhdGUgbWFpbldpbmRvdykgewotICAgICAgICBpZiAoIXJlcXVpcmVzUm91bmRlZENvcm5lcnMobWFpbldpbmRvdykgfHwgbUFjdGl2aXR5UmVjb3JkLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKSkgeworICAgICAgICBpZiAoIXJlcXVpcmVzUm91bmRlZENvcm5lcnMobWFpbldpbmRvdykpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFzay5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UYXNrLmphdmEKaW5kZXggOTY5ZjY1Yy4uNjdjYTg0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UYXNrLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UYXNrLmphdmEKQEAgLTMzOTgsOCArMzM5OCwxMCBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUb3BBY3Rpdml0eVJlc3VtZWQgPSB0b3AgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmIHRvcC5nZXRPcmdhbml6ZWRUYXNrKCkgPT0gdGhpcyAmJiB0b3AuaXNTdGF0ZShSRVNVTUVEKTsKLSAgICAgICAgLy8gV2hldGhlciB0aGUgZGlyZWN0IHRvcCBhY3Rpdml0eSBpcyBpbiBzaXplIGNvbXBhdCBtb2RlIG9uIGZvcmVncm91bmQuCi0gICAgICAgIGluZm8udG9wQWN0aXZpdHlJblNpemVDb21wYXQgPSBpc1RvcEFjdGl2aXR5UmVzdW1lZCAmJiB0b3AuaW5TaXplQ29tcGF0TW9kZSgpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzVG9wQWN0aXZpdHlWaXNpYmxlID0gdG9wICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiB0b3AuZ2V0T3JnYW5pemVkVGFzaygpID09IHRoaXMgJiYgdG9wLmlzVmlzaWJsZSgpOworICAgICAgICAvLyBXaGV0aGVyIHRoZSBkaXJlY3QgdG9wIGFjdGl2aXR5IGlzIGluIHNpemUgY29tcGF0IG1vZGUKKyAgICAgICAgaW5mby50b3BBY3Rpdml0eUluU2l6ZUNvbXBhdCA9IGlzVG9wQWN0aXZpdHlWaXNpYmxlICYmIHRvcC5pblNpemVDb21wYXRNb2RlKCk7CiAgICAgICAgIGlmIChpbmZvLnRvcEFjdGl2aXR5SW5TaXplQ29tcGF0CiAgICAgICAgICAgICAgICAgJiYgbVdtU2VydmljZS5tTGV0dGVyYm94Q29uZmlndXJhdGlvbi5pc1RyYW5zbHVjZW50TGV0dGVyYm94aW5nRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAvLyBXZSBoaWRlIHRoZSByZXN0YXJ0IGJ1dHRvbiBpbiBjYXNlIG9mIHRyYW5zcGFyZW50IGFjdGl2aXRpZXMuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1Rhc2tGcmFnbWVudC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UYXNrRnJhZ21lbnQuamF2YQppbmRleCAyZGRiMzA3Li43YzU3ZGMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1Rhc2tGcmFnbWVudC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFza0ZyYWdtZW50LmphdmEKQEAgLTEwMTIsNiArMTAxMiwxMCBAQAogICAgICAgICBpZiAoaXNUb3BBY3Rpdml0eUxhdW5jaGVkQmVoaW5kKCkpIHsKICAgICAgICAgICAgIHJldHVybiBUQVNLX0ZSQUdNRU5UX1ZJU0lCSUxJVFlfVklTSUJMRTsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBUYXNrIHRoaXNUYXNrID0gYXNUYXNrKCk7CisgICAgICAgIGlmICh0aGlzVGFzayAhPSBudWxsICYmIG1UcmFuc2l0aW9uQ29udHJvbGxlci5pc1RyYW5zaWVudEhpZGUodGhpc1Rhc2spKSB7CisgICAgICAgICAgICByZXR1cm4gVEFTS19GUkFHTUVOVF9WSVNJQklMSVRZX1ZJU0lCTEU7CisgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIGdvdFRyYW5zbHVjZW50RnVsbHNjcmVlbiA9IGZhbHNlOwogICAgICAgICBib29sZWFuIGdvdFRyYW5zbHVjZW50QWRqYWNlbnQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvbi5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uLmphdmEKaW5kZXggNGUwZjEyMC4uMzcwZDMwNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uLmphdmEKQEAgLTE5NCw2ICsxOTQsMTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEFycmF5TWFwPEFjdGl2aXR5UmVjb3JkLCBUYXNrPiBtVHJhbnNpZW50TGF1bmNoZXMgPSBudWxsOwogCisgICAgLyoqCisgICAgICogVGhlIHRhc2tzIHRoYXQgbWF5IGJlIG9jY2x1ZGVkIGJ5IHRoZSB0cmFuc2llbnQgYWN0aXZpdHkuIEFzc3VtZSB0aGUgdGFzayBzdGFjayBpcworICAgICAqIFtIb21lLCBBKG9wYXF1ZSksIEIob3BhcXVlKSwgQyh0cmFuc2x1Y2VudCldIChib3R0b20gdG8gdG9wKSwgdGhlbiBBIGlzIHRoZSByZXN0b3JlLWJlbG93CisgICAgICogdGFzaywgYW5kIFtCLCBDXSBhcmUgdGhlIHRyYW5zaWVudC1oaWRlIHRhc2tzLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFRhc2s+IG1UcmFuc2llbnRIaWRlVGFza3M7CisKICAgICAvKiogQ3VzdG9tIGFjdGl2aXR5LWxldmVsIGFuaW1hdGlvbiBvcHRpb25zIGFuZCBjYWxsYmFja3MuICovCiAgICAgcHJpdmF0ZSBUcmFuc2l0aW9uSW5mby5BbmltYXRpb25PcHRpb25zIG1PdmVycmlkZU9wdGlvbnM7CiAgICAgcHJpdmF0ZSBJUmVtb3RlQ2FsbGJhY2sgbUNsaWVudEFuaW1hdGlvblN0YXJ0Q2FsbGJhY2sgPSBudWxsOwpAQCAtMjY1LDM1ICsyNzIsNTEgQEAKICAgICB2b2lkIHNldFRyYW5zaWVudExhdW5jaChATm9uTnVsbCBBY3Rpdml0eVJlY29yZCBhY3Rpdml0eSwgQE51bGxhYmxlIFRhc2sgcmVzdG9yZUJlbG93KSB7CiAgICAgICAgIGlmIChtVHJhbnNpZW50TGF1bmNoZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgbVRyYW5zaWVudExhdW5jaGVzID0gbmV3IEFycmF5TWFwPD4oKTsKKyAgICAgICAgICAgIG1UcmFuc2llbnRIaWRlVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgfQogICAgICAgICBtVHJhbnNpZW50TGF1bmNoZXMucHV0KGFjdGl2aXR5LCByZXN0b3JlQmVsb3cpOwogICAgICAgICBzZXRUcmFuc2llbnRMYXVuY2hUb0NoYW5nZXMoYWN0aXZpdHkpOwogCiAgICAgICAgIGlmIChyZXN0b3JlQmVsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQ2hhbmdlSW5mbyBpbmZvID0gbUNoYW5nZXMuZ2V0KHJlc3RvcmVCZWxvdyk7Ci0gICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5tRmxhZ3MgfD0gQ2hhbmdlSW5mby5GTEFHX0FCT1ZFX1RSQU5TSUVOVF9MQVVOQ0g7CisgICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCB2aXNpYmxlIGFjdGl2aXRpZXMgd2hpY2ggY2FuIGJlIG9jY2x1ZGVkIGJ5IHRoZSB0cmFuc2llbnQgYWN0aXZpdHkgdG8KKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbiB0aGUgcGFydGljaXBhbnRzIHNvIHRoZWlyIHZpc2liaWxpdGllcyBjYW4gYmUgdXBkYXRlZCB3aGVuCisgICAgICAgICAgICAvLyBmaW5pc2hpbmcgdHJhbnNpdGlvbi4KKyAgICAgICAgICAgICgoV2luZG93Q29udGFpbmVyPD8+KSByZXN0b3JlQmVsb3cuZ2V0UGFyZW50KCkpLmZvckFsbFRhc2tzKHQgLT4geworICAgICAgICAgICAgICAgIGlmICh0LmlzVmlzaWJsZVJlcXVlc3RlZCgpICYmICF0LmlzQWx3YXlzT25Ub3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXQuZ2V0V2luZG93Q29uZmlndXJhdGlvbigpLnRhc2tzQXJlRmxvYXRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodC5pc1Jvb3RUYXNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2llbnRIaWRlVGFza3MuYWRkKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzTGVhZlRhc2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JBbGxBY3Rpdml0aWVzKHIgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmlzVmlzaWJsZVJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Qocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT0gcmVzdG9yZUJlbG93OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAvLyBBZGQgRkxBR19BQk9WRV9UUkFOU0lFTlRfTEFVTkNIIHRvIHRoZSB0cmVlIG9mIHRyYW5zaWVudC1oaWRlIHRhc2tzLAorICAgICAgICAgICAgLy8gc28gQ2hhbmdlSW5mbyNoYXNDaGFuZ2VkKCkgY2FuIHJldHVybiB0cnVlIHRvIHJlcG9ydCB0aGUgdHJhbnNpdGlvbiBpbmZvLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1DaGFuZ2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgZmluYWwgV2luZG93Q29udGFpbmVyPD8+IHdjID0gbUNoYW5nZXMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHdjLmFzVGFza0ZyYWdtZW50KCkgPT0gbnVsbCAmJiB3Yy5hc0FjdGl2aXR5UmVjb3JkKCkgPT0gbnVsbCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGlzSW5UcmFuc2llbnRIaWRlKHdjKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlcy52YWx1ZUF0KGkpLm1GbGFncyB8PSBDaGFuZ2VJbmZvLkZMQUdfQUJPVkVfVFJBTlNJRU5UX0xBVU5DSDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgUHJvdG9Mb2cudihQcm90b0xvZ0dyb3VwLldNX0RFQlVHX1dJTkRPV19UUkFOU0lUSU9OUywgIlRyYW5zaXRpb24gJWQ6IFNldCAlcyBhcyAiCiAgICAgICAgICAgICAgICAgKyAidHJhbnNpZW50LWxhdW5jaCIsIG1TeW5jSWQsIGFjdGl2aXR5KTsKICAgICB9CiAKLSAgICBib29sZWFuIGlzVHJhbnNpZW50SGlkZShATm9uTnVsbCBUYXNrIHRhc2spIHsKLSAgICAgICAgaWYgKG1UcmFuc2llbnRMYXVuY2hlcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRyYW5zaWVudExhdW5jaGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobVRyYW5zaWVudExhdW5jaGVzLnZhbHVlQXQoaSkgPT0gdGFzaykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICAvKiogQHJldHVybiB3aGV0aGVyIGB3Y2AgaXMgYSBkZXNjZW5kZW50IG9mIGEgdHJhbnNpZW50LWhpZGUgd2luZG93LiAqLwogICAgIGJvb2xlYW4gaXNJblRyYW5zaWVudEhpZGUoQE5vbk51bGwgV2luZG93Q29udGFpbmVyIHdjKSB7Ci0gICAgICAgIGlmIChtVHJhbnNpZW50TGF1bmNoZXMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UcmFuc2llbnRMYXVuY2hlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKHdjLmlzRGVzY2VuZGFudE9mKG1UcmFuc2llbnRMYXVuY2hlcy52YWx1ZUF0KGkpKSkgeworICAgICAgICBpZiAobVRyYW5zaWVudEhpZGVUYXNrcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtVHJhbnNpZW50SGlkZVRhc2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBmaW5hbCBUYXNrIHRhc2sgPSBtVHJhbnNpZW50SGlkZVRhc2tzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh3YyA9PSB0YXNrIHx8IHdjLmlzRGVzY2VuZGFudE9mKHRhc2spKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgxNCw2ICs4MzcsMTUgQEAKICAgICAgICAgaWYgKG1TdGF0ZSA8IFNUQVRFX1BMQVlJTkcpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGZpbmlzaCBhIG5vbi1wbGF5aW5nIHRyYW5zaXRpb24gIiArIG1TeW5jSWQpOwogICAgICAgICB9CisgICAgICAgIG1Db250cm9sbGVyLm1GaW5pc2hpbmdUcmFuc2l0aW9uID0gdGhpczsKKworICAgICAgICBpZiAobVRyYW5zaWVudEhpZGVUYXNrcyAhPSBudWxsICYmICFtVHJhbnNpZW50SGlkZVRhc2tzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlIHRyYW5zaWVudCBoaWRlIHRhc2tzIGNvdWxkIGJlIG9jY2x1ZGVkIG5vdywgZS5nLiByZXR1cm5pbmcgdG8gaG9tZS4gU28gdHJpZ2dlcgorICAgICAgICAgICAgLy8gdGhlIHVwZGF0ZSB0byBtYWtlIHRoZSBhY3Rpdml0aWVzIGluIHRoZSB0YXNrcyBpbnZpc2libGUtcmVxdWVzdGVkLCB0aGVuIHRoZSBuZXh0CisgICAgICAgICAgICAvLyBzdGVwIGNhbiBjb250aW51ZSB0byBjb21taXQgdGhlIHZpc2liaWxpdHkuCisgICAgICAgICAgICBtQ29udHJvbGxlci5tQXRtLm1Sb290V2luZG93Q29udGFpbmVyLmVuc3VyZUFjdGl2aXRpZXNWaXNpYmxlKG51bGwgLyogc3RhcnRpbmcgKi8sCisgICAgICAgICAgICAgICAgICAgIDAgLyogY29uZmlnQ2hhbmdlcyAqLywgdHJ1ZSAvKiBwcmVzZXJ2ZVdpbmRvd3MgKi8pOworICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBoYXNQYXJ0aWNpcGF0ZWREaXNwbGF5ID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gaGFzVmlzaWJsZVRyYW5zaWVudExhdW5jaCA9IGZhbHNlOwpAQCAtOTgwLDYgKzEwMTIsNyBAQAogICAgICAgICAgICAgZGMucmVtb3ZlSW1lU3VyZmFjZUltbWVkaWF0ZWx5KCk7CiAgICAgICAgICAgICBkYy5oYW5kbGVDb21wbGV0ZURlZmVycmVkUmVtb3ZhbCgpOwogICAgICAgICB9CisgICAgICAgIHZhbGlkYXRlVmlzaWJpbGl0eSgpOwogCiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOwogICAgICAgICBtQ29udHJvbGxlci5tVHJhbnNpdGlvblRyYWNlci5sb2dTdGF0ZSh0aGlzKTsKQEAgLTk5NSw2ICsxMDI4LDcgQEAKIAogICAgICAgICAvLyBIYW5kbGUgYmFjayBhbmltYXRpb24gaWYgaXQncyBhbHJlYWR5IHN0YXJ0ZWQuCiAgICAgICAgIG1Db250cm9sbGVyLm1BdG0ubUJhY2tOYXZpZ2F0aW9uQ29udHJvbGxlci5oYW5kbGVEZWZlcnJlZEJhY2tBbmltYXRpb24obVRhcmdldHMpOworICAgICAgICBtQ29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbiA9IG51bGw7CiAgICAgfQogCiAgICAgdm9pZCBhYm9ydCgpIHsKQEAgLTExNzMsMTQgKzEyMDcsMTMgQEAKIAogICAgICAgICAvLyBSZWNvcmQgd2luZG93dG9rZW5zIChhY3Rpdml0eS93YWxscGFwZXIpIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIHZpc2libGUgYWZ0ZXIgdGhlCiAgICAgICAgIC8vIHRyYW5zaXRpb24gYW5pbWF0aW9uLiBUaGlzIHdpbGwgYmUgdXNlZCBpbiBmaW5pc2hUcmFuc2l0aW9uIHRvIHByZXZlbnQgcHJlbWF0dXJlbHkKLSAgICAgICAgLy8gY29tbWl0dGluZyB2aXNpYmlsaXR5LgotICAgICAgICBmb3IgKGludCBpID0gbVBhcnRpY2lwYW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgZmluYWwgV2luZG93Q29udGFpbmVyIHdjID0gbVBhcnRpY2lwYW50cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKHdjLmFzV2luZG93VG9rZW4oKSA9PSBudWxsIHx8ICF3Yy5pc1Zpc2libGVSZXF1ZXN0ZWQoKSkgY29udGludWU7Ci0gICAgICAgICAgICAvLyBkb24ndCBpbmNsdWRlIHRyYW5zaWVudCBsYXVuY2hlcywgdGhvdWdoLCBzaW5jZSB0aG9zZSBhcmUgb25seSB0ZW1wb3JhcmlseSB2aXNpYmxlLgotICAgICAgICAgICAgaWYgKG1UcmFuc2llbnRMYXVuY2hlcyAhPSBudWxsICYmIHdjLmFzQWN0aXZpdHlSZWNvcmQoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1UcmFuc2llbnRMYXVuY2hlcy5jb250YWluc0tleSh3Yy5hc0FjdGl2aXR5UmVjb3JkKCkpKSBjb250aW51ZTsKLSAgICAgICAgICAgIG1WaXNpYmxlQXRUcmFuc2l0aW9uRW5kVG9rZW5zLmFkZCh3Yy5hc1dpbmRvd1Rva2VuKCkpOworICAgICAgICAvLyBjb21taXR0aW5nIHZpc2liaWxpdHkuIFNraXAgdHJhbnNpZW50IGxhdW5jaGVzIHNpbmNlIHRob3NlIGFyZSBvbmx5IHRlbXBvcmFyaWx5IHZpc2libGUuCisgICAgICAgIGlmIChtVHJhbnNpZW50TGF1bmNoZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1QYXJ0aWNpcGFudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXIgd2MgPSBtUGFydGljaXBhbnRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHdjLmFzV2luZG93VG9rZW4oKSA9PSBudWxsIHx8ICF3Yy5pc1Zpc2libGVSZXF1ZXN0ZWQoKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgbVZpc2libGVBdFRyYW5zaXRpb25FbmRUb2tlbnMuYWRkKHdjLmFzV2luZG93VG9rZW4oKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUYWtlIHRhc2sgc25hcHNob3RzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgSU1FIGJlZm9yZSBpdCBnZXRzCkBAIC0xMjc0LDcgKzEzMDcsNyBAQAogICAgICAgICBpZiAobUZpbmlzaFRyYW5zYWN0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgIG1GaW5pc2hUcmFuc2FjdGlvbi5hcHBseSgpOwogICAgICAgICB9Ci0gICAgICAgIG1Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24obVRva2VuKTsKKyAgICAgICAgbUNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbih0aGlzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcEludGVybmFsKCkgewpAQCAtMTg4OCw2ICsxOTIxLDcgQEAKICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFBhcmVudChpbmZvLm1TdGFydFBhcmVudC5tUmVtb3RlVG9rZW4udG9XaW5kb3dDb250YWluZXJUb2tlbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNoYW5nZS5zZXRNb2RlKGluZm8uZ2V0VHJhbnNpdE1vZGUodGFyZ2V0KSk7CisgICAgICAgICAgICBpbmZvLm1SZWFkeU1vZGUgPSBjaGFuZ2UuZ2V0TW9kZSgpOwogICAgICAgICAgICAgY2hhbmdlLnNldFN0YXJ0QWJzQm91bmRzKGluZm8ubUFic29sdXRlQm91bmRzKTsKICAgICAgICAgICAgIGNoYW5nZS5zZXRGbGFncyhpbmZvLmdldENoYW5nZUZsYWdzKHRhcmdldCkpOwogICAgICAgICAgICAgY2hhbmdlLnNldERpc3BsYXlJZChpbmZvLm1EaXNwbGF5SWQsIGdldERpc3BsYXlJZCh0YXJnZXQpKTsKQEAgLTIxNDUsNiArMjE3OSwyNiBAQAogICAgICAgICByZXR1cm4gbWFpbldpbi5nZXRBdHRycygpLnJvdGF0aW9uQW5pbWF0aW9uOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVZpc2liaWxpdHkoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBtVGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKHJlZHVjZU1vZGUobVRhcmdldHMuZ2V0KGkpLm1SZWFkeU1vZGUpICE9IFRSQU5TSVRfQ0xPU0UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIG1vZGVzIGFyZSBDTE9TRS4gVGhlIHN1cmZhY2VzIG1heSBiZSBoaWRkZW4gYnkgdGhlIGFuaW1hdGlvbiB1bmV4cGVjdGVkbHkuCisgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgY29udGFpbmVyIHNob3VsZCBiZSB2aXNpYmxlLCB0aGVuIHJlY292ZXIgaXQuCisgICAgICAgIG1Db250cm9sbGVyLm1TdGF0ZVZhbGlkYXRvcnMuYWRkKCgpIC0+IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtVGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENoYW5nZUluZm8gY2hhbmdlID0gbVRhcmdldHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghY2hhbmdlLm1Db250YWluZXIuaXNWaXNpYmxlUmVxdWVzdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGb3JjZSBzaG93IGZvciB2aXNpYmxlICIgKyBjaGFuZ2UubUNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWNoIG1heSBiZSBoaWRkZW4gYnkgdHJhbnNpdGlvbiB1bmV4cGVjdGVkbHkiKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2UubUNvbnRhaW5lci5nZXRTeW5jVHJhbnNhY3Rpb24oKS5zaG93KGNoYW5nZS5tQ29udGFpbmVyLm1TdXJmYWNlQ29udHJvbCk7CisgICAgICAgICAgICAgICAgY2hhbmdlLm1Db250YWluZXIuc2NoZWR1bGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCiAgICAgLyoqIEFwcGxpZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbmdlZCBkaXNwbGF5cy4gKi8KICAgICB2b2lkIGFwcGx5RGlzcGxheUNoYW5nZUlmTmVlZGVkKCkgewogICAgICAgICBmb3IgKGludCBpID0gbVBhcnRpY2lwYW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewpAQCAtMjIzMCw2ICsyMjg0LDEwIEBACiAgICAgICAgIFN1cmZhY2VDb250cm9sIG1TbmFwc2hvdDsKICAgICAgICAgZmxvYXQgbVNuYXBzaG90THVtYTsKIAorICAgICAgICAvKiogVGhlIG1vZGUgd2hpY2ggaXMgc2V0IHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgcmVhZHkuICovCisgICAgICAgIEBUcmFuc2l0aW9uSW5mby5UcmFuc2l0aW9uTW9kZQorICAgICAgICBpbnQgbVJlYWR5TW9kZTsKKwogICAgICAgICBDaGFuZ2VJbmZvKEBOb25OdWxsIFdpbmRvd0NvbnRhaW5lciBvcmlnU3RhdGUpIHsKICAgICAgICAgICAgIG1Db250YWluZXIgPSBvcmlnU3RhdGU7CiAgICAgICAgICAgICBtVmlzaWJsZSA9IG9yaWdTdGF0ZS5pc1Zpc2libGVSZXF1ZXN0ZWQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvbkNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvbkNvbnRyb2xsZXIuamF2YQppbmRleCBiYWNjNmU2Li44NmJiNmI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25Db250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uQ29udHJvbGxlci5qYXZhCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxUcmFuc2l0aW9uPiBtUGxheWluZ1RyYW5zaXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKKyAgICAvKiogVGhlIGN1cnJlbnRseSBmaW5pc2hpbmcgdHJhbnNpdGlvbi4gKi8KKyAgICBUcmFuc2l0aW9uIG1GaW5pc2hpbmdUcmFuc2l0aW9uOworCiAgICAgLyoqCiAgICAgICogVGhlIHdpbmRvd3MgdGhhdCByZXF1ZXN0IHRvIGJlIGludmlzaWJsZSB3aGlsZSBpdCBpcyBpbiB0cmFuc2l0aW9uLiBBZnRlciB0aGUgdHJhbnNpdGlvbgogICAgICAqIGlzIGZpbmlzaGVkIGFuZCB0aGUgd2luZG93cyBhcmUgbm8gbG9uZ2VyIGFuaW1hdGluZywgdGhlaXIgc3VyZmFjZXMgd2lsbCBiZSBkZXN0cm95ZWQuCkBAIC0zMTMsNiArMzE2LDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKiogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGB3Y2AgaXMgYSBwYXJ0aWNpcGFudCBvZiB0aGUgZmluaXNoaW5nIHRyYW5zaXRpb24uICovCisgICAgYm9vbGVhbiBpbkZpbmlzaGluZ1RyYW5zaXRpb24oV2luZG93Q29udGFpbmVyPD8+IHdjKSB7CisgICAgICAgIHJldHVybiBtRmluaXNoaW5nVHJhbnNpdGlvbiAhPSBudWxsICYmIG1GaW5pc2hpbmdUcmFuc2l0aW9uLm1QYXJ0aWNpcGFudHMuY29udGFpbnMod2MpOworICAgIH0KKwogICAgIC8qKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHRyYW5zaXRpb24gaXMgcnVubmluZyAqLwogICAgIGJvb2xlYW4gaW5UcmFuc2l0aW9uKCkgewogICAgICAgICAvLyBUT0RPKHNoZWxsLXRyYW5zaXRpb25zKTogZXZlbnR1YWxseSBwcm9wZXJseSBzdXBwb3J0IG11bHRpcGxlCkBAIC0zNTgsMTEgKzM2NiwxMSBAQAogICAgIH0KIAogICAgIGJvb2xlYW4gaXNUcmFuc2llbnRIaWRlKEBOb25OdWxsIFRhc2sgdGFzaykgewotICAgICAgICBpZiAobUNvbGxlY3RpbmdUcmFuc2l0aW9uICE9IG51bGwgJiYgbUNvbGxlY3RpbmdUcmFuc2l0aW9uLmlzVHJhbnNpZW50SGlkZSh0YXNrKSkgeworICAgICAgICBpZiAobUNvbGxlY3RpbmdUcmFuc2l0aW9uICE9IG51bGwgJiYgbUNvbGxlY3RpbmdUcmFuc2l0aW9uLmlzSW5UcmFuc2llbnRIaWRlKHRhc2spKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBmb3IgKGludCBpID0gbVBsYXlpbmdUcmFuc2l0aW9ucy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgaWYgKG1QbGF5aW5nVHJhbnNpdGlvbnMuZ2V0KGkpLmlzVHJhbnNpZW50SGlkZSh0YXNrKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAobVBsYXlpbmdUcmFuc2l0aW9ucy5nZXQoaSkuaXNJblRyYW5zaWVudEhpZGUodGFzaykpIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02NzIsMTQgKzY4MCwxMyBAQAogICAgIH0KIAogICAgIC8qKiBAc2VlIFRyYW5zaXRpb24jZmluaXNoVHJhbnNpdGlvbiAqLwotICAgIHZvaWQgZmluaXNoVHJhbnNpdGlvbihATm9uTnVsbCBJQmluZGVyIHRva2VuKSB7CisgICAgdm9pZCBmaW5pc2hUcmFuc2l0aW9uKFRyYW5zaXRpb24gcmVjb3JkKSB7CiAgICAgICAgIC8vIEl0IGlzIHVzdWFsbHkgYSBuby1vcCBidXQgbWFrZSBzdXJlIHRoYXQgdGhlIG1ldHJpYyBjb25zdW1lciBpcyByZW1vdmVkLgotICAgICAgICBtVHJhbnNpdGlvbk1ldHJpY3NSZXBvcnRlci5yZXBvcnRBbmltYXRpb25TdGFydCh0b2tlbiwgMCAvKiBzdGFydFRpbWUgKi8pOworICAgICAgICBtVHJhbnNpdGlvbk1ldHJpY3NSZXBvcnRlci5yZXBvcnRBbmltYXRpb25TdGFydChyZWNvcmQuZ2V0VG9rZW4oKSwgMCAvKiBzdGFydFRpbWUgKi8pOwogICAgICAgICAvLyBJdCBpcyBhIG5vLW9wIGlmIHRoZSB0cmFuc2l0aW9uIGRpZCBub3QgY2hhbmdlIHRoZSBkaXNwbGF5LgogICAgICAgICBtQXRtLmVuZExhdW5jaFBvd2VyTW9kZShQT1dFUl9NT0RFX1JFQVNPTl9DSEFOR0VfRElTUExBWSk7Ci0gICAgICAgIGZpbmFsIFRyYW5zaXRpb24gcmVjb3JkID0gVHJhbnNpdGlvbi5mcm9tQmluZGVyKHRva2VuKTsKLSAgICAgICAgaWYgKHJlY29yZCA9PSBudWxsIHx8ICFtUGxheWluZ1RyYW5zaXRpb25zLmNvbnRhaW5zKHJlY29yZCkpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJUcnlpbmcgdG8gZmluaXNoIGEgbm9uLXBsYXlpbmcgdHJhbnNpdGlvbiAiICsgdG9rZW4pOworICAgICAgICBpZiAoIW1QbGF5aW5nVHJhbnNpdGlvbnMuY29udGFpbnMocmVjb3JkKSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIlRyeWluZyB0byBmaW5pc2ggYSBub24tcGxheWluZyB0cmFuc2l0aW9uICIgKyByZWNvcmQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIFByb3RvTG9nLnYoUHJvdG9Mb2dHcm91cC5XTV9ERUJVR19XSU5ET1dfVFJBTlNJVElPTlMsICJGaW5pc2ggVHJhbnNpdGlvbjogJXMiLCByZWNvcmQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VySW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlckludGVybmFsLmphdmEKaW5kZXggMmYzYTcwZS4uOTY5YWZlNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VySW50ZXJuYWwuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJJbnRlcm5hbC5qYXZhCkBAIC03NDAsNyArNzQwLDcgQEAKICAgICAvKioKICAgICAgKiBTaG93IElNRSBvbiBpbWVUYXJnZXRXaW5kb3cgb25jZSBJTUUgaGFzIGZpbmlzaGVkIGxheW91dC4KICAgICAgKgotICAgICAqIEBwYXJhbSBpbWVUYXJnZXRXaW5kb3dUb2tlbiB0b2tlbiBvZiB0aGUgKElNRSB0YXJnZXQpIHdpbmRvdyBvbiB3aGljaCBJTUUgc2hvdWxkIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBpbWVUYXJnZXRXaW5kb3dUb2tlbiB0b2tlbiBvZiB0aGUgKElNRSB0YXJnZXQpIHdpbmRvdyB3aGljaCBJTUUgc2hvdWxkIGJlIHNob3duLgogICAgICAqIEBwYXJhbSBzdGF0c1Rva2VuIHRoZSB0b2tlbiB0cmFja2luZyB0aGUgY3VycmVudCBJTUUgc2hvdyByZXF1ZXN0IG9yIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2hvd0ltZVBvc3RMYXlvdXQoSUJpbmRlciBpbWVUYXJnZXRXaW5kb3dUb2tlbiwKQEAgLTc0OSw3ICs3NDksNyBAQAogICAgIC8qKgogICAgICAqIEhpZGUgSU1FIHVzaW5nIGltZVRhcmdldFdpbmRvdyB3aGVuIHJlcXVlc3RlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBpbWVUYXJnZXRXaW5kb3dUb2tlbiB0b2tlbiBvZiB0aGUgKElNRSB0YXJnZXQpIHdpbmRvdyBvbiB3aGljaCBJTUUgc2hvdWxkIGJlIGhpZGRlbi4KKyAgICAgKiBAcGFyYW0gaW1lVGFyZ2V0V2luZG93VG9rZW4gdG9rZW4gb2YgdGhlIChJTUUgdGFyZ2V0KSB3aW5kb3cgb24gd2hpY2ggcmVxdWVzdHMgaGlkaW5nIElNRS4KICAgICAgKiBAcGFyYW0gZGlzcGxheUlkIHRoZSBpZCBvZiB0aGUgZGlzcGxheSB0aGUgSU1FIGlzIG9uLgogICAgICAqIEBwYXJhbSBzdGF0c1Rva2VuIHRoZSB0b2tlbiB0cmFja2luZyB0aGUgY3VycmVudCBJTUUgaGlkZSByZXF1ZXN0IG9yIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNDVjZGFjZC4uNDJkMjNlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTg2LDcgKzE4Niw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZS5WMV8wLk9wdGlvbmFsQm9vbDsKQEAgLTczNjEsMTQgKzczNjAsNiBAQAogICAgICAgICAgICAgICAgICAgICAuc2V0UG9pbnRlckljb25UeXBlKFBvaW50ZXJJY29uLlRZUEVfREVGQVVMVCk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBQb2ludEYgZ2V0TGF0ZXN0TW91c2VQb3NpdGlvbigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTW91c2VQb3NpdGlvblRyYWNrZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnRGKG1Nb3VzZVBvc2l0aW9uVHJhY2tlci5tTGF0ZXN0TW91c2VYLAotICAgICAgICAgICAgICAgICAgICBtTW91c2VQb3NpdGlvblRyYWNrZXIubUxhdGVzdE1vdXNlWSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2b2lkIHNldE1vdXNlUG9pbnRlckRpc3BsYXlJZChpbnQgZGlzcGxheUlkKSB7CiAgICAgICAgIG1Nb3VzZVBvc2l0aW9uVHJhY2tlci5zZXRQb2ludGVyRGlzcGxheUlkKGRpc3BsYXlJZCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJDb250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQppbmRleCBjM2M4N2FmLi4xN2Q0ZjFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBDT05UUk9MTEFCTEVfQ09ORklHUyA9IEFjdGl2aXR5SW5mby5DT05GSUdfV0lORE9XX0NPTkZJR1VSQVRJT04KICAgICAgICAgICAgIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19TTUFMTEVTVF9TQ1JFRU5fU0laRSB8IEFjdGl2aXR5SW5mby5DT05GSUdfU0NSRUVOX1NJWkUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19MQVlPVVRfRElSRUNUSU9OOworICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX0xBWU9VVF9ESVJFQ1RJT04gfCBBY3Rpdml0eUluZm8uQ09ORklHX0RFTlNJVFk7CiAgICAgc3RhdGljIGZpbmFsIGludCBDT05UUk9MTEFCTEVfV0lORE9XX0NPTkZJR1MgPSBXSU5ET1dfQ09ORklHX0JPVU5EUwogICAgICAgICAgICAgfCBXaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV19DT05GSUdfQVBQX0JPVU5EUzsKIApAQCAtMzkxLDkgKzM5MSwxNCBAQAogICAgICAgICAgICAgICAgIC8vIGFwcGx5IHRoZSBpbmNvbWluZyB0cmFuc2FjdGlvbiBiZWZvcmUgZmluaXNoIGluIGNhc2UgaXQgYWx0ZXJzIHRoZSB2aXNpYmlsaXR5CiAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcnRpY2lwYW50cy4KICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZmluaXNoaW5nIHRyYW5zaXRpb24gYmVmb3JlIGFwcGx5VHJhbnNhY3Rpb24gc28gdGhlIHZpc2liaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBvZiB0aGUgdHJhbnNpdGlvbiBwYXJ0aWNpcGFudHMgd2lsbCBvbmx5IHNldCB2aXNpYmxlLXJlcXVlc3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RpbGwgbGV0IGZpbmlzaFRyYW5zaXRpb24gaGFuZGxlIHRoZSBwYXJ0aWNpcGFudHMuCisgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uQ29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CiAgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNhY3Rpb24odCwgc3luY0lkLCBudWxsIC8qdHJhbnNpdGlvbiovLCBjYWxsZXIsIHRyYW5zaXRpb24pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRUcmFuc2l0aW9uQ29udHJvbGxlcigpLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbkNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbkNvbnRyb2xsZXIubUZpbmlzaGluZ1RyYW5zaXRpb24gPSBudWxsOwogICAgICAgICAgICAgICAgIGlmIChzeW5jSWQgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZXRTeW5jUmVhZHkoc3luY0lkKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggNjk0ZjFiZS4uODM0YjcwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXIuamF2YQpAQCAtMTM4MSw2ICsxMzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIFdpbmR3b1Byb2Nlc3NDb250cm9sbGVyLCBhZnRlciB0aGUgcHJvY2VzcyBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqLworICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgdW5yZWdpc3RlckNvbmZpZ3VyYXRpb25MaXN0ZW5lcnMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayBpZiBhY3Rpdml0eSBjb25maWd1cmF0aW9uIG92ZXJyaWRlIGZvciB0aGUgYWN0aXZpdHkgcHJvY2VzcyBuZWVkcyBhbiB1cGRhdGUgYW5kIHBlcmZvcm0KICAgICAgKiBpZiBuZWVkZWQuIEJ5IGRlZmF1bHQgd2UgdHJ5IHRvIG92ZXJyaWRlIHRoZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gdG8gbWF0Y2ggdGhlIHRvcCBhY3Rpdml0eQogICAgICAqIGNvbmZpZyB0byBpbmNyZWFzZSBhcHAgY29tcGF0aWJpbGl0eSB3aXRoIG11bHRpLXdpbmRvdyBhbmQgbXVsdGktZGlzcGxheS4gVGhlIHByb2Nlc3Mgd2lsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcC5qYXZhCmluZGV4IDI3Njc5NzIuLjQyNGIwNDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJNYXAuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyTWFwLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBmaW5hbCBjbGFzcyBXaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcCB7CiAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICAgICAgICAgIG1QaWRNYXAucmVtb3ZlKHBpZCk7CiAgICAgICAgICAgICAvLyByZW1vdmUgcHJvY2VzcyBmcm9tIG1VaWRNYXAKICAgICAgICAgICAgIHJlbW92ZVByb2Nlc3NGcm9tVWlkTWFwKHByb2MpOworICAgICAgICAgICAgcHJvYy5kZXN0cm95KCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YQppbmRleCBmODZiOTk3Li5kNmMwMzExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhCkBAIC0yMjEsOCArMjIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd0ZvY3VzT2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dJZDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwotaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dEV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dEV2ZW50UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0V2luZG93SGFuZGxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnNldHNTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lkluc2V0c1N0YXRlOwpAQCAtNTcyLDEyICs1NzAsNiBAQAogICAgIGJvb2xlYW4gbVJlbW92ZU9uRXhpdDsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGFwcCBkaWVkIHdoaWxlIGl0IHdhcyB2aXNpYmxlLCBpZiB0cnVlIHdlIG1pZ2h0IG5lZWQKLSAgICAgKiB0byBjb250aW51ZSB0byBzaG93IGl0IHVudGlsIGl0J3MgcmVzdGFydGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gbUFwcERpZWQ7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgd2hlbiB0aGUgb3JpZW50YXRpb24gaXMgY2hhbmdpbmcgYW5kIHRoaXMgd2luZG93IGhhcyBub3QgeWV0CiAgICAgICogYmVlbiB1cGRhdGVkIGZvciB0aGUgbmV3IG9yaWVudGF0aW9uLgogICAgICAqLwpAQCAtNzYwLDcgKzc1Miw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBJbnNldHNTdGF0ZSBtRnJvemVuSW5zZXRzU3RhdGU7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0RJTV9BTU9VTlRfREVBRF9XSU5ET1cgPSAwLjVmOwogICAgIHByaXZhdGUgS2V5SW50ZXJjZXB0aW9uSW5mbyBtS2V5SW50ZXJjZXB0aW9uSW5mbzsKIAogICAgIC8qKgpAQCAtMTUwNCwxMyArMTQ5NSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJZiBpdCdzIGEgZGVhZCB3aW5kb3cgbGVmdCBvbiBzY3JlZW4sIGFuZCB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VkLCB0aGVyZSBpcyBub3RoaW5nCi0gICAgICAgICAgICAvLyB3ZSBjYW4gZG8gYWJvdXQgaXQuIFJlbW92ZSB0aGUgd2luZG93IG5vdy4KLSAgICAgICAgICAgIGlmIChtQWN0aXZpdHlSZWNvcmQgIT0gbnVsbCAmJiBtQXBwRGllZCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0eVJlY29yZC5yZW1vdmVEZWFkV2luZG93cygpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgb25SZXNpemVIYW5kbGVkKCk7CiAgICAgICAgICAgICBtV21TZXJ2aWNlLm1ha2VXaW5kb3dGcmVlemluZ1NjcmVlbklmTmVlZGVkTG9ja2VkKHRoaXMpOwogCkBAIC0yMDA5LDcgKzE5OTMsNyBAQAogICAgIGJvb2xlYW4gaXNJbnRlcmVzdGluZygpIHsKICAgICAgICAgZmluYWwgUmVjZW50c0FuaW1hdGlvbkNvbnRyb2xsZXIgcmVjZW50c0FuaW1hdGlvbkNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgIG1XbVNlcnZpY2UuZ2V0UmVjZW50c0FuaW1hdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgcmV0dXJuIG1BY3Rpdml0eVJlY29yZCAhPSBudWxsICYmICFtQXBwRGllZAorICAgICAgICByZXR1cm4gbUFjdGl2aXR5UmVjb3JkICE9IG51bGwKICAgICAgICAgICAgICAgICAmJiAoIW1BY3Rpdml0eVJlY29yZC5pc0ZyZWV6aW5nU2NyZWVuKCkgfHwgIW1BcHBGcmVlemluZykKICAgICAgICAgICAgICAgICAmJiBtVmlld1Zpc2liaWxpdHkgPT0gVmlldy5WSVNJQkxFCiAgICAgICAgICAgICAgICAgJiYgKHJlY2VudHNBbmltYXRpb25Db250cm9sbGVyID09IG51bGwKQEAgLTI0NDgsMTEgKzI0MzIsNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCByZW1vdmVJZlBvc3NpYmxlKCkgewotICAgICAgICBzdXBlci5yZW1vdmVJZlBvc3NpYmxlKCk7Ci0gICAgICAgIHJlbW92ZUlmUG9zc2libGUoZmFsc2UgLyprZWVwVmlzaWJsZURlYWRXaW5kb3cqLyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUlmUG9zc2libGUoYm9vbGVhbiBrZWVwVmlzaWJsZURlYWRXaW5kb3cpIHsKICAgICAgICAgbVdpbmRvd1JlbW92YWxBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgUHJvdG9Mb2cudihXTV9ERUJVR19BRERfUkVNT1ZFLAogICAgICAgICAgICAgICAgICJyZW1vdmVJZlBvc3NpYmxlOiAlcyBjYWxsZXJzPSVzIiwgdGhpcywgRGVidWcuZ2V0Q2FsbGVycyg1KSk7CkBAIC0yNTI3LDIxICsyNTA2LDYgQEAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGN1cnJlbnRseSBydW5uaW5nIHRoZSBleGl0IGFuaW1hdGlvbiwgd2UgbmVlZCB0byBzZWUgYWJvdXQgc3RhcnRpbmcgb25lCiAgICAgICAgICAgICAgICAgd2FzVmlzaWJsZSA9IGlzVmlzaWJsZSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGtlZXBWaXNpYmxlRGVhZFdpbmRvdykgewotICAgICAgICAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX0FERF9SRU1PVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCByZW1vdmluZyAlcyBiZWNhdXNlIGFwcCBkaWVkIHdoaWxlIGl0J3MgdmlzaWJsZSIsIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BcHBEaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheUxheW91dE5lZWRlZCgpOwotICAgICAgICAgICAgICAgICAgICBtV21TZXJ2aWNlLm1XaW5kb3dQbGFjZXJMb2NrZWQucGVyZm9ybVN1cmZhY2VQbGFjZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgYSByZXBsYWNlbWVudCBpbnB1dCBjaGFubmVsIHNpbmNlIHRoZSBhcHAgaXMgbm93IGRlYWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2F0Y2ggdGFwcGluZyBvbiB0aGUgZGVhZCB3aW5kb3cgdG8gcmVzdGFydCB0aGUgYXBwLgotICAgICAgICAgICAgICAgICAgICBvcGVuSW5wdXRDaGFubmVsKG51bGwpOwotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q29udGVudC5nZXRJbnB1dE1vbml0b3IoKS51cGRhdGVJbnB1dFdpbmRvd3NMdyh0cnVlIC8qZm9yY2UqLyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaW1tZWRpYXRlbHkgaWYgdGhlcmUgaXMgZGlzcGxheSB0cmFuc2l0aW9uIGJlY2F1c2UgdGhlIGFuaW1hdGlvbiBpcwogICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgdW5ub3RpY2VhYmxlIChlLmcuIGNvdmVyZWQgYnkgcm90YXRpb24gYW5pbWF0aW9uKSBhbmQgdGhlIGFuaW1hdGlvbgogICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBjb3VsZCBiZSBpbmNvbnNpc3RlbnQsIHN1Y2ggYXMgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIHdpbmRvdyBhcHBsaWVzCkBAIC0yNzE1LDE5ICsyNjc5LDcgQEAKICAgICAgICAgICAgICAgICB8fCAoaXNWaXNpYmxlKCkgJiYgbUFjdGl2aXR5UmVjb3JkICE9IG51bGwgJiYgbUFjdGl2aXR5UmVjb3JkLmlzVmlzaWJsZSgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERlYWRXaW5kb3dFdmVudFJlY2VpdmVyIGV4dGVuZHMgSW5wdXRFdmVudFJlY2VpdmVyIHsKLSAgICAgICAgRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIoSW5wdXRDaGFubmVsIGlucHV0Q2hhbm5lbCkgewotICAgICAgICAgICAgc3VwZXIoaW5wdXRDaGFubmVsLCBtV21TZXJ2aWNlLm1ILmdldExvb3BlcigpKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dEV2ZW50KElucHV0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaElucHV0RXZlbnQoZXZlbnQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKiBGYWtlIGV2ZW50IHJlY2VpdmVyIGZvciB3aW5kb3dzIHRoYXQgZGllZCB2aXNpYmxlLiAqLwotICAgIHByaXZhdGUgRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIgbURlYWRXaW5kb3dFdmVudFJlY2VpdmVyOwotCi0gICAgdm9pZCBvcGVuSW5wdXRDaGFubmVsKElucHV0Q2hhbm5lbCBvdXRJbnB1dENoYW5uZWwpIHsKKyAgICB2b2lkIG9wZW5JbnB1dENoYW5uZWwoQE5vbk51bGwgSW5wdXRDaGFubmVsIG91dElucHV0Q2hhbm5lbCkgewogICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXaW5kb3cgYWxyZWFkeSBoYXMgYW4gaW5wdXQgY2hhbm5lbC4iKTsKICAgICAgICAgfQpAQCAtMjczNiwxNCArMjY4OCw3IEBACiAgICAgICAgIG1JbnB1dENoYW5uZWxUb2tlbiA9IG1JbnB1dENoYW5uZWwuZ2V0VG9rZW4oKTsKICAgICAgICAgbUlucHV0V2luZG93SGFuZGxlLnNldFRva2VuKG1JbnB1dENoYW5uZWxUb2tlbik7CiAgICAgICAgIG1XbVNlcnZpY2UubUlucHV0VG9XaW5kb3dNYXAucHV0KG1JbnB1dENoYW5uZWxUb2tlbiwgdGhpcyk7Ci0gICAgICAgIGlmIChvdXRJbnB1dENoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0Q2hhbm5lbC5jb3B5VG8ob3V0SW5wdXRDaGFubmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgZGllZCB2aXNpYmxlLCB3ZSBzZXR1cCBhIGZha2UgaW5wdXQgY2hhbm5lbCwgc28gdGhhdCB0YXBzCi0gICAgICAgICAgICAvLyBjYW4gc3RpbGwgZGV0ZWN0ZWQgYnkgaW5wdXQgbW9uaXRvciBjaGFubmVsLCBhbmQgd2UgY2FuIHJlbGF1bmNoIHRoZSBhcHAuCi0gICAgICAgICAgICAvLyBDcmVhdGUgZmFrZSBldmVudCByZWNlaXZlciB0aGF0IHNpbXBseSByZXBvcnRzIGFsbCBldmVudHMgYXMgaGFuZGxlZC4KLSAgICAgICAgICAgIG1EZWFkV2luZG93RXZlbnRSZWNlaXZlciA9IG5ldyBEZWFkV2luZG93RXZlbnRSZWNlaXZlcihtSW5wdXRDaGFubmVsKTsKLSAgICAgICAgfQorICAgICAgICBtSW5wdXRDaGFubmVsLmNvcHlUbyhvdXRJbnB1dENoYW5uZWwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc1NCwxMCArMjY5OSw2IEBACiAgICAgfQogCiAgICAgdm9pZCBkaXNwb3NlSW5wdXRDaGFubmVsKCkgewotICAgICAgICBpZiAobURlYWRXaW5kb3dFdmVudFJlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EZWFkV2luZG93RXZlbnRSZWNlaXZlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIgPSBudWxsOwotICAgICAgICB9CiAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBzZXJ2ZXIgY2hhbm5lbCBmaXJzdCBvdGhlcndpc2UgaXQgY29tcGxhaW5zIGFib3V0IGJyb2tlbiBjaGFubmVsLgogICAgICAgICAgICAgbVdtU2VydmljZS5tSW5wdXRNYW5hZ2VyLnJlbW92ZUlucHV0Q2hhbm5lbChtSW5wdXRDaGFubmVsVG9rZW4pOwpAQCAtMzA4NCwxMSArMzAyNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dGb3JDbGllbnRMb2NrZWQobVNlc3Npb24sIG1DbGllbnQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIldJTiBERUFUSDogIiArIHdpbik7CiAgICAgICAgICAgICAgICAgICAgIGlmICh3aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlzcGxheUNvbnRlbnQgZGMgPSBnZXREaXNwbGF5Q29udGVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbi5tQWN0aXZpdHlSZWNvcmQgIT0gbnVsbCAmJiB3aW4ubUFjdGl2aXR5UmVjb3JkLmZpbmRNYWluV2luZG93KCkgPT0gd2luKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdtU2VydmljZS5tVGFza1NuYXBzaG90Q29udHJvbGxlci5vbkFwcERpZWQod2luLm1BY3Rpdml0eVJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aW4ucmVtb3ZlSWZQb3NzaWJsZShzaG91bGRLZWVwVmlzaWJsZURlYWRBcHBXaW5kb3coKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aW4ucmVtb3ZlSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IYXNTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiISEhIExFQUsgISEhIFdpbmRvdyByZW1vdmVkIGJ1dCBzdXJmYWNlIHN0aWxsIHZhbGlkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUudGhpcy5yZW1vdmVJZlBvc3NpYmxlKCk7CkBAIC0zMTAwLDMyICszMDQwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHdpbmRvdyBpcyB2aXNpYmxlIGFuZCBiZWxvbmdzIHRvIGEgZGVhZCBhcHAgYW5kIHNob3VsZG4ndCBiZSByZW1vdmVkLAotICAgICAqIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdHMgbG9jYXRpb24gb24gc2NyZWVuIHRvIGJlIHJlLWFjdGl2YXRlZCBsYXRlciB3aGVuIHRoZSB1c2VyCi0gICAgICogaW50ZXJhY3RzIHdpdGggaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEtlZXBWaXNpYmxlRGVhZEFwcFdpbmRvdygpIHsKLSAgICAgICAgaWYgKCFpc1Zpc2libGUoKSB8fCBtQWN0aXZpdHlSZWNvcmQgPT0gbnVsbCB8fCAhbUFjdGl2aXR5UmVjb3JkLmlzQ2xpZW50VmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYSB2aXNpYmxlIGFwcCB3aW5kb3cgb3IgdGhlIGFwcCBpc24ndCBkZWFkLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BdHRycy50b2tlbiAhPSBtQ2xpZW50LmFzQmluZGVyKCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgd2FzIGFkZCBieSBhIGNsaWVudCB1c2luZyBhbm90aGVyIGNsaWVudCdzIGFwcCB0b2tlbi4gV2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgLy8ga2VlcCB0aGUgZGVhZCB3aW5kb3cgYXJvdW5kIGZvciB0aGlzIGNhc2Ugc2luY2UgdGhpcyBpcyBtZWFudCBmb3IgJ3JlYWwnIGFwcHMuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUF0dHJzLnR5cGUgPT0gVFlQRV9BUFBMSUNBVElPTl9TVEFSVElORykgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga2VlcCBzdGFydGluZyB3aW5kb3dzIHNpbmNlIHRoZXkgd2VyZSBhZGRlZCBieSB0aGUgd2luZG93IG1hbmFnZXIgYmVmb3JlCi0gICAgICAgICAgICAvLyB0aGUgYXBwIGV2ZW4gbGF1bmNoZWQuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0V2luZG93Q29uZmlndXJhdGlvbigpLmtlZXBWaXNpYmxlRGVhZEFwcFdpbmRvd09uU2NyZWVuKCk7Ci0gICAgfQotCiAgICAgLyoqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgd2luZG93IGRlc2lyZXMga2V5IGV2ZW50cy4gKi8KICAgICBib29sZWFuIGNhblJlY2VpdmVLZXlzKCkgewogICAgICAgICByZXR1cm4gY2FuUmVjZWl2ZUtleXMoZmFsc2UgLyogZnJvbVVzZXJUb3VjaCAqLyk7CkBAIC0zOTcyLDcgKzM4ODYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUluc2V0c0NvbnRyb2xDaGFuZ2VkKCkgewogICAgICAgICBQcm90b0xvZy5kKFdNX0RFQlVHX1dJTkRPV19JTlNFVFMsICJub3RpZnlJbnNldHNDb250cm9sQ2hhbmdlZCBmb3IgJXMgIiwgdGhpcyk7Ci0gICAgICAgIGlmIChtQXBwRGllZCB8fCBtUmVtb3ZlZCkgeworICAgICAgICBpZiAobVJlbW92ZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBJbnNldHNTdGF0ZUNvbnRyb2xsZXIgc3RhdGVDb250cm9sbGVyID0KQEAgLTQyNzgsNyArNDE5Miw2IEBACiAgICAgICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtVG9rZW49IiArIG1Ub2tlbik7CiAgICAgICAgICAgICBpZiAobUFjdGl2aXR5UmVjb3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtQWN0aXZpdHlSZWNvcmQ9IiArIG1BY3Rpdml0eVJlY29yZCk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4ICsgIm1BcHBEaWVkPSIgKyBtQXBwRGllZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4ICsgImRyYXduU3RhdGVFdmFsdWF0ZWQ9IiArIGdldERyYXduU3RhdGVFdmFsdWF0ZWQoKSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwcmVmaXggKyAibWlnaHRBZmZlY3RBbGxEcmF3bj0iICsgbWlnaHRBZmZlY3RBbGxEcmF3bigpKTsKICAgICAgICAgICAgIH0KQEAgLTU0MDcsMTAgKzUzMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhcHBseURpbXMoKSB7Ci0gICAgICAgIGlmICghbUFuaW1hdGluZ0V4aXQgJiYgbUFwcERpZWQpIHsKLSAgICAgICAgICAgIG1Jc0RpbW1pbmcgPSB0cnVlOwotICAgICAgICAgICAgZ2V0RGltbWVyKCkuZGltQWJvdmUoZ2V0U3luY1RyYW5zYWN0aW9uKCksIHRoaXMsIERFRkFVTFRfRElNX0FNT1VOVF9ERUFEX1dJTkRPVyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKChtQXR0cnMuZmxhZ3MgJiBGTEFHX0RJTV9CRUhJTkQpICE9IDAgfHwgc2hvdWxkRHJhd0JsdXJCZWhpbmQoKSkKKyAgICAgICAgaWYgKCgobUF0dHJzLmZsYWdzICYgRkxBR19ESU1fQkVISU5EKSAhPSAwIHx8IHNob3VsZERyYXdCbHVyQmVoaW5kKCkpCiAgICAgICAgICAgICAgICAgICAgJiYgaXNWaXNpYmxlTm93KCkgJiYgIW1IaWRkZW4pIHsKICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgRGltbWVyIHdoZW4gdGhlIGZvbGxvd2luZyBpcyBzYXRpc2ZpZWQ6CiAgICAgICAgICAgICAvLyAxLiBUaGUgd2luZG93IGhhcyB0aGUgZmxhZyBGTEFHX0RJTV9CRUhJTkQgb3IgYmx1ciBiZWhpbmQgaXMgcmVxdWVzdGVkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfaW5wdXRfSW5wdXRNYW5hZ2VyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jb3JlL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfaW5wdXRfSW5wdXRNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggYjRlMmZiNi4uZGE0NGRhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2lucHV0X0lucHV0TWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NvcmUvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9pbnB1dF9JbnB1dE1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzA4LDYgKzMwOCw3IEBACiAgICAgdm9pZCBzZXRNb3Rpb25DbGFzc2lmaWVyRW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGdldEJsdWV0b290aEFkZHJlc3MoaW50MzJfdCBkZXZpY2VJZCk7CiAgICAgdm9pZCBzZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgRmxvYXRQb2ludCBnZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CiAKICAgICAvKiAtLS0gSW5wdXRSZWFkZXJQb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gLS0tICovCiAKQEAgLTM2Niw3ICszNjcsNyBAQAogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0UG9pbnRlckljb25JZCgpOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0U3R5bHVzSWNvbklkKCk7CiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldEN1c3RvbVBvaW50ZXJJY29uSWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IGRpc3BsYXlJZCwgZmxvYXQgeFBvcywgZmxvYXQgeVBvcyk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uKTsKIAogICAgIC8qIC0tLSBJZiB0b3VjaCBtb2RlIGlzIGVuYWJsZWQgcGVyIGRpc3BsYXkgb3IgZ2xvYmFsIC0tLSAqLwogCkBAIC03MzAsMTEgKzczMSwxMSBAQAogICAgIHJldHVybiBjb250cm9sbGVyOwogfQogCi12b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IHBvaW50ZXJEaXNwbGF5SWQsIGZsb2F0IHhQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5UG9zKSB7Cit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IHBvaW50ZXJEaXNwbGF5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwb3NpdGlvbikgewogICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtU2VydmljZU9iaiwgZ1NlcnZpY2VDbGFzc0luZm8ub25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZCwgcG9pbnRlckRpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhQb3MsIHlQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ueCwgcG9zaXRpb24ueSk7CiAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkIik7CiB9CiAKQEAgLTE2NTUsNiArMTY1NiwxNCBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihlbmFibGVkKTsKIH0KIAorRmxvYXRQb2ludCBOYXRpdmVJbnB1dE1hbmFnZXI6OmdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICBjb25zdCBhdXRvIHBjID0gbUxvY2tlZC5wb2ludGVyQ29udHJvbGxlci5sb2NrKCk7CisgICAgaWYgKCFwYykgcmV0dXJuIHtBTU9USU9OX0VWRU5UX0lOVkFMSURfQ1VSU09SX1BPU0lUSU9OLCBBTU9USU9OX0VWRU5UX0lOVkFMSURfQ1VSU09SX1BPU0lUSU9OfTsKKworICAgIHJldHVybiBwYy0+Z2V0UG9zaXRpb24oKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgTmF0aXZlSW5wdXRNYW5hZ2VyKiBnZXROYXRpdmVJbnB1dE1hbmFnZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopIHsKQEAgLTI1NDcsNiArMjU1NiwxNSBAQAogICAgIGltLT5zZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGVuYWJsZWQpOwogfQogCitzdGF0aWMgamZsb2F0QXJyYXkgbmF0aXZlR2V0TW91c2VDdXJzb3JQb3NpdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBuYXRpdmVJbXBsT2JqKSB7CisgICAgTmF0aXZlSW5wdXRNYW5hZ2VyKiBpbSA9IGdldE5hdGl2ZUlucHV0TWFuYWdlcihlbnYsIG5hdGl2ZUltcGxPYmopOworICAgIGNvbnN0IGF1dG8gcCA9IGltLT5nZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CisgICAgY29uc3Qgc3RkOjphcnJheTxmbG9hdCwgMj4gYXJyID0ge3twLngsIHAueX19OworICAgIGpmbG9hdEFycmF5IG91dEFyciA9IGVudi0+TmV3RmxvYXRBcnJheSgyKTsKKyAgICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24ob3V0QXJyLCAwLCBhcnIuc2l6ZSgpLCBhcnIuZGF0YSgpKTsKKyAgICByZXR1cm4gb3V0QXJyOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBjb25zdCBKTklOYXRpdmVNZXRob2QgZ0lucHV0TWFuYWdlck1ldGhvZHNbXSA9IHsKQEAgLTI2NDAsNiArMjY1OCw3IEBACiAgICAgICAgIHsiZ2V0Qmx1ZXRvb3RoQWRkcmVzcyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCopbmF0aXZlR2V0Qmx1ZXRvb3RoQWRkcmVzc30sCiAgICAgICAgIHsic2V0U3R5bHVzQnV0dG9uTW90aW9uRXZlbnRzRW5hYmxlZCIsICIoWilWIiwKICAgICAgICAgICh2b2lkKiluYXRpdmVTZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkfSwKKyAgICAgICAgeyJnZXRNb3VzZUN1cnNvclBvc2l0aW9uIiwgIigpW0YiLCAodm9pZCopbmF0aXZlR2V0TW91c2VDdXJzb3JQb3NpdGlvbn0sCiB9OwogCiAjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0NyZWF0ZVJlcXVlc3RTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DcmVhdGVSZXF1ZXN0U2Vzc2lvbi5qYXZhCmluZGV4IDc5M2Q4M2UuLjRmODIzNWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0NyZWF0ZVJlcXVlc3RTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlYXRlUmVxdWVzdFNlc3Npb24uamF2YQpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgcmVzcG9uZFRvQ2xpZW50V2l0aEVycm9yQW5kRmluaXNoKFN0cmluZyBlcnJvclR5cGUsIFN0cmluZyBlcnJvck1zZykgewogICAgICAgICBMb2cuaShUQUcsICJyZXNwb25kVG9DbGllbnRXaXRoRXJyb3JBbmRGaW5pc2giKTsKLQorICAgICAgICAvLyBUT0RPIGFkZCBleGNlcHRpb24gYml0CiAgICAgICAgIGlmIChtUmVxdWVzdFNlc3Npb25TdGF0dXMgPT0gUmVxdWVzdFNlc3Npb25TdGF0dXMuQ09NUExFVEUpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuIFRoaXMgaXMgc3RyYW5nZS4iKTsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0NyZWRlbnRpYWxNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlZGVudGlhbE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNGM1YzM2Ni4uODVhNDhkOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlZGVudGlhbE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlZGVudGlhbE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTU5Miw5ICs1OTIsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBmaW5hbGl6ZUFuZEVtaXRJbml0aWFsUGhhc2VNZXRyaWMoUmVxdWVzdFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICAgICAgdmFyIGluaXRNZXRyaWMgPSBzZXNzaW9uLm1Jbml0aWFsUGhhc2VNZXRyaWM7Ci0gICAgICAgICAgICBpbml0TWV0cmljLnNldENyZWRlbnRpYWxTZXJ2aWNlQmVnaW5RdWVyeVRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7Ci0gICAgICAgICAgICBNZXRyaWNVdGlsaXRpZXMubG9nQXBpQ2FsbGVkKGluaXRNZXRyaWMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2YXIgaW5pdE1ldHJpYyA9IHNlc3Npb24ubUluaXRpYWxQaGFzZU1ldHJpYzsKKyAgICAgICAgICAgICAgICBpbml0TWV0cmljLnNldENyZWRlbnRpYWxTZXJ2aWNlQmVnaW5RdWVyeVRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICAgICAgTWV0cmljVXRpbGl0aWVzLmxvZ0FwaUNhbGxlZChpbml0TWV0cmljKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvTWV0cmljVXRpbGl0aWVzLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQppbmRleCBlZDEzOWI1Li45OWYzYjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQpAQCAtODEsNiArODEsMzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBIGxvZ2dpbmcgdXRpbGl0eSB1c2VkIHByaW1hcmlseSBmb3IgdGhlIGNhbmRpZGF0ZSBwaGFzZSBvZiB0aGUgY3VycmVudCBtZXRyaWMgc2V0dXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJzICAgICAgICAgICAgYSBtYXAgd2l0aCBrbm93biBwcm92aWRlcnMKKyAgICAgKiBAcGFyYW0gZW1pdFNlcXVlbmNlSWQgICAgICAgYW4gZW1pdHRlZCBzZXF1ZW5jZSBpZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dBcGlDYWxsZWQoTWFwPFN0cmluZywgUHJvdmlkZXJTZXNzaW9uPiBwcm92aWRlcnMsCisgICAgICAgICAgICBpbnQgZW1pdFNlcXVlbmNlSWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlclNlc3Npb25zID0gcHJvdmlkZXJzLnZhbHVlcygpOworICAgICAgICAgICAgaW50IHByb3ZpZGVyU2l6ZSA9IHByb3ZpZGVyU2Vzc2lvbnMuc2l6ZSgpOworICAgICAgICAgICAgaW50W10gY2FuZGlkYXRlVWlkTGlzdCA9IG5ldyBpbnRbcHJvdmlkZXJTaXplXTsKKyAgICAgICAgICAgIGludFtdIGNhbmRpZGF0ZVF1ZXJ5Um91bmRUcmlwVGltZUxpc3QgPSBuZXcgaW50W3Byb3ZpZGVyU2l6ZV07CisgICAgICAgICAgICBpbnRbXSBjYW5kaWRhdGVTdGF0dXNMaXN0ID0gbmV3IGludFtwcm92aWRlclNpemVdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAodmFyIHNlc3Npb24gOiBwcm92aWRlclNlc3Npb25zKSB7CisgICAgICAgICAgICAgICAgQ2FuZGlkYXRlUGhhc2VNZXRyaWMgbWV0cmljID0gc2Vzc2lvbi5tQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYzsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVVaWRMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRDYW5kaWRhdGVVaWQoKTsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVRdWVyeVJvdW5kVHJpcFRpbWVMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRRdWVyeUxhdGVuY3lNaWNyb3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVTdGF0dXNMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRQcm92aWRlclF1ZXJ5U3RhdHVzKCk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8gSGFuZGxlIHRoZSBlbWl0IGhlcmUKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGUgbW9zdCBjb21tb24gbG9nZ2luZyBoZWxwZXIsIGhhbmRsZXMgdGhlIG92ZXJhbGwgc3RhdHVzIG9mIHRoZSBBUEkgcmVxdWVzdCB3aXRoIHRoZQogICAgICAqIHByb3ZpZGVyIHN0YXR1cyBhbmQgbGF0ZW5jaWVzLiBPdGhlciB2ZXJzaW9ucyBvZiB0aGlzIG1ldGhvZCBtYXkgYmUgbW9yZSB1c2VmdWwgZGVwZW5kaW5nCiAgICAgICogb24gdGhlIHNpdHVhdGlvbiwgYXMgdGhpcyBpcyBnZWFyZWQgdG93YXJkcyB0aGUgbG9nZ2luZyBvZiB7QGxpbmsgUHJvdmlkZXJTZXNzaW9ufSB0eXBlcy4KQEAgLTkwLDYgKzExOCw3IEBACiAgICAgICogQHBhcmFtIHByb3ZpZGVycyAgICAgICAgICAgIGEgbWFwIHdpdGgga25vd24gcHJvdmlkZXJzCiAgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgICAgICAgICAgIHRoZSBjYWxsaW5nIFVJRCBvZiB0aGUgY2xpZW50IGFwcAogICAgICAqIEBwYXJhbSBjaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMgdGhlIG1ldHJpYyBkYXRhIHR5cGUgb2YgdGhlIGZpbmFsIGNob3NlbiBwcm92aWRlcgorICAgICAqIFRPRE8gcmVtb3ZlIHNvb24KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nQXBpQ2FsbGVkKEFwaU5hbWUgYXBpTmFtZSwgQXBpU3RhdHVzIGFwaVN0YXR1cywKICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3ZpZGVyU2Vzc2lvbj4gcHJvdmlkZXJzLCBpbnQgY2FsbGluZ1VpZCwKQEAgLTEzMyw2ICsxNjIsNyBAQAogICAgICAqIGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvdGhlciBvcHRpb25hbCBwYXJhbWV0ZXJzLgogICAgICAqCiAgICAgICogVE9ETyhiLzI3MTEzNTA0OCkgLSBnaXZlbiBzcGFjZSByZXF1aXJlbWVudHMsIHRoaXMgbWF5IGJlIGEgZ29vZCBjYW5kaWRhdGUgZm9yIGFub3RoZXIgYXRvbQorICAgICAqIFRPRE8gaW1tZWRpYXRlbHkgcmVtb3ZlIGFuZCBjYXJyeSBvdmVyIFRPRE8gdG8gbmV3IGxvZyBmb3IgdGhpcyBzZXR1cAogICAgICAqCiAgICAgICogQHBhcmFtIGFwaU5hbWUgICAgdGhlIGFwaSBuYW1lIHRvIGxvZwogICAgICAqIEBwYXJhbSBhcGlTdGF0dXMgIHRoZSBzdGF0dXMgdG8gbG9nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckNsZWFyU2Vzc2lvbi5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJDbGVhclNlc3Npb24uamF2YQppbmRleCA5NTBjZjRmLi5iODZkYWJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckNsZWFyU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ2xlYXJTZXNzaW9uLmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgIFByb3ZpZGVyQ2xlYXJTZXNzaW9uIGV4dGVuZHMgUHJvdmlkZXJTZXNzaW9uPENsZWFyQ3JlZGVudGlhbFN0YXRlUmVxdWVzdCwKK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm92aWRlckNsZWFyU2Vzc2lvbiBleHRlbmRzIFByb3ZpZGVyU2Vzc2lvbjxDbGVhckNyZWRlbnRpYWxTdGF0ZVJlcXVlc3QsCiAgICAgICAgIFZvaWQ+CiAgICAgICAgIGltcGxlbWVudHMKICAgICAgICAgUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UuUHJvdmlkZXJDYWxsYmFja3M8Vm9pZD4gewpAQCAtNDIsNyArNDIsOCBAQAogICAgIHByaXZhdGUgQ2xlYXJDcmVkZW50aWFsU3RhdGVFeGNlcHRpb24gbVByb3ZpZGVyRXhjZXB0aW9uOwogCiAgICAgLyoqIENyZWF0ZXMgYSBuZXcgcHJvdmlkZXIgc2Vzc2lvbiB0byBiZSB1c2VkIGJ5IHRoZSByZXF1ZXN0IHNlc3Npb24uICovCi0gICAgQE51bGxhYmxlIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJDbGVhclNlc3Npb24gY3JlYXRlTmV3U2Vzc2lvbigKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyQ2xlYXJTZXNzaW9uIGNyZWF0ZU5ld1Nlc3Npb24oCiAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBAVXNlcklkSW50IGludCB1c2VySWQsCiAgICAgICAgICAgICBDcmVkZW50aWFsUHJvdmlkZXJJbmZvIHByb3ZpZGVySW5mbywKQEAgLTUzLDcgKzU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVxdWVzdFNlc3Npb24ubUNsaWVudFJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclJlcXVlc3RTZXNzaW9uLm1DbGllbnRBcHBJbmZvKTsKICAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlckNsZWFyU2Vzc2lvbihjb250ZXh0LCBwcm92aWRlckluZm8sIGNsZWFyUmVxdWVzdFNlc3Npb24sIHVzZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UsIHByb3ZpZGVyUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgcmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UsIHByb3ZpZGVyUmVxdWVzdCk7CiAgICAgfQogCiAgICAgQE51bGxhYmxlCkBAIC05MCw2ICs5MSw3IEBACiAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBDbGVhckNyZWRlbnRpYWxTdGF0ZUV4Y2VwdGlvbikgewogICAgICAgICAgICAgbVByb3ZpZGVyRXhjZXB0aW9uID0gKENsZWFyQ3JlZGVudGlhbFN0YXRlRXhjZXB0aW9uKSBleGNlcHRpb247CiAgICAgICAgIH0KKyAgICAgICAgY2FwdHVyZUNhbmRpZGF0ZUZhaWx1cmUoKTsKICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2sodG9TdGF0dXMoZXJyb3JDb2RlKSk7CiAgICAgfQogCkBAIC0xMjAsMTQgKzEyMiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU2Vzc2lvbigpIHsKICAgICAgICAgaWYgKG1SZW1vdGVDcmVkZW50aWFsU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgSW5pdGlhbFBoYXNlTWV0cmljIGluaXRNZXRyaWMgPSAoKFJlcXVlc3RTZXNzaW9uKW1DYWxsYmFja3MpLmluaXRNZXRyaWM7Ci0gICAgICAgICAgICBUT0RPIGltbWVkaWF0ZWx5IG9uY2UgdGhlIG90aGVyIGNoYW5nZSBwYXRjaGVkIHRocm91Z2gKLSAgICAgICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRTZXNzaW9uSWQoaW5pdE1ldHJpYwotICAgICAgICAgICAgLm1Jbml0aWFsUGhhc2VNZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgbUNhbmRpZGF0ZVByb3ZpZGVyTWV0cmljLnNldFN0YXJ0VGltZShpbml0TWV0cmljLmdldFN0YXJ0VGltZSgpKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRTdGFydFF1ZXJ5VGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgICAgIHN0YXJ0Q2FuZGlkYXRlTWV0cmljcygpOwogICAgICAgICAgICAgbVJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlLm9uQ2xlYXJDcmVkZW50aWFsU3RhdGUobVByb3ZpZGVyUmVxdWVzdCwgdGhpcyk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckNyZWF0ZVNlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ3JlYXRlU2Vzc2lvbi5qYXZhCmluZGV4IDNlYzBmYzAuLmJiYmIxNTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ3JlYXRlU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ3JlYXRlU2Vzc2lvbi5qYXZhCkBAIC00MCw2ICs0MCw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5FbnRyeUVudW07CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjUsNyArNjcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyIG1Qcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXI7CiAKICAgICAvKiogQ3JlYXRlcyBhIG5ldyBwcm92aWRlciBzZXNzaW9uIHRvIGJlIHVzZWQgYnkgdGhlIHJlcXVlc3Qgc2Vzc2lvbi4gKi8KLSAgICBATnVsbGFibGUgcHVibGljIHN0YXRpYyBQcm92aWRlckNyZWF0ZVNlc3Npb24gY3JlYXRlTmV3U2Vzc2lvbigKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyQ3JlYXRlU2Vzc2lvbiBjcmVhdGVOZXdTZXNzaW9uKAogICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkLAogICAgICAgICAgICAgQ3JlZGVudGlhbFByb3ZpZGVySW5mbyBwcm92aWRlckluZm8sCkBAIC0xNTUsNiArMTU4LDcgQEAKICAgICAgICAgICAgIC8vIFN0b3JlIHF1ZXJ5IHBoYXNlIGV4Y2VwdGlvbiBmb3IgYWdncmVnYXRpb24gd2l0aCBmaW5hbCByZXNwb25zZQogICAgICAgICAgICAgbVByb3ZpZGVyRXhjZXB0aW9uID0gKENyZWF0ZUNyZWRlbnRpYWxFeGNlcHRpb24pIGV4Y2VwdGlvbjsKICAgICAgICAgfQorICAgICAgICBjYXB0dXJlQ2FuZGlkYXRlRmFpbHVyZSgpOwogICAgICAgICB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayh0b1N0YXR1cyhlcnJvckNvZGUpKTsKICAgICB9CiAKQEAgLTE3NSwxNCArMTc5LDMyIEBACiAgICAgICAgIG1Qcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIuYWRkUmVzcG9uc2VDb250ZW50KHJlc3BvbnNlLmdldENyZWF0ZUVudHJpZXMoKSwKICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRSZW1vdGVDcmVhdGVFbnRyeSgpKTsKICAgICAgICAgaWYgKG1Qcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIuaXNFbXB0eVJlc3BvbnNlKHJlc3BvbnNlKSkgeworICAgICAgICAgICAgZ2F0aGVDYW5kaWRhdGVFbnRyeU1ldHJpY3MocmVzcG9uc2UpOwogICAgICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2soU3RhdHVzLkVNUFRZX1JFU1BPTlNFKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdhdGhlQ2FuZGlkYXRlRW50cnlNZXRyaWNzKHJlc3BvbnNlKTsKICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0FuZEludm9rZUNhbGxiYWNrKFN0YXR1cy5TQVZFX0VOVFJJRVNfUkVDRUlWRUQpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGdhdGhlQ2FuZGlkYXRlRW50cnlNZXRyaWNzKEJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgY3JlYXRlRW50cmllcyA9IHJlc3BvbnNlLmdldENyZWF0ZUVudHJpZXMoKTsKKyAgICAgICAgICAgIGludCBudW1DcmVhdGVFbnRyaWVzID0gY3JlYXRlRW50cmllcyA9PSBudWxsID8gMCA6IGNyZWF0ZUVudHJpZXMuc2l6ZSgpOworICAgICAgICAgICAgLy8gVE9ETyBjb25maXJtIGhvdyB0byBnZXQgdHlwZXMgZnJvbSBzbGljZQorICAgICAgICAgICAgaWYgKG51bUNyZWF0ZUVudHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlRW50cmllcy5mb3JFYWNoKGMgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLmFkZEVudHJ5KEVudHJ5RW51bS5DUkVERU5USUFMX0VOVFJZKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXROdW1FbnRyaWVzVG90YWwobnVtQ3JlYXRlRW50cmllcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBtZXRyaWMgbG9nZ2luZzogIiArIGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCi0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBDcmVhdGVDcmVkZW50aWFsUHJvdmlkZXJEYXRhIHByZXBhcmVVaURhdGEoKQorICAgIEBOdWxsYWJsZQorICAgIHByb3RlY3RlZCBDcmVhdGVDcmVkZW50aWFsUHJvdmlkZXJEYXRhIHByZXBhcmVVaURhdGEoKQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKFRBRywgIkluIHByZXBhcmVVaURhdGEiKTsKICAgICAgICAgaWYgKCFQcm92aWRlclNlc3Npb24uaXNVaUludm9raW5nU3RhdHVzKGdldFN0YXR1cygpKSkgewpAQCAtMjI2LDE0ICsyNDgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVNlc3Npb24oKSB7CiAgICAgICAgIGlmIChtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIEluaXRpYWxQaGFzZU1ldHJpYyBpbml0TWV0cmljID0gKChSZXF1ZXN0U2Vzc2lvbiltQ2FsbGJhY2tzKS5pbml0TWV0cmljOwotICAgICAgICAgICAgVE9ETyBpbW1lZGlhdGVseSBvbmNlIHRoZSBvdGhlciBjaGFuZ2UgcGF0Y2hlZCB0aHJvdWdoCi0gICAgICAgICAgICBtQ2FuZGlkYXRlUHJvdmlkZXJNZXRyaWMuc2V0U2Vzc2lvbklkKGluaXRNZXRyaWMKLSAgICAgICAgICAgIC5tSW5pdGlhbFBoYXNlTWV0cmljLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRTdGFydFRpbWUoaW5pdE1ldHJpYy5nZXRTdGFydFRpbWUoKSkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICBzdGFydENhbmRpZGF0ZU1ldHJpY3MoKTsKICAgICAgICAgICAgIG1SZW1vdGVDcmVkZW50aWFsU2VydmljZS5vbkNyZWF0ZUNyZWRlbnRpYWwobVByb3ZpZGVyUmVxdWVzdCwgdGhpcyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMDUsMTIgKzMyMCwxNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyIHsKLSAgICAgICAgQE51bGxhYmxlIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZTsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZTsKIAogICAgICAgICBATm9uTnVsbAogICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhaXI8Q3JlYXRlRW50cnksIEVudHJ5Pj4gbVVpQ3JlYXRlRW50cmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotICAgICAgICBATnVsbGFibGUgcHJpdmF0ZSBQYWlyPFN0cmluZywgUGFpcjxSZW1vdGVFbnRyeSwgRW50cnk+PiBtVWlSZW1vdGVFbnRyeSA9IG51bGw7CisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwcml2YXRlIFBhaXI8U3RyaW5nLCBQYWlyPFJlbW90ZUVudHJ5LCBFbnRyeT4+IG1VaVJlbW90ZUVudHJ5ID0gbnVsbDsKIAogICAgICAgICBQcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIoQE51bGxhYmxlIENvbXBvbmVudE5hbWUgZXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZSkgewogICAgICAgICAgICAgbUV4cGVjdGVkUmVtb3RlRW50cnlQcm92aWRlclNlcnZpY2UgPSBleHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOwpAQCAtMzIzLDYgKzM0MCw3IEBACiAgICAgICAgICAgICAgICAgc2V0UmVtb3RlRW50cnkocmVtb3RlRW50cnkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgYWRkQ3JlYXRlRW50cnkoQ3JlYXRlRW50cnkgY3JlYXRlRW50cnkpIHsKICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdlbmVyYXRlVW5pcXVlSWQoKTsKICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KFNBVkVfRU5UUllfS0VZLApAQCAtMzczLDYgKzM5MSw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UmVzcG9uc2UoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVVpQ3JlYXRlRW50cmllcy5pc0VtcHR5KCkgJiYgbVVpUmVtb3RlRW50cnkgPT0gbnVsbDsKICAgICAgICAgfQorCiAgICAgICAgIEBOdWxsYWJsZQogICAgICAgICBwdWJsaWMgUmVtb3RlRW50cnkgZ2V0UmVtb3RlRW50cnkoU3RyaW5nIGVudHJ5S2V5KSB7CiAgICAgICAgICAgICByZXR1cm4gbVVpUmVtb3RlRW50cnkgPT0gbnVsbCB8fCBtVWlSZW1vdGVFbnRyeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJHZXRTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckdldFNlc3Npb24uamF2YQppbmRleCBlYzhiZjIyLi5iZjFkYjM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckdldFNlc3Npb24uamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckdldFNlc3Npb24uamF2YQpAQCAtNDMsNiArNDMsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLm1ldHJpY3MuRW50cnlFbnVtOworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTgyLDcgKzg0LDggQEAKICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlciBtUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyOwogCiAgICAgLyoqIENyZWF0ZXMgYSBuZXcgcHJvdmlkZXIgc2Vzc2lvbiB0byBiZSB1c2VkIGJ5IHRoZSByZXF1ZXN0IHNlc3Npb24uICovCi0gICAgQE51bGxhYmxlIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJHZXRTZXNzaW9uIGNyZWF0ZU5ld1Nlc3Npb24oCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIHN0YXRpYyBQcm92aWRlckdldFNlc3Npb24gY3JlYXRlTmV3U2Vzc2lvbigKICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCwKICAgICAgICAgICAgIENyZWRlbnRpYWxQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvLApAQCAtMTEzLDYgKzExNiw3IEBACiAgICAgICAgIExvZy5pKFRBRywgIlVuYWJsZSB0byBjcmVhdGUgcHJvdmlkZXIgc2Vzc2lvbiIpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBCZWdpbkdldENyZWRlbnRpYWxSZXF1ZXN0IGNvbnN0cnVjdFF1ZXJ5UGhhc2VSZXF1ZXN0KAogICAgICAgICAgICAgYW5kcm9pZC5jcmVkZW50aWFscy5HZXRDcmVkZW50aWFsUmVxdWVzdCBmaWx0ZXJlZFJlcXVlc3QsCiAgICAgICAgICAgICBDYWxsaW5nQXBwSW5mbyBjYWxsaW5nQXBwSW5mbywKQEAgLTE2OSw3ICsxNzMsNyBAQAogICAgICAgICAgICAgQ2FsbGluZ0FwcEluZm8gY2FsbGluZ0FwcEluZm8sCiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBDcmVkZW50aWFsT3B0aW9uPiBiZWdpbkdldE9wdGlvblRvQ3JlZGVudGlhbE9wdGlvbk1hcCwKICAgICAgICAgICAgIFN0cmluZyBoeWJyaWRTZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGJlZ2luR2V0UmVxdWVzdCwgY2FsbGJhY2tzLCBpbmZvLmdldENvbXBvbmVudE5hbWUoKSAsCisgICAgICAgIHN1cGVyKGNvbnRleHQsIGJlZ2luR2V0UmVxdWVzdCwgY2FsbGJhY2tzLCBpbmZvLmdldENvbXBvbmVudE5hbWUoKSwKICAgICAgICAgICAgICAgICB1c2VySWQsIHJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlKTsKICAgICAgICAgbUNvbXBsZXRlUmVxdWVzdCA9IGNvbXBsZXRlR2V0UmVxdWVzdDsKICAgICAgICAgbUNhbGxpbmdBcHBJbmZvID0gY2FsbGluZ0FwcEluZm87CkBAIC0xOTEsNiArMTk1LDcgQEAKICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEdldENyZWRlbnRpYWxFeGNlcHRpb24pIHsKICAgICAgICAgICAgIG1Qcm92aWRlckV4Y2VwdGlvbiA9IChHZXRDcmVkZW50aWFsRXhjZXB0aW9uKSBleGNlcHRpb247CiAgICAgICAgIH0KKyAgICAgICAgY2FwdHVyZUNhbmRpZGF0ZUZhaWx1cmUoKTsKICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2sodG9TdGF0dXMoZXJyb3JDb2RlKSk7CiAgICAgfQogCkBAIC0yNjksMjAgKzI3NCwxNCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVNlc3Npb24oKSB7CiAgICAgICAgIGlmIChtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIEluaXRpYWxQaGFzZU1ldHJpYyBpbml0TWV0cmljID0gKChSZXF1ZXN0U2Vzc2lvbiltQ2FsbGJhY2tzKS5pbml0TWV0cmljOwotICAgICAgICAgICAgVE9ETyBpbW1lZGlhdGVseSBvbmNlIHRoZSBvdGhlciBjaGFuZ2UgcGF0Y2hlZCB0aHJvdWdoCi0gICAgICAgICAgICBtQ2FuZGlkYXRlUHJvdmlkZXJNZXRyaWMuc2V0U2Vzc2lvbklkKGluaXRNZXRyaWMKLSAgICAgICAgICAgIC5tSW5pdGlhbFBoYXNlTWV0cmljLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRTdGFydFRpbWUoaW5pdE1ldHJpYy5nZXRTdGFydFRpbWUoKSkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICBzdGFydENhbmRpZGF0ZU1ldHJpY3MoKTsKICAgICAgICAgICAgIG1SZW1vdGVDcmVkZW50aWFsU2VydmljZS5vbkJlZ2luR2V0Q3JlZGVudGlhbChtUHJvdmlkZXJSZXF1ZXN0LCB0aGlzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZSAvLyBDYWxsIGZyb20gcmVxdWVzdCBzZXNzaW9uIHRvIGRhdGEgdG8gYmUgc2hvd24gb24gdGhlIFVJCi0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBHZXRDcmVkZW50aWFsUHJvdmlkZXJEYXRhIHByZXBhcmVVaURhdGEoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBATnVsbGFibGUKKyAgICBwcm90ZWN0ZWQgR2V0Q3JlZGVudGlhbFByb3ZpZGVyRGF0YSBwcmVwYXJlVWlEYXRhKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKFRBRywgIkluIHByZXBhcmVVaURhdGEiKTsKICAgICAgICAgaWYgKCFQcm92aWRlclNlc3Npb24uaXNVaUludm9raW5nU3RhdHVzKGdldFN0YXR1cygpKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAiSW4gcHJlcGFyZVVpRGF0YSAtIHByb3ZpZGVyIGRvZXMgbm90IHdhbnQgdG8gc2hvdyBVSTogIgpAQCAtMzg5LDYgKzM4OCw3IEBACiAgICAgICAgIEdldENyZWRlbnRpYWxFeGNlcHRpb24gZXhjZXB0aW9uID0gbWF5YmVHZXRQZW5kaW5nSW50ZW50RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIHByb3ZpZGVyUGVuZGluZ0ludGVudFJlc3BvbnNlKTsKICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPIChiLzI3MTEzNTA0OCksIGZvciBBdXRoZW50aWNhdGlvbkVudHJ5IGNhbGxiYWNrIHNlbGVjdGlvbiwgc2V0IGVycm9yCiAgICAgICAgICAgICBpbnZva2VDYWxsYmFja1dpdGhFcnJvcihleGNlcHRpb24uZ2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgY29udGVudCByZWNlaXZlZCBpcyBpbiB0aGUgZm9ybSBvZiBhbiBleGNlcHRpb24gd2hpY2ggZW5kcyB0aGUgZmxvdy4KQEAgLTQzOSwxMSArNDM5LDM0IEBACiAgICAgICAgICAgICB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayhTdGF0dXMuRU1QVFlfUkVTUE9OU0UpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHksIGFkZCB0byBDYW5kaWRhdGUgUGhhc2UgY291bnRzLCByZXBlYXQgYWNyb3NzIGFsbCBzZXNzaW9ucwotICAgICAgICAvLyBVc2Ugc2V0cyB0byBkZWR1cCB0eXBlIGNvdW50cworICAgICAgICBnYXRoZXJDYW5kaWRhdGVFbnRyeU1ldHJpY3MocmVzcG9uc2UpOwogICAgICAgICB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayhTdGF0dXMuQ1JFREVOVElBTFNfUkVDRUlWRUQpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBnYXRoZXJDYW5kaWRhdGVFbnRyeU1ldHJpY3MoQmVnaW5HZXRDcmVkZW50aWFsUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBudW1DcmVkRW50cmllcyA9IHJlc3BvbnNlLmdldENyZWRlbnRpYWxFbnRyaWVzKCkuc2l6ZSgpOworICAgICAgICAgICAgaW50IG51bUFjdGlvbkVudHJpZXMgPSByZXNwb25zZS5nZXRBY3Rpb25zKCkuc2l6ZSgpOworICAgICAgICAgICAgaW50IG51bUF1dGhFbnRyaWVzID0gcmVzcG9uc2UuZ2V0QXV0aGVudGljYXRpb25BY3Rpb25zKCkuc2l6ZSgpOworICAgICAgICAgICAgLy8gVE9ETyBpbW1lZGlhdGVseSBhZGQgcmVtb3RlIGVudHJpZXMKKyAgICAgICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgY29uZmlybSBob3cgdG8gZ2V0IHR5cGVzIGZyb20gc2xpY2UgdG8gZ2V0IHVuaXF1ZSB0eXBlIGNvdW50IHZpYQorICAgICAgICAgICAgLy8gIGRlZHVwZQorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0Q3JlZGVudGlhbEVudHJpZXMoKS5mb3JFYWNoKGMgLT4KKyAgICAgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuYWRkRW50cnkoRW50cnlFbnVtLkNSRURFTlRJQUxfRU5UUlkpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEFjdGlvbnMoKS5mb3JFYWNoKGMgLT4KKyAgICAgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuYWRkRW50cnkoRW50cnlFbnVtLkFDVElPTl9FTlRSWSkpOworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0QXV0aGVudGljYXRpb25BY3Rpb25zKCkuZm9yRWFjaChjIC0+CisgICAgICAgICAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLmFkZEVudHJ5KEVudHJ5RW51bS5BVVRIRU5USUNBVElPTl9FTlRSWSkpOworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0TnVtRW50cmllc1RvdGFsKG51bUNyZWRFbnRyaWVzICsgbnVtQXV0aEVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgKyBudW1BY3Rpb25FbnRyaWVzKTsKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldENyZWRlbnRpYWxFbnRyeUNvdW50KG51bUNyZWRFbnRyaWVzKTsKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldEFjdGlvbkVudHJ5Q291bnQobnVtQWN0aW9uRW50cmllcyk7CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRBdXRoZW50aWNhdGlvbkVudHJ5Q291bnQobnVtQXV0aEVudHJpZXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFdoZW4gYW4gaW52YWxpZCBzdGF0ZSBvY2N1cnMsIGUuZy4gZW50cnkgbWlzbWF0Y2ggb3Igbm8gcmVzcG9uc2UgZnJvbSBwcm92aWRlciwKICAgICAgKiB3ZSBzZW5kIGJhY2sgYSBUWVBFX05PX0NSRURFTlRJQUwgZXJyb3IgYXMgdG8gdGhlIGRldmVsb3Blci4KQEAgLTQ3MSwxMSArNDk0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TVEFUVVNfVU5MT0NLRURfQlVUX0VNUFRZX0xFU1NfUkVDRU5UCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuc2Vjb25kLmdldFN0YXR1cygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEF1dGhlbnRpY2F0aW9uRW50cnkuU1RBVFVTX1VOTE9DS0VEX0JVVF9FTVBUWV9NT1NUX1JFQ0VOVAotICAgICAgICApOworICAgICAgICAgICAgICAgICk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIgewotICAgICAgICBATnVsbGFibGUgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1FeHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1FeHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOwogICAgICAgICBATm9uTnVsbAogICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhaXI8Q3JlZGVudGlhbEVudHJ5LCBFbnRyeT4+IG1VaUNyZWRlbnRpYWxFbnRyaWVzID0KICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDw+KCk7CkBAIC00ODUsNyArNTA5LDggQEAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYWlyPEFjdGlvbiwgQXV0aGVudGljYXRpb25FbnRyeT4+IG1VaUF1dGhlbnRpY2F0aW9uRW50cmllcyA9CiAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpOwogCi0gICAgICAgIEBOdWxsYWJsZSBwcml2YXRlIFBhaXI8U3RyaW5nLCBQYWlyPFJlbW90ZUVudHJ5LCBFbnRyeT4+IG1VaVJlbW90ZUVudHJ5ID0gbnVsbDsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgUGFpcjxTdHJpbmcsIFBhaXI8UmVtb3RlRW50cnksIEVudHJ5Pj4gbVVpUmVtb3RlRW50cnkgPSBudWxsOwogCiAgICAgICAgIFByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlcihATnVsbGFibGUgQ29tcG9uZW50TmFtZSBleHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlKSB7CiAgICAgICAgICAgICBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZSA9IGV4cGVjdGVkUmVtb3RlRW50cnlQcm92aWRlclNlcnZpY2U7CkBAIC01MDksNiArNTM0LDcgQEAKICAgICAgICAgICAgICAgICBzZXRSZW1vdGVFbnRyeShyZW1vdGVFbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBhZGRDcmVkZW50aWFsRW50cnkoQ3JlZGVudGlhbEVudHJ5IGNyZWRlbnRpYWxFbnRyeSkgewogICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpOwogICAgICAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoQ1JFREVOVElBTF9FTlRSWV9LRVksCkBAIC01NTksNyArNTg1LDYgQEAKICAgICAgICAgfQogCiAKLQogICAgICAgICBwdWJsaWMgR2V0Q3JlZGVudGlhbFByb3ZpZGVyRGF0YSB0b0dldENyZWRlbnRpYWxQcm92aWRlckRhdGEoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEdldENyZWRlbnRpYWxQcm92aWRlckRhdGEuQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU3RyaW5nKCkpLnNldEFjdGlvbkNoaXBzKHByZXBhcmVBY3Rpb25FbnRyaWVzKCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlclNlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyU2Vzc2lvbi5qYXZhCmluZGV4IDc3ZDRlNzcuLmZhYTkxZGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyU2Vzc2lvbi5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNhbmRpZGF0ZVBoYXNlTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkluaXRpYWxQaGFzZU1ldHJpYzsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5Qcm92aWRlclN0YXR1c0Zvck1ldHJpY3M7CiAKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKQEAgLTcyLDggKzczLDkgQEAKICAgICBATm9uTnVsbAogICAgIHByb3RlY3RlZCBCb29sZWFuIG1Qcm92aWRlclJlc3BvbnNlU2V0ID0gZmFsc2U7CiAgICAgLy8gU3BlY2lmaWMgY2FuZGlkYXRlIHByb3ZpZGVyIG1ldHJpYyBmb3IgdGhlIHByb3ZpZGVyIHRoaXMgc2Vzc2lvbiBoYW5kbGVzCi0gICAgQE51bGxhYmxlCi0gICAgcHJvdGVjdGVkIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljOworICAgIEBOb25OdWxsCisgICAgcHJvdGVjdGVkIGZpbmFsIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljID0KKyAgICAgICAgICAgIG5ldyBDYW5kaWRhdGVQaGFzZU1ldHJpYygpOwogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBpbnQgbVByb3ZpZGVyU2Vzc2lvblVpZDsKIApAQCAtMTQzLDcgKzE0NSw2IEBACiAgICAgICAgIG1Vc2VySWQgPSB1c2VySWQ7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKICAgICAgICAgbVJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlID0gcmVtb3RlQ3JlZGVudGlhbFNlcnZpY2U7Ci0gICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljID0gbmV3IENhbmRpZGF0ZVBoYXNlTWV0cmljKCk7CiAgICAgICAgIG1Qcm92aWRlclNlc3Npb25VaWQgPSBNZXRyaWNVdGlsaXRpZXMuZ2V0UGFja2FnZVVpZChtQ29udGV4dCwgbUNvbXBvbmVudE5hbWUpOwogICAgIH0KIApAQCAtMjA4LDYgKzIwOSwxMiBAQAogICAgICAgICByZXR1cm4gbVJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlOwogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGNhcHR1cmVDYW5kaWRhdGVGYWlsdXJlKCkgeworICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRIYXNFeGNlcHRpb24odHJ1ZSk7CisgICAgICAgIC8vIFRPRE8oYi8yNzExMzUwNDgpIC0gdGhpcyBpcyBhIHRydWUgZXhjZXB0aW9uLCBidXQgd2hhdCBhYm91dCB0aGUgZW1wdHkgY2FzZT8KKyAgICAgICAgLy8gQWRkIG1vcmUgbnVhbmNlIGluIG5leHQgaXRlcmF0aW9uLgorICAgIH0KKwogICAgIC8qKiBVcGRhdGVzIHRoZSBzdGF0dXMgLiAqLwogICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0FuZEludm9rZUNhbGxiYWNrKEBOb25OdWxsIFN0YXR1cyBzdGF0dXMpIHsKICAgICAgICAgc2V0U3RhdHVzKHN0YXR1cyk7CkBAIC0yMTYsMTggKzIyMywzNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDYW5kaWRhdGVNZXRyaWMoU3RhdHVzIHN0YXR1cykgewotICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRDYW5kaWRhdGVVaWQobVByb3ZpZGVyU2Vzc2lvblVpZCk7Ci0gICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBjYW5kaWRhdGUgcGhhc2UgaGVyZSB0byBoYXZlIG1vcmUgbmV3IGRhdGEKLSAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMKLSAgICAgICAgICAgICAgICAuc2V0UXVlcnlGaW5pc2hUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOwotICAgICAgICBpZiAoaXNUZXJtaW5hdGluZ1N0YXR1cyhzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRQcm92aWRlclF1ZXJ5U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuUVVFUllfRkFJTFVSRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWNDb2RlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQ29tcGxldGlvblN0YXR1cyhzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRQcm92aWRlclF1ZXJ5U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuUVVFUllfU1VDQ0VTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWNDb2RlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0Q2FuZGlkYXRlVWlkKG1Qcm92aWRlclNlc3Npb25VaWQpOworICAgICAgICAgICAgLy8gVE9ETyBpbW1lZGlhdGVseSB1cGRhdGUgdGhlIGNhbmRpZGF0ZSBwaGFzZSBoZXJlIHRvIGhhdmUgbW9yZSBuZXcgZGF0YQorICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMKKyAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXJ5RmluaXNoVGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgICAgIGlmIChpc1Rlcm1pbmF0aW5nU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRRdWVyeVJldHVybmVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRQcm92aWRlclF1ZXJ5U3RhdHVzKAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJTdGF0dXNGb3JNZXRyaWNzLlFVRVJZX0ZBSUxVUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldHJpY0NvZGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29tcGxldGlvblN0YXR1cyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0UXVlcnlSZXR1cm5lZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRQcm92aWRlclF1ZXJ5U3RhdHVzKAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJTdGF0dXNGb3JNZXRyaWNzLlFVRVJZX1NVQ0NFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldHJpY0NvZGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBtZXRyaWMgbG9nZ2luZzogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tbW9uIG1ldGhvZCB0byB0cmFuc2ZlciBtZXRyaWNzIGZyb20gdGhlIGluaXRpYWwgcGhhc2UgdG8gdGhlIGNhbmRpZGF0ZSBwaGFzZSBwZXIgcHJvdmlkZXIKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydENhbmRpZGF0ZU1ldHJpY3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbml0aWFsUGhhc2VNZXRyaWMgaW5pdE1ldHJpYyA9ICgoUmVxdWVzdFNlc3Npb24pIG1DYWxsYmFja3MpLm1Jbml0aWFsUGhhc2VNZXRyaWM7CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRTZXNzaW9uSWQoaW5pdE1ldHJpYy5nZXRTZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRTZXJ2aWNlQmVnYW5UaW1lTmFub3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgIGluaXRNZXRyaWMuZ2V0Q3JlZGVudGlhbFNlcnZpY2VTdGFydGVkVGltZU5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBtZXRyaWMgbG9nZ2luZzogIiArIGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9SZXF1ZXN0U2Vzc2lvbi5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUmVxdWVzdFNlc3Npb24uamF2YQppbmRleCBlZDQyYmIyLi4zYWMxMGM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9SZXF1ZXN0U2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1JlcXVlc3RTZXNzaW9uLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLk1ldHJpY1V0aWxpdGllcy5sb2dBcGlDYWxsZWQ7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVzZXJJZEludDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTc5LDE0ICs3OCwxNCBAQAogICAgIHByb3RlY3RlZCBmaW5hbCBDYW5jZWxsYXRpb25TaWduYWwgbUNhbmNlbGxhdGlvblNpZ25hbDsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBQcm92aWRlclNlc3Npb24+IG1Qcm92aWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJvdGVjdGVkIEluaXRpYWxQaGFzZU1ldHJpYyBtSW5pdGlhbFBoYXNlTWV0cmljID0gbmV3IEluaXRpYWxQaGFzZU1ldHJpYygpOwotICAgIHByb3RlY3RlZCBDaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMKKyAgICBwcm90ZWN0ZWQgZmluYWwgSW5pdGlhbFBoYXNlTWV0cmljIG1Jbml0aWFsUGhhc2VNZXRyaWMgPSBuZXcgSW5pdGlhbFBoYXNlTWV0cmljKCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIENob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYwogICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYyA9IG5ldyBDaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMoKTsKIAogICAgIC8vIFRPRE8oYi8yNzExMzUwNDgpIC0gR3JvdXAgbWV0cmljcyB1c2VkIGluIGEgc2NvcGUgdG9nZXRoZXIsIHN1Y2ggYXMgaGVyZSBpbiBSZXF1ZXN0U2Vzc2lvbgogICAgIC8vIFRPRE8oYi8yNzExMzUwNDgpIC0gUmVwbGFjZSB0aGlzIHdpdGggYSBuZXcgYXRvbSBwZXIgZWFjaCBicm93c2luZyBlbWl0IChWNCkKLSAgICBATnVsbGFibGUKLSAgICBwcm90ZWN0ZWQgTGlzdDxDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljPiBtQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYzsKKyAgICBATm9uTnVsbAorICAgIHByb3RlY3RlZCBMaXN0PENhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWM+IG1DYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgLy8gQXMgZW1pdHMgb2NjdXIgaW4gc2VxdWVudGlhbCBvcmRlciwgaW5jcmVtZW50IHRoaXMgY291bnRlciBhbmQgdXRpbGl6ZQogICAgIHByb3RlY3RlZCBpbnQgbVNlcXVlbmNlQ291bnRlciA9IDA7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtSHlicmlkU2VydmljZTsKQEAgLTEyNCw5ICsxMjMsMTcgQEAKICAgICAgICAgICAgICAgICBtVXNlcklkLCB0aGlzKTsKICAgICAgICAgbUh5YnJpZFNlcnZpY2UgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICBSLnN0cmluZy5jb25maWdfZGVmYXVsdENyZWRlbnRpYWxNYW5hZ2VySHlicmlkU2VydmljZSk7Ci0gICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q3JlZGVudGlhbFNlcnZpY2VTdGFydGVkVGltZU5hbm9zZWNvbmRzKHRpbWVzdGFtcFN0YXJ0ZWQpOwotICAgICAgICBtSW5pdGlhbFBoYXNlTWV0cmljLnNldFNlc3Npb25JZChtUmVxdWVzdElkLmhhc2hDb2RlKCkpOwotICAgICAgICBtSW5pdGlhbFBoYXNlTWV0cmljLnNldENhbGxlclVpZChtQ2FsbGluZ1VpZCk7CisgICAgICAgIGluaXRpYWxQaGFzZU1ldHJpY1NldHVwKHRpbWVzdGFtcFN0YXJ0ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsUGhhc2VNZXRyaWNTZXR1cChsb25nIHRpbWVzdGFtcFN0YXJ0ZWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q3JlZGVudGlhbFNlcnZpY2VTdGFydGVkVGltZU5hbm9zZWNvbmRzKHRpbWVzdGFtcFN0YXJ0ZWQpOworICAgICAgICAgICAgbUluaXRpYWxQaGFzZU1ldHJpYy5zZXRTZXNzaW9uSWQobVJlcXVlc3RJZC5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q2FsbGVyVWlkKG1DYWxsaW5nVWlkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgUHJvdmlkZXJTZXNzaW9uIGluaXRpYXRlUHJvdmlkZXJTZXNzaW9uKENyZWRlbnRpYWxQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvLApAQCAtMTcxLDEzICsxNzgsMTcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBsb2dCcm93c2luZ1BoYXNlUGVyU2VsZWN0KFVzZXJTZWxlY3Rpb25EaWFsb2dSZXN1bHQgc2VsZWN0aW9uLAogICAgICAgICAgICAgUHJvdmlkZXJTZXNzaW9uIHByb3ZpZGVyU2Vzc2lvbikgewotICAgICAgICBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljIGJyb3dzaW5nUGhhc2VNZXRyaWMgPSBuZXcgQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYygpOwotICAgICAgICBicm93c2luZ1BoYXNlTWV0cmljLnNldFNlc3Npb25JZCh0aGlzLm1Jbml0aWFsUGhhc2VNZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOwotICAgICAgICBicm93c2luZ1BoYXNlTWV0cmljLnNldEVudHJ5RW51bSgKLSAgICAgICAgICAgICAgICBFbnRyeUVudW0uZ2V0TWV0cmljQ29kZUZyb21TdHJpbmcoc2VsZWN0aW9uLmdldEVudHJ5S2V5KCkpKTsKLSAgICAgICAgYnJvd3NpbmdQaGFzZU1ldHJpYy5zZXRQcm92aWRlclVpZChwcm92aWRlclNlc3Npb24ubUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMKLSAgICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlVWlkKCkpOwotICAgICAgICB0aGlzLm1DYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljLmFkZChuZXcgQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWMgYnJvd3NpbmdQaGFzZU1ldHJpYyA9IG5ldyBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljKCk7CisgICAgICAgICAgICBicm93c2luZ1BoYXNlTWV0cmljLnNldFNlc3Npb25JZCh0aGlzLm1Jbml0aWFsUGhhc2VNZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgYnJvd3NpbmdQaGFzZU1ldHJpYy5zZXRFbnRyeUVudW0oCisgICAgICAgICAgICAgICAgICAgIEVudHJ5RW51bS5nZXRNZXRyaWNDb2RlRnJvbVN0cmluZyhzZWxlY3Rpb24uZ2V0RW50cnlLZXkoKSkpOworICAgICAgICAgICAgYnJvd3NpbmdQaGFzZU1ldHJpYy5zZXRQcm92aWRlclVpZChwcm92aWRlclNlc3Npb24ubUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMKKyAgICAgICAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZVVpZCgpKTsKKyAgICAgICAgICAgIHRoaXMubUNhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWMuYWRkKG5ldyBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaFNlc3Npb24oYm9vbGVhbiBwcm9wYWdhdGVDYW5jZWxsYXRpb24pIHsKQEAgLTIzNCw2ICsyNDUsNyBAQAogICAgICAgICBMb2cuaShUQUcsICJJbiBnZXRQcm92aWRlckRhdGFBbmRJbml0aWF0ZVVpIHByb3ZpZGVycyBzaXplOiAiICsgbVByb3ZpZGVycy5zaXplKCkpOwogCiAgICAgICAgIGlmIChpc1Nlc3Npb25DYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgTWV0cmljVXRpbGl0aWVzLmxvZ0FwaUNhbGxlZChtUHJvdmlkZXJzLCArK21TZXF1ZW5jZUNvdW50ZXIpOwogICAgICAgICAgICAgZmluaXNoU2Vzc2lvbigvKnByb3BhZ2F0ZUNhbmNlbGxhdGlvbj0qL3RydWUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yNDksMTMgKzI2MSw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFwcm92aWRlckRhdGFMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAicHJvdmlkZXIgbGlzdCBub3QgZW1wdHkgYWJvdXQgdG8gaW5pdGlhdGUgdWkiKTsKLSAgICAgICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgQWRkIHBhdGhzIHRvIGVuZCBpdCAoc2F5IGl0IGZhaWxzKQotICAgICAgICAgICAgaWYgKGlzU2Vzc2lvbkNhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiSW4gZ2V0UHJvdmlkZXJEYXRhQW5kSW5pdGlhdGVVaSBidXQgc2Vzc2lvbiBoYXMgYmVlbiBjYW5jZWxsZWQiKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGltbWVkYWl0ZWx5IEFkZCBwYXRocwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYXVuY2hVaVdpdGhQcm92aWRlckRhdGEocHJvdmlkZXJEYXRhTGlzdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRyaWNVdGlsaXRpZXMubG9nQXBpQ2FsbGVkKG1Qcm92aWRlcnMsICsrbVNlcXVlbmNlQ291bnRlcik7CisgICAgICAgICAgICBsYXVuY2hVaVdpdGhQcm92aWRlckRhdGEocHJvdmlkZXJEYXRhTGlzdCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2NSwyMiArMjcyLDI3IEBACiAgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWUgdGhlIGNvbXBvbmVudE5hbWUgdG8gYXNzb2NpYXRlIHdpdGggYSBwcm92aWRlcgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldENob3Nlbk1ldHJpYyhDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgQ2FuZGlkYXRlUGhhc2VNZXRyaWMgbWV0cmljID0gdGhpcy5tUHJvdmlkZXJzLmdldChjb21wb25lbnROYW1lLmZsYXR0ZW5Ub1N0cmluZygpKQotICAgICAgICAgICAgICAgIC5tQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1ldHJpYyA9IHRoaXMubVByb3ZpZGVycy5nZXQoY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLm1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljOwogCi0gICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0U2Vzc2lvbklkKG1ldHJpYy5nZXRTZXNzaW9uSWQoKSk7Ci0gICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0Q2hvc2VuVWlkKG1ldHJpYy5nZXRDYW5kaWRhdGVVaWQoKSk7CisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFNlc3Npb25JZChtZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRDaG9zZW5VaWQobWV0cmljLmdldENhbmRpZGF0ZVVpZCgpKTsKIAotICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFF1ZXJ5UGhhc2VMYXRlbmN5TWljcm9zZWNvbmRzKAotICAgICAgICAgICAgICAgIG1ldHJpYy5nZXRRdWVyeUxhdGVuY3lNaWNyb3NlY29uZHMoKSk7CisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFF1ZXJ5UGhhc2VMYXRlbmN5TWljcm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0UXVlcnlMYXRlbmN5TWljcm9zZWNvbmRzKCkpOwogCi0gICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0U2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzKAotICAgICAgICAgICAgICAgIG1ldHJpYy5nZXRTZXJ2aWNlQmVnYW5UaW1lTmFub3NlY29uZHMoKSk7Ci0gICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0UXVlcnlTdGFydFRpbWVOYW5vc2Vjb25kcygKLSAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcygpKTsKKyAgICAgICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0U2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0U2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRRdWVyeVN0YXJ0VGltZU5hbm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcygpKTsKIAotICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IHVwZGF0ZSB3aXRoIHRoZSBlbnRyeSBjb3VudCBudW1iZXJzIGZyb20gdGhlIGNhbmRpZGF0ZSBtZXRyaWNzCisgICAgICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IHVwZGF0ZSB3aXRoIHRoZSBlbnRyeSBjb3VudCBudW1iZXJzIGZyb20gdGhlIGNhbmRpZGF0ZSBtZXRyaWNzCisgICAgICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IGFkZCB0aGUgZXhjZXB0aW9uIGJpdCBmb3IgY2FuZGlkYXRlcyBhbmQgcHJvdmlkZXJzCiAKLSAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRGaW5hbEZpbmlzaFRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldEZpbmFsRmluaXNoVGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0NhbmRpZGF0ZVBoYXNlTWV0cmljLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0NhbmRpZGF0ZVBoYXNlTWV0cmljLmphdmEKaW5kZXggYzM5MmQ3OC4uZjAwYzdmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DYW5kaWRhdGVQaGFzZU1ldHJpYy5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2FuZGlkYXRlUGhhc2VNZXRyaWMuamF2YQpAQCAtMjAsNiArMjAsOSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLk1ldHJpY1V0aWxpdGllczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIC8qKgogICogVGhlIGNlbnRyYWwgY2FuZGlkYXRlIHByb3ZpZGVyIG1ldHJpYyBvYmplY3QgdGhhdCBtaW1pY3Mgb3VyIGRlZmluZWQgbWV0cmljIHNldHVwLgogICogU29tZSB0eXBlcyBhcmUgcmVkdW5kYW50IGFjcm9zcyB0aGVzZSBtZXRyaWMgY29sbGVjdG9ycywgYnV0IHRoYXQgaGFzIGRlYnVnIHVzZS1jYXNlcyBhcwpAQCAtNjYsNiArNjksOCBAQAogICAgIHByaXZhdGUgaW50IG1SZW1vdGVFbnRyeUNvdW50ID0gLTE7CiAgICAgLy8gVGhlIGNvdW50IG9mIGF1dGhlbnRpY2F0aW9uIGVudHJpZXMgZnJvbSB0aGlzIHByb3ZpZGVyLCBkZWZhdWx0cyB0byAtMQogICAgIHByaXZhdGUgaW50IG1BdXRoZW50aWNhdGlvbkVudHJ5Q291bnQgPSAtMTsKKyAgICAvLyBHYXRoZXJlZCB0byBwYXNzIG9uIHRvIGNob3NlbiBwcm92aWRlciB3aGVuIHJlcXVpcmVkCisgICAgcHJpdmF0ZSBMaXN0PEVudHJ5RW51bT4gbUF2YWlsYWJsZUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHB1YmxpYyBDYW5kaWRhdGVQaGFzZU1ldHJpYygpIHsKICAgICB9CkBAIC0yMzYsNCArMjQxLDI4IEBACiAgICAgcHVibGljIGludCBnZXRBdXRoZW50aWNhdGlvbkVudHJ5Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQXV0aGVudGljYXRpb25FbnRyeUNvdW50OwogICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tIFRoZSBFbnRyaWVzIEdhdGhlcmVkIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhZGRpbmcgYW4gZW50cnkgcmVjb3JkIHRvIHRoaXMgbWV0cmljIGNvbGxlY3Rvciwgd2hpY2ggY2FuIHRoZW4gYmUgcHJvcGFnYXRlZCB0bworICAgICAqIHRoZSBmaW5hbCBwaGFzZSB0byByZXRhaW4gaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYXZhaWxhYmxlIHRvIHRoZSBjYW5kaWRhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSB0aGUgZW50cnkgZW51bSBjb2xsZWN0ZWQgYnkgdGhlIGNhbmRpZGF0ZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXRyaWMKKyAgICAgKiAgICAgICAgICBjb2xsZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShFbnRyeUVudW0gZSkgeworICAgICAgICB0aGlzLm1BdmFpbGFibGVFbnRyaWVzLmFkZChlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2FmZWx5IGNvcGllZCBsaXN0IG9mIHRoZSBlbnRyaWVzIGNhcHR1cmVkIGJ5IHRoaXMgbWV0cmljIGNvbGxlY3RvciBhc3NvY2lhdGVkCisgICAgICogd2l0aCBhIHBhcnRpY3VsYXIgY2FuZGlkYXRlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnVsbCBjb2xsZWN0aW9uIG9mIGVudHJpZXMgZW5jb3VudGVyZWQgYnkgdGhlIGNhbmRpZGF0ZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIG1ldHJpYworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEVudHJ5RW51bT4gZ2V0QXZhaWxhYmxlRW50cmllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Pih0aGlzLm1BdmFpbGFibGVFbnRyaWVzKTsgLy8gbm8gYWxpYXMgY29weQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2RldmljZXBvbGljeS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2Vwb2xpY3kvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2RldmljZXBvbGljeS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2Vwb2xpY3kvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA2Y2Q5ZjFjLi5hMTc4OWIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9kZXZpY2Vwb2xpY3kvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlcG9saWN5L0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvZGV2aWNlcG9saWN5L2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXBvbGljeS9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0zMjI0LDcgKzMyMjQsNyBAQAogICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZKTsKICAgICAgICAgQnVuZGxlIG9wdGlvbnMgPSBuZXcgQnJvYWRjYXN0T3B0aW9ucygpCiAgICAgICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpCi0gICAgICAgICAgICAgICAgLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKQogICAgICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogICAgICAgICBtSW5qZWN0b3IuYmluZGVyV2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdEFzVXNlcihpbnRlbnQsIG5ldyBVc2VySGFuZGxlKHVzZXJIYW5kbGUpLCBudWxsLCBvcHRpb25zKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IGJlMjg3M2UuLmI5MzM1MDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0xNzkzLDYgKzE3OTMsMTAgQEAKICAgICAgICAgfQogICAgICAgICB0LnRyYWNlRW5kKCk7CiAKKyAgICAgICAgdC50cmFjZUJlZ2luKCJTdGFydEFwcEhpYmVybmF0aW9uU2VydmljZSIpOworICAgICAgICBtU3lzdGVtU2VydmljZU1hbmFnZXIuc3RhcnRTZXJ2aWNlKEFQUF9ISUJFUk5BVElPTl9TRVJWSUNFX0NMQVNTKTsKKyAgICAgICAgdC50cmFjZUVuZCgpOworCiAgICAgICAgIHQudHJhY2VCZWdpbigiQXJ0TWFuYWdlckxvY2FsIik7CiAgICAgICAgIERleE9wdEhlbHBlci5pbml0aWFsaXplQXJ0TWFuYWdlckxvY2FsKGNvbnRleHQsIG1QYWNrYWdlTWFuYWdlclNlcnZpY2UpOwogICAgICAgICB0LnRyYWNlRW5kKCk7CkBAIC0yMzE2LDEwICsyMzIwLDYgQEAKICAgICAgICAgICAgIG1TeXN0ZW1TZXJ2aWNlTWFuYWdlci5zdGFydFNlcnZpY2UoVk9JQ0VfUkVDT0dOSVRJT05fTUFOQUdFUl9TRVJWSUNFX0NMQVNTKTsKICAgICAgICAgICAgIHQudHJhY2VFbmQoKTsKIAotICAgICAgICAgICAgdC50cmFjZUJlZ2luKCJTdGFydEFwcEhpYmVybmF0aW9uU2VydmljZSIpOwotICAgICAgICAgICAgbVN5c3RlbVNlcnZpY2VNYW5hZ2VyLnN0YXJ0U2VydmljZShBUFBfSElCRVJOQVRJT05fU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgICAgICB0LnRyYWNlRW5kKCk7Ci0KICAgICAgICAgICAgIGlmIChHZXN0dXJlTGF1bmNoZXJTZXJ2aWNlLmlzR2VzdHVyZUxhdW5jaGVyRW5hYmxlZChjb250ZXh0LmdldFJlc291cmNlcygpKSkgewogICAgICAgICAgICAgICAgIHQudHJhY2VCZWdpbigiU3RhcnRHZXN0dXJlTGF1bmNoZXIiKTsKICAgICAgICAgICAgICAgICBtU3lzdGVtU2VydmljZU1hbmFnZXIuc3RhcnRTZXJ2aWNlKEdlc3R1cmVMYXVuY2hlclNlcnZpY2UuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvSW5wdXRNZXRob2RTeXN0ZW1TZXJ2ZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0RlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL0lucHV0TWV0aG9kU3lzdGVtU2VydmVyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXJUZXN0LmphdmEKaW5kZXggN2U0NDA0OS4uN2Q0Zjg3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvSW5wdXRNZXRob2RTeXN0ZW1TZXJ2ZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0RlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9JbnB1dE1ldGhvZFN5c3RlbVNlcnZlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvRGVmYXVsdEltZVZpc2liaWxpdHlBcHBsaWVyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5pbnB1dG1ldGhvZDsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2UuSU1FX0FDVElWRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX1ZJU0lCTEU7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuaW5wdXRtZXRob2QuU29mdElucHV0U2hvd0hpZGVSZWFzb24uSElERV9TT0ZUX0lOUFVUOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5pbnB1dG1ldGhvZC5Tb2Z0SW5wdXRTaG93SGlkZVJlYXNvbi5TSE9XX1NPRlRfSU5QVVQ7CkBAIC0zNSwxMSArMzYsMTYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIAogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZXh0Lmp1bml0LnJ1bm5lcnMuQW5kcm9pZEpVbml0NDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmlucHV0bWV0aG9kLklucHV0QmluZFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5pbnB1dG1ldGhvZC5TdGFydElucHV0RmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuaW5wdXRtZXRob2QuU3RhcnRJbnB1dFJlYXNvbjsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNjAsOCArNjYsOCBAQAogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtVmlzaWJpbGl0eUFwcGxpZXIgPQogICAgICAgICAgICAgICAgIChEZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXIpIG1JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmdldFZpc2liaWxpdHlBcHBsaWVyKCk7Ci0gICAgICAgIG1JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLm1DdXJGb2N1c2VkV2luZG93Q2xpZW50ID0gbW9jaygKLSAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLkNsaWVudFN0YXRlLmNsYXNzKTsKKyAgICAgICAgbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2Uuc2V0QXR0YWNoZWRDbGllbnRGb3JUZXN0aW5nKAorICAgICAgICAgICAgICAgIG1vY2soSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5DbGllbnRTdGF0ZS5jbGFzcykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMTksNCArMTI1LDM4IEBACiAgICAgICAgIG1WaXNpYmlsaXR5QXBwbGllci5hcHBseUltZVZpc2liaWxpdHkobVdpbmRvd1Rva2VuLCBudWxsLCBTVEFURV9TSE9XX0lNRV9JTVBMSUNJVCk7CiAgICAgICAgIHZlcmlmeVNob3dTb2Z0SW5wdXQodHJ1ZSwgdHJ1ZSwgSW5wdXRNZXRob2RNYW5hZ2VyLlNIT1dfSU1QTElDSVQpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGx5SW1lVmlzaWJpbGl0eV9oaWRlSW1lRnJvbVRhcmdldE9uU2Vjb25kYXJ5RGlzcGxheSgpIHsKKyAgICAgICAgLy8gSW5pdCBhIElNRSB0YXJnZXQgY2xpZW50IG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSB0byBzaG93IElNRS4KKyAgICAgICAgbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1Nb2NrSW5wdXRNZXRob2RDbGllbnQsIG1Nb2NrUmVtb3RlSW5wdXRDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIDEwIC8qIHNlbGZSZXBvcnRlZERpc3BsYXlJZCAqLyk7CisgICAgICAgIG1JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLnNldEF0dGFjaGVkQ2xpZW50Rm9yVGVzdGluZyhudWxsKTsKKyAgICAgICAgc3RhcnRJbnB1dE9yV2luZG93R2FpbmVkRm9jdXMobVdpbmRvd1Rva2VuLCBTT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19WSVNJQkxFKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKEltZkxvY2suY2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWRUb1Nob3dJbWUgPSBtSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5nZXREaXNwbGF5SWRUb1Nob3dJbWVMb2NrZWQoKTsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBoaWRlSW1lIHdpbGwgYXBwbHkgdGhlIGV4cGVjdGVkIGRpc3BsYXlJZCB3aGVuIHRoZSBkZWZhdWx0IElNRQorICAgICAgICAgICAgLy8gdmlzaWJpbGl0eSBhcHBsaWVyIGFwcCBTVEFURV9ISURFX0lNRS4KKyAgICAgICAgICAgIG1WaXNpYmlsaXR5QXBwbGllci5hcHBseUltZVZpc2liaWxpdHkobVdpbmRvd1Rva2VuLCBudWxsLCBTVEFURV9ISURFX0lNRSk7CisgICAgICAgICAgICB2ZXJpZnkobUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UubVdpbmRvd01hbmFnZXJJbnRlcm5hbCkuaGlkZUltZSgKKyAgICAgICAgICAgICAgICAgICAgZXEobVdpbmRvd1Rva2VuKSwgZXEoZGlzcGxheUlkVG9TaG93SW1lKSwgZXEobnVsbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnB1dEJpbmRSZXN1bHQgc3RhcnRJbnB1dE9yV2luZG93R2FpbmVkRm9jdXMoSUJpbmRlciB3aW5kb3dUb2tlbiwgaW50IHNvZnRJbnB1dE1vZGUpIHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLnN0YXJ0SW5wdXRPcldpbmRvd0dhaW5lZEZvY3VzKAorICAgICAgICAgICAgICAgIFN0YXJ0SW5wdXRSZWFzb24uV0lORE9XX0ZPQ1VTX0dBSU4gLyogc3RhcnRJbnB1dFJlYXNvbiAqLywKKyAgICAgICAgICAgICAgICBtTW9ja0lucHV0TWV0aG9kQ2xpZW50IC8qIGNsaWVudCAqLywKKyAgICAgICAgICAgICAgICB3aW5kb3dUb2tlbiAvKiB3aW5kb3dUb2tlbiAqLywKKyAgICAgICAgICAgICAgICBTdGFydElucHV0RmxhZ3MuVklFV19IQVNfRk9DVVMgfCBTdGFydElucHV0RmxhZ3MuSVNfVEVYVF9FRElUT1IsCisgICAgICAgICAgICAgICAgc29mdElucHV0TW9kZSAvKiBzb2Z0SW5wdXRNb2RlICovLAorICAgICAgICAgICAgICAgIDAgLyogd2luZG93RmxhZ3MgKi8sCisgICAgICAgICAgICAgICAgbUVkaXRvckluZm8gLyogZWRpdG9ySW5mbyAqLywKKyAgICAgICAgICAgICAgICBtTW9ja1JlbW90ZUlucHV0Q29ubmVjdGlvbiAvKiBpbnB1dENvbm5lY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgbU1vY2tSZW1vdGVBY2Nlc3NpYmlsaXR5SW5wdXRDb25uZWN0aW9uIC8qIHJlbW90ZUFjY2Vzc2liaWxpdHlJbnB1dENvbm5lY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgbVRhcmdldFNka1ZlcnNpb24gLyogdW52ZXJpZmllZFRhcmdldFNka1ZlcnNpb24gKi8sCisgICAgICAgICAgICAgICAgbUNhbGxpbmdVc2VySWQgLyogdXNlcklkICovLAorICAgICAgICAgICAgICAgIG1Nb2NrSW1lT25CYWNrSW52b2tlZERpc3BhdGNoZXIgLyogaW1lRGlzcGF0Y2hlciAqLyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZC5icAppbmRleCAyODk0Mzk1Li4yNGUzODBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZC5icApAQCAtMzIsOSArMzIsOSBAQAogfQogCiBhbmRyb2lkX3Rlc3RfaGVscGVyX2FwcCB7Ci0gICAgbmFtZTogIkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjEwMDAiLAorICAgIG5hbWU6ICJGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IxMDAwMCIsCiAgICAgZGVmYXVsdHM6IFsiRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfYXBrc19kZWZhdWx0cyJdLAotICAgIG1hbmlmZXN0OiAiQW5kcm9pZE1hbmlmZXN0LXIxMDAwLnhtbCIsCisgICAgbWFuaWZlc3Q6ICJBbmRyb2lkTWFuaWZlc3QtcjEwMDAwLnhtbCIsCiB9CiAKIGFuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKQEAgLTQ0LDkgKzQ0LDkgQEAKIH0KIAogYW5kcm9pZF90ZXN0X2hlbHBlcl9hcHAgewotICAgIG5hbWU6ICJGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwX3MxMDAwIiwKKyAgICBuYW1lOiAiRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yMF9zMTAwMDAiLAogICAgIGRlZmF1bHRzOiBbIkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2Fwa3NfZGVmYXVsdHMiXSwKLSAgICBtYW5pZmVzdDogIkFuZHJvaWRNYW5pZmVzdC1yMC1zMTAwMC54bWwiLAorICAgIG1hbmlmZXN0OiAiQW5kcm9pZE1hbmlmZXN0LXIwLXMxMDAwMC54bWwiLAogfQogCiBhbmRyb2lkX3Rlc3RfaGVscGVyX2FwcCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIwLXMxMDAwLnhtbCBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAwLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIwLXMxMDAwLnhtbApyZW5hbWUgdG8gc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMC1zMTAwMDAueG1sCmluZGV4IDI1NzQzYjguLjM4M2U2MGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAwLnhtbApAQCAtMTksNyArMTksNyBAQAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjQiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiPgogICAgICAgICA8IS0tIFRoaXMgZmFpbHMgYmVjYXVzZSAzMSBpcyBub3QgdmVyc2lvbiA1IC0tPgogICAgICAgICA8ZXh0ZW5zaW9uLXNkayBhbmRyb2lkOnNka1ZlcnNpb249IjMwIiBhbmRyb2lkOm1pbkV4dGVuc2lvblZlcnNpb249IjAiIC8+Ci0gICAgICAgIDxleHRlbnNpb24tc2RrIGFuZHJvaWQ6c2RrVmVyc2lvbj0iMzEiIGFuZHJvaWQ6bWluRXh0ZW5zaW9uVmVyc2lvbj0iMTAwMCIgLz4KKyAgICAgICAgPGV4dGVuc2lvbi1zZGsgYW5kcm9pZDpzZGtWZXJzaW9uPSIzMSIgYW5kcm9pZDptaW5FeHRlbnNpb25WZXJzaW9uPSIxMDAwMCIgLz4KICAgICA8L3VzZXMtc2RrPgogCiAgICAgPGFwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwMC54bWwKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMC54bWwKcmVuYW1lIHRvIHNlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAwLnhtbAppbmRleCA5YmY5MjU0Li5mZTdhMjEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwLnhtbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwMC54bWwKQEAgLTE4LDcgKzE4LDcgQEAKIAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjQiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiPgogICAgICAgICA8IS0tIFRoaXMgd2lsbCBmYWlsIHRvIGluc3RhbGwsIGJlY2F1c2UgbWluRXh0ZW5zaW9uVmVyc2lvbiBpcyBub3QgbWV0IC0tPgotICAgICAgICA8ZXh0ZW5zaW9uLXNkayBhbmRyb2lkOnNka1ZlcnNpb249IjMwIiBhbmRyb2lkOm1pbkV4dGVuc2lvblZlcnNpb249IjEwMDAiIC8+CisgICAgICAgIDxleHRlbnNpb24tc2RrIGFuZHJvaWQ6c2RrVmVyc2lvbj0iMzAiIGFuZHJvaWQ6bWluRXh0ZW5zaW9uVmVyc2lvbj0iMTAwMDAiIC8+CiAgICAgPC91c2VzLXNkaz4KIAogICAgIDxhcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL3NlcnZlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggZTcxMWNhYi4uMTE0NjI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL0FuZHJvaWQuYnAKQEAgLTEyNywxMCArMTI3LDEwIEBACiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19xMCIsCiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19xMF9yMCIsCiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yMCIsCi0gICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yMTAwMCIsCisgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yMTAwMDAiLAogICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcl9ub25lIiwKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwX3MwIiwKLSAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwX3MxMDAwIiwKKyAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwX3MxMDAwMCIsCiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfa2V5c2V0X3Blcm1kZWZfc2FfdW5vbmUiLAogICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2tleXNldF9wZXJtdXNlX3NhX3VhX3ViIiwKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19rZXlzZXRfcGVybXVzZV9zYl91YV91YiIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wYXJzaW5nL1BhY2thZ2VQYXJzZXJMZWdhY3lDb3JlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGFyc2luZy9QYWNrYWdlUGFyc2VyTGVnYWN5Q29yZVRlc3QuamF2YQppbmRleCBlYmYzMDlmLi45MDZjYzgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wYXJzaW5nL1BhY2thZ2VQYXJzZXJMZWdhY3lDb3JlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL3NlcnZlci9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BhcnNpbmcvUGFja2FnZVBhcnNlckxlZ2FjeUNvcmVUZXN0LmphdmEKQEAgLTU3NSwxMCArNTc1LDEwIEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBtaW5FeHRWZXJzLmdldCgzMSwgLTEpKTsKIAogICAgICAgICBNYXA8UGFpcjxTdHJpbmcsIEludGVnZXI+LCBJbnRlZ2VyPiBhcHBUb0Vycm9yID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBhcHBUb0Vycm9yLnB1dChQYWlyLmNyZWF0ZSgiaW5zdGFsbF91c2VzX3Nkay5hcGtfcjEwMDAiLCBSLnJhdy5pbnN0YWxsX3VzZXNfc2RrX3IxMDAwKSwKKyAgICAgICAgYXBwVG9FcnJvci5wdXQoUGFpci5jcmVhdGUoImluc3RhbGxfdXNlc19zZGsuYXBrX3IxMDAwMCIsIFIucmF3Lmluc3RhbGxfdXNlc19zZGtfcjEwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfT0xERVJfU0RLKTsKICAgICAgICAgYXBwVG9FcnJvci5wdXQoCi0gICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImluc3RhbGxfdXNlc19zZGsuYXBrX3IwX3MxMDAwIiwgUi5yYXcuaW5zdGFsbF91c2VzX3Nka19yMF9zMTAwMCksCisgICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImluc3RhbGxfdXNlc19zZGsuYXBrX3IwX3MxMDAwMCIsIFIucmF3Lmluc3RhbGxfdXNlc19zZGtfcjBfczEwMDAwKSwKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZBSUxFRF9PTERFUl9TREspOwogCiAgICAgICAgIGFwcFRvRXJyb3IucHV0KFBhaXIuY3JlYXRlKCJpbnN0YWxsX3VzZXNfc2RrLmFwa19xMCIsIFIucmF3Lmluc3RhbGxfdXNlc19zZGtfcTApLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VJZGxlQ29udHJvbGxlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlSWRsZUNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggNTM3N2VlNy4uM2E0N2I0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VJZGxlQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyVGVzdC5qYXZhCkBAIC01MCw3ICs1MCw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlCb29sZWFuOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUludDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlMb25nOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueVN0cmluZzsKQEAgLTYyNCw4ICs2MjMsNyBAQAogCiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX0lOQUNUSVZFKTsKLSAgICAgICAgdmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICB2ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02NDMsOCArNjQxLDcgQEAKIAogICAgICAgICBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuYmVjb21lSW5hY3RpdmVJZkFwcHJvcHJpYXRlTG9ja2VkKCk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JTkFDVElWRSk7Ci0gICAgICAgIHZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5JTkFDVElWRV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgdmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpKTsKICAgICAgICAgLy8gVGhlIGRldmljZSBjb25maWd1cmF0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIG1vdGlvbiBzZW5zb3IgdG8gcHJvY2VlZCB3aXRoIGlkbGluZy4KICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgdGhlIGNhc2Ugb24gVFZzIG9yIG90aGVyIHN1Y2ggZGV2aWNlcy4gV2Ugc2hvdWxkIHNldCBhbiBhbGFybSB0byBtb3ZlCiAgICAgICAgIC8vIGZvcndhcmQgaWYgdGhlIG1vdGlvbiBzZW5zb3IgaXMgbWlzc2luZyBpbiB0aGlzIGNhc2UuCkBAIC02NjksOCArNjY2LDcgQEAKIAogICAgICAgICBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuYmVjb21lSW5hY3RpdmVJZkFwcHJvcHJpYXRlTG9ja2VkKCk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JTkFDVElWRSk7Ci0gICAgICAgIHZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5JTkFDVElWRV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgdmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpKTsKICAgICAgICAgLy8gVGhlIGRldmljZSBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGEgbW90aW9uIHNlbnNvciB0byBwcm9jZWVkIHdpdGggaWRsaW5nLAogICAgICAgICAvLyBzbyB3ZSBzaG91bGQgbmV2ZXIgc2V0IGFuIGFsYXJtIHRvIG1vdmUgZm9yd2FyZCBpZiB0aGUgbW90aW9uIHNlbnNvciBpcwogICAgICAgICAvLyBtaXNzaW5nIGluIHRoaXMgY2FzZS4KQEAgLTY5OSw3ICs2OTUsNyBAQAogICAgICAgICBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuYmVjb21lSW5hY3RpdmVJZkFwcHJvcHJpYXRlTG9ja2VkKCk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JTkFDVElWRSk7CiAgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcSh0aW1lVW50aWxBbGFybSArIG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEodGltZVVudGlsQWxhcm0gKyBtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpKTsKIAogICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9BQ1RJVkUpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwpAQCAtNzA5LDcgKzcwNSw3IEBACiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoCi0gICAgICAgICAgICAgICAgZXEodGltZVVudGlsQWxhcm0gKyBtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgZXEodGltZVVudGlsQWxhcm0gKyBtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03MzYsNTkgKzczMiw1NiBAQAogICAgICAgICBzZXRTY3JlZW5PbihmYWxzZSk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9RVUlDS19ET1pFX0RFTEFZKTsKICAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCkpOwogCiAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0lOQUNUSVZFKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAKICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfSURMRV9QRU5ESU5HKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAKICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfU0VOU0lORyk7CiAgICAgICAgIHNldFF1aWNrRG96ZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9RVUlDS19ET1pFX0RFTEFZKTsKICAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCkpOwogCiAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0xPQ0FUSU5HKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAKICAgICAgICAgLy8gSURMRSBzaG91bGQgc3RheSBhcyBJRExFLgogICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9JRExFKTsKICAgICAgICAgLy8gQ2xlYXIgb3V0IGFueSBhbGFybSBzZXR0aW5nIGZyb20gdGhlIG9yZGVyIGJlZm9yZSBjaGVja2luZyBmb3IgdGhpcyBzZWN0aW9uLgotICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIGF0TGVhc3RPbmNlKCkpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpLCBhbnlCb29sZWFuKCkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIGF0TGVhc3RPbmNlKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX0lETEUpOwotICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIG5ldmVyKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpLCBhbnlCb29sZWFuKCkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIG5ldmVyKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpKTsKIAogICAgICAgICAvLyBJRExFX01BSU5URU5BTkNFIHNob3VsZCBzdGF5IGFzIElETEVfTUFJTlRFTkFOQ0UuCiAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0lETEVfTUFJTlRFTkFOQ0UpOwogICAgICAgICAvLyBDbGVhciBvdXQgYW55IGFsYXJtIHNldHRpbmcgZnJvbSB0aGUgb3JkZXIgYmVmb3JlIGNoZWNraW5nIGZvciB0aGlzIHNlY3Rpb24uCi0gICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgYXRMZWFzdE9uY2UoKSkKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCksIGFueUJvb2xlYW4oKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgYXRMZWFzdE9uY2UoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCkpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfSURMRV9NQUlOVEVOQU5DRSk7Ci0gICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCksIGFueUJvb2xlYW4oKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCkpOwogCiAgICAgICAgIC8vIFN0YXRlIGlzIGFscmVhZHkgUVVJQ0tfRE9aRV9ERUxBWS4gTm8gd29yayBzaG91bGQgYmUgZG9uZS4KICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7CiAgICAgICAgIC8vIENsZWFyIG91dCBhbnkgYWxhcm0gc2V0dGluZyBmcm9tIHRoZSBvcmRlciBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoaXMgc2VjdGlvbi4KLSAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBhdExlYXN0T25jZSgpKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSwgYW55Qm9vbGVhbigpKTsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBhdExlYXN0T25jZSgpKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSk7CiAgICAgICAgIHNldFF1aWNrRG96ZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwotICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIG5ldmVyKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpLCBhbnlCb29sZWFuKCkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIG5ldmVyKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjY4NSwxNyArMjY3OCwxMiBAQAogICAgICAgICBpZiAocmV0ID09IG1EZXZpY2VJZGxlQ29udHJvbGxlci5TRVRfSURMRV9GQUNUT1JfUkVTVUxUX09LKSB7CiAgICAgICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9JRExFKTsKICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICBsb25nIGFsYXJtID0gbURldmljZUlkbGVDb250cm9sbGVyLmdldE5leHRBbGFybVRpbWUoKTsKICAgICAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5zZXRJZGxlU3RhcnRUaW1lRm9yVGVzdCgKICAgICAgICAgICAgICAgICAgICAgbm93IC0gKGxvbmcpIChtQ29uc3RhbnRzLklETEVfVElNRU9VVCAqIDAuNikpOwotICAgICAgICAgICAgbG9uZyBuZXdBbGFybSA9IG1EZXZpY2VJZGxlQ29udHJvbGxlci5nZXROZXh0QWxhcm1UaW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJtYWludGVuYW5jZSBub3QgcmVzY2hlZHVsZSBJRExFX1RJTUVPVVQgKiAwLjYiLAotICAgICAgICAgICAgICAgICAgICBuZXdBbGFybSA9PSBhbGFybSk7CisgICAgICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfSURMRSk7CiAgICAgICAgICAgICBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuc2V0SWRsZVN0YXJ0VGltZUZvclRlc3QoCiAgICAgICAgICAgICAgICAgICAgIG5vdyAtIChsb25nKSAobUNvbnN0YW50cy5JRExFX1RJTUVPVVQgKiAxLjIpKTsKLSAgICAgICAgICAgIG5ld0FsYXJtID0gbURldmljZUlkbGVDb250cm9sbGVyLmdldE5leHRBbGFybVRpbWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIm1haW50ZW5hbmNlIG5vdCByZXNjaGVkdWxlIElETEVfVElNRU9VVCAqIDEuMiIsCi0gICAgICAgICAgICAgICAgICAgIChuZXdBbGFybSAtIG5vdykgPCBtaW51dGVJbk1pbGxpcyk7CisgICAgICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfSURMRV9NQUlOVEVOQU5DRSk7CiAgICAgICAgICAgICBtRGV2aWNlSWRsZUNvbnRyb2xsZXIucmVzZXRQcmVJZGxlVGltZW91dE1vZGUoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHlUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL1Jlc2N1ZVBhcnR5VGVzdC5qYXZhCmluZGV4IDgzNDQxYmYuLjFhNzUxNzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHlUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9SZXNjdWVQYXJ0eVRlc3QuamF2YQpAQCAtNjgsNiArNjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiAvKioKICAqIFRlc3QgUmVzY3VlUGFydHkuCkBAIC05NCw2ICs5NSw5IEBACiAgICAgICAgICAgICAicGVyc2lzdC5kZXZpY2VfY29uZmlnLmNvbmZpZ3VyYXRpb24uZGlzYWJsZV9yZXNjdWVfcGFydHkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RJU0FCTEVfRkFDVE9SWV9SRVNFVF9GTEFHID0KICAgICAgICAgICAgICJwZXJzaXN0LmRldmljZV9jb25maWcuY29uZmlndXJhdGlvbi5kaXNhYmxlX3Jlc2N1ZV9wYXJ0eV9mYWN0b3J5X3Jlc2V0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MQVNUX0ZBQ1RPUllfUkVTRVRfVElNRV9NUyA9ICJwZXJzaXN0LnN5cy5sYXN0X2ZhY3RvcnlfcmVzZXQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9UVExJTkdfRFVSQVRJT05fTUlOID0gMTA7CiAKICAgICBwcml2YXRlIE1vY2tpdG9TZXNzaW9uIG1TZXNzaW9uOwogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbVN5c3RlbVNldHRpbmdzTWFwOwpAQCAtNDU5LDYgKzQ2Myw1MyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocm90dGxpbmdPbkJvb3RGYWlsdXJlcygpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUmVzY3VlUGFydHkuUFJPUF9BVFRFTVBUSU5HX1JFQk9PVCwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSkpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIGJlZm9yZVRpbWVvdXQgPSBub3cgLSBUaW1lVW5pdC5NSU5VVEVTLnRvTWlsbGlzKFRIUk9UVExJTkdfRFVSQVRJT05fTUlOIC0gMSk7CisgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcoYmVmb3JlVGltZW91dCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBMRVZFTF9GQUNUT1JZX1JFU0VUOyBpKyspIHsKKyAgICAgICAgICAgIG5vdGVCb290KGkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKFJlc2N1ZVBhcnR5LmlzQXR0ZW1wdGluZ0ZhY3RvcnlSZXNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvdHRsaW5nT25BcHBDcmFzaCgpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUmVzY3VlUGFydHkuUFJPUF9BVFRFTVBUSU5HX1JFQk9PVCwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSkpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIGJlZm9yZVRpbWVvdXQgPSBub3cgLSBUaW1lVW5pdC5NSU5VVEVTLnRvTWlsbGlzKFRIUk9UVExJTkdfRFVSQVRJT05fTUlOIC0gMSk7CisgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcoYmVmb3JlVGltZW91dCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBMRVZFTF9GQUNUT1JZX1JFU0VUOyBpKyspIHsKKyAgICAgICAgICAgIG5vdGVBcHBDcmFzaChpICsgMSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UoUmVzY3VlUGFydHkuaXNBdHRlbXB0aW5nRmFjdG9yeVJlc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdFRocm90dGxpbmdBZnRlclRpbWVvdXRPbkJvb3RGYWlsdXJlcygpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUmVzY3VlUGFydHkuUFJPUF9BVFRFTVBUSU5HX1JFQk9PVCwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSkpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIGFmdGVyVGltZW91dCA9IG5vdyAtIFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoVEhST1RUTElOR19EVVJBVElPTl9NSU4gKyAxKTsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUFJPUF9MQVNUX0ZBQ1RPUllfUkVTRVRfVElNRV9NUywgTG9uZy50b1N0cmluZyhhZnRlclRpbWVvdXQpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTEVWRUxfRkFDVE9SWV9SRVNFVDsgaSsrKSB7CisgICAgICAgICAgICBub3RlQm9vdChpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKFJlc2N1ZVBhcnR5LmlzQXR0ZW1wdGluZ0ZhY3RvcnlSZXNldCgpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90VGhyb3R0bGluZ0FmdGVyVGltZW91dE9uQXBwQ3Jhc2goKSB7CisgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFJlc2N1ZVBhcnR5LlBST1BfQVRURU1QVElOR19SRUJPT1QsIEJvb2xlYW4udG9TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBhZnRlclRpbWVvdXQgPSBub3cgLSBUaW1lVW5pdC5NSU5VVEVTLnRvTWlsbGlzKFRIUk9UVExJTkdfRFVSQVRJT05fTUlOICsgMSk7CisgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcoYWZ0ZXJUaW1lb3V0KSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IExFVkVMX0ZBQ1RPUllfUkVTRVQ7IGkrKykgeworICAgICAgICAgICAgbm90ZUFwcENyYXNoKGkgKyAxLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKFJlc2N1ZVBhcnR5LmlzQXR0ZW1wdGluZ0ZhY3RvcnlSZXNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVSZXNjdWVQYXJ0eVJlc2V0cygpIHsKICAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbigoKSAtPiBTZXR0aW5nc1RvUHJvcGVydGllc01hcHBlci5pc05hdGl2ZUZsYWdzUmVzZXRQZXJmb3JtZWQoKSk7CiAgICAgICAgIGRvUmV0dXJuKEZBS0VfUkVTRVRfTkFUSVZFX05BTUVTUEFDRVMpLndoZW4oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FsYXJtL0FsYXJtTWFuYWdlclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FsYXJtL0FsYXJtTWFuYWdlclNlcnZpY2VUZXN0LmphdmEKaW5kZXggYjM5NWY0Mi4uMTc0MTQxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbGFybS9BbGFybU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuRkxBR19XQUtFX0ZST01fSURMRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLlJUQzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLlJUQ19XQUtFVVA7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLldJTkRPV19FWEFDVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLldJTkRPV19IRVVSSVNUSUM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEOwpAQCAtMTI2LDcgKzEyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSUFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLmNvbXBhdC5Db21wYXRDaGFuZ2VzOwotaW1wb3J0IGFuZHJvaWQuYXBwLnJvbGUuUm9sZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAudGFyZS5FY29ub215TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5Vc2FnZVN0YXRzTWFuYWdlckludGVybmFsOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CkBAIC0xMzQsNyArMTMyLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJJbnRlcm5hbDsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTE5Miw3ICsxODksNiBAQAogaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0yNDYsOCArMjQyLDYgQEAKICAgICBATW9jawogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXJJbnRlcm5hbCBtUGFja2FnZU1hbmFnZXJJbnRlcm5hbDsKICAgICBATW9jawotICAgIHByaXZhdGUgUm9sZU1hbmFnZXIgbVJvbGVNYW5hZ2VyOwotICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBBcHBTdGF0ZVRyYWNrZXJJbXBsIG1BcHBTdGF0ZVRyYWNrZXI7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIEFsYXJtTWFuYWdlclNlcnZpY2UuQ2xvY2tSZWNlaXZlciBtQ2xvY2tSZWNlaXZlcjsKQEAgLTM5MywxMSArMzg3LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlciwgVXJpIHVyaSkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICB2b2lkIHJlZ2lzdGVyRGV2aWNlQ29uZmlnTGlzdGVuZXIoRGV2aWNlQ29uZmlnLk9uUHJvcGVydGllc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KICAgICAgICAgICAgIC8vIFRoZSB0ZXN0cyBiZWNvbWUgZmxha3kgd2l0aCBhbiBlcnJvciBtZXNzYWdlIG9mCkBAIC00ODQsMTAgKzQ3MywxMiBAQAogICAgICAgICBkb1JldHVybihQZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0hBUkRfREVOSUVEKS53aGVuKAogICAgICAgICAgICAgICAgICgpIC0+IFBlcm1pc3Npb25DaGVja2VyLmNoZWNrUGVybWlzc2lvbkZvclByZWZsaWdodChhbnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGVxKE1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX0VYQUNUX0FMQVJNKSwgYW55SW50KCksIGFueUludCgpLCBhbnlTdHJpbmcoKSkpOworICAgICAgICBkb1JldHVybihQZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0hBUkRfREVOSUVEKS53aGVuKAorICAgICAgICAgICAgICAgICgpIC0+IFBlcm1pc3Npb25DaGVja2VyLmNoZWNrUGVybWlzc2lvbkZvclByZWZsaWdodChhbnkoKSwgZXEoU0NIRURVTEVfRVhBQ1RfQUxBUk0pLAorICAgICAgICAgICAgICAgICAgICAgICAgYW55SW50KCksIGFueUludCgpLCBhbnlTdHJpbmcoKSkpOwogCiAgICAgICAgIHdoZW4obU1vY2tDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BUFBfT1BTX1NFUlZJQ0UpKS50aGVuUmV0dXJuKG1BcHBPcHNNYW5hZ2VyKTsKICAgICAgICAgd2hlbihtTW9ja0NvbnRleHQuZ2V0U3lzdGVtU2VydmljZShCYXR0ZXJ5TWFuYWdlci5jbGFzcykpLnRoZW5SZXR1cm4obUJhdHRlcnlNYW5hZ2VyKTsKLSAgICAgICAgd2hlbihtTW9ja0NvbnRleHQuZ2V0U3lzdGVtU2VydmljZShSb2xlTWFuYWdlci5jbGFzcykpLnRoZW5SZXR1cm4obVJvbGVNYW5hZ2VyKTsKIAogICAgICAgICByZWdpc3RlckFwcElkcyhuZXcgU3RyaW5nW117VEVTVF9DQUxMSU5HX1BBQ0tBR0V9LAogICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyW117VXNlckhhbmRsZS5nZXRBcHBJZChURVNUX0NBTExJTkdfVUlEKX0pOwpAQCAtMTMwMyw3ICsxMjk0LDggQEAKICAgICAgICAgZmluYWwgQnJvYWRjYXN0T3B0aW9ucyBhY3R1YWxPcHRpb25zID0gbmV3IEJyb2FkY2FzdE9wdGlvbnMoYWN0dWFsT3B0aW9uc0J1bmRsZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhCcm9hZGNhc3RPcHRpb25zLkRFTElWRVJZX0dST1VQX1BPTElDWV9NT1NUX1JFQ0VOVCwKICAgICAgICAgICAgICAgICBhY3R1YWxPcHRpb25zLmdldERlbGl2ZXJ5R3JvdXBQb2xpY3koKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0dWFsT3B0aW9ucy5pc0RlZmVyVW50aWxBY3RpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUsCisgICAgICAgICAgICAgICAgYWN0dWFsT3B0aW9ucy5nZXREZWZlcnJhbFBvbGljeSgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjE4MCw0MCArMjE3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGxOb3REZW55TGlzdGVkKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwotCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9ERUZBVUxUKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7Ci0gICAgICAgIGFzc2VydFRydWUobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwotICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfSUdOT1JFRCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtQmluZGVyQ2FsbERlbnlMaXN0ZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIHRydWUsIE1PREVfRVJST1JFRCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwotCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOwotICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgdHJ1ZSwgTU9ERV9JR05PUkVEKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIHRydWUsIE1PREVfQUxMT1dFRCk7Ci0gICAgICAgIGFzc2VydFRydWUobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIG1vY2tDaGFuZ2VFbmFibGVkKGxvbmcgY2hhbmdlSWQsIGJvb2xlYW4gZW5hYmxlZCkgewogICAgICAgICBkb1JldHVybihlbmFibGVkKS53aGVuKCgpIC0+IENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKGVxKGNoYW5nZUlkKSwgYW55U3RyaW5nKCksCiAgICAgICAgICAgICAgICAgYW55KFVzZXJIYW5kbGUuY2xhc3MpKSk7CkBAIC0yMjIxLDE2ICsyMTc5LDYyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1CaW5kZXJDYWxsTm90RGVjbGFyZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1CaW5kZXJDYWxsKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGxOb3REZW55TGlzdGVkUHJlVCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CiAKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9JR05PUkVEKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1CaW5kZXJDYWxsRGVueUxpc3RlZFByZVQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCB0cnVlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIHRydWUsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgdHJ1ZSwgTU9ERV9ERUZBVUxUKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCB0cnVlLCBNT0RFX0lHTk9SRUQpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1CaW5kZXJDYWxsTm90RGVjbGFyZWRQcmVUKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQoZmFsc2UsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKGZhbHNlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVChmYWxzZSwgdHJ1ZSwgTU9ERV9BTExPV0VEKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CiAgICAgfQogCkBAIC0yMjM5LDYxICsyMjQzLDk0IEBACiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIGZhbHNlKTsKIAogICAgICAgICAvLyBjYW5TY2hlZHVsZUV4YWN0QWxhcm1zIHNob3VsZCBiZSB0cnVlIHJlZ2FyZGxlc3Mgb2YgYW55IHBlcm1pc3Npb24gc3RhdGUuCi0gICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CisgICAgICAgIC8vIEJvdGggU0VBIGFuZCBVRUEgYXJlIGRlbmllZCBpbiBzZXRVcC4KICAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIHRydWUsIE1PREVfREVGQVVMVCk7Ci0gICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2FuU2NoZWR1bGVFeGFjdEFsYXJtc0JpbmRlckNhbGwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBjYW5TY2hlZHVsZUV4YWN0QWxhcm1zQmluZGVyQ2FsbFByZVQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgLy8gUG9saWN5IHBlcm1pc3Npb24gaXMgZGVuaWVkIGluIHNldFVwKCkuCiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CiAKICAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgbm8gZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgdHJ1ZSwgTU9ERV9ERUZBVUxUKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOwogICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAogICAgICAgICAvLyBObyBwZXJtaXNzaW9uLCBubyBleGVtcHRpb24uCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gUG9saWN5IHBlcm1pc3Npb24gb25seSwgbm8gZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CiAKICAgICAgICAgLy8gVXNlciBwZXJtaXNzaW9uIG9ubHksIG5vIGV4ZW1wdGlvbi4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCiAgICAgICAgIC8vIFVzZXIgcGVybWlzc2lvbiBvbmx5LCBubyBleGVtcHRpb24uCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCB0cnVlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfQUxMT1dFRCk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KFRFU1RfQ0FMTElOR19VSUQpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCiAgICAgICAgIC8vIE5vIHBlcm1pc3Npb24sIGV4ZW1wdGlvbi4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChURVNUX0NBTExJTkdfVUlEKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oKCkgLT4gVXNlckhhbmRsZS5pc0NvcmUoVEVTVF9DQUxMSU5HX1VJRCkpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCiAgICAgICAgIC8vIEJvdGggcGVybWlzc2lvbnMgYW5kIGV4ZW1wdGlvbi4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2FuU2NoZWR1bGVFeGFjdEFsYXJtc0JpbmRlckNhbGwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQm90aCBwZXJtaXNzaW9ucyBhcmUgZGVuaWVkIGluIHNldFVwKCkuCisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgbm8gZXhlbXB0aW9uLgorICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKKworICAgICAgICAvLyBQb2xpY3kgcGVybWlzc2lvbiBvbmx5LCBubyBleGVtcHRpb24uCisgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CisKKyAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CisKKyAgICAgICAgLy8gVXNlciBwZXJtaXNzaW9uIG9ubHksIG5vIGV4ZW1wdGlvbi4KKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOworCisgICAgICAgIC8vIE5vIHBlcm1pc3Npb24sIGV4ZW1wdGlvbi4KKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKKyAgICAgICAgd2hlbihtRGV2aWNlSWRsZUludGVybmFsLmlzQXBwT25XaGl0ZWxpc3QoVEVTVF9DQUxMSU5HX1VJRCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CisKKyAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgY29yZSB1aWQgZXhlbXB0aW9uLgorICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChURVNUX0NBTExJTkdfVUlEKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oKCkgLT4gVXNlckhhbmRsZS5pc0NvcmUoVEVTVF9DQUxMSU5HX1VJRCkpOworICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOworCisgICAgICAgIC8vIEJvdGggcGVybWlzc2lvbnMgYW5kIGNvcmUgdWlkIGV4ZW1wdGlvbi4KKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOwogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogICAgIH0KQEAgLTI0MDMsOCArMjQ0MCw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBhbGFybUNsb2NrQmluZGVyQ2FsbFdpdGhTRUFQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOwogCiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CiAgICAgICAgIGZpbmFsIEFsYXJtTWFuYWdlci5BbGFybUNsb2NrSW5mbyBhbGFybUNsb2NrID0gbW9jayhBbGFybU1hbmFnZXIuQWxhcm1DbG9ja0luZm8uY2xhc3MpOwpAQCAtMjQzMCw5ICsyNDY4LDEwIEBACiAgICAgcHVibGljIHZvaWQgYWxhcm1DbG9ja0JpbmRlckNhbGxXaXRoVUVBUGVybWlzc2lvbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLkVOQUJMRV9VU0VfRVhBQ1RfQUxBUk0sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOwogCiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CiAKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKICAgICAgICAgZmluYWwgQWxhcm1NYW5hZ2VyLkFsYXJtQ2xvY2tJbmZvIGFsYXJtQ2xvY2sgPSBtb2NrKEFsYXJtTWFuYWdlci5BbGFybUNsb2NrSW5mby5jbGFzcyk7CkBAIC0yNDU0LDcgKzI0OTMsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoVEVNUE9SQVJZX0FMTE9XTElTVF9UWVBFX0ZPUkVHUk9VTkRfU0VSVklDRV9BTExPV0VELCB0eXBlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGJvb2xlYW4gZGVjbGFyZWQsIGJvb2xlYW4gZGVueUxpc3QsIGludCBtb2RlKSB7CisgICAgcHJpdmF0ZSB2b2lkIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQoYm9vbGVhbiBkZWNsYXJlZCwgYm9vbGVhbiBkZW55TGlzdCwgaW50IG1vZGUpIHsKICAgICAgICAgU3RyaW5nW10gcmVxdWVzdGVycyA9IGRlY2xhcmVkID8gbmV3IFN0cmluZ1tde1RFU1RfQ0FMTElOR19QQUNLQUdFfSA6IEVtcHR5QXJyYXkuU1RSSU5HOwogICAgICAgICB3aGVuKG1QZXJtaXNzaW9uTWFuYWdlckludGVybmFsLmdldEFwcE9wUGVybWlzc2lvblBhY2thZ2VzKFNDSEVEVUxFX0VYQUNUX0FMQVJNKSkKICAgICAgICAgICAgICAgICAudGhlblJldHVybihyZXF1ZXN0ZXJzKTsKQEAgLTI0NjksNiArMjUwOCwyMCBAQAogICAgICAgICAgICAgICAgIFRFU1RfQ0FMTElOR19QQUNLQUdFKSkudGhlblJldHVybihtb2RlKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGJvb2xlYW4gZ3JhbnRlZCkgeworICAgICAgICBTdHJpbmdbXSByZXF1ZXN0ZXJzID0gZ3JhbnRlZCA/IG5ldyBTdHJpbmdbXXtURVNUX0NBTExJTkdfUEFDS0FHRX0gOiBFbXB0eUFycmF5LlNUUklORzsKKyAgICAgICAgd2hlbihtUGVybWlzc2lvbk1hbmFnZXJJbnRlcm5hbC5nZXRBcHBPcFBlcm1pc3Npb25QYWNrYWdlcyhTQ0hFRFVMRV9FWEFDVF9BTEFSTSkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4ocmVxdWVzdGVycyk7CisgICAgICAgIG1TZXJ2aWNlLnJlZnJlc2hFeGFjdEFsYXJtQ2FuZGlkYXRlcygpOworCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBncmFudGVkID8gUGVybWlzc2lvbkNoZWNrZXIuUEVSTUlTU0lPTl9HUkFOVEVECisgICAgICAgICAgICAgICAgOiBQZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0hBUkRfREVOSUVEOworICAgICAgICBkb1JldHVybihyZXN1bHQpLndoZW4oCisgICAgICAgICAgICAgICAgKCkgLT4gUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KGVxKG1Nb2NrQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcShTQ0hFRFVMRV9FWEFDVF9BTEFSTSksIGFueUludCgpLCBlcShURVNUX0NBTExJTkdfVUlEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKFRFU1RfQ0FMTElOR19QQUNLQUdFKSkpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGJvb2xlYW4gZ3JhbnRlZCkgewogICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gZ3JhbnRlZCA/IFBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRAogICAgICAgICAgICAgICAgIDogUGVybWlzc2lvbkNoZWNrZXIuUEVSTUlTU0lPTl9IQVJEX0RFTklFRDsKQEAgLTI0ODIsNyArMjUzNSw3IEBACiAgICAgcHVibGljIHZvaWQgYWxhcm1DbG9ja0JpbmRlckNhbGxXaXRob3V0UGVybWlzc2lvbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KGFueUludCgpKSkudGhlblJldHVybih0cnVlKTsKIAogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwpAQCAtMjUwMyw4ICsyNTU2LDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGV4YWN0QmluZGVyQ2FsbFdpdGhTRUFQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOwogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwogICAgICAgICBtQmluZGVyLnNldChURVNUX0NBTExJTkdfUEFDS0FHRSwgRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIDEyMzQsIFdJTkRPV19FWEFDVCwgMCwKICAgICAgICAgICAgICAgICAwLCBhbGFybVBpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTI1MjgsOSArMjU4MiwxMCBAQAogICAgIHB1YmxpYyB2b2lkIGV4YWN0QmluZGVyQ2FsbFdpdGhVRUFQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKICAgICAgICAgbUJpbmRlci5zZXQoVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIEVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCAxMjM0LCBXSU5ET1dfRVhBQ1QsIDAsCiAgICAgICAgICAgICAgICAgMCwgYWxhcm1QaSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CkBAIC0yNTU0LDcgKzI2MDksNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4YWN0QmluZGVyQ2FsbFdpdGhBbGxvd2xpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAgICAgICAgIC8vIElmIHBlcm1pc3Npb24gaXMgZGVuaWVkLCBvbmx5IHRoZW4gYWxsb3dsaXN0IHdpbGwgYmUgY2hlY2tlZC4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChhbnlJbnQoKSkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKQEAgLTI1NzQsNyArMjYyOSw3IEBACiAgICAgcHVibGljIHZvaWQgZXhhY3RBbGxvd1doaWxlSWRsZUJpbmRlckNhbGxXaXRoU0VBUGVybWlzc2lvbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CiAgICAgICAgIG1CaW5kZXIuc2V0KFRFU1RfQ0FMTElOR19QQUNLQUdFLCBFTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgMTIzNCwgV0lORE9XX0VYQUNULCAwLAogICAgICAgICAgICAgICAgIEZMQUdfQUxMT1dfV0hJTEVfSURMRSwgYWxhcm1QaSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CkBAIC0yNjAwLDcgKzI2NTUsNyBAQAogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVChmYWxzZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CiAgICAgICAgIG1CaW5kZXIuc2V0KFRFU1RfQ0FMTElOR19QQUNLQUdFLCBFTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgMTIzNCwgV0lORE9XX0VYQUNULCAwLAogICAgICAgICAgICAgICAgIEZMQUdfQUxMT1dfV0hJTEVfSURMRSwgYWxhcm1QaSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CkBAIC0yNjI0LDcgKzI2NzksNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4YWN0QWxsb3dXaGlsZUlkbGVCaW5kZXJDYWxsV2l0aEFsbG93bGlzdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKICAgICAgICAgLy8gSWYgcGVybWlzc2lvbiBpcyBkZW5pZWQsIG9ubHkgdGhlbiBhbGxvd2xpc3Qgd2lsbCBiZSBjaGVja2VkLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KGFueUludCgpKSkudGhlblJldHVybih0cnVlKTsKIAogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwpAQCAtMjY1MCw3ICsyNzA1LDcgQEAKICAgICBwdWJsaWMgdm9pZCBleGFjdEJpbmRlckNhbGxzV2l0aG91dFBlcm1pc3Npb25XaXRob3V0QWxsb3dsaXN0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgd2hlbihtRGV2aWNlSWRsZUludGVybmFsLmlzQXBwT25XaGl0ZWxpc3QoYW55SW50KCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKIAogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwpAQCAtMjcwMCw3ICsyNzU1LDcgQEAKICAgICBwdWJsaWMgdm9pZCBiaW5kZXJDYWxsV2l0aFVzZXJBbGxvd2xpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChhbnlJbnQoKSkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUFwcFN0YXRlVHJhY2tlci5pc1VpZFBvd2VyU2F2ZVVzZXJFeGVtcHQoVEVTVF9DQUxMSU5HX1VJRCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAKQEAgLTMwMjUsNyArMzA4MCw3IEBACiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogCiAgICAgICAgIG1TZXJ2aWNlLm1MYXN0T3BTY2hlZHVsZUV4YWN0QWxhcm0ucHV0KFRFU1RfQ0FMTElOR19VSUQsIE1PREVfQUxMT1dFRCk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKIAogICAgICAgICBtSUFwcE9wc0NhbGxiYWNrLm9wQ2hhbmdlZChPUF9TQ0hFRFVMRV9FWEFDVF9BTEFSTSwgVEVTVF9DQUxMSU5HX1VJRCwgVEVTVF9DQUxMSU5HX1BBQ0tBR0UpOwogICAgICAgICBhc3NlcnRBbmRIYW5kbGVNZXNzYWdlU3luYyhSRU1PVkVfRVhBQ1RfQUxBUk1TKTsKQEAgLTMwMzgsNyArMzA5Myw3IEBACiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIGZhbHNlKTsKIAogICAgICAgICBtU2VydmljZS5tTGFzdE9wU2NoZWR1bGVFeGFjdEFsYXJtLnB1dChURVNUX0NBTExJTkdfVUlELCBNT0RFX0FMTE9XRUQpOwotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAKICAgICAgICAgbUlBcHBPcHNDYWxsYmFjay5vcENoYW5nZWQoT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk0sIFRFU1RfQ0FMTElOR19VSUQsIFRFU1RfQ0FMTElOR19QQUNLQUdFKTsKIApAQCAtMzA1MSw3ICszMTA2LDcgQEAKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgZmFsc2UpOwogCiAgICAgICAgIG1TZXJ2aWNlLm1MYXN0T3BTY2hlZHVsZUV4YWN0QWxhcm0ucHV0KFRFU1RfQ0FMTElOR19VSUQsIE1PREVfRVJST1JFRCk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfREVGQVVMVCk7CiAKICAgICAgICAgbUlBcHBPcHNDYWxsYmFjay5vcENoYW5nZWQoT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk0sIFRFU1RfQ0FMTElOR19VSUQsIFRFU1RfQ0FMTElOR19QQUNLQUdFKTsKIApAQCAtMzA2Nyw3ICszMTIyLDcgQEAKICAgICAgICAgd2hlbihtQWN0aXZpdHlNYW5hZ2VySW50ZXJuYWwuZ2V0Qm9vdFRpbWVUZW1wQWxsb3dMaXN0RHVyYXRpb24oKSkudGhlblJldHVybihkdXJhdGlvbk1zKTsKIAogICAgICAgICBtU2VydmljZS5tTGFzdE9wU2NoZWR1bGVFeGFjdEFsYXJtLnB1dChURVNUX0NBTExJTkdfVUlELCBNT0RFX0VSUk9SRUQpOwotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CiAgICAgICAgIG1JQXBwT3BzQ2FsbGJhY2sub3BDaGFuZ2VkKE9QX1NDSEVEVUxFX0VYQUNUX0FMQVJNLCBURVNUX0NBTExJTkdfVUlELCBURVNUX0NBTExJTkdfUEFDS0FHRSk7CiAKICAgICAgICAgZmluYWwgQXJndW1lbnRDYXB0b3I8SW50ZW50PiBpbnRlbnRDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhJbnRlbnQuY2xhc3MpOwpAQCAtMzMyNyw3ICszMzgyLDcgQEAKICAgICAgICAgICAgICAgICAucHV0RXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgdHJ1ZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKICAgICAgICAgbVBhY2thZ2VDaGFuZ2VzUmVjZWl2ZXIub25SZWNlaXZlKG1Nb2NrQ29udGV4dCwgcGFja2FnZVJlcGxhY2VkSW50ZW50KTsKICAgICAgICAgYXNzZXJ0QW5kSGFuZGxlTWVzc2FnZVN5bmMoQ0hFQ0tfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTl9PTl9VUERBVEUpOwogCkBAIC0zMzM1LDcgKzMzOTAsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbVNlcnZpY2UubUFsYXJtU3RvcmUuc2l6ZSgpKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOwotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIG1QYWNrYWdlQ2hhbmdlc1JlY2VpdmVyLm9uUmVjZWl2ZShtTW9ja0NvbnRleHQsIHBhY2thZ2VSZXBsYWNlZEludGVudCk7CiAgICAgICAgIGFzc2VydEFuZEhhbmRsZU1lc3NhZ2VTeW5jKENIRUNLX0VYQUNUX0FMQVJNX1BFUk1JU1NJT05fT05fVVBEQVRFKTsKIApAQCAtMzM0Myw3ICszMzk4LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1TZXJ2aWNlLm1BbGFybVN0b3JlLnNpemUoKSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgbVBhY2thZ2VDaGFuZ2VzUmVjZWl2ZXIub25SZWNlaXZlKG1Nb2NrQ29udGV4dCwgcGFja2FnZVJlcGxhY2VkSW50ZW50KTsKICAgICAgICAgYXNzZXJ0QW5kSGFuZGxlTWVzc2FnZVN5bmMoQ0hFQ0tfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTl9PTl9VUERBVEUpOwogCkBAIC0zMzYyLDU1ICszNDE3LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdCgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2UxID0gInByaXYiOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZTIgPSAic2lnbmVkIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2UzID0gIm5vcm1hbCI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlNCA9ICJ3ZWxsYmVpbmciOwotICAgICAgICBmaW5hbCBpbnQgdWlkMSA9IDEyOTQ7Ci0gICAgICAgIGZpbmFsIGludCB1aWQyID0gODMyMTsKLSAgICAgICAgZmluYWwgaW50IHVpZDMgPSAzNDEyOwotICAgICAgICBmaW5hbCBpbnQgdWlkNCA9IDQ1OTE7Ci0KLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1VpZFByaXZpbGVnZWQodWlkMSkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNVaWRQcml2aWxlZ2VkKHVpZDIpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1VpZFByaXZpbGVnZWQodWlkMykpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1QYWNrYWdlTWFuYWdlckludGVybmFsLmlzVWlkUHJpdmlsZWdlZCh1aWQ0KSkudGhlblJldHVybihmYWxzZSk7Ci0KLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1BsYXRmb3JtU2lnbmVkKHBhY2thZ2UxKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNQbGF0Zm9ybVNpZ25lZChwYWNrYWdlMikpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNQbGF0Zm9ybVNpZ25lZChwYWNrYWdlMykpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1QYWNrYWdlTWFuYWdlckludGVybmFsLmlzUGxhdGZvcm1TaWduZWQocGFja2FnZTQpKS50aGVuUmV0dXJuKGZhbHNlKTsKLQotICAgICAgICB3aGVuKG1Sb2xlTWFuYWdlci5nZXRSb2xlSG9sZGVycyhSb2xlTWFuYWdlci5ST0xFX1NZU1RFTV9XRUxMQkVJTkcpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QocGFja2FnZTQpKTsKLQotICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChTQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgZmFsc2UpOwotICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLkVYQUNUX0FMQVJNX0RFTllfTElTVCA9IG5ldyBBcnJheVNldDw+KG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICBwYWNrYWdlMSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlMywKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gRGVueSBsaXN0ZWQgcGFja2FnZXMgd2lsbCBiZSBmYWxzZS4KLSAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2UxLCB1aWQxKSk7Ci0gICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2UyLCB1aWQyKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChwYWNrYWdlMywgdWlkMykpOwotICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChwYWNrYWdlNCwgdWlkNCkpOwotCi0gICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKFNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5FWEFDVF9BTEFSTV9ERU5ZX0xJU1QgPSBuZXcgQXJyYXlTZXQ8PihuZXcgU3RyaW5nW117Ci0gICAgICAgICAgICAgICAgcGFja2FnZTEsCi0gICAgICAgICAgICAgICAgcGFja2FnZTMsCi0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIERlbnkgbGlzdCBkb2Vzbid0IG1hdHRlciBub3csIG9ubHkgZXhlbXB0aW9ucyBzaG91bGQgYmUgdHJ1ZS4KLSAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTEsIHVpZDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTIsIHVpZDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2UzLCB1aWQzKSk7Ci0gICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2U0LCB1aWQ0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBhbGFybVNjaGVkdWxlZEF0b21QdXNoZWQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewogICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CkBAIC0zNTA5LDcgKzM1MTUsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgaGFzVXNlRXhhY3RBbGFybVBlcm1pc3Npb24oKSB7CisgICAgcHVibGljIHZvaWQgaGFzVXNlRXhhY3RBbGFybUludGVybmFsKCkgewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKQEAgLTM1MjAsNyArMzUyNiw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBoYXNVc2VFeGFjdEFsYXJtUGVybWlzc2lvbkNoYW5nZURpc2FibGVkKCkgeworICAgIHB1YmxpYyB2b2lkIGhhc1VzZUV4YWN0QWxhcm1JbnRlcm5hbENoYW5nZURpc2FibGVkKCkgewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgZmFsc2UpOwogCiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CkBAIC0zNTMxLDYgKzM1MzcsNDkgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKCkgeworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCB0cnVlKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWxQcmVUKCkgeworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCBmYWxzZSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQoZmFsc2UsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWxQcmVTKCkgeworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCBmYWxzZSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5oYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbChURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VJRCkpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZW1wb3JhcnlRdW90YVJlc2VydmVfaGFzUXVvdGEoKSB7CiAgICAgICAgIGZpbmFsIGludCBxdW90YVRvRmlsbCA9IDU7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlMSA9ICJwYWNrYWdlMSI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FwcGxpY2F0aW9uRXhpdEluZm9UZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FwcGxpY2F0aW9uRXhpdEluZm9UZXN0LmphdmEKaW5kZXggOTI2M2JmZi4uZDU2MjI5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BcHBsaWNhdGlvbkV4aXRJbmZvVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwbGljYXRpb25FeGl0SW5mb1Rlc3QuamF2YQpAQCAtOTg5LDkgKzk4OSwxNiBAQAogICAgIHByaXZhdGUgUHJvY2Vzc1JlY29yZCBtYWtlUHJvY2Vzc1JlY29yZChpbnQgcGlkLCBpbnQgdWlkLCBpbnQgcGFja2FnZVVpZCwgSW50ZWdlciBkZWZpbmluZ1VpZCwKICAgICAgICAgICAgIGludCBjb25uZWN0aW9uR3JvdXAsIGludCBwcm9jU3RhdGUsIGxvbmcgcHNzLCBsb25nIHJzcywKICAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBtYWtlUHJvY2Vzc1JlY29yZChwaWQsIHVpZCwgcGFja2FnZVVpZCwgZGVmaW5pbmdVaWQsIGNvbm5lY3Rpb25Hcm91cCwKKyAgICAgICAgICAgICAgICBwcm9jU3RhdGUsIHBzcywgcnNzLCBwcm9jZXNzTmFtZSwgcGFja2FnZU5hbWUsIG1BbXMpOworICAgIH0KKworICAgIHN0YXRpYyBQcm9jZXNzUmVjb3JkIG1ha2VQcm9jZXNzUmVjb3JkKGludCBwaWQsIGludCB1aWQsIGludCBwYWNrYWdlVWlkLCBJbnRlZ2VyIGRlZmluaW5nVWlkLAorICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25Hcm91cCwgaW50IHByb2NTdGF0ZSwgbG9uZyBwc3MsIGxvbmcgcnNzLAorICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgYW1zKSB7CiAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhaSA9IG5ldyBBcHBsaWNhdGlvbkluZm8oKTsKICAgICAgICAgYWkucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAgPSBuZXcgUHJvY2Vzc1JlY29yZChtQW1zLCBhaSwgcHJvY2Vzc05hbWUsIHVpZCk7CisgICAgICAgIFByb2Nlc3NSZWNvcmQgYXBwID0gbmV3IFByb2Nlc3NSZWNvcmQoYW1zLCBhaSwgcHJvY2Vzc05hbWUsIHVpZCk7CiAgICAgICAgIGFwcC5zZXRQaWQocGlkKTsKICAgICAgICAgYXBwLmluZm8udWlkID0gcGFja2FnZVVpZDsKICAgICAgICAgaWYgKGRlZmluaW5nVWlkICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0UmVjb3JkVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmRUZXN0LmphdmEKaW5kZXggMDFlMjc2OC4uMmI2ZjIxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmRUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmRUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDggQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdENvbnN0YW50cy5ERUZFUl9CT09UX0NPTVBMRVRFRF9CUk9BRENBU1RfQkFDS0dST1VORF9SRVNUUklDVEVEX09OTFk7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Ccm9hZGNhc3RDb25zdGFudHMuREVGRVJfQk9PVF9DT01QTEVURURfQlJPQURDQVNUX05PTkU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Ccm9hZGNhc3RSZWNvcmQuY2FsY3VsYXRlQmxvY2tlZFVudGlsVGVybWluYWxDb3VudDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdFJlY29yZC5jYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0UmVjb3JkLmNhbGN1bGF0ZVVyZ2VudDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdFJlY29yZC5pc1JlY2VpdmVyRXF1YWxzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CkBAIC0zOCw2ICs0MCw3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQmFja2dyb3VuZFN0YXJ0UHJpdmlsZWdlczsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ccm9hZGNhc3RPcHRpb25zOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JSW50ZW50UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CkBAIC01NSw2ICs1OCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdERpc3BhdGNoZXIuRGVmZXJyZWRCb290Q29tcGxldGVkQnJvYWRjYXN0UGVyVXNlcjsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKQEAgLTg2LDYgKzkwLDE1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFDS0FHRV9MSVNUID0gbmV3IFN0cmluZ1tdIHtQQUNLQUdFMSwgUEFDS0FHRTIsIFBBQ0tBR0UzLAogICAgICAgICAgICAgUEFDS0FHRTR9OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9VSUQgPSBhbmRyb2lkLm9zLlByb2Nlc3MuU1lTVEVNX1VJRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1VJRCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5GSVJTVF9BUFBMSUNBVElPTl9VSUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCcm9hZGNhc3RPcHRpb25zIE9QVF9ERUZBVUxUID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCcm9hZGNhc3RPcHRpb25zIE9QVF9OT05FID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKQorICAgICAgICAgICAgLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX05PTkUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJyb2FkY2FzdE9wdGlvbnMgT1BUX1VOVElMX0FDVElWRSA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCkKKyAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpOworCiAgICAgQE1vY2sgQWN0aXZpdHlNYW5hZ2VySW50ZXJuYWwgbUFjdGl2aXR5TWFuYWdlckludGVybmFsOwogICAgIEBNb2NrIEJyb2FkY2FzdFF1ZXVlIG1RdWV1ZTsKICAgICBATW9jayBQcm9jZXNzUmVjb3JkIG1Qcm9jZXNzOwpAQCAtMjEzLDYgKzIyNiw3NSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGN1bGF0ZVVyZ2VudCgpIHsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudEZvcmVncm91bmQgPSBuZXcgSW50ZW50KCkKKyAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlVXJnZW50KGludGVudCwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZVVyZ2VudChpbnRlbnRGb3JlZ3JvdW5kLCBudWxsKSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQnJvYWRjYXN0T3B0aW9ucyBvcHRzID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZVVyZ2VudChpbnRlbnQsIG9wdHMpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBCcm9hZGNhc3RPcHRpb25zIG9wdHMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpOworICAgICAgICAgICAgb3B0cy5zZXRJbnRlcmFjdGl2ZSh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlVXJnZW50KGludGVudCwgb3B0cykpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEJyb2FkY2FzdE9wdGlvbnMgb3B0cyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCk7CisgICAgICAgICAgICBvcHRzLnNldEFsYXJtQnJvYWRjYXN0KHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVVcmdlbnQoaW50ZW50LCBvcHRzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlX0FwcCgpIHsKKyAgICAgICAgLy8gVmVyaWZ5IG5vbi11cmdlbnQgYmVoYXZpb3IKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfREVGQVVMVCwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX05PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX1VOVElMX0FDVElWRSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHVyZ2VudCBiZWhhdmlvcgorICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIG51bGwsIG51bGwsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX0RFRkFVTFQsIG51bGwsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX05PTkUsIG51bGwsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfVU5USUxfQUNUSVZFLCBudWxsLCBmYWxzZSwgdHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmVfU3lzdGVtKCkgeworICAgICAgICBCcm9hZGNhc3RSZWNvcmQuQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgPSB0cnVlOworCisgICAgICAgIC8vIFZlcmlmeSBub24tdXJnZW50IGJlaGF2aW9yCisgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9ERUZBVUxULCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBPUFRfTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBPUFRfVU5USUxfQUNUSVZFLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKworICAgICAgICAvLyBWZXJpZnkgdXJnZW50IGJlaGF2aW9yCisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoU1lTVEVNX1VJRCwgbnVsbCwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBPUFRfREVGQVVMVCwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBPUFRfTk9ORSwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9VTlRJTF9BQ1RJVkUsIG51bGwsIGZhbHNlLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZV9PdmVycmlkZXMoKSB7CisgICAgICAgIGZpbmFsIElJbnRlbnRSZWNlaXZlciByZXN1bHRUbyA9IG5ldyBJSW50ZW50UmVjZWl2ZXIuRGVmYXVsdCgpOworCisgICAgICAgIC8vIE9yZGVyZWQgYnJvYWRjYXN0cyBuZXZlciBkZWZlcnJlZDsgcmVxdWVzdGVkIG9wdGlvbiBpcyBpZ25vcmVkCisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX1VOVElMX0FDVElWRSwgbnVsbCwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfVU5USUxfQUNUSVZFLCByZXN1bHRUbywgdHJ1ZSwgZmFsc2UpKTsKKworICAgICAgICAvLyBVbm9yZGVyZWQgd2l0aCByZXN1bHQgaXMgYWx3YXlzIGRlZmVycmVkOyByZXF1ZXN0ZWQgb3B0aW9uIGlzIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIE9QVF9OT05FLCByZXN1bHRUbywgZmFsc2UsIGZhbHNlKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW51cERpc2FibGVkUGFja2FnZVJlY2VpdmVycygpIHsKICAgICAgICAgZmluYWwgaW50IHVzZXIwID0gVXNlckhhbmRsZS5VU0VSX1NZU1RFTTsKICAgICAgICAgZmluYWwgaW50IHVzZXIxID0gdXNlcjAgKyAxOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlVGltZW91dFRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vU2VydmljZVRpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxYjA2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vU2VydmljZVRpbWVvdXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9TRVJWSUNFOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5BcHBsaWNhdGlvbkV4aXRJbmZvVGVzdC5tYWtlUHJvY2Vzc1JlY29yZDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYWZ0ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uY2xlYXJJbnZvY2F0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb05vdGhpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9SZXR1cm47CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZW91dDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuVXNhZ2VTdGF0c01hbmFnZXJJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucGxhdGZvcm0uYXBwLkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLkRyb3BCb3hNYW5hZ2VySW50ZXJuYWw7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLkxvY2FsU2VydmljZXM7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclNlcnZpY2UuSW5qZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFwcGxpY2F0aW9uRXhpdEluZm9UZXN0LlNlcnZpY2VUaHJlYWRSdWxlOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hcHBvcC5BcHBPcHNTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5BY3Rpdml0eVRhc2tNYW5hZ2VyU2VydmljZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHRoZSBzZXJ2aWNlIHRpbWVvdXQuCisgKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgYXRlc3QgU2VydmljZVRpbWVvdXRUZXN0CisgKi8KK0BQcmVzdWJtaXQKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlVGltZW91dFRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBTZXJ2aWNlVGltZW91dFRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TRVJWSUNFX1RJTUVPVVQgPSAyMDAwOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgU2VydmljZVRocmVhZFJ1bGUgbVNlcnZpY2VUaHJlYWRSdWxlID0gbmV3IFNlcnZpY2VUaHJlYWRSdWxlKCk7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtSGFuZGxlclRocmVhZDsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBBcHBPcHNTZXJ2aWNlIG1BcHBPcHNTZXJ2aWNlOworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBEcm9wQm94TWFuYWdlckludGVybmFsIG1Ecm9wQm94TWFuYWdlckludDsKKyAgICBATW9jaworICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXJJbnRlcm5hbCBtUGFja2FnZU1hbmFnZXJJbnQ7CisgICAgQE1vY2sKKyAgICBwcml2YXRlIFVzYWdlU3RhdHNNYW5hZ2VySW50ZXJuYWwgbVVzYWdlU3RhdHNNYW5hZ2VySW50OworCisgICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIG1BbXM7CisgICAgcHJpdmF0ZSBQcm9jZXNzTGlzdCBtUHJvY2Vzc0xpc3Q7CisgICAgcHJpdmF0ZSBBY3RpdmVTZXJ2aWNlcyBtQWN0aXZlU2VydmljZXM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKworICAgICAgICBtSGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1IYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1Qcm9jZXNzTGlzdCA9IHNweShuZXcgUHJvY2Vzc0xpc3QoKSk7CisKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5yZW1vdmVTZXJ2aWNlRm9yVGVzdChEcm9wQm94TWFuYWdlckludGVybmFsLmNsYXNzKTsKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5hZGRTZXJ2aWNlKERyb3BCb3hNYW5hZ2VySW50ZXJuYWwuY2xhc3MsIG1Ecm9wQm94TWFuYWdlckludCk7CisgICAgICAgIExvY2FsU2VydmljZXMucmVtb3ZlU2VydmljZUZvclRlc3QoUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5jbGFzcyk7CisgICAgICAgIExvY2FsU2VydmljZXMuYWRkU2VydmljZShQYWNrYWdlTWFuYWdlckludGVybmFsLmNsYXNzLCBtUGFja2FnZU1hbmFnZXJJbnQpOworICAgICAgICBkb1JldHVybihuZXcgQ29tcG9uZW50TmFtZSgiIiwgIiIpKS53aGVuKG1QYWNrYWdlTWFuYWdlckludCkuZ2V0U3lzdGVtVWlTZXJ2aWNlQ29tcG9uZW50KCk7CisKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSByZWFsQW1zID0gbmV3IEFjdGl2aXR5TWFuYWdlclNlcnZpY2UoCisgICAgICAgICAgICAgICAgbmV3IFRlc3RJbmplY3RvcihtQ29udGV4dCksIG1TZXJ2aWNlVGhyZWFkUnVsZS5nZXRUaHJlYWQoKSk7CisgICAgICAgIHJlYWxBbXMubUFjdGl2aXR5VGFza01hbmFnZXIgPSBuZXcgQWN0aXZpdHlUYXNrTWFuYWdlclNlcnZpY2UobUNvbnRleHQpOworICAgICAgICByZWFsQW1zLm1BY3Rpdml0eVRhc2tNYW5hZ2VyLmluaXRpYWxpemUobnVsbCwgbnVsbCwgbUNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKKyAgICAgICAgcmVhbEFtcy5tQXRtSW50ZXJuYWwgPSBzcHkocmVhbEFtcy5tQWN0aXZpdHlUYXNrTWFuYWdlci5nZXRBdG1JbnRlcm5hbCgpKTsKKyAgICAgICAgcmVhbEFtcy5tT29tQWRqdXN0ZXIubUNhY2hlZEFwcE9wdGltaXplciA9IHNweShyZWFsQW1zLm1Pb21BZGp1c3Rlci5tQ2FjaGVkQXBwT3B0aW1pemVyKTsKKyAgICAgICAgcmVhbEFtcy5tUGFja2FnZU1hbmFnZXJJbnQgPSBtUGFja2FnZU1hbmFnZXJJbnQ7CisgICAgICAgIHJlYWxBbXMubVVzYWdlU3RhdHNTZXJ2aWNlID0gbVVzYWdlU3RhdHNNYW5hZ2VySW50OworICAgICAgICByZWFsQW1zLm1Qcm9jZXNzZXNSZWFkeSA9IHRydWU7CisgICAgICAgIHJlYWxBbXMubUNvbnN0YW50cy5TRVJWSUNFX1RJTUVPVVQgPSBERUZBVUxUX1NFUlZJQ0VfVElNRU9VVDsKKyAgICAgICAgcmVhbEFtcy5tQ29uc3RhbnRzLlNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUID0gREVGQVVMVF9TRVJWSUNFX1RJTUVPVVQ7CisgICAgICAgIG1BbXMgPSBzcHkocmVhbEFtcyk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5yZW1vdmVTZXJ2aWNlRm9yVGVzdChEcm9wQm94TWFuYWdlckludGVybmFsLmNsYXNzKTsKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5yZW1vdmVTZXJ2aWNlRm9yVGVzdChQYWNrYWdlTWFuYWdlckludGVybmFsLmNsYXNzKTsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdCgpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJHdWFyZGVkQnkiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VUaW1lb3V0QW5kUHJvY2Vzc0tpbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHBpZCA9IDEyMzQ1OworICAgICAgICBmaW5hbCBpbnQgdWlkID0gMTAxMjM7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gImNvbS5leGFtcGxlLmZvbyI7CisgICAgICAgIGZpbmFsIFByb2Nlc3NSZWNvcmQgYXBwID0gbWFrZVByb2Nlc3NSZWNvcmQoCisgICAgICAgICAgICAgICAgcGlkLCAgICAgICAgICAgICAgICAgICAvLyBwaWQKKyAgICAgICAgICAgICAgICB1aWQsICAgICAgICAgICAgICAgICAgIC8vIHVpZAorICAgICAgICAgICAgICAgIHVpZCwgICAgICAgICAgICAgICAgICAgLy8gcGFja2FnZVVpZAorICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgLy8gZGVmaW5pbmdVaWQKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb25Hcm91cAorICAgICAgICAgICAgICAgIFBST0NFU1NfU1RBVEVfU0VSVklDRSwgLy8gcHJvY3N0YXRlCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvLyBwc3MKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIHJzcworICAgICAgICAgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc05hbWUKKyAgICAgICAgICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgIC8vIHBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgbUFtcyk7CisgICAgICAgIGFwcC5tYWtlQWN0aXZlKG1vY2soSUFwcGxpY2F0aW9uVGhyZWFkLmNsYXNzKSwgbUFtcy5tUHJvY2Vzc1N0YXRzKTsKKyAgICAgICAgbVByb2Nlc3NMaXN0LnVwZGF0ZUxydVByb2Nlc3NMb2NrZWQoYXBwLCBmYWxzZSwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgU2VydmljZVJlY29yZCBzciA9IHNweShTZXJ2aWNlUmVjb3JkLm5ld0VtcHR5SW5zdGFuY2VGb3JUZXN0KG1BbXMpKTsKKyAgICAgICAgZG9Ob3RoaW5nKCkud2hlbihzcikuZHVtcChhbnkoKSwgYW55U3RyaW5nKCkpOworICAgICAgICBzci5zdGFydFJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgIHNyLmV4ZWN1dGluZ1N0YXJ0ID0gbm93OworCisgICAgICAgIGFwcC5tU2VydmljZXMuc3RhcnRFeGVjdXRpbmdTZXJ2aWNlKHNyKTsKKyAgICAgICAgbUFjdGl2ZVNlcnZpY2VzLnNjaGVkdWxlU2VydmljZVRpbWVvdXRMb2NrZWQoYXBwKTsKKworICAgICAgICB2ZXJpZnkobUFjdGl2ZVNlcnZpY2VzLCB0aW1lb3V0KERFRkFVTFRfU0VSVklDRV9USU1FT1VUICogMikudGltZXMoMSkpCisgICAgICAgICAgICAgICAgLnNlcnZpY2VUaW1lb3V0KGVxKGFwcCkpOworCisgICAgICAgIGNsZWFySW52b2NhdGlvbnMobUFjdGl2ZVNlcnZpY2VzKTsKKworICAgICAgICBhcHAubVNlcnZpY2VzLnN0YXJ0RXhlY3V0aW5nU2VydmljZShzcik7CisgICAgICAgIG1BY3RpdmVTZXJ2aWNlcy5zY2hlZHVsZVNlcnZpY2VUaW1lb3V0TG9ja2VkKGFwcCk7CisKKyAgICAgICAgYXBwLmtpbGxMb2NrZWQoVEFHLCA0MiwgZmFsc2UpOworICAgICAgICBtQW1zLnJlbW92ZUxydVByb2Nlc3NMb2NrZWQoYXBwKTsKKworICAgICAgICB2ZXJpZnkobUFjdGl2ZVNlcnZpY2VzLCBhZnRlcihERUZBVUxUX1NFUlZJQ0VfVElNRU9VVCAqIDQpCisgICAgICAgICAgICAgICAgLnRpbWVzKDEpKS5zZXJ2aWNlVGltZW91dChlcShhcHApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RJbmplY3RvciBleHRlbmRzIEluamVjdG9yIHsKKyAgICAgICAgVGVzdEluamVjdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFwcE9wc1NlcnZpY2UgZ2V0QXBwT3BzU2VydmljZShGaWxlIHJlY2VudEFjY2Vzc2VzRmlsZSwgRmlsZSBzdG9yYWdlRmlsZSwKKyAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXBwT3BzU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSGFuZGxlciBnZXRVaUhhbmRsZXIoQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gbUhhbmRsZXJUaHJlYWQuZ2V0VGhyZWFkSGFuZGxlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcm9jZXNzTGlzdCBnZXRQcm9jZXNzTGlzdChBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvY2Vzc0xpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGl2ZVNlcnZpY2VzIGdldEFjdGl2ZVNlcnZpY2VzKEFjdGl2aXR5TWFuYWdlclNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmVTZXJ2aWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVNlcnZpY2VzID0gc3B5KG5ldyBBY3RpdmVTZXJ2aWNlcyhzZXJ2aWNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVNlcnZpY2VzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2NoZWR1bGVyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNjaGVkdWxlclNlcnZpY2VUZXN0LmphdmEKaW5kZXggOGI0MjBhMy4uZTA1NjQxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2NoZWR1bGVyU2VydmljZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC01MCw2ICs1MCw3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYkluZm87CiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlBhcmFtZXRlcnM7CiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iV29ya0l0ZW07CiBpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuVXNhZ2VTdGF0c01hbmFnZXJJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTkxLDYgKzkyLDcgQEAKIAogcHVibGljIGNsYXNzIEpvYlNjaGVkdWxlclNlcnZpY2VUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gSm9iU2NoZWR1bGVyU2VydmljZVRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1VJRCA9IDEwMTIzOwogCiAgICAgcHJpdmF0ZSBKb2JTY2hlZHVsZXJTZXJ2aWNlIG1TZXJ2aWNlOwogCkBAIC0xNzcsNiArMTc5LDkgQEAKICAgICAgICAgaWYgKG1Nb2NraW5nU2Vzc2lvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTW9ja2luZ1Nlc3Npb24uZmluaXNoTW9ja2luZygpOwogICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLmNhbmNlbEpvYnNGb3JVaWQoVEVTVF9VSUQsIHRydWUsCisgICAgICAgICAgICAgICAgSm9iUGFyYW1ldGVycy5TVE9QX1JFQVNPTl9VTkRFRklORUQsIEpvYlBhcmFtZXRlcnMuSU5URVJOQUxfU1RPUF9SRUFTT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAidGVzdCBjbGVhbnVwIik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBDbG9jayBnZXRBZHZhbmNlZENsb2NrKENsb2NrIGNsb2NrLCBsb25nIGluY3JlbWVudE1zKSB7CkBAIC0yNTcsOSArMjYyLDkgQEAKICAgICAgICAgQ29ubmVjdGl2aXR5Q29udHJvbGxlciBjb25uZWN0aXZpdHlDb250cm9sbGVyID0gbVNlcnZpY2UuZ2V0Q29ubmVjdGl2aXR5Q29udHJvbGxlcigpOwogICAgICAgICBzcHlPbihjb25uZWN0aXZpdHlDb250cm9sbGVyKTsKICAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9HVUFSQU5URUVfTVMgPSAxMCAqIE1JTlVURV9JTl9NSUxMSVM7Ci0gICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9IDEuNWY7Ci0gICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPSBIT1VSX0lOX01JTExJUzsKLSAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPSA2ICogSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9IDEuNWY7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPSA2ICogSE9VUl9JTl9NSUxMSVM7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1pbkpvYkV4ZWN1dGlvbkd1YXJhbnRlZU1zKGVqTWF4KSk7CkBAIC0yNzksMjYgKzI4NCwyNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0TWluSm9iRXhlY3V0aW9uR3VhcmFudGVlTXMoam9iVUlEVCkpOwogICAgICAgICBncmFudFJ1blVzZXJJbml0aWF0ZWRKb2JzUGVybWlzc2lvbih0cnVlKTsgLy8gV2l0aCBwZXJtaXNzaW9uCi0gICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAorICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRNaW5Kb2JFeGVjdXRpb25HdWFyYW50ZWVNcyhqb2JVSURUKSk7CiAgICAgICAgIGRvUmV0dXJuKENvbm5lY3Rpdml0eUNvbnRyb2xsZXIuVU5LTk9XTl9USU1FKQogICAgICAgICAgICAgICAgIC53aGVuKGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIpLmdldEVzdGltYXRlZFRyYW5zZmVyVGltZU1zKGFueSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1pbkpvYkV4ZWN1dGlvbkd1YXJhbnRlZU1zKGpvYlVJRFQpKTsKLSAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyAvIDIpCisgICAgICAgIGRvUmV0dXJuKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgLyAyKQogICAgICAgICAgICAgICAgIC53aGVuKGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIpLmdldEVzdGltYXRlZFRyYW5zZmVyVGltZU1zKGFueSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1pbkpvYkV4ZWN1dGlvbkd1YXJhbnRlZU1zKGpvYlVJRFQpKTsKLSAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyAqIDIpCisgICAgICAgIGRvUmV0dXJuKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgKiAyKQogICAgICAgICAgICAgICAgIC53aGVuKGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIpLmdldEVzdGltYXRlZFRyYW5zZmVyVGltZU1zKGFueSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgIChsb25nKSAobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUworICAgICAgICAgICAgICAgIChsb25nKSAobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUwogICAgICAgICAgICAgICAgICAgICAgICAgKiAyICogbVNlcnZpY2UubUNvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SKSwKICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRNaW5Kb2JFeGVjdXRpb25HdWFyYW50ZWVNcyhqb2JVSURUKSk7Ci0gICAgICAgIGRvUmV0dXJuKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TICogMikKKyAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgKiAyKQogICAgICAgICAgICAgICAgIC53aGVuKGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIpLmdldEVzdGltYXRlZFRyYW5zZmVyVGltZU1zKGFueSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TLAorICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCiAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0TWluSm9iRXhlY3V0aW9uR3VhcmFudGVlTXMoam9iVUlEVCkpOwogICAgIH0KIApAQCAtMzIwLDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgLndoZW4ocXVvdGFDb250cm9sbGVyKS5nZXRNYXhKb2JFeGVjdXRpb25UaW1lTXNMb2NrZWQoYW55KCkpOwogCiAgICAgICAgIGdyYW50UnVuVXNlckluaXRpYXRlZEpvYnNQZXJtaXNzaW9uKHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCisgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRNYXhKb2JFeGVjdXRpb25UaW1lTXMoam9iVUlEVCkpOwogICAgICAgICBncmFudFJ1blVzZXJJbml0aWF0ZWRKb2JzUGVybWlzc2lvbihmYWxzZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMsCkBAIC0xMTcwLDcgKzExNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBpIDwgMzAwID8gSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTIDogSm9iU2NoZWR1bGVyLlJFU1VMVF9GQUlMVVJFOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgdW5leHBlY3RlZCByZXN1bHQgZm9yIHNjaGVkdWxlICMiICsgKGkgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgMTAxMjMsIG51bGwsIDAsICJKU1NUZXN0IiwgIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCBURVNUX1VJRCwgbnVsbCwgMCwgIkpTU1Rlc3QiLCAiIikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTkxLDcgKzExOTYsNyBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB1bmV4cGVjdGVkIHJlc3VsdCBmb3Igc2NoZWR1bGUgIyIgKyAoaSArIDEpLAogICAgICAgICAgICAgICAgICAgICBKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgMTAxMjMsIG51bGwsIDAsICJKU1NUZXN0IiwgIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCBURVNUX1VJRCwgbnVsbCwgMCwgIkpTU1Rlc3QiLCAiIikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjEyLDcgKzEyMTcsNyBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB1bmV4cGVjdGVkIHJlc3VsdCBmb3Igc2NoZWR1bGUgIyIgKyAoaSArIDEpLAogICAgICAgICAgICAgICAgICAgICBKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgMTAxMjMsICJwcm94aWVkLnBhY2thZ2UiLCAwLCAiSlNTVGVzdCIsCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgVEVTVF9VSUQsICJwcm94aWVkLnBhY2thZ2UiLCAwLCAiSlNTVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyMzYsMTEgKzEyNDEsNjMgQEAKICAgICAgICAgICAgICAgICAgICAgaSA8IDMwMCA/IEpvYlNjaGVkdWxlci5SRVNVTFRfU1VDQ0VTUyA6IEpvYlNjaGVkdWxlci5SRVNVTFRfRkFJTFVSRTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiR290IHVuZXhwZWN0ZWQgcmVzdWx0IGZvciBzY2hlZHVsZSAjIiArIChpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zY2hlZHVsZUFzUGFja2FnZShqb2IsIG51bGwsIDEwMTIzLCBqb2IuZ2V0U2VydmljZSgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgVEVTVF9VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLmdldFNlcnZpY2UoKS5nZXRQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJKU1NUZXN0IiwgIiIpKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG51bWJlciBvZiBwZXJzaXN0ZWQgSm9iV29ya0l0ZW1zIGlzIGNhcHBlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZUxpbWl0aW5nX0pvYldvcmtJdGVtc19Ob25wZXJzaXN0ZWQoKSB7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMgPSA1MDA7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuRU5BQkxFX0FQSV9RVU9UQVMgPSBmYWxzZTsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5BUElfUVVPVEFfU0NIRURVTEVfVEhST1dfRVhDRVBUSU9OID0gZmFsc2U7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuQVBJX1FVT1RBX1NDSEVEVUxFX1JFVFVSTl9GQUlMVVJFX1JFU1VMVCA9IGZhbHNlOworICAgICAgICBtU2VydmljZS51cGRhdGVRdW90YVRyYWNrZXIoKTsKKworICAgICAgICBmaW5hbCBKb2JJbmZvIGpvYiA9IGNyZWF0ZUpvYkluZm8oKS5zZXRQZXJzaXN0ZWQoZmFsc2UpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEpvYldvcmtJdGVtIGl0ZW0gPSBuZXcgSm9iV29ya0l0ZW0uQnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB1bmV4cGVjdGVkIHJlc3VsdCBmb3Igc2NoZWR1bGUgIyIgKyAoaSArIDEpLAorICAgICAgICAgICAgICAgICAgICBKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgaXRlbSwgVEVTVF9VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLmdldFNlcnZpY2UoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJKU1NUZXN0IiwgIiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG51bWJlciBvZiBwZXJzaXN0ZWQgSm9iV29ya0l0ZW1zIGlzIGNhcHBlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZUxpbWl0aW5nX0pvYldvcmtJdGVtc19QZXJzaXN0ZWQoKSB7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMgPSA1MDA7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuRU5BQkxFX0FQSV9RVU9UQVMgPSBmYWxzZTsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5BUElfUVVPVEFfU0NIRURVTEVfVEhST1dfRVhDRVBUSU9OID0gZmFsc2U7CisgICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuQVBJX1FVT1RBX1NDSEVEVUxFX1JFVFVSTl9GQUlMVVJFX1JFU1VMVCA9IGZhbHNlOworICAgICAgICBtU2VydmljZS51cGRhdGVRdW90YVRyYWNrZXIoKTsKKworICAgICAgICBmaW5hbCBKb2JJbmZvIGpvYiA9IGNyZWF0ZUpvYkluZm8oKS5zZXRQZXJzaXN0ZWQodHJ1ZSkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSm9iV29ya0l0ZW0gaXRlbSA9IG5ldyBKb2JXb3JrSXRlbS5CdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgdW5leHBlY3RlZCByZXN1bHQgZm9yIHNjaGVkdWxlICMiICsgKGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTLAorICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zY2hlZHVsZUFzUGFja2FnZShqb2IsIGl0ZW0sIFRFU1RfVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYi5nZXRTZXJ2aWNlKCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiSlNTVGVzdCIsICIiKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgaXRlbSwgVEVTVF9VSUQsIGpvYi5nZXRTZXJ2aWNlKCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgMCwgIkpTU1Rlc3QiLCAiIik7CisgICAgICAgICAgICBmYWlsKCJBZGRlZCBtb3JlIGl0ZW1zIHRoYW4gYWxsb3dlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBUZXN0cyB0aGF0IGpvYnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGlmIHRoZSB1c2VyIHN0b3BzIHRoZSBhcHAuICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlclN0b3BSZW1vdmVzUGVuZGluZygpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclZpc2liaWxpdHlNZWRpYXRvclRlc3RDYXNlLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3JUZXN0Q2FzZS5qYXZhCmluZGV4IDIzOWI2ZmQuLjcwYjVhYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclZpc2liaWxpdHlNZWRpYXRvclRlc3RDYXNlLmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yVGVzdENhc2UuamF2YQpAQCAtNTk2LDYgKzU5Niw3IEBACiAgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLmFzc2lnblVzZXJUb0V4dHJhRGlzcGxheSh1c2VySWQsIGRpc3BsYXlJZCkpCiAgICAgICAgICAgICAgICAgLmlzVHJ1ZSgpOwogICAgICAgICBleHBlY3RVc2VySXNWaXNpYmxlT25EaXNwbGF5KHVzZXJJZCwgZGlzcGxheUlkKTsKKyAgICAgICAgZXhwZWN0RGlzcGxheXNBc3NpZ25lZFRvVXNlckNvbnRhaW5zRGlzcGxheUlkKHVzZXJJZCwgZGlzcGxheUlkKTsKIAogICAgICAgICBpZiAodW5hc3NpZ24pIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIkNhbGxpbmcgdW5hc3NpZ25Vc2VyRnJvbUV4dHJhRGlzcGxheSgiICsgdXNlcklkICsgIiwgIiArIGRpc3BsYXlJZCArICIpIik7CkBAIC02MDMsNiArNjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLnVuYXNzaWduVXNlckZyb21FeHRyYURpc3BsYXkodXNlcklkLCBkaXNwbGF5SWQpKQogICAgICAgICAgICAgICAgICAgICAuaXNUcnVlKCk7CiAgICAgICAgICAgICBleHBlY3RVc2VySXNOb3RWaXNpYmxlT25EaXNwbGF5KHVzZXJJZCwgZGlzcGxheUlkKTsKKyAgICAgICAgICAgIGV4cGVjdERpc3BsYXlzQXNzaWduZWRUb1VzZXJEb2VzTm90Q29udGFpbkRpc3BsYXlJZCh1c2VySWQsIGRpc3BsYXlJZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY2OCw2ICs2NzAsNyBAQAogICAgICAgICBleHBlY3RVc2VySXNOb3RWaXNpYmxlT25EaXNwbGF5KHVzZXJJZCwgSU5WQUxJRF9ESVNQTEFZKTsKICAgICAgICAgZXhwZWN0VXNlcklzTm90VmlzaWJsZU9uRGlzcGxheSh1c2VySWQsIFNFQ09OREFSWV9ESVNQTEFZX0lEKTsKICAgICAgICAgZXhwZWN0VXNlcklzTm90VmlzaWJsZU9uRGlzcGxheSh1c2VySWQsIE9USEVSX1NFQ09OREFSWV9ESVNQTEFZX0lEKTsKKyAgICAgICAgZXhwZWN0RGlzcGxheXNBc3NpZ25lZFRvVXNlcklzRW1wdHkodXNlcklkKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3REaXNwbGF5QXNzaWduZWRUb1VzZXIoQFVzZXJJZEludCBpbnQgdXNlcklkLCBpbnQgZGlzcGxheUlkKSB7CkBAIC02ODAsNiArNjgzLDI0IEBACiAgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLmdldERpc3BsYXlBc3NpZ25lZFRvVXNlcih1c2VySWQpKS5pc0VxdWFsVG8oSU5WQUxJRF9ESVNQTEFZKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3REaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyQ29udGFpbnNEaXNwbGF5SWQoCisgICAgICAgICAgICBAVXNlcklkSW50IGludCB1c2VySWQsIGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgZXhwZWN0V2l0aE1lc3NhZ2UoImdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoJXMpIiwgdXNlcklkKQorICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci5nZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKHVzZXJJZCkpLmFzTGlzdCgpLmNvbnRhaW5zKGRpc3BsYXlJZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0RGlzcGxheXNBc3NpZ25lZFRvVXNlckRvZXNOb3RDb250YWluRGlzcGxheUlkKAorICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkLCBpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIGV4cGVjdFdpdGhNZXNzYWdlKCJnZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKCVzKSIsIHVzZXJJZCkKKyAgICAgICAgICAgICAgICAudGhhdChtTWVkaWF0b3IuZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlcih1c2VySWQpKS5hc0xpc3QoKQorICAgICAgICAgICAgICAgIC5kb2VzTm90Q29udGFpbihkaXNwbGF5SWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4cGVjdERpc3BsYXlzQXNzaWduZWRUb1VzZXJJc0VtcHR5KEBVc2VySWRJbnQgaW50IHVzZXJJZCkgeworICAgICAgICBleHBlY3RXaXRoTWVzc2FnZSgiZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlciglcykiLCB1c2VySWQpCisgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLmdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIodXNlcklkKSkuaXNOdWxsKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0VXNlckNhbm5vdEJlVW5hc3NpZ25lZEZyb21EaXNwbGF5KEBVc2VySWRJbnQgaW50IHVzZXJJZCwgaW50IGRpc3BsYXlJZCkgewogICAgICAgICBleHBlY3RXaXRoTWVzc2FnZSgidW5hc3NpZ25Vc2VyRnJvbUV4dHJhRGlzcGxheSglcywgJXMpIiwgdXNlcklkLCBkaXNwbGF5SWQpCiAgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLnVuYXNzaWduVXNlckZyb21FeHRyYURpc3BsYXkodXNlcklkLCBkaXNwbGF5SWQpKS5pc0ZhbHNlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvU2NyaWJlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci90YXJlL1NjcmliZVRlc3QuamF2YQppbmRleCA3MTI4MGNlLi5lODFiNjNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvU2NyaWJlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9TY3JpYmVUZXN0LmphdmEKQEAgLTQwMyw2ICs0MDMsNyBAQAogICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvID0gbmV3IEFwcGxpY2F0aW9uSW5mbygpOwogICAgICAgICBhcHBsaWNhdGlvbkluZm8udWlkID0gVXNlckhhbmRsZS5nZXRVaWQodXNlcklkLCBNYXRoLmFicyhwa2dOYW1lLmhhc2hDb2RlKCkpKTsKICAgICAgICAgcGtnSW5mby5hcHBsaWNhdGlvbkluZm8gPSBhcHBsaWNhdGlvbkluZm87Ci0gICAgICAgIG1JbnN0YWxsZWRQYWNrYWdlcy5hZGQodXNlcklkLCBwa2dOYW1lLCBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCBwa2dJbmZvKSk7CisgICAgICAgIG1JbnN0YWxsZWRQYWNrYWdlcy5hZGQodXNlcklkLCBwa2dOYW1lLCBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCB1c2VySWQsCisgICAgICAgICAgICAgICAgcGtnSW5mbykpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY29tcGFuaW9uL3ZpcnR1YWwvSW5wdXRDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDc2NDJlN2IuLjZjNmI2MDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2NvbXBhbmlvbi92aXJ0dWFsL0lucHV0Q29udHJvbGxlclRlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JSW5wdXRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyR2xvYmFsOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgICAgICBkZXZpY2UxSWQpLmlzTm90RXF1YWxUbyhkZXZpY2UySWQpOwogCiAKLSAgICAgICAgaW50W10gZGV2aWNlSWRzID0gSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgaW50W10gZGV2aWNlSWRzID0gSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIklucHV0TWFuYWdlcidzIGRldmljZUlkcyBsaXN0IHNob3VsZCBjb250YWluIGlkIG9mIGRldmljZSAxIikudGhhdCgKICAgICAgICAgICAgICAgICBkZXZpY2VJZHMpLmFzTGlzdCgpLmNvbnRhaW5zKGRldmljZTFJZCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJJbnB1dE1hbmFnZXIncyBkZXZpY2VJZHMgbGlzdCBzaG91bGQgY29udGFpbiBpZCBvZiBkZXZpY2UgMiIpLnRoYXQoCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgICAgICAgICBkZXZpY2VUb2tlbiwgLyogZGlzcGxheUlkPSAqLyAxLCAvKiB0b3VjaHBhZEhlaWdodD0gKi8gNTAsIC8qIHRvdWNocGFkV2lkdGg9ICovIDUwKTsKIAogICAgICAgICBpbnQgZGV2aWNlSWQgPSBtSW5wdXRDb250cm9sbGVyLmdldElucHV0RGV2aWNlSWQoZGV2aWNlVG9rZW4pOwotICAgICAgICBpbnRbXSBkZXZpY2VJZHMgPSBJbnB1dE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZUlkcygpOworICAgICAgICBpbnRbXSBkZXZpY2VJZHMgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZUlkcygpOwogCiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJJbnB1dE1hbmFnZXIncyBkZXZpY2VJZHMgbGlzdCBzaG91bGQgY29udGFpbiBpZCBvZiB0aGUgZGV2aWNlIikudGhhdCgKICAgICAgICAgICAgIGRldmljZUlkcykuYXNMaXN0KCkuY29udGFpbnMoZGV2aWNlSWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggODE5NmQ2YS4uZTM5NjI2MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lUSE9VVF9OT1RJRklDQVRJT04gPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9XSVRIX0FDVElWRV9OT1RJRklDQVRJT04gPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9XSVRIX0FDVElWRV9BTkRfVEhFUk1BTF9OT1RJRklDQVRJT04gPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04gPSAzOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTElEX0FQUF9VSUQgPSAxMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FQUF9VSUQgPSAyMDAwOwpAQCAtNjgsNiArNjgsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UXzIgPSAiY29udGVudDI6JTEkcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVJNQUxfVElUTEVfMiA9ICJ0aGVybWFsX3RpdGxlMiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVJNQUxfQ09OVEVOVF8yID0gInRoZXJtYWxfY29udGVudDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1dFUl9TQVZFX1RJVExFXzIgPSAicG93ZXJfc2F2ZV90aXRsZTIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1dFUl9TQVZFX0NPTlRFTlRfMiA9ICJwb3dlcl9zYXZlX2NvbnRlbnQyIjsKIAogICAgIHByaXZhdGUgRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyIG1Db250cm9sbGVyOwogCkBAIC04OCwxMSArOTAsMTIgQEAKICAgICAgICAgbm90aWZpY2F0aW9uSW5mb3MucHV0KFNUQVRFX1dJVEhfQUNUSVZFX05PVElGSUNBVElPTiwKICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5vdGlmaWNhdGlvbkluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FXzEsIFRJVExFXzEsIENPTlRFTlRfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIikpOwotICAgICAgICBub3RpZmljYXRpb25JbmZvcy5wdXQoU1RBVEVfV0lUSF9BQ1RJVkVfQU5EX1RIRVJNQUxfTk9USUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIpKTsKKyAgICAgICAgbm90aWZpY2F0aW9uSW5mb3MucHV0KFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTiwKICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5vdGlmaWNhdGlvbkluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FXzIsIFRJVExFXzIsIENPTlRFTlRfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIRVJNQUxfVElUTEVfMiwgVEhFUk1BTF9DT05URU5UXzIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIRVJNQUxfVElUTEVfMiwgVEhFUk1BTF9DT05URU5UXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TQVZFX1RJVExFXzIsIFBPV0VSX1NBVkVfQ09OVEVOVF8yKSk7CiAKICAgICAgICAgd2hlbihwYWNrYWdlTWFuYWdlci5nZXROYW1lRm9yVWlkKFZBTElEX0FQUF9VSUQpKS50aGVuUmV0dXJuKFZBTElEX0FQUF9OQU1FKTsKICAgICAgICAgd2hlbihwYWNrYWdlTWFuYWdlci5nZXROYW1lRm9yVWlkKElOVkFMSURfQVBQX1VJRCkpLnRoZW5SZXR1cm4oSU5WQUxJRF9BUFBfTkFNRSk7CkBAIC0xMzksMTAgKzE0Miw0NiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdF9wb3dlclNhdmVOb3RpZmljYXRpb24oKSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhY3RpdmUgbm90aWZpY2F0aW9uIGlzIGNyZWF0ZWQuCisgICAgICAgIG1Db250cm9sbGVyLnNob3dTdGF0ZUFjdGl2ZU5vdGlmaWNhdGlvbklmTmVlZGVkKAorICAgICAgICAgICAgICAgIFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTiwgVkFMSURfQVBQX1VJRCk7CisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uTWFuYWdlcikubm90aWZ5KAorICAgICAgICAgICAgICAgIGVxKERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fVEFHKSwKKyAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX0lEKSwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2FwdG9yLmNhcHR1cmUoKSk7CisgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBtTm90aWZpY2F0aW9uQ2FwdG9yLmdldFZhbHVlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhUSVRMRV8yLCBub3RpZmljYXRpb24uZXh0cmFzLmdldFN0cmluZyhOb3RpZmljYXRpb24uRVhUUkFfVElUTEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoQ09OVEVOVF8yLCBWQUxJRF9BUFBfTEFCRUwpLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5leHRyYXMuZ2V0U3RyaW5nKE5vdGlmaWNhdGlvbi5FWFRSQV9URVhUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5ULAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOworICAgICAgICBNb2NraXRvLmNsZWFySW52b2NhdGlvbnMobU5vdGlmaWNhdGlvbk1hbmFnZXIpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB0aGVybWFsIGNyaXRpY2FsIG5vdGlmaWNhdGlvbiBpcyBjcmVhdGVkLgorICAgICAgICBtQ29udHJvbGxlci5zaG93UG93ZXJTYXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoCisgICAgICAgICAgICAgICAgU1RBVEVfV0lUSF9BTExfTk9USUZJQ0FUSU9OKTsKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25NYW5hZ2VyKS5ub3RpZnkoCisgICAgICAgICAgICAgICAgZXEoRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9UQUcpLAorICAgICAgICAgICAgICAgIGVxKERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fSUQpLAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25DYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgbm90aWZpY2F0aW9uID0gbU5vdGlmaWNhdGlvbkNhcHRvci5nZXRWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUE9XRVJfU0FWRV9USVRMRV8yLCBub3RpZmljYXRpb24uZXh0cmFzLmdldFN0cmluZyhOb3RpZmljYXRpb24uRVhUUkFfVElUTEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBPV0VSX1NBVkVfQ09OVEVOVF8yLCBub3RpZmljYXRpb24uZXh0cmFzLmdldFN0cmluZyhOb3RpZmljYXRpb24uRVhUUkFfVEVYVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5vdGlmaWNhdGlvbiBpcyBjYW5jZWxlZC4KKyAgICAgICAgbUNvbnRyb2xsZXIuY2FuY2VsTm90aWZpY2F0aW9uKFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTik7CisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uTWFuYWdlcikuY2FuY2VsKAorICAgICAgICAgICAgICAgIERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fVEFHLAorICAgICAgICAgICAgICAgIERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fSUQpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdF90aGVybWFsTm90aWZpY2F0aW9uKCkgewogICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYWN0aXZlIG5vdGlmaWNhdGlvbiBpcyBjcmVhdGVkLgogICAgICAgICBtQ29udHJvbGxlci5zaG93U3RhdGVBY3RpdmVOb3RpZmljYXRpb25JZk5lZWRlZCgKLSAgICAgICAgICAgICAgICBTVEFURV9XSVRIX0FDVElWRV9BTkRfVEhFUk1BTF9OT1RJRklDQVRJT04sIFZBTElEX0FQUF9VSUQpOworICAgICAgICAgICAgICAgIFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTiwgVkFMSURfQVBQX1VJRCk7CiAgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uTWFuYWdlcikubm90aWZ5KAogICAgICAgICAgICAgICAgIGVxKERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fVEFHKSwKICAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX0lEKSwKQEAgLTE1Nyw3ICsxOTYsNyBAQAogCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB0aGVybWFsIGNyaXRpY2FsIG5vdGlmaWNhdGlvbiBpcyBjcmVhdGVkLgogICAgICAgICBtQ29udHJvbGxlci5zaG93VGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uSWZOZWVkZWQoCi0gICAgICAgICAgICAgICAgU1RBVEVfV0lUSF9BQ1RJVkVfQU5EX1RIRVJNQUxfTk9USUZJQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICBTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04pOwogICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbk1hbmFnZXIpLm5vdGlmeSgKICAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX1RBRyksCiAgICAgICAgICAgICAgICAgZXEoRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9JRCksCkBAIC0xNjgsNyArMjA3LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOwogCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgY2FuY2VsZWQuCi0gICAgICAgIG1Db250cm9sbGVyLmNhbmNlbE5vdGlmaWNhdGlvbihTVEFURV9XSVRIX0FDVElWRV9OT1RJRklDQVRJT04pOworICAgICAgICBtQ29udHJvbGxlci5jYW5jZWxOb3RpZmljYXRpb24oU1RBVEVfV0lUSF9BTExfTk9USUZJQ0FUSU9OKTsKICAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25NYW5hZ2VyKS5jYW5jZWwoCiAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9UQUcsCiAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9JRCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L0RldmljZVN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BvbGljeS9EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbFRlc3QuamF2YQppbmRleCA3MTI1Nzk2Li43ZTQwZjk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L0RldmljZVN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGxUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDggQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuU0VOU09SX1NFUlZJQ0U7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLkRldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9JTklUSUFMSVpFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLkRldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGUuRGV2aWNlU3RhdGVQcm92aWRlci5TVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRU5BQkxFRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLkRldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX0NSSVRJQ0FMOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGUuRGV2aWNlU3RhdGVQcm92aWRlci5TVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1RIRVJNQUxfTk9STUFMOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIucG9saWN5LkRldmljZVN0YXRlUHJvdmlkZXJJbXBsLkRFRkFVTFRfREVWSUNFX1NUQVRFOwpAQCAtMzI3LDcgKzMyOSw4IEBACiAgICAgICAgICAgICAgICAgKyAiICAgICAgICA8bmFtZT5USEVSTUFMX1RFU1Q8L25hbWU+XG4iCiAgICAgICAgICAgICAgICAgKyAiICAgICAgICA8ZmxhZ3M+XG4iCiAgICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgPGZsYWc+RkxBR19FTVVMQVRFRF9PTkxZPC9mbGFnPlxuIgotICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxmbGFnPkZMQUdfRElTQUJMRV9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMPC9mbGFnPlxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxmbGFnPkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTDwvZmxhZz5cbiIKKyAgICAgICAgICAgICAgICArICIgICAgICAgICAgICA8ZmxhZz5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFPC9mbGFnPlxuIgogICAgICAgICAgICAgICAgICsgIiAgICAgICAgPC9mbGFncz5cbiIKICAgICAgICAgICAgICAgICArICIgICAgPC9kZXZpY2Utc3RhdGU+XG4iCiAgICAgICAgICAgICAgICAgKyAiPC9kZXZpY2Utc3RhdGUtY29uZmlnPlxuIjsKQEAgLTM1NCw3ICszNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDMsICJPUEVORUQiLCAwIC8qIGZsYWdzICovKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSg0LCAiVEhFUk1BTF9URVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19FTVVMQVRFRF9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX0RJU0FCTEVfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSkgfSwKICAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5nZXRWYWx1ZSgpKTsKICAgICAgICAgLy8gb25TdGF0ZUNoYW5nZWQoKSBzaG91bGQgbm90IGJlIGNhbGxlZCBiZWNhdXNlIHRoZSBwcm92aWRlciBoYXMgbm90IHlldCBiZWVuIG5vdGlmaWVkIG9mCiAgICAgICAgIC8vIHRoZSBpbml0aWFsIHNlbnNvciBzdGF0ZS4KQEAgLTQxOSw3ICs0MjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDMsICJPUEVORUQiLCAwIC8qIGZsYWdzICovKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSg0LCAiVEhFUk1BTF9URVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19FTVVMQVRFRF9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX0RJU0FCTEVfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSkgfSwKICAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5nZXRWYWx1ZSgpKTsKICAgICAgICAgTW9ja2l0by5jbGVhckludm9jYXRpb25zKGxpc3RlbmVyKTsKIApAQCAtNDUxLDcgKzQ1Niw2NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDMsICJPUEVORUQiLCAwIC8qIGZsYWdzICovKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSg0LCAiVEhFUk1BTF9URVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19FTVVMQVRFRF9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX0RJU0FCTEVfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSkgfSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZmxhZ0Rpc2FibGVXaGVuUG93ZXJTYXZlRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZW5zb3Igc2Vuc29yID0gbmV3U2Vuc29yKCJzZW5zb3IiLCBTZW5zb3IuU1RSSU5HX1RZUEVfSElOR0VfQU5HTEUpOworICAgICAgICB3aGVuKG1TZW5zb3JNYW5hZ2VyLmdldFNlbnNvckxpc3QoYW55SW50KCkpKS50aGVuUmV0dXJuKExpc3Qub2Yoc2Vuc29yKSk7CisgICAgICAgIERldmljZVN0YXRlUHJvdmlkZXJJbXBsIHByb3ZpZGVyID0gY3JlYXRlX3NlbnNvckJhc2VkUHJvdmlkZXIoc2Vuc29yKTsKKworICAgICAgICBwcm92aWRlci5vblBvd2VyU2F2ZU1vZGVDaGFuZ2VkKGZhbHNlIC8qIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQgKi8pOworICAgICAgICBEZXZpY2VTdGF0ZVByb3ZpZGVyLkxpc3RlbmVyIGxpc3RlbmVyID0gbW9jayhEZXZpY2VTdGF0ZVByb3ZpZGVyLkxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgcHJvdmlkZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIHZlcmlmeShsaXN0ZW5lcikub25TdXBwb3J0ZWREZXZpY2VTdGF0ZXNDaGFuZ2VkKG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmNhcHR1cmUoKSwKKyAgICAgICAgICAgICAgICBlcShTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0lOSVRJQUxJWkVEKSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZVtdeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDEsICJDTE9TRUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgyLCAiSEFMRl9PUEVORUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoNCwgIlRIRVJNQUxfVEVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfRU1VTEFURURfT05MWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFKSB9LAorICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmdldFZhbHVlKCkpOworICAgICAgICBNb2NraXRvLmNsZWFySW52b2NhdGlvbnMobGlzdGVuZXIpOworCisgICAgICAgIHByb3ZpZGVyLm9uUG93ZXJTYXZlTW9kZUNoYW5nZWQoZmFsc2UgLyogaXNQb3dlclNhdmVNb2RlRW5hYmxlZCAqLyk7CisgICAgICAgIHZlcmlmeShsaXN0ZW5lciwgbmV2ZXIoKSkub25TdXBwb3J0ZWREZXZpY2VTdGF0ZXNDaGFuZ2VkKG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmNhcHR1cmUoKSwKKyAgICAgICAgICAgICAgICBlcShTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0lOSVRJQUxJWkVEKSk7CisgICAgICAgIE1vY2tpdG8uY2xlYXJJbnZvY2F0aW9ucyhsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gVGhlIFRIRVJNQUxfVEVTVCBzdGF0ZSBzaG91bGQgYmUgZGlzYWJsZWQgZHVlIHRvIHBvd2VyIHNhdmUgYmVpbmcgZW5hYmxlZC4KKyAgICAgICAgcHJvdmlkZXIub25Qb3dlclNhdmVNb2RlQ2hhbmdlZCh0cnVlIC8qIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQgKi8pOworICAgICAgICB2ZXJpZnkobGlzdGVuZXIpLm9uU3VwcG9ydGVkRGV2aWNlU3RhdGVzQ2hhbmdlZChtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5jYXB0dXJlKCksCisgICAgICAgICAgICAgICAgZXEoU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQpKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlW117CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoMSwgIkNMT1NFRCIsIDAgLyogZmxhZ3MgKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDIsICJIQUxGX09QRU5FRCIsIDAgLyogZmxhZ3MgKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDMsICJPUEVORUQiLCAwIC8qIGZsYWdzICovKSB9LAorICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmdldFZhbHVlKCkpOworICAgICAgICBNb2NraXRvLmNsZWFySW52b2NhdGlvbnMobGlzdGVuZXIpOworCisgICAgICAgIC8vIFRoZSBUSEVSTUFMX1RFU1Qgc3RhdGUgc2hvdWxkIGJlIHJlLWVuYWJsZWQuCisgICAgICAgIHByb3ZpZGVyLm9uUG93ZXJTYXZlTW9kZUNoYW5nZWQoZmFsc2UgLyogaXNQb3dlclNhdmVNb2RlRW5hYmxlZCAqLyk7CisgICAgICAgIHZlcmlmeShsaXN0ZW5lcikub25TdXBwb3J0ZWREZXZpY2VTdGF0ZXNDaGFuZ2VkKG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmNhcHR1cmUoKSwKKyAgICAgICAgICAgICAgICBlcShTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRElTQUJMRUQpKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlW117CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoMSwgIkNMT1NFRCIsIDAgLyogZmxhZ3MgKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDIsICJIQUxGX09QRU5FRCIsIDAgLyogZmxhZ3MgKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDMsICJPUEVORUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSg0LCAiVEhFUk1BTF9URVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19FTVVMQVRFRF9PTkxZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpIH0sCiAgICAgICAgICAgICAgICAgbURldmljZVN0YXRlQXJyYXlDYXB0b3IuZ2V0VmFsdWUoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdmlicmF0b3IvSW5wdXREZXZpY2VEZWxlZ2F0ZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci92aWJyYXRvci9JbnB1dERldmljZURlbGVnYXRlVGVzdC5qYXZhCmluZGV4IDZlZGVmNzUuLjA3YjQzNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci92aWJyYXRvci9JbnB1dERldmljZURlbGVnYXRlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci92aWJyYXRvci9JbnB1dERldmljZURlbGVnYXRlVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSUlucHV0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlckdsb2JhbDsKIGltcG9ydCBhbmRyb2lkLm9zLkNvbWJpbmVkVmlicmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CkBAIC04Miw4ICs4Myw4IEBACiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1UZXN0TG9vcGVyID0gbmV3IFRlc3RMb29wZXIoKTsKLSAgICAgICAgbUNvbnRleHRTcHkgPSBzcHkobmV3IENvbnRleHRXcmFwcGVyKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSkpOwogICAgICAgICBJbnB1dE1hbmFnZXIgaW5wdXRNYW5hZ2VyID0gSW5wdXRNYW5hZ2VyLnJlc2V0SW5zdGFuY2UobUlJbnB1dE1hbmFnZXJNb2NrKTsKKyAgICAgICAgbUNvbnRleHRTcHkgPSBzcHkobmV3IENvbnRleHRXcmFwcGVyKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSkpOwogCiAgICAgICAgIHdoZW4obUNvbnRleHRTcHkuZ2V0U3lzdGVtU2VydmljZShlcShDb250ZXh0LklOUFVUX1NFUlZJQ0UpKSkudGhlblJldHVybihpbnB1dE1hbmFnZXIpOwogICAgICAgICBkb0Fuc3dlcihpbnZvY2F0aW9uIC0+IG1JSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudCgwKSkKQEAgLTMxNCw3ICszMTUsNyBAQAogICAgICAgICAgICAgZGV2aWNlSWRzQW5kR2VuZXJhdGlvbnNbaSArIDFdID0gMjsgLy8gdXBkYXRlIGJ5IGluY3JlYXNpbmcgaXQncyBnZW5lcmF0aW9uIHRvIDIuCiAgICAgICAgIH0KICAgICAgICAgLy8gRm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgbUlJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIsIGlmIGl0IHN0aWxsIGhhdmVuJ3QKLSAgICAgICAgSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKICAgICAgICAgbUlJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIub25JbnB1dERldmljZXNDaGFuZ2VkKGRldmljZUlkc0FuZEdlbmVyYXRpb25zKTsKICAgICAgICAgLy8gTWFrZXMgc3VyZSBhbGwgY2FsbGJhY2tzIGZyb20gSW5wdXREZXZpY2VEZWxlZ2F0ZSBhcmUgZXhlY3V0ZWQuCiAgICAgICAgIG1UZXN0TG9vcGVyLmRpc3BhdGNoQWxsKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy91aXNlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vQ29uZGl0aW9uUHJvdmlkZXJzVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRlZDAxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLm5vdGlmaWNhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLkNvbmRpdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5VaVNlcnZpY2VUZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBDb25kaXRpb25Qcm92aWRlcnNUZXN0IGV4dGVuZHMgVWlTZXJ2aWNlVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBDb25kaXRpb25Qcm92aWRlcnMgbVByb3ZpZGVyczsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBJUGFja2FnZU1hbmFnZXIgbUlwbTsKKyAgICBATW9jaworICAgIHByaXZhdGUgTWFuYWdlZFNlcnZpY2VzLlVzZXJQcm9maWxlcyBtVXNlclByb2ZpbGVzOworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBDb25kaXRpb25Qcm92aWRlcnMuQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCisgICAgICAgIG1Qcm92aWRlcnMgPSBuZXcgQ29uZGl0aW9uUHJvdmlkZXJzKG1Db250ZXh0LCBtVXNlclByb2ZpbGVzLCBtSXBtKTsKKyAgICAgICAgbVByb3ZpZGVycy5zZXRDYWxsYmFjayhtQ2FsbGJhY2spOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm90aWZ5Q29uZGl0aW9uc19maW5kQ29uZGl0aW9uKCkgeworICAgICAgICBDb21wb25lbnROYW1lIGNuID0gbmV3IENvbXBvbmVudE5hbWUoInBhY2thZ2UiLCAiY2xzIik7CisgICAgICAgIE1hbmFnZWRTZXJ2aWNlcy5NYW5hZ2VkU2VydmljZUluZm8gbXNpID0gbVByb3ZpZGVycy5uZXcgTWFuYWdlZFNlcnZpY2VJbmZvKAorICAgICAgICAgICAgICAgIG1vY2soSUludGVyZmFjZS5jbGFzcyksIGNuLCAwLCBmYWxzZSwgbW9jayhTZXJ2aWNlQ29ubmVjdGlvbi5jbGFzcyksIDMzLCAxMDApOworICAgICAgICBDb25kaXRpb25bXSBjb25kaXRpb25zID0gbmV3IENvbmRpdGlvbltdIHsKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYSIpLCAic3VtbWFyeSIsIENvbmRpdGlvbi5TVEFURV9UUlVFKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYiIpLCAic3VtbWFyeTIiLCBDb25kaXRpb24uU1RBVEVfVFJVRSkKKyAgICAgICAgfTsKKworICAgICAgICBtUHJvdmlkZXJzLm5vdGlmeUNvbmRpdGlvbnMoInBhY2thZ2UiLCBtc2ksIGNvbmRpdGlvbnMpOworCisgICAgICAgIGFzc2VydFRoYXQobVByb3ZpZGVycy5maW5kQ29uZGl0aW9uKGNuLCBVcmkucGFyc2UoImEiKSkpLmlzRXF1YWxUbyhjb25kaXRpb25zWzBdKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtUHJvdmlkZXJzLmZpbmRDb25kaXRpb24oY24sIFVyaS5wYXJzZSgiYiIpKSkuaXNFcXVhbFRvKGNvbmRpdGlvbnNbMV0pOworICAgICAgICBhc3NlcnRUaGF0KG1Qcm92aWRlcnMuZmluZENvbmRpdGlvbihudWxsLCBVcmkucGFyc2UoImEiKSkpLmlzTnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KG1Qcm92aWRlcnMuZmluZENvbmRpdGlvbihjbiwgbnVsbCkpLmlzTnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm90aWZ5Q29uZGl0aW9uc19jYWxsYmFja09uQ29uZGl0aW9uQ2hhbmdlZCgpIHsKKyAgICAgICAgTWFuYWdlZFNlcnZpY2VzLk1hbmFnZWRTZXJ2aWNlSW5mbyBtc2kgPSBtUHJvdmlkZXJzLm5ldyBNYW5hZ2VkU2VydmljZUluZm8oCisgICAgICAgICAgICAgICAgbW9jayhJSW50ZXJmYWNlLmNsYXNzKSwgbmV3IENvbXBvbmVudE5hbWUoInBhY2thZ2UiLCAiY2xzIiksIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgIG1vY2soU2VydmljZUNvbm5lY3Rpb24uY2xhc3MpLCAzMywgMTAwKTsKKyAgICAgICAgQ29uZGl0aW9uW10gY29uZGl0aW9uc1RvTm90aWZ5ID0gbmV3IENvbmRpdGlvbltdIHsKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYSIpLCAic3VtbWFyeSIsIENvbmRpdGlvbi5TVEFURV9UUlVFKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYiIpLCAic3VtbWFyeTIiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImMiKSwgInN1bW1hcnkzIiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpCisgICAgICAgIH07CisKKyAgICAgICAgbVByb3ZpZGVycy5ub3RpZnlDb25kaXRpb25zKCJwYWNrYWdlIiwgbXNpLCBjb25kaXRpb25zVG9Ob3RpZnkpOworCisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uQ29uZGl0aW9uQ2hhbmdlZChlcShVcmkucGFyc2UoImEiKSksIGVxKGNvbmRpdGlvbnNUb05vdGlmeVswXSkpOworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJiIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbMV0pKTsKKyAgICAgICAgdmVyaWZ5KG1DYWxsYmFjaykub25Db25kaXRpb25DaGFuZ2VkKGVxKFVyaS5wYXJzZSgiYyIpKSwgZXEoY29uZGl0aW9uc1RvTm90aWZ5WzJdKSk7CisgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhtQ2FsbGJhY2spOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm90aWZ5Q29uZGl0aW9uc19kdXBsaWNhdGVJZHNfaWdub3JlZCgpIHsKKyAgICAgICAgTWFuYWdlZFNlcnZpY2VzLk1hbmFnZWRTZXJ2aWNlSW5mbyBtc2kgPSBtUHJvdmlkZXJzLm5ldyBNYW5hZ2VkU2VydmljZUluZm8oCisgICAgICAgICAgICAgICAgbW9jayhJSW50ZXJmYWNlLmNsYXNzKSwgbmV3IENvbXBvbmVudE5hbWUoInBhY2thZ2UiLCAiY2xzIiksIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgIG1vY2soU2VydmljZUNvbm5lY3Rpb24uY2xhc3MpLCAzMywgMTAwKTsKKyAgICAgICAgQ29uZGl0aW9uW10gY29uZGl0aW9uc1RvTm90aWZ5ID0gbmV3IENvbmRpdGlvbltdIHsKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYSIpLCAic3VtbWFyeSIsIENvbmRpdGlvbi5TVEFURV9UUlVFKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYiIpLCAic3VtbWFyeTIiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnkzIiwgQ29uZGl0aW9uLlNUQVRFX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYSIpLCAic3VtbWFyeTQiLCBDb25kaXRpb24uU1RBVEVfRkFMU0UpCisgICAgICAgIH07CisKKyAgICAgICAgbVByb3ZpZGVycy5ub3RpZnlDb25kaXRpb25zKCJwYWNrYWdlIiwgbXNpLCBjb25kaXRpb25zVG9Ob3RpZnkpOworCisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uQ29uZGl0aW9uQ2hhbmdlZChlcShVcmkucGFyc2UoImEiKSksIGVxKGNvbmRpdGlvbnNUb05vdGlmeVswXSkpOworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJiIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbMV0pKTsKKworICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobUNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvbmRpdGlvbnNfbnVsbEl0ZW1zX2lnbm9yZWQoKSB7CisgICAgICAgIE1hbmFnZWRTZXJ2aWNlcy5NYW5hZ2VkU2VydmljZUluZm8gbXNpID0gbVByb3ZpZGVycy5uZXcgTWFuYWdlZFNlcnZpY2VJbmZvKAorICAgICAgICAgICAgICAgIG1vY2soSUludGVyZmFjZS5jbGFzcyksIG5ldyBDb21wb25lbnROYW1lKCJwYWNrYWdlIiwgImNscyIpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBtb2NrKFNlcnZpY2VDb25uZWN0aW9uLmNsYXNzKSwgMzMsIDEwMCk7CisgICAgICAgIENvbmRpdGlvbltdIGNvbmRpdGlvbnNUb05vdGlmeSA9IG5ldyBDb25kaXRpb25bXSB7CisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnkiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBDb25kaXRpb24oVXJpLnBhcnNlKCJiIiksICJzdW1tYXJ5IiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpCisgICAgICAgIH07CisKKyAgICAgICAgbVByb3ZpZGVycy5ub3RpZnlDb25kaXRpb25zKCJwYWNrYWdlIiwgbXNpLCBjb25kaXRpb25zVG9Ob3RpZnkpOworCisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uQ29uZGl0aW9uQ2hhbmdlZChlcShVcmkucGFyc2UoImEiKSksIGVxKGNvbmRpdGlvbnNUb05vdGlmeVswXSkpOworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJiIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbM10pKTsKKyAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG1DYWxsYmFjayk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDQxYTk1MDQuLjVjYmQxMjAgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy91aXNlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2VUZXN0LmphdmEKQEAgLTEwNDQxLDYgKzEwNDQxLDMxIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaXhDYWxsTm90aWZpY2F0aW9uX3dpdGhPbkdvaW5nRmxhZ19zaG91bGROb3RCZU5vbkRpc21pc3NpYmxlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBHaXZlbjogYSBjYWxsIG5vdGlmaWNhdGlvbiBoYXMgdGhlIGZsYWcgRkxBR19PTkdPSU5HX0VWRU5UIHNldAorICAgICAgICAvLyBmZWF0dXJlIGZsYWc6IEFMTE9XX0RJU01JU1NfT05HT0lORyBpcyBvbgorICAgICAgICBtVGVzdEZsYWdSZXNvbHZlci5zZXRGbGFnT3ZlcnJpZGUoQUxMT1dfRElTTUlTU19PTkdPSU5HLCB0cnVlKTsKKyAgICAgICAgd2hlbihtVGVsZWNvbU1hbmFnZXIuaXNJbk1hbmFnZWRDYWxsKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoImNhbGxlciIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCAidGVzdCIpCisgICAgICAgICAgICAgICAgLnNldE9uZ29pbmcodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0U3R5bGUoTm90aWZpY2F0aW9uLkNhbGxTdHlsZS5mb3JPbmdvaW5nQ2FsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbiwgbW9jayhQZW5kaW5nSW50ZW50LmNsYXNzKSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gV2hlbjogZml4IHRoZSBub3RpZmljYXRpb24gd2l0aCBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQorICAgICAgICBtU2VydmljZS5maXhOb3RpZmljYXRpb24obiwgUEtHLCAidGFnIiwgOSwgMCwgbVVpZCwgTk9UX0ZPUkVHUk9VTkRfU0VSVklDRSk7CisKKyAgICAgICAgLy8gVGhlbjogdGhlIG5vdGlmaWNhdGlvbidzIGZsYWcgRkxBR19OT19ESVNNSVNTIHNob3VsZCBiZSBzZXQKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgwLCBuLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fRElTTUlTUyk7CisgICAgfQorCisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGZpeE5vbkV4ZW1wdE5vdGlmaWNhdGlvbl93aXRoT25Hb2luZ0ZsYWdfc2hvdWxkQmVEaXNtaXNzaWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBHaXZlbjogYSBub24tZXhlbXB0IG5vdGlmaWNhdGlvbiBoYXMgdGhlIGZsYWcgRkxBR19PTkdPSU5HX0VWRU5UIHNldAogICAgICAgICAvLyBmZWF0dXJlIGZsYWc6IEFMTE9XX0RJU01JU1NfT05HT0lORyBpcyBvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL1ZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL1ZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlVGVzdC5qYXZhCmluZGV4IGQ3MmNmYzcuLjA1NjRhNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy91aXNlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGVUZXN0LmphdmEKQEAgLTE1LDYgKzE1LDggQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTUxLDYgKzUzLDggQEAKIGltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLlVpU2VydmljZVRlc3RDYXNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5ub3RpZmljYXRpb24uVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuTG9va3VwUmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5ub3RpZmljYXRpb24uVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuUGVvcGxlUmFua2luZ1JlY29uc2lkZXJhdGlvbjsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTYwLDYgKzY0LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKQEAgLTIxNSw3ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuQ09OVEVOVF9MT09LVVBfVVJJLAogICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuRU5URVJQUklTRV9DT05UQUNUX0xPT0tVUF9QUkVGSVggKyBjb250YWN0SWQpOwogCi0gICAgICAgIG5ldyBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZSgpLnNlYXJjaENvbnRhY3RzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOworICAgICAgICBQZW9wbGVSYW5raW5nUmVjb25zaWRlcmF0aW9uLnNlYXJjaENvbnRhY3RzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOwogCiAgICAgICAgIEFyZ3VtZW50Q2FwdG9yPFVyaT4gcXVlcnlVcmkgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhVcmkuY2xhc3MpOwogICAgICAgICB2ZXJpZnkobW9ja0NvbnRlbnRSZXNvbHZlcikucXVlcnkoCkBAIC0yNDIsNyArMjQ3LDcgQEAKICAgICAgICAgZmluYWwgVXJpIGxvb2t1cFVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKAogICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuQ09OVEVOVF9MT09LVVBfVVJJLCBTdHJpbmcudmFsdWVPZihjb250YWN0SWQpKTsKIAotICAgICAgICBuZXcgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUoKS5zZWFyY2hDb250YWN0cyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKKyAgICAgICAgUGVvcGxlUmFua2luZ1JlY29uc2lkZXJhdGlvbi5zZWFyY2hDb250YWN0cyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKIAogICAgICAgICBBcmd1bWVudENhcHRvcjxVcmk+IHF1ZXJ5VXJpID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoVXJpLmNsYXNzKTsKICAgICAgICAgdmVyaWZ5KG1vY2tDb250ZW50UmVzb2x2ZXIpLnF1ZXJ5KApAQCAtMjc3LDcgKzI4Miw3IEBACiAKICAgICAgICAgLy8gY2FsbCBzZWFyY2hDb250YWN0cyBhbmQgdGhlbiBtZXJnZVBob25lTnVtYmVycywgbWFrZSBzdXJlIHdlIG5ldmVyIGFjdHVhbGx5CiAgICAgICAgIC8vIHF1ZXJ5IHRoZSBjb250ZW50IHJlc29sdmVyIGZvciBhIHBob25lIG51bWJlcgotICAgICAgICBuZXcgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUoKS5zZWFyY2hDb250YWN0c0FuZExvb2t1cE51bWJlcnMobW9ja0NvbnRleHQsIGxvb2t1cFVyaSk7CisgICAgICAgIFBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb24uc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOwogICAgICAgICB2ZXJpZnkobW9ja0NvbnRlbnRSZXNvbHZlciwgbmV2ZXIoKSkucXVlcnkoCiAgICAgICAgICAgICAgICAgZXEoQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9VUkkpLAogICAgICAgICAgICAgICAgIGVxKFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLlBIT05FX0xPT0tVUF9QUk9KRUNUSU9OKSwKQEAgLTMyMCw3ICszMjUsNyBAQAogCiAgICAgICAgIC8vIGNhbGwgc2VhcmNoQ29udGFjdHMgYW5kIHRoZW4gbWVyZ2VQaG9uZU51bWJlcnMsIGFuZCBjaGVjayB0aGF0IHdlIHF1ZXJ5CiAgICAgICAgIC8vIG9uY2UgZm9yIHRoZQotICAgICAgICBuZXcgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUoKS5zZWFyY2hDb250YWN0c0FuZExvb2t1cE51bWJlcnMobW9ja0NvbnRleHQsIGxvb2t1cFVyaSk7CisgICAgICAgIFBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb24uc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOwogICAgICAgICB2ZXJpZnkobW9ja0NvbnRlbnRSZXNvbHZlciwgdGltZXMoMSkpLnF1ZXJ5KAogICAgICAgICAgICAgICAgIGVxKENvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lLkNPTlRFTlRfVVJJKSwKICAgICAgICAgICAgICAgICBlcShWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5QSE9ORV9MT09LVVBfUFJPSkVDVElPTiksCkBAIC0zMzksNyArMzQ0LDcgQEAKIAogICAgICAgICAvLyBDcmVhdGUgdmFsaWRhdG9yIHdpdGggZW1wdHkgY2FjaGUKICAgICAgICAgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUgdm5wID0gbmV3IFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlKCk7Ci0gICAgICAgIExydUNhY2hlIGNhY2hlID0gbmV3IExydUNhY2hlPFN0cmluZywgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuTG9va3VwUmVzdWx0Pig1KTsKKyAgICAgICAgTHJ1Q2FjaGU8U3RyaW5nLCBMb29rdXBSZXN1bHQ+IGNhY2hlID0gbmV3IExydUNhY2hlPD4oNSk7CiAgICAgICAgIHZucC5pbml0Rm9yVGVzdHMobW9ja0NvbnRleHQsIG1vY2tOb3RpZmljYXRpb25Vc2FnZVN0YXRzLCBjYWNoZSk7CiAKICAgICAgICAgTm90aWZpY2F0aW9uUmVjb3JkIHJlY29yZCA9IGdldE5vdGlmaWNhdGlvblJlY29yZCgpOwpAQCAtMzY2LDkgKzM3MSw4IEBACiAgICAgICAgIGZsb2F0IGFmZmluaXR5ID0gMC43ZjsKIAogICAgICAgICAvLyBDcmVhdGUgYSBmYWtlIExvb2t1cFJlc3VsdCBmb3IgdGhlIGRhdGEgd2UnbGwgcGFzcyBpbgotICAgICAgICBMcnVDYWNoZSBjYWNoZSA9IG5ldyBMcnVDYWNoZTxTdHJpbmcsIFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLkxvb2t1cFJlc3VsdD4oNSk7Ci0gICAgICAgIFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLkxvb2t1cFJlc3VsdCBsciA9Ci0gICAgICAgICAgICAgICAgbW9jayhWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5Mb29rdXBSZXN1bHQuY2xhc3MpOworICAgICAgICBMcnVDYWNoZTxTdHJpbmcsIExvb2t1cFJlc3VsdD4gY2FjaGUgPSBuZXcgTHJ1Q2FjaGU8Pig1KTsKKyAgICAgICAgTG9va3VwUmVzdWx0IGxyID0gbW9jayhMb29rdXBSZXN1bHQuY2xhc3MpOwogICAgICAgICB3aGVuKGxyLmdldEFmZmluaXR5KCkpLnRoZW5SZXR1cm4oYWZmaW5pdHkpOwogICAgICAgICB3aGVuKGxyLmdldFBob25lTnVtYmVycygpKS50aGVuUmV0dXJuKG5ldyBBcnJheVNldDw+KG5ldyBTdHJpbmdbXXtsb29rdXBUZWx9KSk7CiAgICAgICAgIHdoZW4obHIuaXNFeHBpcmVkKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwpAQCAtMzkyLDYgKzM5NiwyMyBAQAogICAgICAgICBhc3NlcnRUcnVlKHJlY29yZC5nZXRQaG9uZU51bWJlcnMoKS5jb250YWlucyhsb29rdXBUZWwpKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlUGVvcGxlX3JlY29uc2lkZXJhdGlvbldpbGxOb3RCZURlbGF5ZWQoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgbW9ja0NvbnRleHQgPSBtb2NrKENvbnRleHQuY2xhc3MpOworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbW9ja0NvbnRlbnRSZXNvbHZlciA9IG1vY2soQ29udGVudFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgd2hlbihtb2NrQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSkudGhlblJldHVybihtb2NrQ29udGVudFJlc29sdmVyKTsKKyAgICAgICAgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUgdm5wID0gbmV3IFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlKCk7CisgICAgICAgIHZucC5pbml0Rm9yVGVzdHMobW9ja0NvbnRleHQsIG1vY2soTm90aWZpY2F0aW9uVXNhZ2VTdGF0cy5jbGFzcyksIG5ldyBMcnVDYWNoZTw+KDUpKTsKKyAgICAgICAgTm90aWZpY2F0aW9uUmVjb3JkIHJlY29yZCA9IGdldE5vdGlmaWNhdGlvblJlY29yZCgpOworICAgICAgICBTdHJpbmdbXSBjYWxsTnVtYmVyID0gbmV3IFN0cmluZ1tdeyJ0ZWw6MTIzNDU2Nzg5MTAifTsKKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uUGVvcGxlKHJlY29yZCwgY2FsbE51bWJlcik7CisKKyAgICAgICAgUmFua2luZ1JlY29uc2lkZXJhdGlvbiByciA9IHZucC52YWxpZGF0ZVBlb3BsZShtb2NrQ29udGV4dCwgcmVjb3JkKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJyKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyci5nZXREZWxheShUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKS5pc0VxdWFsVG8oMCk7CisgICAgfQorCiAgICAgLy8gQ3JlYXRlcyBhIGN1cnNvciB0aGF0IHBvaW50cyB0byBvbmUgaXRlbSBvZiBDb250YWN0cyBkYXRhIHdpdGggdGhlIHNwZWNpZmllZAogICAgIC8vIGNvbHVtbnMuCiAgICAgcHJpdmF0ZSBDdXJzb3IgbWFrZU1vY2tDdXJzb3IoaW50IGlkLCBTdHJpbmcgbG9va3VwS2V5LCBpbnQgc3RhcnJlZCwgaW50IGhhc1Bob25lKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vTGV0dGVyYm94VWlDb250cm9sbGVyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL0xldHRlcmJveFVpQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAwNmI2ZWQ4Li5kYTA3OGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vTGV0dGVyYm94VWlDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTQ1OSw4ICs0NTksMTcgQEAKICAgICAgICAgbWFpbldpbmRvdy5tSW52R2xvYmFsU2NhbGUgPSBpbnZHbG9iYWxTY2FsZTsKICAgICAgICAgbUxldHRlcmJveENvbmZpZ3VyYXRpb24uc2V0TGV0dGVyYm94QWN0aXZpdHlDb3JuZXJzUmFkaXVzKGNvbmZpZ3VyYXRpb25SYWRpdXMpOwogCisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obUFjdGl2aXR5KS5pc0luTGV0dGVyYm94QW5pbWF0aW9uKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJhZGl1cywgbUNvbnRyb2xsZXIuZ2V0Um91bmRlZENvcm5lcnNSYWRpdXMobWFpbldpbmRvdykpOwogCisgICAgICAgIGRvUmV0dXJuKGZhbHNlKS53aGVuKG1BY3Rpdml0eSkuaXNJbkxldHRlcmJveEFuaW1hdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSYWRpdXMsIG1Db250cm9sbGVyLmdldFJvdW5kZWRDb3JuZXJzUmFkaXVzKG1haW5XaW5kb3cpKTsKKworICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihtYWluV2luZG93KS5pc09uU2NyZWVuKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQ29udHJvbGxlci5nZXRSb3VuZGVkQ29ybmVyc1JhZGl1cyhtYWluV2luZG93KSk7CisKKyAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbihtQWN0aXZpdHkpLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmFkaXVzLCBtQ29udHJvbGxlci5nZXRSb3VuZGVkQ29ybmVyc1JhZGl1cyhtYWluV2luZG93KSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTQ5NSw2ICs1MDQsNyBAQAogICAgICAgICAgICAgaW5zZXRzLmFkZFNvdXJjZSh0YXNrYmFyKTsKICAgICAgICAgfQogICAgICAgICBkb1JldHVybihtTGV0dGVyYm94ZWRQb3J0cmFpdFRhc2tCb3VuZHMpLndoZW4obUFjdGl2aXR5KS5nZXRCb3VuZHMoKTsKKyAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4obUFjdGl2aXR5KS5pc0luTGV0dGVyYm94QW5pbWF0aW9uKCk7CiAgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obUFjdGl2aXR5KS5pc1Zpc2libGUoKTsKICAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbihtQWN0aXZpdHkpLmlzTGV0dGVyYm94ZWRGb3JGaXhlZE9yaWVudGF0aW9uQW5kQXNwZWN0UmF0aW8oKTsKICAgICAgICAgZG9SZXR1cm4oaW5zZXRzKS53aGVuKG1haW5XaW5kb3cpLmdldEluc2V0c1N0YXRlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2l6ZUNvbXBhdFRlc3RzLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2l6ZUNvbXBhdFRlc3RzLmphdmEKaW5kZXggNzUzY2M2Mi4uMmNjNDZhOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NpemVDb21wYXRUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TaXplQ29tcGF0VGVzdHMuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nLkFQUF9DT01QQVRfU1RBVEVfQ0hBTkdFRF9fU1RBVEVfX0xFVFRFUkJPWEVEX0ZPUl9TSVpFX0NPTVBBVF9NT0RFOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nLkFQUF9DT01QQVRfU1RBVEVfQ0hBTkdFRF9fU1RBVEVfX05PVF9MRVRURVJCT1hFRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GcmFtZXdvcmtTdGF0c0xvZy5BUFBfQ09NUEFUX1NUQVRFX0NIQU5HRURfX1NUQVRFX19OT1RfVklTSUJMRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLndtLkFjdGl2aXR5UmVjb3JkLlN0YXRlLlBBVVNFRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLndtLkFjdGl2aXR5UmVjb3JkLlN0YXRlLlJFU1RBUlRJTkdfUFJPQ0VTUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLndtLkFjdGl2aXR5UmVjb3JkLlN0YXRlLlJFU1VNRUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci53bS5BY3Rpdml0eVJlY29yZC5TdGF0ZS5TVE9QUEVEOwpAQCAtMzkxOCw2ICszOTE5LDI0IEBACiAgICAgICAgIGFzc2VydFRydWUobUFjdGl2aXR5LmluU2l6ZUNvbXBhdE1vZGUoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wQWN0aXZpdHlJblNpemVDb21wYXRNb2RlX3BhdXNlZEFuZEluU2l6ZUNvbXBhdE1vZGVfcmV0dXJuc1RydWUoKSB7CisgICAgICAgIHNldFVwRGlzcGxheVNpemVXaXRoQXBwKDEwMDAsIDI1MDApOworICAgICAgICBtQWN0aXZpdHkubURpc3BsYXlDb250ZW50LnNldElnbm9yZU9yaWVudGF0aW9uUmVxdWVzdCh0cnVlIC8qIGlnbm9yZU9yaWVudGF0aW9uUmVxdWVzdCAqLyk7CisKKyAgICAgICAgc3B5T24obUFjdGl2aXR5KTsKKyAgICAgICAgZG9SZXR1cm4obVRhc2spLndoZW4obUFjdGl2aXR5KS5nZXRPcmdhbml6ZWRUYXNrKCk7CisgICAgICAgIHByZXBhcmVVbnJlc2l6YWJsZShtQWN0aXZpdHksIFNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCk7CisKKyAgICAgICAgcm90YXRlRGlzcGxheShtQWN0aXZpdHkubURpc3BsYXlDb250ZW50LCBST1RBVElPTl85MCk7CisgICAgICAgIG1BY3Rpdml0eS5zZXRTdGF0ZShQQVVTRUQsICJ0ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQWN0aXZpdHkuaW5TaXplQ29tcGF0TW9kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1BY3Rpdml0eS5nZXRTdGF0ZSgpLCBQQVVTRUQpOworICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5pc1Zpc2libGUoKSk7CisgICAgICAgIGFzc2VydFRydWUobVRhc2suZ2V0VGFza0luZm8oKS50b3BBY3Rpdml0eUluU2l6ZUNvbXBhdCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBhbGwgdGhyZWUgcGF0aHMgaW4gd2hpY2ggYXNwZWN0IHJhdGlvIGxvZ2ljIGNhbiBiZSBhcHBsaWVkIHlpZWxkIHRoZSBzYW1lCiAgICAgICogcmVzdWx0LCB3aGljaCBpcyB0aGF0IGFzcGVjdCByYXRpbyBpcyByZXNwZWN0ZWQgb24gYXBwIGJvdW5kcy4gVGhlIHRocmVlIHBhdGhzIGFyZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25UZXN0cy5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25UZXN0cy5qYXZhCmluZGV4IDMwNDU4MTIuLjYxNmQ1MjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uVGVzdHMuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvblRlc3RzLmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC53aW5kb3cuVHJhbnNpdGlvbkluZm8uRkxBR19UUkFOU0xVQ0VOVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC53aW5kb3cuVHJhbnNpdGlvbkluZm8uaXNJbmRlcGVuZGVudDsKIAoraW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5keC5tb2NraXRvLmlubGluZS5leHRlbmRlZC5FeHRlbmRlZE1vY2tpdG8uZG9DYWxsUmVhbE1ldGhvZDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZHgubW9ja2l0by5pbmxpbmUuZXh0ZW5kZWQuRXh0ZW5kZWRNb2NraXRvLmRvTm90aGluZzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZHgubW9ja2l0by5pbmxpbmUuZXh0ZW5kZWQuRXh0ZW5kZWRNb2NraXRvLmRvUmV0dXJuOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5keC5tb2NraXRvLmlubGluZS5leHRlbmRlZC5FeHRlbmRlZE1vY2tpdG8uc3B5T247CkBAIC01NCw2ICs1NSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55Qm9vbGVhbjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKQEAgLTEzOTEsNyArMTM5Myw3IEBACiAKICAgICAgICAgdmVyaWZ5KHNuYXBzaG90Q29udHJvbGxlciwgdGltZXMoMSkpLnJlY29yZFNuYXBzaG90KGVxKHRhc2syKSwgZXEoZmFsc2UpKTsKIAotICAgICAgICBvcGVuVHJhbnNpdGlvbi5maW5pc2hUcmFuc2l0aW9uKCk7CisgICAgICAgIGNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbihvcGVuVHJhbnNpdGlvbik7CiAKICAgICAgICAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzaW11bGF0ZSBjbG9zaW5nIHRhc2sxIHRvIHJldHVybiBiYWNrIHRvIChvcGVuKSB0YXNrMi4KICAgICAgICAgZmluYWwgVHJhbnNpdGlvbiBjbG9zZVRyYW5zaXRpb24gPSBjb250cm9sbGVyLmNyZWF0ZVRyYW5zaXRpb24oVFJBTlNJVF9DTE9TRSk7CkBAIC0xNDAwLDcgKzE0MDIsMTMgQEAKICAgICAgICAgY2xvc2VUcmFuc2l0aW9uLmNvbGxlY3RFeGlzdGVuY2VDaGFuZ2UoYWN0aXZpdHkxKTsKICAgICAgICAgY2xvc2VUcmFuc2l0aW9uLmNvbGxlY3RFeGlzdGVuY2VDaGFuZ2UodGFzazIpOwogICAgICAgICBjbG9zZVRyYW5zaXRpb24uY29sbGVjdEV4aXN0ZW5jZUNoYW5nZShhY3Rpdml0eTIpOwotICAgICAgICBjbG9zZVRyYW5zaXRpb24uc2V0VHJhbnNpZW50TGF1bmNoKGFjdGl2aXR5MiwgbnVsbCAvKiByZXN0b3JlQmVsb3cgKi8pOworICAgICAgICBjbG9zZVRyYW5zaXRpb24uc2V0VHJhbnNpZW50TGF1bmNoKGFjdGl2aXR5MiwgdGFzazEpOworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uLkNoYW5nZUluZm8gdGFzazFDaGFuZ2VJbmZvID0gY2xvc2VUcmFuc2l0aW9uLm1DaGFuZ2VzLmdldCh0YXNrMSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFzazFDaGFuZ2VJbmZvKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrMUNoYW5nZUluZm8uaGFzQ2hhbmdlZCgpKTsKKyAgICAgICAgZmluYWwgVHJhbnNpdGlvbi5DaGFuZ2VJbmZvIGFjdGl2aXR5MUNoYW5nZUluZm8gPSBjbG9zZVRyYW5zaXRpb24ubUNoYW5nZXMuZ2V0KGFjdGl2aXR5MSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aXZpdHkxQ2hhbmdlSW5mbyk7CisgICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHkxQ2hhbmdlSW5mby5oYXNDaGFuZ2VkKCkpOwogCiAgICAgICAgIGFjdGl2aXR5MS5zZXRWaXNpYmxlUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgYWN0aXZpdHkyLnNldFZpc2libGVSZXF1ZXN0ZWQodHJ1ZSk7CkBAIC0xNDE2LDkgKzE0MjQsMjcgQEAKICAgICAgICAgdmVyaWZ5KHNuYXBzaG90Q29udHJvbGxlciwgdGltZXMoMCkpLnJlY29yZFNuYXBzaG90KGVxKHRhc2sxKSwgZXEoZmFsc2UpKTsKIAogICAgICAgICBlbnRlcmluZ0FuaW1SZXBvcnRzLmNsZWFyKCk7Ci0gICAgICAgIGNsb3NlVHJhbnNpdGlvbi5maW5pc2hUcmFuc2l0aW9uKCk7CisgICAgICAgIGRvQ2FsbFJlYWxNZXRob2QoKS53aGVuKG1XbS5tUm9vdCkuZW5zdXJlQWN0aXZpdGllc1Zpc2libGUoYW55KCksCisgICAgICAgICAgICAgICAgYW55SW50KCksIGFueUJvb2xlYW4oKSwgYW55Qm9vbGVhbigpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbltdIHdhc0luRmluaXNoaW5nVHJhbnNpdGlvbiA9IHsgZmFsc2UgfTsKKyAgICAgICAgY29udHJvbGxlci5yZWdpc3RlckxlZ2FjeUxpc3RlbmVyKG5ldyBXaW5kb3dNYW5hZ2VySW50ZXJuYWwuQXBwVHJhbnNpdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFwcFRyYW5zaXRpb25GaW5pc2hlZExvY2tlZChJQmluZGVyIHRva2VuKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlSZWNvcmQgciA9IEFjdGl2aXR5UmVjb3JkLmZvclRva2VuKHRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdhc0luRmluaXNoaW5nVHJhbnNpdGlvblswXSA9IGNvbnRyb2xsZXIuaW5GaW5pc2hpbmdUcmFuc2l0aW9uKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbihjbG9zZVRyYW5zaXRpb24pOworICAgICAgICBhc3NlcnRUcnVlKHdhc0luRmluaXNoaW5nVHJhbnNpdGlvblswXSk7CisgICAgICAgIGFzc2VydE51bGwoY29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbik7CiAKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eTIuaXNWaXNpYmxlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlUYXNrTWFuYWdlclNlcnZpY2UuQVBQX1NXSVRDSF9ESVNBTExPVywgbUF0bS5nZXRCYWxBcHBTd2l0Y2hlc1N0YXRlKCkpOworICAgICAgICAvLyBCZWNhdXNlIHRhc2sxIGlzIG9jY2x1ZGVkIGJ5IHRhc2syLCBmaW5pc2hUcmFuc2l0aW9uIHNob3VsZCBtYWtlIGFjdGl2aXR5MSBpbnZpc2libGUuCisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5pc1Zpc2libGVSZXF1ZXN0ZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5pc1Zpc2libGUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5hcHAuaGFzQWN0aXZpdHlJblZpc2libGVUYXNrKCkpOwogCiAgICAgICAgIHZlcmlmeShzbmFwc2hvdENvbnRyb2xsZXIsIHRpbWVzKDEpKS5yZWNvcmRTbmFwc2hvdChlcSh0YXNrMSksIGVxKGZhbHNlKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2FsbHBhcGVyQ29udHJvbGxlclRlc3RzLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2FsbHBhcGVyQ29udHJvbGxlclRlc3RzLmphdmEKaW5kZXggNjU2MzFlYS4uOTg0Yjg2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dhbGxwYXBlckNvbnRyb2xsZXJUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYWxscGFwZXJDb250cm9sbGVyVGVzdHMuamF2YQpAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgIGZpbmFsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIHQgPSBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKTsKICAgICAgICAgdG9rZW4uZmluaXNoU3luYyh0LCBmYWxzZSAvKiBjYW5jZWwgKi8pOwogICAgICAgICB0cmFuc2l0Lm9uVHJhbnNhY3Rpb25SZWFkeSh0cmFuc2l0LmdldFN5bmNJZCgpLCB0KTsKLSAgICAgICAgZGMubVRyYW5zaXRpb25Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdC5nZXRUb2tlbigpKTsKKyAgICAgICAgZGMubVRyYW5zaXRpb25Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdCk7CiAgICAgICAgIGFzc2VydEZhbHNlKHdhbGxwYXBlcldpbmRvdy5pc1Zpc2libGUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHRva2VuLmlzVmlzaWJsZSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93T3JnYW5pemVyVGVzdHMuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCmluZGV4IGE2OGE1NzMuLjE3YWQ0ZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCkBAIC0xNDg2LDkgKzE0ODYsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMocm9vdFRhc2subVRhc2tJZCwgaW5mby50YXNrSWQpOwogICAgICAgICBhc3NlcnRUcnVlKGluZm8udG9wQWN0aXZpdHlJblNpemVDb21wYXQpOwogCi0gICAgICAgIC8vIEVuc3VyZSB0YXNrIGluZm8gc2hvdyB0b3AgYWN0aXZpdHkgdGhhdCBpcyBub3QgaW4gZm9yZWdyb3VuZCBhcyBub3QgaW4gc2l6ZSBjb21wYXQuCisgICAgICAgIC8vIEVuc3VyZSB0YXNrIGluZm8gc2hvdyB0b3AgYWN0aXZpdHkgdGhhdCBpcyBub3QgdmlzaWJsZSBhcyBub3QgaW4gc2l6ZSBjb21wYXQuCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMob3JnYW5pemVyKTsKLSAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4oYWN0aXZpdHkpLmlzU3RhdGUoUkVTVU1FRCk7CisgICAgICAgIGRvUmV0dXJuKGZhbHNlKS53aGVuKGFjdGl2aXR5KS5pc1Zpc2libGUoKTsKICAgICAgICAgcm9vdFRhc2sub25TaXplQ29tcGF0QWN0aXZpdHlDaGFuZ2VkKCk7CiAgICAgICAgIG1XbS5tQXRtU2VydmljZS5tVGFza09yZ2FuaXplckNvbnRyb2xsZXIuZGlzcGF0Y2hQZW5kaW5nRXZlbnRzKCk7CiAgICAgICAgIHZlcmlmeShvcmdhbml6ZXIpLm9uVGFza0luZm9DaGFuZ2VkKGluZm9DYXB0b3IuY2FwdHVyZSgpKTsKQEAgLTE0OTgsNyArMTQ5OCw3IEBACiAKICAgICAgICAgLy8gRW5zdXJlIHRhc2sgaW5mbyBzaG93IG5vbiBzaXplIGNvbXBhdCB0b3AgYWN0aXZpdHkgYXMgbm90IGluIHNpemUgY29tcGF0LgogICAgICAgICBjbGVhckludm9jYXRpb25zKG9yZ2FuaXplcik7Ci0gICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oYWN0aXZpdHkpLmlzU3RhdGUoUkVTVU1FRCk7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oYWN0aXZpdHkpLmlzVmlzaWJsZSgpOwogICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihhY3Rpdml0eSkuaW5TaXplQ29tcGF0TW9kZSgpOwogICAgICAgICByb290VGFzay5vblNpemVDb21wYXRBY3Rpdml0eUNoYW5nZWQoKTsKICAgICAgICAgbVdtLm1BdG1TZXJ2aWNlLm1UYXNrT3JnYW5pemVyQ29udHJvbGxlci5kaXNwYXRjaFBlbmRpbmdFdmVudHMoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcFRlc3RzLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJNYXBUZXN0cy5qYXZhCmluZGV4IGMyZWUwNzkuLjJhM2M5YmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcFRlc3RzLmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyTWFwVGVzdHMuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CkBAIC0xMjksNCArMTMxLDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh1aWQycHJvY2Vzc2VzLnNpemUoKSwgMSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtUHJvY2Vzc01hcC5nZXRQcm9jZXNzKEZBS0VfUElEMSksIHBpZDF1aWQyKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVfY2FsbHNEZXN0cm95KCkgeworICAgICAgICB2YXIgcHJvYyA9IHNweShwaWQxdWlkMSk7CisgICAgICAgIG1Qcm9jZXNzTWFwLnB1dChGQUtFX1BJRDEsIHByb2MpOworCisgICAgICAgIG1Qcm9jZXNzTWFwLnJlbW92ZShGQUtFX1BJRDEpOworCisgICAgICAgIHZlcmlmeShwcm9jKS5kZXN0cm95KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyVGVzdHMuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlclRlc3RzLmphdmEKaW5kZXggZDZjZmQwMC4uY2Y4Mzk4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyVGVzdHMuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJUZXN0cy5qYXZhCkBAIC0xNTksNiArMTU5LDE3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveV91bnJlZ2lzdGVyc0Rpc3BsYXlBcmVhTGlzdGVuZXIoKSB7CisgICAgICAgIGZpbmFsIFRlc3REaXNwbGF5Q29udGVudCB0ZXN0RGlzcGxheUNvbnRlbnQxID0gY3JlYXRlVGVzdERpc3BsYXlDb250ZW50SW5Db250YWluZXIoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheUFyZWEgaW1lQ29udGFpbmVyMSA9IHRlc3REaXNwbGF5Q29udGVudDEuZ2V0SW1lQ29udGFpbmVyKCk7CisgICAgICAgIG1XcGMucmVnaXN0ZXJEaXNwbGF5QXJlYUNvbmZpZ3VyYXRpb25MaXN0ZW5lcihpbWVDb250YWluZXIxKTsKKworICAgICAgICBtV3BjLmRlc3Ryb3koKTsKKworICAgICAgICBhc3NlcnROdWxsKG1XcGMuZ2V0RGlzcGxheUFyZWEoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24oKSB7CiAgICAgICAgIG1XcGMuc2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24odHJ1ZSk7CiAgICAgICAgIG1XcGMuc2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24oZmFsc2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Rlc3RzQmFzZS5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Rlc3RzQmFzZS5qYXZhCmluZGV4IGNlNmNkOTAuLmI4MDUwMGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dUZXN0c0Jhc2UuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93VGVzdHNCYXNlLmphdmEKQEAgLTE3OTksNyArMTc5OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5maW5pc2hUcmFuc2l0aW9uKG1MYXN0VHJhbnNpdC5nZXRUb2tlbigpKTsKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24obUxhc3RUcmFuc2l0KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L0NhcnJpZXJDb25maWdNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9DYXJyaWVyQ29uZmlnTWFuYWdlci5qYXZhCmluZGV4IGJmMTJiOWMuLjIxMmRjNDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L0NhcnJpZXJDb25maWdNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvQ2FycmllckNvbmZpZ01hbmFnZXIuamF2YQpAQCAtMTYyOCw2ICsxNjI4LDcgQEAKICAgICAgKiA8bGk+ICA5OiBXaUZpIENhbGxpbmc8L2xpPgogICAgICAqIDxsaT4gMTA6IFZvV2lmaTwvbGk+CiAgICAgICogPGxpPiAxMTogJXMgV2lGaSBDYWxsaW5nPC9saT4KKyAgICAgKiA8bGk+IDEyOiBXaUZpIENhbGw8L2xpPgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dGQ19TUE5fRk9STUFUX0lEWF9JTlQgPSAid2ZjX3Nwbl9mb3JtYXRfaWR4X2ludCI7CkBAIC0xOTc0LDggKzE5NzUsMTMgQEAKICAgICAvKioKICAgICAgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgTFRFKyBpY29uIHNob3VsZCBiZSBzaG93biBpZiBhdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hJREVfTFRFX1BMVVNfREFUQV9JQ09OX0JPT0wgPQotICAgICAgICAgICAgImhpZGVfbHRlX3BsdXNfZGF0YV9pY29uX2Jvb2wiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ISURFX0xURV9QTFVTX0RBVEFfSUNPTl9CT09MID0gImhpZGVfbHRlX3BsdXNfZGF0YV9pY29uX2Jvb2wiOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBpbmRpY3RpbmcgaWYgdGhlIDVHIHNsaWNlIGljb24gc2hvdWxkIGJlIHNob3duIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSE9XXzVHX1NMSUNFX0lDT05fQk9PTCA9ICJzaG93XzVnX3NsaWNlX2ljb25fYm9vbCI7CiAKICAgICAvKioKICAgICAgKiBUaGUgY29tYmluZWQgY2hhbm5lbCBiYW5kd2lkdGggdGhyZXNob2xkIChub24taW5jbHVzaXZlKSBpbiBLSHogcmVxdWlyZWQgdG8gZGlzcGxheSB0aGUKQEAgLTk5MTMsNiArOTkxOSw3IEBACiAgICAgICAgIHNEZWZhdWx0cy5wdXRTdHJpbmcoS0VZX09QRVJBVE9SX05BTUVfRklMVEVSX1BBVFRFUk5fU1RSSU5HLCAiIik7CiAgICAgICAgIHNEZWZhdWx0cy5wdXRTdHJpbmcoS0VZX1NIT1dfQ0FSUklFUl9EQVRBX0lDT05fUEFUVEVSTl9TVFJJTkcsICIiKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEJvb2xlYW4oS0VZX0hJREVfTFRFX1BMVVNfREFUQV9JQ09OX0JPT0wsIHRydWUpOworICAgICAgICBzRGVmYXVsdHMucHV0Qm9vbGVhbihLRVlfU0hPV181R19TTElDRV9JQ09OX0JPT0wsIHRydWUpOwogICAgICAgICBzRGVmYXVsdHMucHV0SW50KEtFWV9MVEVfUExVU19USFJFU0hPTERfQkFORFdJRFRIX0tIWl9JTlQsIDIwMDAwKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEludChLRVlfTlJfQURWQU5DRURfVEhSRVNIT0xEX0JBTkRXSURUSF9LSFpfSU5ULCAwKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEJvb2xlYW4oS0VZX0lOQ0xVREVfTFRFX0ZPUl9OUl9BRFZBTkNFRF9USFJFU0hPTERfQkFORFdJRFRIX0JPT0wsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L2RhdGEvUW9zQmVhcmVyU2Vzc2lvbi5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKaW5kZXggZGQwODA4NS4uMTY2ODE5MyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKQEAgLTEwMiwxMiArMTAyLDExIEBACiAKICAgICAgICAgUW9zQmVhcmVyU2Vzc2lvbiBvdGhlciA9IChRb3NCZWFyZXJTZXNzaW9uKSBvOwogICAgICAgICByZXR1cm4gdGhpcy5xb3NCZWFyZXJTZXNzaW9uSWQgPT0gb3RoZXIucW9zQmVhcmVyU2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgJiYgdGhpcy5xb3MuZXF1YWxzKG90aGVyLnFvcykKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyh0aGlzLnFvcywgb3RoZXIucW9zKQogICAgICAgICAgICAgICAgICYmIHRoaXMucW9zQmVhcmVyRmlsdGVyTGlzdC5zaXplKCkgPT0gb3RoZXIucW9zQmVhcmVyRmlsdGVyTGlzdC5zaXplKCkKICAgICAgICAgICAgICAgICAmJiB0aGlzLnFvc0JlYXJlckZpbHRlckxpc3QuY29udGFpbnNBbGwob3RoZXIucW9zQmVhcmVyRmlsdGVyTGlzdCk7CiAgICAgfQogCi0KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBOb25OdWxsIFBhcmNlbGFibGUuQ3JlYXRvcjxRb3NCZWFyZXJTZXNzaW9uPiBDUkVBVE9SID0KICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UW9zQmVhcmVyU2Vzc2lvbj4oKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCmluZGV4IDk4MjIxYzkuLmNkOWQ4MWUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCkBAIC0yMiwxMyArMjIsNiBAQAogICovCiBvbmV3YXkgaW50ZXJmYWNlIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIHsKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2F0ZWxsaXRlIGhhcyBwZW5kaW5nIGRhdGFncmFtcyBmb3IgdGhlIGRldmljZSB0byBiZSBwdWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHBlbmRpbmcgZGF0YWdyYW1zLgotICAgICAqLwotICAgIHZvaWQgb25QZW5kaW5nRGF0YWdyYW1Db3VudChpbiBpbnQgY291bnQpOwotCi0gICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNhdGVsbGl0ZSBtb2RlbSBzdGF0ZSBoYXMgY2hhbmdlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzYXRlbGxpdGUgbW9kZW0gc3RhdGUuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2suYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suYWlkbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2suYWlkbApyZW5hbWUgdG8gdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL0lTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjay5haWRsCmluZGV4IGQzZjEwOTEuLjI0NDIwODMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjay5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suYWlkbApAQCAtMjIsNyArMjIsNyBAQAogICogSW50ZXJmYWNlIGZvciBwb3NpdGlvbiB1cGRhdGUgYW5kIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIGNoYW5nZSBjYWxsYmFjay4KICAqIEBoaWRlCiAgKi8KLW9uZXdheSBpbnRlcmZhY2UgSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2sgeworb25ld2F5IGludGVyZmFjZSBJU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgewogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHNhdGVsbGl0ZSBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZSBjaGFuZ2VkLgogICAgICAqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEKaW5kZXggYTNjM2YxOS4uN2M3OTQ0NzMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9Qb2ludGluZ0luZm8uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEKQEAgLTMwLDMxICszMCwxMiBAQAogICAgIC8qKiBTYXRlbGxpdGUgZWxldmF0aW9uIGluIGRlZ3JlZXMgKi8KICAgICBwcml2YXRlIGZsb2F0IG1TYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzOwogCi0gICAgLyoqIEFudGVubmEgYXppbXV0aCBpbiBkZWdyZWVzICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYUF6aW11dGhEZWdyZWVzOwotCi0gICAgLyoqCi0gICAgICogQW5nbGUgb2Ygcm90YXRpb24gYWJvdXQgdGhlIHggYXhpcy4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBhbmdsZSBiZXR3ZWVuIGEgcGxhbmUKLSAgICAgKiBwYXJhbGxlbCB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYVBpdGNoRGVncmVlczsKLQotICAgIC8qKgotICAgICAqIEFuZ2xlIG9mIHJvdGF0aW9uIGFib3V0IHRoZSB5IGF4aXMuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgYW5nbGUgYmV0d2VlbiBhIHBsYW5lCi0gICAgICogcGVycGVuZGljdWxhciB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYVJvbGxEZWdyZWVzOwotCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnRpbmdJbmZvKGZsb2F0IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzLCBmbG9hdCBzYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzLAotICAgICAgICAgICAgZmxvYXQgYW50ZW5uYUF6aW11dGhEZWdyZWVzLCBmbG9hdCBhbnRlbm5hUGl0Y2hEZWdyZWVzLCBmbG9hdCBhbnRlbm5hUm9sbERlZ3JlZXMpIHsKKyAgICBwdWJsaWMgUG9pbnRpbmdJbmZvKGZsb2F0IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzLCBmbG9hdCBzYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIG1TYXRlbGxpdGVBemltdXRoRGVncmVlcyA9IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzOwogICAgICAgICBtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlcyA9IHNhdGVsbGl0ZUVsZXZhdGlvbkRlZ3JlZXM7Ci0gICAgICAgIG1BbnRlbm5hQXppbXV0aERlZ3JlZXMgPSBhbnRlbm5hQXppbXV0aERlZ3JlZXM7Ci0gICAgICAgIG1BbnRlbm5hUGl0Y2hEZWdyZWVzID0gYW50ZW5uYVBpdGNoRGVncmVlczsKLSAgICAgICAgbUFudGVubmFSb2xsRGVncmVlcyA9IGFudGVubmFSb2xsRGVncmVlczsKICAgICB9CiAKICAgICBwcml2YXRlIFBvaW50aW5nSW5mbyhQYXJjZWwgaW4pIHsKQEAgLTcwLDkgKzUxLDYgQEAKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIFBhcmNlbCBvdXQsIGludCBmbGFncykgewogICAgICAgICBvdXQud3JpdGVGbG9hdChtU2F0ZWxsaXRlQXppbXV0aERlZ3JlZXMpOwogICAgICAgICBvdXQud3JpdGVGbG9hdChtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlcyk7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KG1BbnRlbm5hQXppbXV0aERlZ3JlZXMpOwotICAgICAgICBvdXQud3JpdGVGbG9hdChtQW50ZW5uYVBpdGNoRGVncmVlcyk7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KG1BbnRlbm5hUm9sbERlZ3JlZXMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIENyZWF0b3I8UG9pbnRpbmdJbmZvPiBDUkVBVE9SID0KQEAgLTk5LDE4ICs3Nyw2IEBACiAKICAgICAgICAgc2IuYXBwZW5kKCJTYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzOiIpOwogICAgICAgICBzYi5hcHBlbmQobVNhdGVsbGl0ZUVsZXZhdGlvbkRlZ3JlZXMpOwotICAgICAgICBzYi5hcHBlbmQoIiwiKTsKLQotICAgICAgICBzYi5hcHBlbmQoIkFudGVubmFBemltdXRoRGVncmVlczoiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1BbnRlbm5hQXppbXV0aERlZ3JlZXMpOwotICAgICAgICBzYi5hcHBlbmQoIiwiKTsKLQotICAgICAgICBzYi5hcHBlbmQoIkFudGVubmFQaXRjaERlZ3JlZXM6Iik7Ci0gICAgICAgIHNiLmFwcGVuZChtQW50ZW5uYVBpdGNoRGVncmVlcyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCIpOwotCi0gICAgICAgIHNiLmFwcGVuZCgiQW50ZW5uYVJvbGxEZWdyZWVzOiIpOwotICAgICAgICBzYi5hcHBlbmQobUFudGVubmFSb2xsRGVncmVlcyk7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KIApAQCAtMTIyLDIzICs4OCw4IEBACiAgICAgICAgIHJldHVybiBtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlczsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgZ2V0QW50ZW5uYUF6aW11dGhEZWdyZWVzKCkgewotICAgICAgICByZXR1cm4gbUFudGVubmFBemltdXRoRGVncmVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0QW50ZW5uYVBpdGNoRGVncmVlcygpIHsKLSAgICAgICAgcmV0dXJuIG1BbnRlbm5hUGl0Y2hEZWdyZWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRBbnRlbm5hUm9sbERlZ3JlZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQW50ZW5uYVJvbGxEZWdyZWVzOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCByZWFkRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKICAgICAgICAgbVNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzID0gaW4ucmVhZEZsb2F0KCk7CiAgICAgICAgIG1TYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzID0gaW4ucmVhZEZsb2F0KCk7Ci0gICAgICAgIG1BbnRlbm5hQXppbXV0aERlZ3JlZXMgPSBpbi5yZWFkRmxvYXQoKTsKLSAgICAgICAgbUFudGVubmFQaXRjaERlZ3JlZXMgPSBpbi5yZWFkRmxvYXQoKTsKLSAgICAgICAgbUFudGVubmFSb2xsRGVncmVlcyA9IGluLnJlYWRGbG9hdCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVDYXBhYmlsaXRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVDYXBhYmlsaXRpZXMuamF2YQppbmRleCA4ODk4NTZiLi5kZjgwMTU5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5qYXZhCkBAIC0zMywzMSArMzMsMjQgQEAKICAgICBATm9uTnVsbCBAU2F0ZWxsaXRlTWFuYWdlci5OVFJhZGlvVGVjaG5vbG9neSBwcml2YXRlIFNldDxJbnRlZ2VyPiBtU3VwcG9ydGVkUmFkaW9UZWNobm9sb2dpZXM7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHNhdGVsbGl0ZSBtb2RlbSBpcyBhbHdheXMgb24uCi0gICAgICogVGhpcyBpbmRpY2F0ZXMgdGhlIHBvd2VyIGltcGFjdCBvZiBrZWVwaW5nIGl0IG9uIGlzIHZlcnkgbWluaW1hbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWx3YXlzT247Ci0KLSAgICAvKioKICAgICAgKiBXaGV0aGVyIFVFIG5lZWRzIHRvIHBvaW50IHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YS4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzUG9pbnRpbmdUb1NhdGVsbGl0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUG9pbnRpbmdSZXF1aXJlZDsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgVUUgbmVlZHMgYSBzZXBhcmF0ZSBTSU0gcHJvZmlsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzYXRlbGxpdGUgbmV0d29yay4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdGFncmFtIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBzYXRlbGxpdGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZTsKKyAgICBwcml2YXRlIGludCBtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBzdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcywgYm9vbGVhbiBpc0Fsd2F5c09uLAotICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUsIGJvb2xlYW4gbmVlZHNTZXBhcmF0ZVNpbVByb2ZpbGUpIHsKKyAgICBwdWJsaWMgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBzdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNQb2ludGluZ1JlcXVpcmVkLCBpbnQgbWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtKSB7CiAgICAgICAgIG1TdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcyA9IHN1cHBvcnRlZFJhZGlvVGVjaG5vbG9naWVzID09IG51bGwKICAgICAgICAgICAgICAgICA/IG5ldyBIYXNoU2V0PD4oKSA6IHN1cHBvcnRlZFJhZGlvVGVjaG5vbG9naWVzOwotICAgICAgICBtSXNBbHdheXNPbiA9IGlzQWx3YXlzT247Ci0gICAgICAgIG1OZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUgPSBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGU7Ci0gICAgICAgIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSA9IG5lZWRzU2VwYXJhdGVTaW1Qcm9maWxlOworICAgICAgICBtSXNQb2ludGluZ1JlcXVpcmVkID0gaXNQb2ludGluZ1JlcXVpcmVkOworICAgICAgICBtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtID0gbWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtOwogICAgIH0KIAogICAgIHByaXZhdGUgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFBhcmNlbCBpbikgewpAQCAtODAsOSArNzMsOCBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOwogICAgICAgICB9CiAKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihtSXNBbHdheXNPbik7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obU5lZWRzUG9pbnRpbmdUb1NhdGVsbGl0ZSk7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obU5lZWRzU2VwYXJhdGVTaW1Qcm9maWxlKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihtSXNQb2ludGluZ1JlcXVpcmVkKTsKKyAgICAgICAgb3V0LndyaXRlSW50KG1NYXhCeXRlc1Blck91dGdvaW5nRGF0YWdyYW0pOwogICAgIH0KIAogICAgIEBOb25OdWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxTYXRlbGxpdGVDYXBhYmlsaXRpZXM+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjw+KCkgewpAQCAtMTExLDE2ICsxMDMsMTIgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZCgibm9uZSwiKTsKICAgICAgICAgfQogCi0gICAgICAgIHNiLmFwcGVuZCgiaXNBbHdheXNPbjoiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1Jc0Fsd2F5c09uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJpc1BvaW50aW5nUmVxdWlyZWQ6Iik7CisgICAgICAgIHNiLmFwcGVuZChtSXNQb2ludGluZ1JlcXVpcmVkKTsKICAgICAgICAgc2IuYXBwZW5kKCIsIik7CiAKLSAgICAgICAgc2IuYXBwZW5kKCJuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGU6Iik7Ci0gICAgICAgIHNiLmFwcGVuZChtTmVlZHNQb2ludGluZ1RvU2F0ZWxsaXRlKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIik7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCJuZWVkc1NlcGFyYXRlU2ltUHJvZmlsZToiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSk7CisgICAgICAgIHNiLmFwcGVuZCgibWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtIik7CisgICAgICAgIHNiLmFwcGVuZChtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtKTsKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCkBAIC0xMzMsMzMgKzEyMSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgYWx3YXlzIG9uLgotICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBwb3dlciBpbXBhY3Qgb2Yga2VlcGluZyBpdCBvbiBpcyB2ZXJ5IG1pbmltYWwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGFsd2F5cyBvbiBhbmQge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHdheXNPbigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0Fsd2F5c09uOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCB3aGV0aGVyIFVFIG5lZWRzIHRvIHBvaW50IHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YS4KICAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFVFIG5lZWRzIHRvIHBvaW50aW5nIHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBhbmQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBVRSBuZWVkcyB0byBwb2ludCB0byBhIHNhdGVsbGl0ZSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgYW5kCiAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUoKSB7Ci0gICAgICAgIHJldHVybiBtTmVlZHNQb2ludGluZ1RvU2F0ZWxsaXRlOworICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRpbmdSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc1BvaW50aW5nUmVxdWlyZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHdoZXRoZXIgVUUgbmVlZHMgYSBzZXBhcmF0ZSBTSU0gcHJvZmlsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzYXRlbGxpdGUgbmV0d29yay4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdGFncmFtIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBVRSBuZWVkcyBhIHNlcGFyYXRlIFNJTSBwcm9maWxlIHRvIGNvbXVuaWNhdGUgd2l0aCB0aGUgc2F0ZWxsaXRlCi0gICAgICogICAgICAgICBuZXR3b3JrIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgZGF0YWdyYW0gdGhhdCBjYW4gYmUgc2VudCBvdmVyIHNhdGVsbGl0ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZTsKKyAgICBwdWJsaWMgaW50IGdldE1heEJ5dGVzUGVyT3V0Z29pbmdEYXRhZ3JhbSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhCeXRlc1Blck91dGdvaW5nRGF0YWdyYW07CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbikgewpAQCAtMTcxLDggKzE0OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtSXNBbHdheXNPbiA9IGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgIG1OZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBtTmVlZHNTZXBhcmF0ZVNpbVByb2ZpbGUgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBtSXNQb2ludGluZ1JlcXVpcmVkID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgbU1heEJ5dGVzUGVyT3V0Z29pbmdEYXRhZ3JhbSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlRGF0YWdyYW0uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCmluZGV4IGNjNWE5ZjQuLmQzY2I4YTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiAKQEAgLTI4LDcgKzI3LDcgQEAKICAgICAvKioKICAgICAgKiBEYXRhZ3JhbSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1EYXRhOworICAgIEBOb25OdWxsIHByaXZhdGUgYnl0ZVtdIG1EYXRhOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKQEAgLTUxLDggKzUwLDggQEAKICAgICAgICAgb3V0LndyaXRlQnl0ZUFycmF5KG1EYXRhKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBDcmVhdG9yPFNhdGVsbGl0ZURhdGFncmFtPiBDUkVBVE9SID0KLSAgICAgICAgICAgIG5ldyBDcmVhdG9yPFNhdGVsbGl0ZURhdGFncmFtPigpIHsKKyAgICBATm9uTnVsbCBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8U2F0ZWxsaXRlRGF0YWdyYW0+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IENyZWF0b3I8PigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgU2F0ZWxsaXRlRGF0YWdyYW0gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXRlbGxpdGVEYXRhZ3JhbShpbik7CkBAIC02NCw4ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKIAotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBieXRlW10gZ2V0U2F0ZWxsaXRlRGF0YWdyYW0oKSB7CisgICAgQE5vbk51bGwgcHVibGljIGJ5dGVbXSBnZXRTYXRlbGxpdGVEYXRhZ3JhbSgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrLmphdmEKaW5kZXggMjEzYjk4NS4uZjIzN2FkYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjay5qYXZhCkBAIC0xNyw0OCArMTcsMTggQEAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUxvbmdDb25zdW1lcjsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCiAvKioKICAqIEEgY2FsbGJhY2sgY2xhc3MgZm9yIGxpc3RlbmluZyB0byBzYXRlbGxpdGUgZGF0YWdyYW1zLgogICoKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrQmluZGVyIG1CaW5kZXIgPSBuZXcgQ2FsbGJhY2tCaW5kZXIodGhpcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsYmFja0JpbmRlciBleHRlbmRzIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrLlN0dWIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgbUxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIHByaXZhdGUgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIHByaXZhdGUgQ2FsbGJhY2tCaW5kZXIoU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayBsb2NhbENhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtTG9jYWxDYWxsYmFjayA9IGxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgaW50IHBlbmRpbmdDb3VudCwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBtTG9jYWxDYWxsYmFjay5vblNhdGVsbGl0ZURhdGFncmFtUmVjZWl2ZWQoZGF0YWdyYW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFncmFtLCBwZW5kaW5nQ291bnQsIGNhbGxiYWNrKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3B1YmxpYyBpbnRlcmZhY2UgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayB7CiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgZGF0YWdyYW0gdG8gYmUgcmVjZWl2ZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YWdyYW1JZCBBbiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgaW5jb21pbmcgZGF0YWdyYW0uCiAgICAgICogQHBhcmFtIGRhdGFncmFtIERhdGFncmFtIHRvIGJlIHJlY2VpdmVkIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqIEBwYXJhbSBwZW5kaW5nQ291bnQgTnVtYmVyIG9mIGRhdGFncmFtcyB5ZXQgdG8gYmUgcmVjZWl2ZWQgYnkgdGhlIGFwcC4KQEAgLTY2LDE5ICszNiw2IEBACiAgICAgICogICAgICAgICAgICAgICAgIGRhdGFncmFtSWQgdG8gVGVsZXBob255LiBJZiB0aGUgY2FsbGJhY2sgaXMgbm90IHJlY2VpdmVkIHdpdGhpbiBmaXZlIG1pbnV0ZXMsCiAgICAgICogICAgICAgICAgICAgICAgIFRlbGVwaG9ueSB3aWxsIHJlc2VuZCB0aGUgZGF0YWdyYW0uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sCi0gICAgICAgICAgICBpbnQgcGVuZGluZ0NvdW50LCBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKiogQGhpZGUgKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgbUJpbmRlci5zZXRFeGVjdXRvcihleGVjdXRvcik7Ci0gICAgfQorICAgIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sCisgICAgICAgICAgICBpbnQgcGVuZGluZ0NvdW50LCBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlTWFuYWdlci5qYXZhCmluZGV4IDllYzY5MjkuLmQwYWJmYmYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZU1hbmFnZXIuamF2YQpAQCAtMzYsMTIgKzM2LDE1IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RnJhbWV3b3JrSW5pdGlhbGl6ZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUludGVnZXJDb25zdW1lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUxvbmdDb25zdW1lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIGltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnkuUmxvZzsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIApAQCAtNTUsNiArNTgsMTcgQEAKIHB1YmxpYyBjbGFzcyBTYXRlbGxpdGVNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhdGVsbGl0ZU1hbmFnZXIiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjaywgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2s+CisgICAgICAgICAgICBzU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFja01hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjaywKKyAgICAgICAgICAgIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrPiBzU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFja01hcCA9CisgICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2ssIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrPgorICAgICAgICAgICAgc1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2tNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLAorICAgICAgICAgICAgSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrPiBzU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2tNYXAgPQorICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKwogICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJJZDsKIAogICAgIC8qKgpAQCAtNjYsNiArODAsNyBAQAogICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgU2F0ZWxsaXRlTWFuYWdlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRoZSBTYXRlbGxpdGVNYW5hZ2VyIGJlbG9uZ3MgdG8uCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU2F0ZWxsaXRlTWFuYWdlcihATnVsbGFibGUgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgU3Vic2NyaXB0aW9uTWFuYWdlci5ERUZBVUxUX1NVQlNDUklQVElPTl9JRCk7CkBAIC0xMTYsNyArMTMxLDcgQEAKIAogICAgIC8qKgogICAgICAqIEJ1bmRsZSBrZXkgdG8gZ2V0IHRoZSByZXNwb25zZSBmcm9tCi0gICAgICoge0BsaW5rICNyZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9LgorICAgICAqIHtAbGluayAjcmVxdWVzdElzRGVtb01vZGVFbmFibGVkKEV4ZWN1dG9yLCBPdXRjb21lUmVjZWl2ZXIpfS4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERU1PX01PREVfRU5BQkxFRCA9ICJkZW1vX21vZGVfZW5hYmxlZCI7CkBAIC0xMzcsMTQgKzE1Miw2IEBACiAKICAgICAvKioKICAgICAgKiBCdW5kbGUga2V5IHRvIGdldCB0aGUgcmVzcG9uc2UgZnJvbQotICAgICAqIHtAbGluayAjcmVxdWVzdE1heFNpemVQZXJTZW5kaW5nRGF0YWdyYW0oRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9IC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfQ0hBUkFDVEVSU19QRVJfU0FURUxMSVRFX1RFWFQgPQotICAgICAgICAgICAgIm1heF9jaGFyYWN0ZXJzX3Blcl9zYXRlbGxpdGVfdGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUga2V5IHRvIGdldCB0aGUgcmVzcG9uc2UgZnJvbQogICAgICAqIHtAbGluayAjcmVxdWVzdElzU2F0ZWxsaXRlUHJvdmlzaW9uZWQoRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9LgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0zMTksMjMgKzMyNiwyNSBAQAogICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5UUmFkaW9UZWNobm9sb2d5IHt9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0uIElmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZW5hYmxlZCwgdGhpcwotICAgICAqIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSBjZWxsdWxhciBtb2RlbSwgYW5kIGlmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZGlzYWJsZWQsIHRoaXMgd2lsbCBhbHNvCi0gICAgICogcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KKyAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGRlbW8gbW9kZS4gSWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcworICAgICAqIGVuYWJsZWQsIHRoaXMgbWF5IGFsc28gZGlzYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0sIGFuZCBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGRpc2FibGVkLAorICAgICAqIHRoaXMgbWF5IGFsc28gcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KICAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZVNhdGVsbGl0ZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZURlbW9Nb2RlIHtAY29kZSB0cnVlfSB0byBlbmFibGUgZGVtbyBtb2RlIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgZXJyb3IgY29kZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlTGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRMaXN0ZW5lciBMaXN0ZW5lciBmb3IgdGhlIHtAbGluayBTYXRlbGxpdGVFcnJvcn0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHJlcXVpcmVkIHBlcm1pc3Npb24uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFRlbGVwaG9ueSBwcm9jZXNzIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZCgKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlLCBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IGVycm9yQ29kZUxpc3RlbmVyKSB7CisgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVTYXRlbGxpdGUsIGJvb2xlYW4gZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKKyAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiByZXN1bHRMaXN0ZW5lcikgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChlcnJvckNvZGVMaXN0ZW5lcik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVzdWx0TGlzdGVuZXIpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKQEAgLTM0NCwxMCArMzUzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiByZXN1bHRMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkucmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQobVN1YklkLCBlbmFibGUsIGVycm9yQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChtU3ViSWQsIGVuYWJsZVNhdGVsbGl0ZSwgZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTQxMiw1MCArNDIyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UgZGVtbyBtb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgZGVtbyBtb2RlIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgZXJyb3IgY29kZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlTGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZURlbW9Nb2RlRW5hYmxlZChib29sZWFuIGVuYWJsZSwKLSAgICAgICAgICAgIEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAotICAgICAgICAgICAgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKLSAgICAgICAgICAgIGlmICh0ZWxlcGhvbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayA9IG5ldyBJSW50ZWdlckNvbnN1bWVyLlN0dWIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkucmVxdWVzdFNhdGVsbGl0ZURlbW9Nb2RlRW5hYmxlZChtU3ViSWQsIGVuYWJsZSwgZXJyb3JDYWxsYmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgUmxvZy5lKFRBRywgInJlcXVlc3RTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIsIGV4KTsKLSAgICAgICAgICAgIGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIHRoZSByZXN1bHQgd2lsbCBiZSBkZWxpdmVyZWQuCiAgICAgICogICAgICAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25SZXN1bHQoT2JqZWN0KX0KLSAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gYSB7QGNvZGUgYm9vbGVhbn0gd2l0aCB2YWx1ZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNhdGVsbGl0ZQotICAgICAqICAgICAgICAgICAgICAgICBkZW1vIG1vZGUgaXMgZW5hYmxlZCBhbmQge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIGEge0Bjb2RlIGJvb2xlYW59IHdpdGggdmFsdWUge0Bjb2RlIHRydWV9IGlmIGRlbW8gbW9kZSBpcyBlbmFibGVkCisgICAgICogICAgICAgICAgICAgICAgIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25FcnJvcihUaHJvd2FibGUpfQogICAgICAqICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiBhIHtAbGluayBTYXRlbGxpdGVFeGNlcHRpb259IHdpdGggdGhlIHtAbGluayBTYXRlbGxpdGVFcnJvcn0uCiAgICAgICoKQEAgLTQ2Myw3ICs0MzYsNyBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlRGVtb01vZGVFbmFibGVkKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RJc0RlbW9Nb2RlRW5hYmxlZChATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKICAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxCb29sZWFuLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKQEAgLTQ5MiwxMiArNDY1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQobVN1YklkLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgdGVsZXBob255LnJlcXVlc3RJc0RlbW9Nb2RlRW5hYmxlZChtU3ViSWQsIHJlY2VpdmVyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2dlKCJyZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7CisgICAgICAgICAgICBsb2dlKCJyZXF1ZXN0SXNEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7CiAgICAgICAgICAgICBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzQyLDE0NSArNzE1LDExNyBAQAogICAgIHB1YmxpYyBAaW50ZXJmYWNlIERhdGFncmFtVHlwZSB7fQogCiAgICAgLyoqCi0gICAgICogU3RhcnQgcmVjZWl2aW5nIHNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGVzLgorICAgICAqIFN0YXJ0IHJlY2VpdmluZyBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICogVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBwb2ludGluZyBVSSB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBwb2ludGluZyB0byB0aGUgc2F0ZWxsaXRlLgogICAgICAqIE1vZGVtIHNob3VsZCBjb250aW51ZSB0byByZXBvcnQgdGhlIHBvaW50aW5nIGlucHV0IGFzIHRoZSBkZXZpY2Ugb3Igc2F0ZWxsaXRlIG1vdmVzLgotICAgICAqIFNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGVzIGFyZSBzdGFydGVkIG9ubHkgb24ge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uCisgICAgICogU2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzIGFyZSBzdGFydGVkIG9ubHkgb24ge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uCiAgICAgICogQWxsIG90aGVyIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBmYWlsZWQuCi0gICAgICogT25jZSBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlcyBiZWdpbiwgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgdXBkYXRlcyB3aWxsIGJlIHNlbnQKLSAgICAgKiB0aHJvdWdoIHtAbGluayBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrfS4KKyAgICAgKiBPbmNlIHNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcyBiZWdpbiwgcG9zaXRpb24gYW5kIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIHVwZGF0ZXMKKyAgICAgKiB3aWxsIGJlIHNlbnQgdGhyb3VnaCB7QGxpbmsgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2t9LgogICAgICAqCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgY2FsbGJhY2sgYW5kIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIG5vdGlmeSBvZiBjaGFuZ2VzIGluIHNhdGVsbGl0ZSBwb3NpdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gbm90aWZ5IG9mIHNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgcmVxdWlyZWQgcGVybWlzc2lvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgVGVsZXBob255IHByb2Nlc3MgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAotICAgICAgICAgICAgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcHVibGljIHZvaWQgc3RhcnRTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgICAgICAgICAgQFNhdGVsbGl0ZUVycm9yIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IHJlc3VsdExpc3RlbmVyLAorICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlc3VsdExpc3RlbmVyKTsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwogICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayA9IG5ldyBJSW50ZWdlckNvbnN1bWVyLlN0dWIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiByZXN1bHRMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkuc3RhcnRTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViSWQsIGVycm9yQ2FsbGJhY2ssIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBJU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLlN0dWIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kUGVuZGluZ0NvdW50LCBpbnQgcmVjZWl2ZVBlbmRpbmdDb3VudCwgaW50IGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHNlbmRQZW5kaW5nQ291bnQsIHJlY2VpdmVQZW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQoUG9pbnRpbmdJbmZvIHBvaW50aW5nSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQocG9pbnRpbmdJbmZvKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc1NhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrTWFwLnB1dChjYWxsYmFjaywgaW50ZXJuYWxDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgdGVsZXBob255LnN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcyhtU3ViSWQsIGVycm9yQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2dlKCJzdGFydFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcygpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKKyAgICAgICAgICAgIGxvZ2UoInN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcygpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKICAgICAgICAgICAgIGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlcy4KKyAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICogVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBwb2ludGluZyBVSSB3aGVuIHRoZSB1c2VyIHN0b3BzIHBvaW50aW5nIHRvIHRoZSBzYXRlbGxpdGUuCi0gICAgICogU2F0ZWxsaXRlIHBvc2l0aW9uIHVwZGF0ZXMgYXJlIHN0b3BwZWQgYW5kIHRoZSBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQgb25seSBvbgorICAgICAqIFNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcyBhcmUgc3RvcHBlZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZCBvbmx5IG9uCiAgICAgICoge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uIEFsbCBvdGhlciByZXN1bHRzIHRoYXQgdGhpcyBvcGVyYXRpb24gZmFpbGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8KLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKEV4ZWN1dG9yLCBDb25zdW1lciwgU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayl9LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdGhhdCB3YXMgcGFzc2VkIHRvIHtAbGluaworICAgICAqICNzdGFydFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZXMoRXhlY3V0b3IsIENvbnN1bWVyLCBTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayl9LgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgc3RvcFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcyhATm9uTnVsbCBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrLAorICAgIHB1YmxpYyB2b2lkIHN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKAorICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IGVycm9yQ29kZUxpc3RlbmVyKSB7CisgICAgICAgICAgICBAU2F0ZWxsaXRlRXJyb3IgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gcmVzdWx0TGlzdGVuZXIpIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGVycm9yQ29kZUxpc3RlbmVyKTsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChyZXN1bHRMaXN0ZW5lcik7CisgICAgICAgIElTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayBpbnRlcm5hbENhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2tNYXAucmVtb3ZlKGNhbGxiYWNrKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgSVRlbGVwaG9ueSB0ZWxlcGhvbnkgPSBnZXRJVGVsZXBob255KCk7CiAgICAgICAgICAgICBpZiAodGVsZXBob255ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2sgPSBuZXcgSUludGVnZXJDb25zdW1lci5TdHViKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnN0b3BTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMobVN1YklkLCBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZ2V0QmluZGVyKCkpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IE5vdGlmeSBTbXNIYW5kbGVyIHRoYXQgcG9pbnRpbmcgVUkgc3RvcHBlZAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZWxlcGhvbnkgc2VydmljZSBpcyBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZ2UoInN0b3BTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgICAgICBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvIHNhdGVsbGl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIHRoZSByZXN1bHQgd2lsbCBiZSBkZWxpdmVyZWQuCi0gICAgICogICAgICAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25SZXN1bHQoT2JqZWN0KX0KLSAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvCi0gICAgICogICAgICAgICAgICAgICAgIHNhdGVsbGl0ZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25FcnJvcihUaHJvd2FibGUpfQotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdE1heFNpemVQZXJTZW5kaW5nRGF0YWdyYW0oCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxJbnRlZ2VyLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVRlbGVwaG9ueSB0ZWxlcGhvbnkgPSBnZXRJVGVsZXBob255KCk7Ci0gICAgICAgICAgICBpZiAodGVsZXBob255ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBSZXN1bHRSZWNlaXZlcihudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBTQVRFTExJVEVfRVJST1JfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHREYXRhLmNvbnRhaW5zS2V5KEtFWV9NQVhfQ0hBUkFDVEVSU19QRVJfU0FURUxMSVRFX1RFWFQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhDaGFyYWN0ZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhLmdldEludChLRVlfTUFYX0NIQVJBQ1RFUlNfUEVSX1NBVEVMTElURV9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQobWF4Q2hhcmFjdGVycykpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dlKCJLRVlfTUFYX0NIQVJBQ1RFUlNfUEVSX1NBVEVMTElURV9URVhUIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhdGVsbGl0ZUV4Y2VwdGlvbihTQVRFTExJVEVfUkVRVUVTVF9GQUlMRUQpKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG5ldyBTYXRlbGxpdGVFeGNlcHRpb24ocmVzdWx0Q29kZSkpKSk7CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2sgPSBuZXcgSUludGVnZXJDb25zdW1lci5TdHViKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IHJlc3VsdExpc3RlbmVyLmFjY2VwdChyZXN1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0TWF4U2l6ZVBlclNlbmRpbmdEYXRhZ3JhbShtU3ViSWQsIHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGVsZXBob255LnN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKG1TdWJJZCwgZXJyb3JDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTm90aWZ5IFNtc0hhbmRsZXIgdGhhdCBwb2ludGluZyBVSSBzdG9wcGVkCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZSgic3RvcFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZXM6IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KFNBVEVMTElURV9JTlZBTElEX0FSR1VNRU5UUykpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nZSgicmVxdWVzdE1heENoYXJhY3RlcnNQZXJTYXRlbGxpdGVUZXh0TWVzc2FnZSgpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKKyAgICAgICAgICAgIGxvZ2UoInN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKCkgUmVtb3RlRXhjZXB0aW9uOiAiICsgZXgpOwogICAgICAgICAgICAgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTg5MSwyMyArODM2LDI0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgcHJvdmlzaW9uaW5nIHdpdGggc2F0ZWxsaXRlCiAgICAgICogICAgICAgICAgICAgIGdhdGV3YXkuCisgICAgICogQHBhcmFtIHJlZ2lvbklkIFRoZSByZWdpb24gSUQgZm9yIHRoZSBkZXZpY2UncyBjdXJyZW50IGxvY2F0aW9uLgogICAgICAqIEBwYXJhbSBjYW5jZWxsYXRpb25TaWduYWwgVGhlIG9wdGlvbmFsIHNpZ25hbCB1c2VkIGJ5IHRoZSBjYWxsZXIgdG8gY2FuY2VsIHRoZSBwcm92aXNpb24KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuIEV2ZW4gd2hlbiB0aGUgY2FuY2VsbGF0aW9uIGlzIHNpZ25hbGVkLCBUZWxlcGhvbnkgd2lsbAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2sgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhpcyByZXF1ZXN0LgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sCisgICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sIEBOb25OdWxsIFN0cmluZyByZWdpb25JZCwKICAgICAgICAgICAgIEBOdWxsYWJsZSBDYW5jZWxsYXRpb25TaWduYWwgY2FuY2VsbGF0aW9uU2lnbmFsLAogICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsCi0gICAgICAgICAgICBAU2F0ZWxsaXRlRXJyb3IgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiByZXN1bHRMaXN0ZW5lcikgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHRva2VuKTsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlc3VsdExpc3RlbmVyKTsKIAogICAgICAgICBJQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbFJlbW90ZSA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC05MTcsMTAgKzg2MywxMSBAQAogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2FuY2VsUmVtb3RlID0gdGVsZXBob255LnByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UobVN1YklkLCB0b2tlbiwgZXJyb3JDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgY2FuY2VsUmVtb3RlID0gdGVsZXBob255LnByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UobVN1YklkLCB0b2tlbiwgcmVnaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTk0Miw3ICs4ODksNyBAQAogICAgICAqIHtAbGluayAjcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShTdHJpbmcsIENhbmNlbGxhdGlvblNpZ25hbCwgRXhlY3V0b3IsIENvbnN1bWVyKX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIG9mIHRoZSBkZXZpY2Uvc3Vic2NyaXB0aW9uIHRvIGJlIGRlcHJvdmlzaW9uZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KQEAgLTk1MCwxMCArODk3LDEwIEBACiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQogICAgIHB1YmxpYyB2b2lkIGRlcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiBlcnJvckNvZGVMaXN0ZW5lcikgeworICAgICAgICAgICAgQFNhdGVsbGl0ZUVycm9yIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IHJlc3VsdExpc3RlbmVyKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwodG9rZW4pOwogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChlcnJvckNvZGVMaXN0ZW5lcik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVzdWx0TGlzdGVuZXIpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKQEAgLTk2Miw3ICs5MDksNyBAQAogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgdGVsZXBob255LmRlcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShtU3ViSWQsIHRva2VuLCBlcnJvckNhbGxiYWNrKTsKQEAgLTk5Niw5ICs5NDMsMTggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOworICAgICAgICAgICAgICAgIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGludGVybmFsQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrLlN0dWIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoYm9vbGVhbiBwcm92aXNpb25lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aXNpb25lZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrTWFwLnB1dChjYWxsYmFjaywgaW50ZXJuYWxDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbGVwaG9ueS5yZWdpc3RlckZvclNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJJZCwgY2FsbGJhY2suZ2V0QmluZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTEwMjMsMTEgKzk3OSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoCiAgICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoY2FsbGJhY2spOworICAgICAgICBJU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjayBpbnRlcm5hbENhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFja01hcC5yZW1vdmUoY2FsbGJhY2spOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKICAgICAgICAgICAgIGlmICh0ZWxlcGhvbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKG1TdWJJZCwgY2FsbGJhY2suZ2V0QmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQobVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkOiBObyBpbnRlcm5hbCBjYWxsYmFjay4iKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7CiAgICAgICAgICAgICB9CkBAIC0xMTEyLDkgKzEwNzQsMTUgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXRCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IG5ldyBJU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5TdHViKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkKHN0YXRlKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlU3RhdGVDYWxsYmFja01hcC5wdXQoY2FsbGJhY2ssIGludGVybmFsQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsIGludGVybmFsQ2FsbGJhY2spOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZWxlcGhvbnkgc2VydmljZSBpcyBudWxsLiIpOwogICAgICAgICAgICAgfQpAQCAtMTEzOCwxMSArMTEwNiwxNiBAQAogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQE5vbk51bGwgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayBjYWxsYmFjaykgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKKyAgICAgICAgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IHNTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrTWFwLnJlbW92ZShjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQobVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQ6IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTExNTUsOCArMTEyOCw2IEBACiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdG8gcmVjZWl2ZSBpbmNvbWluZyBkYXRhZ3JhbXMgb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YWdyYW1UeXBlIGRhdGFncmFtIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRhZ3JhbSBpcyBvZiB0eXBlCi0gICAgICogICAgICAgICAgICAgICAgICAgICBTT1NfU01TIG9yIExPQ0FUSU9OX1NIQVJJTkcuCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBoYW5kbGUgaW5jb21pbmcgZGF0YWdyYW1zIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGNhbGxiYWNrIHdpdGggYmUgaW52b2tlZCB3aGVuIGEgbmV3IGRhdGFncmFtIGlzIHJlY2VpdmVkIGZyb20gc2F0ZWxsaXRlLgpAQCAtMTE2Nyw3ICsxMTM4LDcgQEAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgVGVsZXBob255IHByb2Nlc3MgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQotICAgIEBTYXRlbGxpdGVFcnJvciBwdWJsaWMgaW50IHJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oQERhdGFncmFtVHlwZSBpbnQgZGF0YWdyYW1UeXBlLAorICAgIEBTYXRlbGxpdGVFcnJvciBwdWJsaWMgaW50IHJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKICAgICAgICAgICAgIEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7CkBAIC0xMTc2LDkgKzExNDcsMTkgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShtU3ViSWQsIGRhdGFncmFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXRCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suU3R1YigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZURhdGFncmFtUmVjZWl2ZWQobG9uZyBkYXRhZ3JhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sIGludCBwZW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWdyYW1JZCwgZGF0YWdyYW0sIHBlbmRpbmdDb3VudCwgYWNrKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2tNYXAucHV0KGNhbGxiYWNrLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVsZXBob255LnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0obVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTExOTQsNyArMTE3NSw3IEBACiAgICAgICogSWYgY2FsbGJhY2sgd2FzIG5vdCByZWdpc3RlcmVkIGJlZm9yZSwgdGhlIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8KLSAgICAgKiB7QGxpbmsgI3JlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oaW50LCBFeGVjdXRvciwgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayl9LgorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShFeGVjdXRvciwgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayl9LgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KQEAgLTEyMDIsMTEgKzExODMsMTcgQEAKICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclNhdGVsbGl0ZURhdGFncmFtKEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CisgICAgICAgIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIGludGVybmFsQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgIHNTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrTWFwLnJlbW92ZShjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShtU3ViSWQsIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0obVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW06IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTEyMjIsNyArMTIwOSw3IEBACiAgICAgICogVGhpcyBtZXRob2QgcmVxdWVzdHMgbW9kZW0gdG8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGRhdGFncmFtcyB0byBiZSByZWNlaXZlZCBvdmVyCiAgICAgICogc2F0ZWxsaXRlLiBJZiB0aGVyZSBhcmUgYW55IGluY29taW5nIGRhdGFncmFtcywgdGhleSB3aWxsIGJlIHJlY2VpdmVkIHZpYQogICAgICAqIHtAbGluayBTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrI29uU2F0ZWxsaXRlRGF0YWdyYW1SZWNlaXZlZChsb25nLCBTYXRlbGxpdGVEYXRhZ3JhbSwgaW50LAotICAgICAqICAgICAgICAgIElTYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVyQWNrKX0KKyAgICAgKiAgICAgICAgSUxvbmdDb25zdW1lcil9CiAgICAgICoKICAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIG9uIHdoaWNoIHRoZSByZXN1bHQgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCiAgICAgICogQHBhcmFtIHJlc3VsdExpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KQEAgLTEzNzEsOSArMTM1OCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBnZXQgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuIFRoaXMgaXMgYW4KLSAgICAgKiB7QGNvZGUgaW50fSByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuCi0gICAgICogVGhpcyB3aWxsIHJldHVybiB7QGNvZGUgMH0gaWYgdGhlIHNhdGVsbGl0ZSBpcyBjdXJyZW50bHkgdmlzaWJsZS4KKyAgICAgKiBSZXF1ZXN0IHRvIGdldCB0aGUgZHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2F0ZWxsaXRlIHdpbGwgYmUgdmlzaWJsZS4KKyAgICAgKiBUaGlzIHdpbGwgYmUge0BsaW5rIER1cmF0aW9uI1pFUk99IGlmIHRoZSBzYXRlbGxpdGUgaXMgY3VycmVudGx5IHZpc2libGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIG9uIHdoaWNoIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCB0aGUgcmVzdWx0IHdpbGwgYmUgZGVsaXZlcmVkLgpAQCAtMTM4Nyw3ICsxMzczLDcgQEAKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdFRpbWVGb3JOZXh0U2F0ZWxsaXRlVmlzaWJpbGl0eShATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxJbnRlZ2VyLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBATm9uTnVsbCBPdXRjb21lUmVjZWl2ZXI8RHVyYXRpb24sIFNhdGVsbGl0ZUV4Y2VwdGlvbj4gY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoY2FsbGJhY2spOwogCkBAIC0xNDAyLDcgKzEzODgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFZpc2liaWxpdHlEdXJhdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0YS5nZXRJbnQoS0VZX1NBVEVMTElURV9ORVhUX1ZJU0lCSUxJVFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChuZXh0VmlzaWJpbGl0eUR1cmF0aW9uKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24ub2ZTZWNvbmRzKG5leHRWaXNpYmlsaXR5RHVyYXRpb24pKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2UoIktFWV9TQVRFTExJVEVfTkVYVF9WSVNJQklMSVRZIGRvZXMgbm90IGV4aXN0LiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRhODRkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotLyoqCi0gKiBBIGNhbGxiYWNrIGNsYXNzIGZvciBtb25pdG9yaW5nIHNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGUgYW5kIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIGNoYW5nZQotICogZXZlbnRzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrQmluZGVyIG1CaW5kZXIgPSBuZXcgQ2FsbGJhY2tCaW5kZXIodGhpcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsYmFja0JpbmRlciBleHRlbmRzIElTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLlN0dWIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2sgbUxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIHByaXZhdGUgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIHByaXZhdGUgQ2FsbGJhY2tCaW5kZXIoU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayBsb2NhbENhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtTG9jYWxDYWxsYmFjayA9IGxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQoQE5vbk51bGwgUG9pbnRpbmdJbmZvIHBvaW50aW5nSW5mbykgewotICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxsaW5nSWRlbnRpdHkgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrLm9uU2F0ZWxsaXRlUG9zaXRpb25DaGFuZ2VkKHBvaW50aW5nSW5mbykpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGNhbGxpbmdJZGVudGl0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgIEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZURhdGFncmFtVHJhbnNmZXJTdGF0ZSBpbnQgc3RhdGUsIGludCBzZW5kUGVuZGluZ0NvdW50LAotICAgICAgICAgICAgICAgIGludCByZWNlaXZlUGVuZGluZ0NvdW50LCBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVFcnJvciBpbnQgZXJyb3JDb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgc2VuZFBlbmRpbmdDb3VudCwgcmVjZWl2ZVBlbmRpbmdDb3VudCwgZXJyb3JDb2RlKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2F0ZWxsaXRlIHBvc2l0aW9uIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9pbnRpbmdJbmZvIFRoZSBwb2ludGluZyBpbmZvIGNvbnRhaW5pbmcgdGhlIHNhdGVsbGl0ZSBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZVBvc2l0aW9uQ2hhbmdlZChATm9uTnVsbCBQb2ludGluZ0luZm8gcG9pbnRpbmdJbmZvKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlLgotICAgICAqIEBwYXJhbSBzZW5kUGVuZGluZ0NvdW50IFRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzZW50LgotICAgICAqIEBwYXJhbSByZWNlaXZlUGVuZGluZ0NvdW50IFRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyByZWNlaXZlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIElmIGRhdGFncmFtIHRyYW5zZmVyIGZhaWxlZCwgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGFncmFtVHJhbnNmZXJTdGF0ZUNoYW5nZWQoCi0gICAgICAgICAgICBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVEYXRhZ3JhbVRyYW5zZmVyU3RhdGUgaW50IHN0YXRlLCBpbnQgc2VuZFBlbmRpbmdDb3VudCwKLSAgICAgICAgICAgIGludCByZWNlaXZlUGVuZGluZ0NvdW50LCBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVFcnJvciBpbnQgZXJyb3JDb2RlKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKipAaGlkZSovCi0gICAgQE5vbk51bGwKLSAgICBmaW5hbCBJU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayBnZXRCaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQmluZGVyOwotICAgIH0KLQotICAgIC8qKkBoaWRlKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBtQmluZGVyLnNldEV4ZWN1dG9yKGV4ZWN1dG9yKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjay5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2suamF2YQppbmRleCAyYjZhNWQ5Li5hNjJlYjhiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjay5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrLmphdmEKQEAgLTE2LDYxICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZTsKIAotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KIC8qKgogICogQSBjYWxsYmFjayBjbGFzcyBmb3IgbW9uaXRvcmluZyBzYXRlbGxpdGUgcHJvdmlzaW9uIHN0YXRlIGNoYW5nZSBldmVudHMuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2sgewotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tCaW5kZXIgbUJpbmRlciA9IG5ldyBDYWxsYmFja0JpbmRlcih0aGlzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxiYWNrQmluZGVyIGV4dGVuZHMgSVNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2suU3R1YiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjayBtTG9jYWxDYWxsYmFjazsKLSAgICAgICAgcHJpdmF0ZSBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBDYWxsYmFja0JpbmRlcihTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGxvY2FsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrID0gbG9jYWxDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZChib29sZWFuIHByb3Zpc2lvbmVkKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQocHJvdmlzaW9uZWQpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShjYWxsaW5nSWRlbnRpdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotICAgIH0KLQorcHVibGljIGludGVyZmFjZSBTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIHsKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgcHJvdmlzaW9uIHN0YXRlIGNoYW5nZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvdmlzaW9uZWQgVGhlIG5ldyBwcm92aXNpb24gc3RhdGUuIHtAY29kZSB0cnVlfSBtZWFucyBzYXRlbGxpdGUgaXMgcHJvdmlzaW9uZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBtZWFucyBzYXRlbGxpdGUgaXMgbm90IHByb3Zpc2lvbmVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKGJvb2xlYW4gcHJvdmlzaW9uZWQpIHsKLSAgICAgICAgLy8gQmFzZSBJbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIC8qKkBoaWRlKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqQGhpZGUqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIG1CaW5kZXIuc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgIH0KKyAgICB2b2lkIG9uU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKGJvb2xlYW4gcHJvdmlzaW9uZWQpOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVTdGF0ZUNhbGxiYWNrLmphdmEKaW5kZXggMTdkMDViNy4uZDllY2FhMyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5qYXZhCkBAIC0xNiw4MCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGU7CiAKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCiAvKioKICAqIEEgY2FsbGJhY2sgY2xhc3MgZm9yIG1vbml0b3Jpbmcgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlIGNoYW5nZSBldmVudHMuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgewotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tCaW5kZXIgbUJpbmRlciA9IG5ldyBDYWxsYmFja0JpbmRlcih0aGlzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxiYWNrQmluZGVyIGV4dGVuZHMgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suU3R1YiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayBtTG9jYWxDYWxsYmFjazsKLSAgICAgICAgcHJpdmF0ZSBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBDYWxsYmFja0JpbmRlcihTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIGxvY2FsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrID0gbG9jYWxDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkKEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZU1vZGVtU3RhdGUgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25TYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChzdGF0ZSkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGNhbGxpbmdJZGVudGl0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QZW5kaW5nRGF0YWdyYW1Db3VudChpbnQgY291bnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsbGluZ0lkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTG9jYWxDYWxsYmFjay5vblBlbmRpbmdEYXRhZ3JhbUNvdW50KGNvdW50KSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3B1YmxpYyBpbnRlcmZhY2UgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayB7CiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gc2F0ZWxsaXRlIG1vZGVtIHN0YXRlIGNoYW5nZXMuCiAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlTW9kZW1TdGF0ZSBpbnQgc3RhdGUpIHsKLSAgICAgICAgLy8gQmFzZSBJbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGFyZSBwZW5kaW5nIGRhdGFncmFtcyB0byBiZSByZWNlaXZlZCBmcm9tIHNhdGVsbGl0ZS4KLSAgICAgKiBAcGFyYW0gY291bnQgUGVuZGluZyBkYXRhZ3JhbSBjb3VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblBlbmRpbmdEYXRhZ3JhbUNvdW50KGludCBjb3VudCkgewotICAgICAgICAvLyBCYXNlIEltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgLy9UT0RPOiBBZGQgYW4gQVBJIGZvciBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZSB1cGRhdGUgaGVyZS4KLQotICAgIC8qKkBoaWRlKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqQGhpZGUqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIG1CaW5kZXIuc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgIH0KKyAgICB2b2lkIG9uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlTW9kZW1TdGF0ZSBpbnQgc3RhdGUpOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL0lTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmFpZGwgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suamF2YQpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL0lTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmFpZGwKY29weSB0byB0ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suamF2YQppbmRleCBkM2YxMDkxLi4wZWZiZDFmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2suYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTMgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOwogCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlLlBvaW50aW5nSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIAogLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHBvc2l0aW9uIHVwZGF0ZSBhbmQgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgY2hhbmdlIGNhbGxiYWNrLgorICogQSBjYWxsYmFjayBjbGFzcyBmb3IgbW9uaXRvcmluZyBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlIGFuZCBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZSBjaGFuZ2UKKyAqIGV2ZW50cy4KKyAqCiAgKiBAaGlkZQogICovCi1vbmV3YXkgaW50ZXJmYWNlIElTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIHsKK3B1YmxpYyBpbnRlcmZhY2UgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgeworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBzYXRlbGxpdGUgcG9zaXRpb24gY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb2ludGluZ0luZm8gVGhlIHBvaW50aW5nIGluZm8gY29udGFpbmluZyB0aGUgc2F0ZWxsaXRlIGxvY2F0aW9uLgorICAgICAqLworICAgIHZvaWQgb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQoQE5vbk51bGwgUG9pbnRpbmdJbmZvIHBvaW50aW5nSW5mbyk7CisKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgY2hhbmdlZC4KICAgICAgKgpAQCAtMzEsMTMgKzQwLDcgQEAKICAgICAgKiBAcGFyYW0gcmVjZWl2ZVBlbmRpbmdDb3VudCBUaGUgbnVtYmVyIG9mIGRhdGFncmFtcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcmVjZWl2ZWQuCiAgICAgICogQHBhcmFtIGVycm9yQ29kZSBJZiBkYXRhZ3JhbSB0cmFuc2ZlciBmYWlsZWQsIHRoZSByZWFzb24gZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdm9pZCBvbkRhdGFncmFtVHJhbnNmZXJTdGF0ZUNoYW5nZWQoaW4gaW50IHN0YXRlLCBpbiBpbnQgc2VuZFBlbmRpbmdDb3VudCwKLSAgICAgICAgICAgIGluIGludCByZWNlaXZlUGVuZGluZ0NvdW50LCBpbiBpbnQgZXJyb3JDb2RlKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBzYXRlbGxpdGUgcG9zaXRpb24gY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb2ludGluZ0luZm8gVGhlIHBvaW50aW5nIGluZm8gY29udGFpbmluZyB0aGUgc2F0ZWxsaXRlIGxvY2F0aW9uLgotICAgICAqLwotICAgIHZvaWQgb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQoaW4gUG9pbnRpbmdJbmZvIHBvaW50aW5nSW5mbyk7CisgICAgdm9pZCBvbkRhdGFncmFtVHJhbnNmZXJTdGF0ZUNoYW5nZWQoQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlRGF0YWdyYW1UcmFuc2ZlclN0YXRlIGludCBzdGF0ZSwKKyAgICAgICAgICAgIGludCBzZW5kUGVuZGluZ0NvdW50LCBpbnQgcmVjZWl2ZVBlbmRpbmdDb3VudCwKKyAgICAgICAgICAgIEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZUVycm9yIGludCBlcnJvckNvZGUpOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvSVNhdGVsbGl0ZS5haWRsIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvSVNhdGVsbGl0ZS5haWRsCmluZGV4IGQ5M2VlMjEuLmE3ODBjYjkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGUuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlLmFpZGwKQEAgLTQ5LDEwICs0OSw5IEBACiAgICAgICogTGlzdGVuaW5nIG1vZGUgYWxsb3dzIHRoZSBzYXRlbGxpdGUgc2VydmljZSB0byBsaXN0ZW4gZm9yIGluY29taW5nIHBhZ2VzLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSBUcnVlIHRvIGVuYWJsZSBzYXRlbGxpdGUgbGlzdGVuaW5nIG1vZGUgYW5kIGZhbHNlIHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGlzRGVtb01vZGUgV2hldGhlciBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKiBAcGFyYW0gdGltZW91dCBIb3cgbG9uZyB0aGUgc2F0ZWxsaXRlIG1vZGVtIHNob3VsZCB3YWl0IGZvciB0aGUgbmV4dCBpbmNvbWluZyBwYWdlIGJlZm9yZQogICAgICAqICAgICAgICAgICAgICAgIGRpc2FibGluZyBsaXN0ZW5pbmcgbW9kZS4KLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKQEAgLTY0LDE2ICs2MywxNyBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVMaXN0ZW5pbmdFbmFibGVkKGluIGJvb2xlYW4gZW5hYmxlLCBpbiBib29sZWFuIGlzRGVtb01vZGUsIGluIGludCB0aW1lb3V0LAotICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKKyAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVMaXN0ZW5pbmdFbmFibGVkKGluIGJvb2xlYW4gZW5hYmxlLCBpbiBpbnQgdGltZW91dCwKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtLiBJZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGVuYWJsZWQsCi0gICAgICogdGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0sIGFuZCBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGRpc2FibGVkLAotICAgICAqIHRoaXMgd2lsbCBhbHNvIHJlLWVuYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0uCisgICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCBkZW1vIG1vZGUuIElmIHRoZSBzYXRlbGxpdGUgbW9kZW0KKyAgICAgKiBpcyBlbmFibGVkLCB0aGlzIG1heSBhbHNvIGRpc2FibGUgdGhlIGNlbGx1bGFyIG1vZGVtLCBhbmQgaWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBkaXNhYmxlZCwKKyAgICAgKiB0aGlzIG1heSBhbHNvIHJlLWVuYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlIFRydWUgdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGZhbHNlIHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIGVuYWJsZVNhdGVsbGl0ZSBUcnVlIHRvIGVuYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCBmYWxzZSB0byBkaXNhYmxlLgorICAgICAqIEBwYXJhbSBlbmFibGVEZW1vTW9kZSBUcnVlIHRvIGVuYWJsZSBkZW1vIG1vZGUgYW5kIGZhbHNlIHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC04NSwxMyArODUsMTQgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChpbiBib29sZWFuIGVuYWJsZWQsIGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayk7CisgICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChpbiBib29sZWFuIGVuYWJsZVNhdGVsbGl0ZSwgaW4gYm9vbGVhbiBlbmFibGVEZW1vTW9kZSwKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgd2hldGhlciB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGVuYWJsZWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGVuYWJsZWQuCiAgICAgICoKQEAgLTEwNSwxMyArMTA2LDEzIEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlRW5hYmxlZChpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssIGluIElCb29sZWFuQ29uc3VtZXIgY2FsbGJhY2spOworICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlRW5hYmxlZChpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLCBpbiBJQm9vbGVhbkNvbnN1bWVyIGNhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIGlzIHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIGlzIHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgogICAgICAqCkBAIC0xMjUsMTQgKzEyNiwxNCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZVN1cHBvcnRlZChpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssCisgICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVTdXBwb3J0ZWQoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywKICAgICAgICAgICAgIGluIElCb29sZWFuQ29uc3VtZXIgY2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgdGhlIFNhdGVsbGl0ZUNhcGFiaWxpdGllcyBvZiB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgdGhlIFNhdGVsbGl0ZUNhcGFiaWxpdGllcyBvZiB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UuCiAgICAgICoKQEAgLTE0Niw3ICsxNDcsNyBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVDYXBhYmlsaXRpZXMoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAorICAgIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUNhcGFiaWxpdGllcyhpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLAogICAgICAgICAgICAgaW4gSVNhdGVsbGl0ZUNhcGFiaWxpdGllc0NvbnN1bWVyIGNhbGxiYWNrKTsKIAogICAgIC8qKgpAQCAtMTU0LDcgKzE1NSw3IEBACiAgICAgICogVGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIHNob3VsZCByZXBvcnQgdGhlIHNhdGVsbGl0ZSBwb2ludGluZyBpbmZvIHZpYQogICAgICAqIElTYXRlbGxpdGVMaXN0ZW5lciNvblNhdGVsbGl0ZVBvc2l0aW9uQ2hhbmdlZCBhcyB0aGUgdXNlciBkZXZpY2Uvc2F0ZWxsaXRlIG1vdmVzLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC0xNjYsMTMgKzE2NywxMyBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHN0YXJ0U2VuZGluZ1NhdGVsbGl0ZVBvaW50aW5nSW5mbyhpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgc3RhcnRTZW5kaW5nU2F0ZWxsaXRlUG9pbnRpbmdJbmZvKGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogVXNlciBzdG9wcGVkIHBvaW50aW5nIHRvIHRoZSBzYXRlbGxpdGUuCiAgICAgICogVGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIHNob3VsZCBzdG9wIHJlcG9ydGluZyBzYXRlbGxpdGUgcG9pbnRpbmcgaW5mbyB0byB0aGUgZnJhbWV3b3JrLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC0xODQsMjggKzE4NSw3IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHZvaWQgc3RvcFNlbmRpbmdTYXRlbGxpdGVQb2ludGluZ0luZm8oaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKLQotICAgIC8qKgotICAgICAqIFJlcXVlc3QgdG8gZ2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBNTyB0ZXh0IG1lc3NhZ2Ugb24gc2F0ZWxsaXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGVyIE1PIHRleHQgbWVzc2FnZSBvbiBzYXRlbGxpdGUuCi0gICAgICoKLSAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlNFUlZJQ0VfRVJST1IKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk1PREVNX0VSUk9SCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpJTlZBTElEX01PREVNX1NUQVRFCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpJTlZBTElEX0FSR1VNRU5UUwotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkFESU9fTk9UX0FWQUlMQUJMRQotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKLSAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RNYXhDaGFyYWN0ZXJzUGVyTU9UZXh0TWVzc2FnZShpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssCi0gICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIGNhbGxiYWNrKTsKKyAgICB2b2lkIHN0b3BTZW5kaW5nU2F0ZWxsaXRlUG9pbnRpbmdJbmZvKGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUHJvdmlzaW9uIHRoZSBkZXZpY2Ugd2l0aCBhIHNhdGVsbGl0ZSBwcm92aWRlci4KQEAgLTIxNCw3ICsxOTQsOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHByb3Zpc2lvbmluZyB3aXRoIHNhdGVsbGl0ZQogICAgICAqICAgICAgICAgICAgICBnYXRld2F5LgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZWdpb25JZCBUaGUgcmVnaW9uIElEIGZvciB0aGUgZGV2aWNlJ3MgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKQEAgLTIyOSw3ICsyMTAsOCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9BQk9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpORVRXT1JLX1RJTUVPVVQKICAgICAgKi8KLSAgICB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoaW4gU3RyaW5nIHRva2VuLCBpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShpbiBTdHJpbmcgdG9rZW4sIGluIFN0cmluZyByZWdpb25JZCwKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogRGVwcm92aXNpb24gdGhlIGRldmljZSB3aXRoIHRoZSBzYXRlbGxpdGUgcHJvdmlkZXIuCkBAIC0yMzcsNyArMjE5LDcgQEAKICAgICAgKiBPbmNlIGRlcHJvdmlzaW9uZWQsIElTYXRlbGxpdGVMaXN0ZW5lciNvblNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZCBzaG91bGQgcmVwb3J0IGZhbHNlLgogICAgICAqCiAgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBvZiB0aGUgZGV2aWNlL3N1YnNjcmlwdGlvbiB0byBiZSBkZXByb3Zpc2lvbmVkLgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6RVJST1JfTk9ORQpAQCAtMjUyLDEzICsyMzQsMTMgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfQUJPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6TkVUV09SS19USU1FT1VUCiAgICAgICovCi0gICAgdm9pZCBkZXByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoaW4gU3RyaW5nIHRva2VuLCBpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgZGVwcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKGluIFN0cmluZyB0b2tlbiwgaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoaXMgZGV2aWNlIGlzIHByb3Zpc2lvbmVkIHdpdGggYSBzYXRlbGxpdGUgcHJvdmlkZXIuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgd2hldGhlciB0aGlzIGRldmljZSBpcyBwcm92aXNpb25lZCB3aXRoIGEgc2F0ZWxsaXRlIHByb3ZpZGVyLgogICAgICAqCkBAIC0yNzIsNyArMjU0LDcgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVQcm92aXNpb25lZChpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssCisgICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVQcm92aXNpb25lZChpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLAogICAgICAgICAgICAgaW4gSUJvb2xlYW5Db25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKQEAgLTI4MCw3ICsyNjIsNyBAQAogICAgICAqIFRoZSBzYXRlbGxpdGUgc2VydmljZSBzaG91bGQgY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGRhdGFncmFtcyB0byBiZSByZWNlaXZlZCBvdmVyCiAgICAgICogc2F0ZWxsaXRlIGFuZCByZXBvcnQgdGhlbSB2aWEgSVNhdGVsbGl0ZUxpc3RlbmVyI29uU2F0ZWxsaXRlRGF0YWdyYW1zUmVjZWl2ZWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKQEAgLTI5NywxNSArMjc5LDE0IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpTQVRFTExJVEVfTk9UX1JFQUNIQUJMRQogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9UX0FVVEhPUklaRUQKICAgICAgKi8KLSAgICB2b2lkIHBvbGxQZW5kaW5nU2F0ZWxsaXRlRGF0YWdyYW1zKGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayk7CisgICAgdm9pZCBwb2xsUGVuZGluZ1NhdGVsbGl0ZURhdGFncmFtcyhpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFNlbmQgZGF0YWdyYW0gb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YWdyYW0gRGF0YWdyYW0gdG8gc2VuZCBpbiBieXRlIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gaXNEZW1vTW9kZSBXaGV0aGVyIGRlbW8gbW9kZSBpcyBlbmFibGVkLgogICAgICAqIEBwYXJhbSBpc0VtZXJnZW5jeSBXaGV0aGVyIHRoaXMgaXMgYW4gZW1lcmdlbmN5IGRhdGFncmFtLgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6RVJST1JfTk9ORQpAQCAtMzIzLDE2ICszMDQsMTYgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlNBVEVMTElURV9OT1RfUkVBQ0hBQkxFCiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT1RfQVVUSE9SSVpFRAogICAgICAqLwotICAgIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKGluIFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBpbiBib29sZWFuIGlzRGVtb01vZGUsCi0gICAgICAgICAgICBpbiBib29sZWFuIGlzRW1lcmdlbmN5LCBpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKGluIFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBpbiBib29sZWFuIGlzRW1lcmdlbmN5LAorICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRoZSBjdXJyZW50IHNhdGVsbGl0ZSBtb2RlbSBzdGF0ZS4KICAgICAgKiBUaGUgc2F0ZWxsaXRlIHNlcnZpY2Ugc2hvdWxkIHJlcG9ydCB0aGUgY3VycmVudCBzYXRlbGxpdGUgbW9kZW0gc3RhdGUgdmlhCiAgICAgICogSVNhdGVsbGl0ZUxpc3RlbmVyI29uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlLgogICAgICAqCkBAIC0zNDYsMTQgKzMyNywxNCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVNb2RlbVN0YXRlKGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKKyAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVNb2RlbVN0YXRlKGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2ssCiAgICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIGNhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHdoZXRoZXIgc2F0ZWxsaXRlIGNvbW11bmljYXRpb24gaXMgYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb24uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgd2hldGhlciBzYXRlbGxpdGUgY29tbXVuaWNhdGlvbiBpcyBhbGxvd2VkIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbi4KICAgICAgKgpAQCAtMzY4LDE1ICszNDksMTUgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwogICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlQ29tbXVuaWNhdGlvbkFsbG93ZWRGb3JDdXJyZW50TG9jYXRpb24oCi0gICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssIGluIElCb29sZWFuQ29uc3VtZXIgY2FsbGJhY2spOworICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywgaW4gSUJvb2xlYW5Db25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB0aGUgdGltZSBhZnRlciB3aGljaCB0aGUgc2F0ZWxsaXRlIHdpbGwgYmUgdmlzaWJsZS4gVGhpcyBpcyBhbiBpbnQKICAgICAgKiByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuCiAgICAgICogVGhpcyB3aWxsIHJldHVybiAwIGlmIHRoZSBzYXRlbGxpdGUgaXMgY3VycmVudGx5IHZpc2libGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIHJlc3VsdCBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKICAgICAgKiAgICAgICAgICAgICAgICAgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuCiAgICAgICoKQEAgLTM5MCw2ICszNzEsNiBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RUaW1lRm9yTmV4dFNhdGVsbGl0ZVZpc2liaWxpdHkoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAorICAgIHZvaWQgcmVxdWVzdFRpbWVGb3JOZXh0U2F0ZWxsaXRlVmlzaWJpbGl0eShpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLAogICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBjYWxsYmFjayk7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlTGlzdGVuZXIuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGVMaXN0ZW5lci5haWRsCmluZGV4IGQ5NjY4NjguLjVlNjkyMTUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGVMaXN0ZW5lci5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGVMaXN0ZW5lci5haWRsCkBAIC00MywxMCArNDMsOCBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNhdGVsbGl0ZSBoYXMgcGVuZGluZyBkYXRhZ3JhbXMgZm9yIHRoZSBkZXZpY2UgdG8gYmUgcHVsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBwZW5kaW5nIGRhdGFncmFtcy4KICAgICAgKi8KLSAgICB2b2lkIG9uUGVuZGluZ0RhdGFncmFtQ291bnQoaW4gaW50IGNvdW50KTsKKyAgICB2b2lkIG9uUGVuZGluZ0RhdGFncmFtcygpOwogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNhdGVsbGl0ZSBwb2ludGluZyBpbnB1dCBoYXMgY2hhbmdlZC4KQEAgLTYxLDExICs1OSw0IEBACiAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHNhdGVsbGl0ZSBtb2RlbSBzdGF0ZS4KICAgICAgKi8KICAgICB2b2lkIG9uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoaW4gU2F0ZWxsaXRlTW9kZW1TdGF0ZSBzdGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2F0ZWxsaXRlIHJhZGlvIHRlY2hub2xvZ3kgaGFzIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVjaG5vbG9neSBUaGUgY3VycmVudCBzYXRlbGxpdGUgcmFkaW8gdGVjaG5vbG9neS4KLSAgICAgKi8KLSAgICB2b2lkIG9uU2F0ZWxsaXRlUmFkaW9UZWNobm9sb2d5Q2hhbmdlZChpbiBOVFJhZGlvVGVjaG5vbG9neSB0ZWNobm9sb2d5KTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1BvaW50aW5nSW5mby5haWRsIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvUG9pbnRpbmdJbmZvLmFpZGwKaW5kZXggODMzOTJkZC4uNTJhMzZkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvUG9pbnRpbmdJbmZvLmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvUG9pbnRpbmdJbmZvLmFpZGwKQEAgLTI5LDIxICsyOSw0IEBACiAgICAgICogU2F0ZWxsaXRlIGVsZXZhdGlvbiBpbiBkZWdyZWVzLgogICAgICAqLwogICAgIGZsb2F0IHNhdGVsbGl0ZUVsZXZhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFudGVubmEgYXppbXV0aCBpbiBkZWdyZWVzLgotICAgICAqLwotICAgIGZsb2F0IGFudGVubmFBemltdXRoOwotCi0gICAgLyoqCi0gICAgICogQW5nbGUgb2Ygcm90YXRpb24gYWJvdXQgdGhlIHggYXhpcy4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBhbmdsZSBiZXR3ZWVuIGEgcGxhbmUKLSAgICAgKiBwYXJhbGxlbCB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgZmxvYXQgYW50ZW5uYVBpdGNoOwotCi0gICAgLyoqCi0gICAgICogQW5nbGUgb2Ygcm90YXRpb24gYWJvdXQgdGhlIHkgYXhpcy4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBhbmdsZSBiZXR3ZWVuIGEgcGxhbmUKLSAgICAgKiBwZXJwZW5kaWN1bGFyIHRvIHRoZSBkZXZpY2UncyBzY3JlZW4gYW5kIGEgcGxhbmUgcGFyYWxsZWwgdG8gdGhlIGdyb3VuZC4KLSAgICAgKi8KLSAgICBmbG9hdCBhbnRlbm5hUm9sbDsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5haWRsIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzLmFpZGwKaW5kZXggMTBjMmVhMy4uY2Q2OWRhMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzLmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTI4LDE4ICsyOCwxMiBAQAogICAgIE5UUmFkaW9UZWNobm9sb2d5W10gc3VwcG9ydGVkUmFkaW9UZWNobm9sb2dpZXM7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHNhdGVsbGl0ZSBtb2RlbSBpcyBhbHdheXMgb24uCi0gICAgICogVGhpcyBpbmRpY2F0ZXMgdGhlIHBvd2VyIGltcGFjdCBvZiBrZWVwaW5nIGl0IG9uIGlzIHZlcnkgbWluaW1hbC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQWx3YXlzT247Ci0KLSAgICAvKioKICAgICAgKiBXaGV0aGVyIFVFIG5lZWRzIHRvIHBvaW50IHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YS4KICAgICAgKi8KLSAgICBib29sZWFuIG5lZWRzUG9pbnRpbmdUb1NhdGVsbGl0ZTsKKyAgICBib29sZWFuIGlzUG9pbnRpbmdSZXF1aXJlZDsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgVUUgbmVlZHMgYSBzZXBhcmF0ZSBTSU0gcHJvZmlsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzYXRlbGxpdGUgbmV0d29yay4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdGFncmFtIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBzYXRlbGxpdGUuCiAgICAgICovCi0gICAgYm9vbGVhbiBuZWVkc1NlcGFyYXRlU2ltUHJvZmlsZTsKKyAgICBpbnQgbWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlSW1wbEJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUltcGxCYXNlLmphdmEKaW5kZXggNzExZGNiZS4uZGViYjM5NCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlSW1wbEJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9TYXRlbGxpdGVJbXBsQmFzZS5qYXZhCkBAIC03MCwyMCArNzAsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZChib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBpc0RlbW9Nb2RlLAotICAgICAgICAgICAgICAgIGludCB0aW1lb3V0LCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZChib29sZWFuIGVuYWJsZSwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICAgICAgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGV4ZWN1dGVNZXRob2RBc3luYygKICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU2F0ZWxsaXRlSW1wbEJhc2UudGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSwgaXNEZW1vTW9kZSwgdGltZW91dCwgZXJyb3JDYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3RTYXRlbGxpdGVMaXN0ZW5pbmdFbmFibGVkKGVuYWJsZSwgdGltZW91dCwgZXJyb3JDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZCIpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlLCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlU2F0ZWxsaXRlLCBib29sZWFuIGVuYWJsZURlbW9Nb2RlLAorICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBleGVjdXRlTWV0aG9kQXN5bmMoCi0gICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMucmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoZW5hYmxlLCBlcnJvckNhbGxiYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gU2F0ZWxsaXRlSW1wbEJhc2UudGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVNhdGVsbGl0ZSwgZW5hYmxlRGVtb01vZGUsIGVycm9yQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgICAgICAicmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQiKTsKICAgICAgICAgfQogCkBAIC0xMzEsMTkgKzEzMiwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RNYXhDaGFyYWN0ZXJzUGVyTU9UZXh0TWVzc2FnZShJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSUludGVnZXJDb25zdW1lciBjYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoU3RyaW5nIHRva2VuLCBTdHJpbmcgcmVnaW9uSWQsCisgICAgICAgICAgICAgICAgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGV4ZWN1dGVNZXRob2RBc3luYygKICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU2F0ZWxsaXRlSW1wbEJhc2UudGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0TWF4Q2hhcmFjdGVyc1Blck1PVGV4dE1lc3NhZ2UoZXJyb3JDYWxsYmFjaywgY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAicmVxdWVzdE1heENoYXJhY3RlcnNQZXJNT1RleHRNZXNzYWdlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShTdHJpbmcgdG9rZW4sIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykKLSAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGV4ZWN1dGVNZXRob2RBc3luYygKLSAgICAgICAgICAgICAgICAgICAgKCkgLT4gU2F0ZWxsaXRlSW1wbEJhc2UudGhpcy5wcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKHRva2VuLCBlcnJvckNhbGxiYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZSh0b2tlbiwgcmVnaW9uSWQsIGVycm9yQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgICAgICAicHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZSIpOwogICAgICAgICB9CiAKQEAgLTE3MywxMiArMTY2LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBib29sZWFuIGlzRGVtb01vZGUsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VtZXJnZW5jeSwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBib29sZWFuIGlzRW1lcmdlbmN5LAorICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBleGVjdXRlTWV0aG9kQXN5bmMoCiAgICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFNhdGVsbGl0ZURhdGFncmFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWdyYW0sIGlzRGVtb01vZGUsIGlzRW1lcmdlbmN5LCBlcnJvckNhbGxiYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFNhdGVsbGl0ZURhdGFncmFtKGRhdGFncmFtLCBpc0VtZXJnZW5jeSwgZXJyb3JDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgICAgICJzZW5kU2F0ZWxsaXRlRGF0YWdyYW0iKTsKICAgICAgICAgfQogCkBAIC0yNDksNyArMjQxLDYgQEAKICAgICAgKiBMaXN0ZW5pbmcgbW9kZSBhbGxvd3MgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIHRvIGxpc3RlbiBmb3IgaW5jb21pbmcgcGFnZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZW5hYmxlIFRydWUgdG8gZW5hYmxlIHNhdGVsbGl0ZSBsaXN0ZW5pbmcgbW9kZSBhbmQgZmFsc2UgdG8gZGlzYWJsZS4KLSAgICAgKiBAcGFyYW0gaXNEZW1vTW9kZSBXaGV0aGVyIGRlbW8gbW9kZSBpcyBlbmFibGVkLgogICAgICAqIEBwYXJhbSB0aW1lb3V0IEhvdyBsb25nIHRoZSBzYXRlbGxpdGUgbW9kZW0gc2hvdWxkIHdhaXQgZm9yIHRoZSBuZXh0IGluY29taW5nIHBhZ2UgYmVmb3JlCiAgICAgICogICAgICAgICAgICAgICAgZGlzYWJsaW5nIGxpc3RlbmluZyBtb2RlLgogICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgpAQCAtMjY0LDE3ICsyNTUsMTggQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gaXNEZW1vTW9kZSwgaW50IHRpbWVvdXQsCisgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGUsIGludCB0aW1lb3V0LAogICAgICAgICAgICAgQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB7CiAgICAgICAgIC8vIHN0dWIgaW1wbGVtZW50YXRpb24KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0uIElmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZW5hYmxlZCwKLSAgICAgKiB0aGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSBjZWxsdWxhciBtb2RlbSwgYW5kIGlmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZGlzYWJsZWQsCi0gICAgICogdGhpcyB3aWxsIGFsc28gcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KKyAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGRlbW8gbW9kZS4gSWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcworICAgICAqIGVuYWJsZWQsIHRoaXMgbWF5IGFsc28gZGlzYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0sIGFuZCBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGRpc2FibGVkLAorICAgICAqIHRoaXMgbWF5IGFsc28gcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KICAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGUgVHJ1ZSB0byBlbmFibGUgdGhlIHNhdGVsbGl0ZSBtb2RlbSBhbmQgZmFsc2UgdG8gZGlzYWJsZS4KKyAgICAgKiBAcGFyYW0gZW5hYmxlU2F0ZWxsaXRlIFRydWUgdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGZhbHNlIHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZURlbW9Nb2RlIFRydWUgdG8gZW5hYmxlIGRlbW8gbW9kZSBhbmQgZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgpAQCAtMjg3LDcgKzI3OSw4IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlLCBATm9uTnVsbCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHsKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZVNhdGVsbGl0ZSwgYm9vbGVhbiBlbmFibGVEZW1vTW9kZSwKKyAgICAgICAgICAgIEBOb25OdWxsIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAvLyBzdHViIGltcGxlbWVudGF0aW9uCiAgICAgfQogCkBAIC00MDIsMzUgKzM5NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3QgdG8gZ2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBNTyB0ZXh0IG1lc3NhZ2Ugb24gc2F0ZWxsaXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIElmIHRoZSByZXN1bHQgaXMgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORSwgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUKLSAgICAgKiAgICAgICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGVyIE1PIHRleHQgbWVzc2FnZSBvbiBzYXRlbGxpdGUuCi0gICAgICoKLSAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlNFUlZJQ0VfRVJST1IKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk1PREVNX0VSUk9SCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpJTlZBTElEX01PREVNX1NUQVRFCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpJTlZBTElEX0FSR1VNRU5UUwotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkFESU9fTk9UX0FWQUlMQUJMRQotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TWF4Q2hhcmFjdGVyc1Blck1PVGV4dE1lc3NhZ2UoQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBjYWxsYmFjaykgewotICAgICAgICAvLyBzdHViIGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgLyoqCiAgICAgICogUHJvdmlzaW9uIHRoZSBkZXZpY2Ugd2l0aCBhIHNhdGVsbGl0ZSBwcm92aWRlci4KICAgICAgKiBUaGlzIGlzIG5lZWRlZCBpZiB0aGUgcHJvdmlkZXIgYWxsb3dzIGR5bmFtaWMgcmVnaXN0cmF0aW9uLgogICAgICAqIE9uY2UgcHJvdmlzaW9uZWQsIElTYXRlbGxpdGVMaXN0ZW5lciNvblNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZCBzaG91bGQgcmVwb3J0IHRydWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgcHJvdmlzaW9uaW5nIHdpdGggc2F0ZWxsaXRlCiAgICAgICogICAgICAgICAgICAgIGdhdGV3YXkuCisgICAgICogQHBhcmFtIHJlZ2lvbklkIFRoZSByZWdpb24gSUQgZm9yIHRoZSBkZXZpY2UncyBjdXJyZW50IGxvY2F0aW9uLgogICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CkBAIC00NDYsNyArNDE3LDcgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfQUJPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6TkVUV09SS19USU1FT1VUCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sCisgICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sIEBOb25OdWxsIFN0cmluZyByZWdpb25JZCwKICAgICAgICAgICAgIEBOb25OdWxsIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAvLyBzdHViIGltcGxlbWVudGF0aW9uCiAgICAgfQpAQCAtNTMwLDcgKzUwMSw2IEBACiAgICAgICogU2VuZCBkYXRhZ3JhbSBvdmVyIHNhdGVsbGl0ZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBkYXRhZ3JhbSBEYXRhZ3JhbSB0byBzZW5kIGluIGJ5dGUgZm9ybWF0LgotICAgICAqIEBwYXJhbSBpc0RlbW9Nb2RlIFdoZXRoZXIgZGVtbyBtb2RlIGlzIGVuYWJsZWQuCiAgICAgICogQHBhcmFtIGlzRW1lcmdlbmN5IFdoZXRoZXIgdGhpcyBpcyBhbiBlbWVyZ2VuY3kgZGF0YWdyYW0uCiAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKQEAgLTU1MCw4ICs1MjAsOCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6U0FURUxMSVRFX05PVF9SRUFDSEFCTEUKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PVF9BVVRIT1JJWkVECiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBib29sZWFuIGlzRGVtb01vZGUsCi0gICAgICAgICAgICBib29sZWFuIGlzRW1lcmdlbmN5LCBATm9uTnVsbCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHsKKyAgICBwdWJsaWMgdm9pZCBzZW5kU2F0ZWxsaXRlRGF0YWdyYW0oQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sIGJvb2xlYW4gaXNFbWVyZ2VuY3ksCisgICAgICAgICAgICBATm9uTnVsbCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbgogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKaW5kZXggMzIzZmE2Zi4uZDBkZTNhYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCkBAIC02OCw3ICs2OCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuaW1zLmFpZGwuSUltc1JlZ2lzdHJhdGlvbkNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lmltcy5haWRsLklSY3NDb25maWdDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGUuSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlLklTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZS5JU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlLklTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZS5JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGUuU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzOwpAQCAtMjcyNiwxMSArMjcyNiwxMyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gZm9yLgogICAgICAqIEBwYXJhbSBlbmFibGUgVHJ1ZSB0byBlbmFibGUgdGhlIHNhdGVsbGl0ZSBtb2RlbSBhbmQgZmFsc2UgdG8gZGlzYWJsZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgZXJyb3IgY29kZSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gaXNEZW1vTW9kZUVuYWJsZWQgVHJ1ZSBpZiBkZW1vIG1vZGUgaXMgZW5hYmxlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCiAgICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGludCBzdWJJZCwgYm9vbGVhbiBlbmFibGUsIGluIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spOworICAgIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoaW50IHN1YklkLCBib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBpc0RlbW9Nb2RlRW5hYmxlZCwKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgd2hldGhlciB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGVuYWJsZWQuCkBAIC0yNzQ0LDE3ICsyNzQ2LDYgQEAKICAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZUVuYWJsZWQoaW50IHN1YklkLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgc2VydmljZSBkZW1vIG1vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNhdGVsbGl0ZSBkZW1vIG1vZGUgZm9yLgotICAgICAqIEBwYXJhbSBlbmFibGUgVHJ1ZSB0byBlbmFibGUgdGhlIHNhdGVsbGl0ZSBkZW1vIG1vZGUgYW5kIGZhbHNlIHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCi0gICAgICovCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCi0gICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoaW50IHN1YklkLCBib29sZWFuIGVuYWJsZSwgaW4gSUludGVnZXJDb25zdW1lciBjYWxsYmFjayk7Ci0KLSAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byByZXF1ZXN0IHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBkZW1vIG1vZGUgaXMKQEAgLTI3NjQsNyArMjc1NSw3IEBACiAgICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZURlbW9Nb2RlRW5hYmxlZChpbnQgc3ViSWQsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKKyAgICB2b2lkIHJlcXVlc3RJc0RlbW9Nb2RlRW5hYmxlZChpbnQgc3ViSWQsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIGlzIHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLgpAQCAtMjc4NywzOSArMjc3OCwyOCBAQAogICAgIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUNhcGFiaWxpdGllcyhpbnQgc3ViSWQsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKIAogICAgIC8qKgotICAgICAqIFN0YXJ0IHJlY2VpdmluZyBzYXRlbGxpdGUgcG9pbnRpbmcgdXBkYXRlcy4KKyAgICAgKiBTdGFydCByZWNlaXZpbmcgc2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzLgogICAgICAqCi0gICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIHN0b3Agc2F0ZWxsaXRlIHBvc2l0aW9uIHVwZGF0ZXMgZm9yLgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBoYW5kbGUgcG9zaXRpb24gdXBkYXRlcy4KKyAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gc3RvcCBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMgZm9yLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBoYW5kbGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICB2b2lkIHN0YXJ0U2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKGludCBzdWJJZCwgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgaW4gSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHZvaWQgc3RhcnRTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKGludCBzdWJJZCwgaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywKKyAgICAgICAgICAgIGluIElTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayBjYWxsYmFjayk7CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgcG9pbnRpbmcgdXBkYXRlcy4KKyAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpdHBpb24gdG8gc3RvcCBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlcyBmb3IuCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgZXJyb3IgY29kZSBvZiB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgd2FzIHBhc3NlZCB0byBzdGFydFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcy4KKyAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpdHBpb24gdG8gc3RvcCBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMgZm9yLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8gc3RhcnRTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzLgogICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgdm9pZCBzdG9wU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKGludCBzdWJJZCwgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgaW4gSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvIHNhdGVsbGl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZm9yLgotICAgICAqIEBwYXJhbSByZWNlaXZlciBSZXN1bHQgcmVjZWl2ZXIgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVxdWVzdGVkCi0gICAgICogICAgICAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvIHNhdGVsbGl0ZS4KLSAgICAgKi8KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKLSAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQotICAgIHZvaWQgcmVxdWVzdE1heFNpemVQZXJTZW5kaW5nRGF0YWdyYW0oaW50IHN1YklkLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CisgICAgdm9pZCBzdG9wU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcyhpbnQgc3ViSWQsIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2ssCisgICAgICAgICAgICBpbiBJU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdGhlIHN1YnNjcmlwdGlvbiB3aXRoIGEgc2F0ZWxsaXRlIHByb3ZpZGVyLgpAQCAtMjgyOCwxMyArMjgwOCwxNCBAQAogICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBiZSBwcm92aXNpb25lZC4KICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgcHJvdmlzaW9uaW5nIHdpdGggc2F0ZWxsaXRlCiAgICAgICogICAgICAgICAgICAgIGdhdGV3YXkuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlZ2lvbklkIFRoZSByZWdpb24gSUQgZm9yIHRoZSBkZXZpY2UncyBjdXJyZW50IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBzaWduYWwgdHJhbnNwb3J0IHVzZWQgYnkgY2FsbGVycyB0byBjYW5jZWwgdGhlIHByb3Zpc2lvbiByZXF1ZXN0LgogICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgSUNhbmNlbGxhdGlvblNpZ25hbCBwcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKGludCBzdWJJZCwgaW4gU3RyaW5nIHRva2VuLAorICAgIElDYW5jZWxsYXRpb25TaWduYWwgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShpbnQgc3ViSWQsIGluIFN0cmluZyB0b2tlbiwgaW4gU3RyaW5nIHJlZ2lvbklkLAogICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKQEAgLTI4NDYsNyArMjgyNyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gYmUgZGVwcm92aXNpb25lZC4KICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIG9mIHRoZSBkZXZpY2Uvc3Vic2NyaXB0aW9uIHRvIGJlIGRlcHJvdmlzaW9uZWQuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgcmVxdWVzdC4KICAgICAgKi8KICAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQpAQCAtMjkxNiwxNSArMjg5NywxMyBAQAogICAgICAqIFJlZ2lzdGVyIHRvIHJlY2VpdmUgaW5jb21pbmcgZGF0YWdyYW1zIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqCiAgICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIHJlZ2lzdGVyIGZvciBpbmNvbWluZyBzYXRlbGxpdGUgZGF0YWdyYW1zLgotICAgICAqIEBwYXJhbSBkYXRhZ3JhbVR5cGUgVHlwZSBvZiBkYXRhZ3JhbS4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgZGF0YWdyYW1zLgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKi8KICAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQotICAgIGludCByZWdpc3RlckZvclNhdGVsbGl0ZURhdGFncmFtKAotICAgICAgICAgICAgaW50IHN1YklkLCBpbnQgZGF0YWdyYW1UeXBlLCBJU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayBjYWxsYmFjayk7CisgICAgaW50IHJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oaW50IHN1YklkLCBJU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayBjYWxsYmFjayk7CiAKICAgIC8qKgogICAgICAqIFVucmVnaXN0ZXIgdG8gc3RvcCByZWNlaXZpbmcgaW5jb21pbmcgZGF0YWdyYW1zIG92ZXIgc2F0ZWxsaXRlLgpAQCAtMjk0MSw3ICsyOTIwLDcgQEAKICAgICAqIFBvbGwgcGVuZGluZyBzYXRlbGxpdGUgZGF0YWdyYW1zIG92ZXIgc2F0ZWxsaXRlLgogICAgICoKICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB1c2VkIGZvciByZWNlaXZpbmcgZGF0YWdyYW1zLgotICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCisgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgogICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCkBAIC0yOTU1LDcgKzI5MzQsNyBAQAogICAgICogQHBhcmFtIGRhdGFncmFtIERhdGFncmFtIHRvIHNlbmQgb3ZlciBzYXRlbGxpdGUuCiAgICAgKiBAcGFyYW0gbmVlZEZ1bGxTY3JlZW5Qb2ludGluZ1VJIHRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSBwb2ludGluZ1VJIGFwcCB0byBvcGVuIGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgc2NyZWVuIG1vZGUuCi0gICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgZXJyb3IgY29kZSBvZiB0aGUgcmVxdWVzdC4KKyAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCiAgICAgKi8KICAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMuamF2YQppbmRleCBkMmE2YmYyLi44MWVmZGExIDEwMDY0NAotLS0gYS90ZXN0cy9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9CYWNrZ3JvdW5kRGV4T3B0U2VydmljZUludGVncmF0aW9uVGVzdHMuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5wbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CkBAIC0xMTIsNiArMTE0LDcgQEAKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZUZhbHNlKFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiZGFsdmlrLnZtLnVzZWFydHNlcnZpY2UiLCBmYWxzZSkpOwogICAgICAgICBGaWxlIGRhdGFEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGF0YURpcigpOwogICAgICAgICBtQmlnRmlsZSA9IG5ldyBGaWxlKGRhdGFEaXIsIEJJR19GSUxFKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9BbmRyb2lkLmJwIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTlhODk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYmFzZV9saWNlbnNlIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImZyYW1ld29ya3MtZW5mb3JjZS1wZXJtaXNzaW9uLXRlc3QtYWlkbCIsCisgICAgc3JjczogWyJhaWRsLyoqLyouYWlkbCJdLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vVEVTVF9NQVBQSU5HIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmY0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiRW5mb3JjZVBlcm1pc3Npb25UZXN0cyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL2FpZGwvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9JTmVzdGVkLmFpZGwgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9haWRsL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vSU5lc3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjc3M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9haWRsL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vSU5lc3RlZC5haWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb247CisKK2ludGVyZmFjZSBJTmVzdGVkIHsKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIkFDQ0VTU19ORVRXT1JLX1NUQVRFIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5QWNjZXNzTmV0d29ya1N0YXRlKCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIlJFQURfU1lOQ19TRVRUSU5HUyIpCisgICAgdm9pZCBQcm90ZWN0ZWRCeVJlYWRTeW5jU2V0dGluZ3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL2FpZGwvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9haWRsL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTNhZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9haWRsL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb247CisKK2ludGVyZmFjZSBJUHJvdGVjdGVkIHsKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXQoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiVklCUkFURSIpCisgICAgdm9pZCBQcm90ZWN0ZWRCeVZpYnJhdGUoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFZpYnJhdGVJbXBsaWNpdGx5KCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRBY2Nlc3NOZXR3b3JrU3RhdGVJbXBsaWNpdGx5KCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRSZWFkU3luY1NldHRpbmdzSW1wbGljaXRseSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvQW5kcm9pZC5icCBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhYzFkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2Jhc2VfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYmFzZV9saWNlbnNlIl0sCit9CisKK2FuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKKyAgICBuYW1lOiAiRW5mb3JjZVBlcm1pc3Npb25UZXN0SGVscGVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvKiovKi5qYXZhIiwKKyAgICAgICAgIjpmcmFtZXdvcmtzLWVuZm9yY2UtcGVybWlzc2lvbi10ZXN0LWFpZGwiLAorICAgIF0sCisgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKKyAgICBjZXJ0aWZpY2F0ZTogInBsYXRmb3JtIiwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAueG1sIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMC54bWwKY29weSB0byB0ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9zZXJ2aWNlLWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDliZjkyNTQuLmRkYWZlMTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAueG1sCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTEsNSArMSw1IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTQgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3Muc2VydmljZXN0ZXN0cy5pbnN0YWxsX3VzZXNfc2RrIj4KLQotICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjQiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiPgotICAgICAgICA8IS0tIFRoaXMgd2lsbCBmYWlsIHRvIGluc3RhbGwsIGJlY2F1c2UgbWluRXh0ZW5zaW9uVmVyc2lvbiBpcyBub3QgbWV0IC0tPgotICAgICAgICA8ZXh0ZW5zaW9uLXNkayBhbmRyb2lkOnNka1ZlcnNpb249IjMwIiBhbmRyb2lkOm1pbkV4dGVuc2lvblZlcnNpb249IjEwMDAiIC8+Ci0gICAgPC91c2VzLXNkaz4KLQorICBwYWNrYWdlPSJhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnNlcnZpY2UiPgogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5UZXN0U2VydmljZSIKKyAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuTmVzdGVkVGVzdFNlcnZpY2UiCisgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3NlcnZpY2UvTmVzdGVkVGVzdFNlcnZpY2UuamF2YSBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3NlcnZpY2UvTmVzdGVkVGVzdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODc5YTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9OZXN0ZWRUZXN0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnNlcnZpY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uRW5mb3JjZVBlcm1pc3Npb247CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLklOZXN0ZWQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIE5lc3RlZFRlc3RTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmZvcmNlUGVybWlzc2lvbi5OZXN0ZWRUZXN0U2VydmljZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBMb2cuaShUQUcsICJvbkJpbmQiKTsKKyAgICAgICAgcmV0dXJuIG1CaW5kZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBJTmVzdGVkLlN0dWIgbUJpbmRlciA9IG5ldyBJTmVzdGVkLlN0dWIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFKQorICAgICAgICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRCeUFjY2Vzc05ldHdvcmtTdGF0ZSgpIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5QWNjZXNzTmV0d29ya1N0YXRlX2VuZm9yY2VQZXJtaXNzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5UmVhZFN5bmNTZXR0aW5ncygpIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5UmVhZFN5bmNTZXR0aW5nc19lbmZvcmNlUGVybWlzc2lvbigpOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3NlcnZpY2UvVGVzdFNlcnZpY2UuamF2YSBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3NlcnZpY2UvVGVzdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI4OTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9UZXN0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5zZXJ2aWNlOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5JTmVzdGVkOworaW1wb3J0IGFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24uSVByb3RlY3RlZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUZXN0U2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmZvcmNlUGVybWlzc2lvbi5UZXN0U2VydmljZSI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTZXJ2aWNlQ29ubmVjdGlvbiBtTmVzdGVkU2VydmljZUNvbm5lY3Rpb247CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbU5lc3RlZFNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE5lc3RlZFRlc3RTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBib3VuZCA9IGJpbmRTZXJ2aWNlKGludGVudCwgbU5lc3RlZFNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICBpZiAoIWJvdW5kKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgImJpbmRTZXJ2aWNlKCkgb24gTmVzdGVkVGVzdFNlcnZpY2UgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHVuYmluZFNlcnZpY2UobU5lc3RlZFNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbiB7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ29tcGxldGFibGVGdXR1cmU8SU5lc3RlZD4gbUZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisKKyAgICAgICAgcHVibGljIElOZXN0ZWQgZ2V0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUZ1dHVyZS5nZXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhY2ggTmVzdGVkVGVzdFNlcnZpY2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbUZ1dHVyZS5jb21wbGV0ZShJTmVzdGVkLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICBtRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgfQorICAgIH07CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBtQmluZGVyOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSVByb3RlY3RlZC5TdHViIG1CaW5kZXIgPSBuZXcgSVByb3RlY3RlZC5TdHViKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCkKKyAgICAgICAgcHVibGljIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldCgpIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5SW50ZXJuZXRfZW5mb3JjZVBlcm1pc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEUpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5VmlicmF0ZSgpIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5VmlicmF0ZV9lbmZvcmNlUGVybWlzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRWaWJyYXRlSW1wbGljaXRseSgpIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRWaWJyYXRlSW1wbGljaXRseV9lbmZvcmNlUGVybWlzc2lvbigpOworCisgICAgICAgICAgICBQcm90ZWN0ZWRCeVZpYnJhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVUKQorICAgICAgICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRCeUludGVybmV0QW5kQWNjZXNzTmV0d29ya1N0YXRlSW1wbGljaXRseSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZEFjY2Vzc05ldHdvcmtTdGF0ZUltcGxpY2l0bHlfZW5mb3JjZVBlcm1pc3Npb24oKTsKKworICAgICAgICAgICAgbU5lc3RlZFNlcnZpY2VDb25uZWN0aW9uLmdldCgpLlByb3RlY3RlZEJ5QWNjZXNzTmV0d29ya1N0YXRlKCk7CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVUKQorICAgICAgICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRCeUludGVybmV0QW5kUmVhZFN5bmNTZXR0aW5nc0ltcGxpY2l0bHkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRSZWFkU3luY1NldHRpbmdzSW1wbGljaXRseV9lbmZvcmNlUGVybWlzc2lvbigpOworCisgICAgICAgICAgICBtTmVzdGVkU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkuUHJvdGVjdGVkQnlSZWFkU3luY1NldHRpbmdzKCk7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZC5icCBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1Mzg1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2Jhc2VfbGljZW5zZSJdLAorfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJFbmZvcmNlUGVybWlzc2lvblRlc3RzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvKiovKi5qYXZhIiwKKyAgICAgICAgIjpmcmFtZXdvcmtzLWVuZm9yY2UtcGVybWlzc2lvbi10ZXN0LWFpZGwiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVsZXMiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYW5kcm9pZC50ZXN0LmJhc2UiLAorICAgICAgICAiYW5kcm9pZC50ZXN0LnJ1bm5lciIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6RW5mb3JjZVBlcm1pc3Npb25UZXN0SGVscGVyIiwKKyAgICBdLAorICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCisgICAgY2VydGlmaWNhdGU6ICJwbGF0Zm9ybSIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBjNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgcGFja2FnZT0iYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi50ZXN0cyI+CisKKyAgICA8IS0tIEV4cGVjdGVkIGZvciB0aGUgdGVzdHMgKG5vdCBhY3R1YWxseSB1c2VkKSAtLT4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TWU5DX1NFVFRJTkdTIiAvPgorCisgICAgPHF1ZXJpZXM+CisgICAgICAgIDxwYWNrYWdlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5zZXJ2aWNlIiAvPgorICAgIDwvcXVlcmllcz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnRlc3RzIi8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDM4MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIEVuZm9yY2VQZXJtaXNzaW9uIEVuZC10by1FbmQgVGVzdHMiPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CisgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iRW5mb3JjZVBlcm1pc3Npb25UZXN0SGVscGVyLmFwayIvPgorICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkVuZm9yY2VQZXJtaXNzaW9uVGVzdHMuYXBrIi8+CisgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGFnIiB2YWx1ZT0iRW5mb3JjZVBlcm1pc3Npb25UZXN0cyIvPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0Ij4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi50ZXN0cyIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3Rlc3RzL1NlcnZpY2VUZXN0LmphdmEgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9zcmMvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi90ZXN0cy9TZXJ2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTRhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9zcmMvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi90ZXN0cy9TZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5JUHJvdGVjdGVkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVuZm9yY2VQZXJtaXNzaW9uLlRlc3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gImFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24uc2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVElNRU9VVF9TRUMgPSA1OworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgdm9sYXRpbGUgU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJpbmRUZXN0U2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChUQUcsICJiaW5kVGVzdFNlcnZpY2UiKTsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKFNFUlZJQ0VfTkFNRSwgU0VSVklDRV9OQU1FICsgIi5UZXN0U2VydmljZSIpOworICAgICAgICBhc3NlcnRUcnVlKG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB1bmJpbmRUZXN0U2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2VydmljZUNvbm5lY3Rpb24gaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENvbXBsZXRhYmxlRnV0dXJlPElQcm90ZWN0ZWQ+IG1GdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbUZ1dHVyZS5jb21wbGV0ZShJUHJvdGVjdGVkLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIGNsYXNzTmFtZSkgeworICAgICAgICAgICAgbUZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSVByb3RlY3RlZCBnZXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRnV0dXJlLmdldChTRVJWSUNFX1RJTUVPVVRfU0VDLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIHwgVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZWFjaCBUZXN0U2VydmljZTogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbW1lZGlhdGVQZXJtaXNzaW9uR3JhbnRlZF9zdWNjZWVkcygpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uLmdldCgpLlByb3RlY3RlZEJ5SW50ZXJuZXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbW1lZGlhdGVQZXJtaXNzaW9uTm90R3JhbnRlZF9mYWlscygpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGV4ID0gYXNzZXJ0VGhyb3dzKFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXQoKS5Qcm90ZWN0ZWRCeVZpYnJhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXguZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiVklCUkFURSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbW1lZGlhdGVQZXJtaXNzaW9uR3JhbnRlZEJ1dEltcGxpY2l0TG9jYWxOb3RHcmFudGVkX2ZhaWxzKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFeGNlcHRpb24gZXggPSBhc3NlcnRUaHJvd3MoU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbVNlcnZpY2VDb25uZWN0aW9uLmdldCgpLlByb3RlY3RlZEJ5SW50ZXJuZXRBbmRWaWJyYXRlSW1wbGljaXRseSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleC5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCJWSUJSQVRFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZVBlcm1pc3Npb25HcmFudGVkQnV0SW1wbGljaXROZXN0ZWROb3RHcmFudGVkX2ZhaWxzKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFeGNlcHRpb24gZXggPSBhc3NlcnRUaHJvd3MoU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbVNlcnZpY2VDb25uZWN0aW9uLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgLlByb3RlY3RlZEJ5SW50ZXJuZXRBbmRBY2Nlc3NOZXR3b3JrU3RhdGVJbXBsaWNpdGx5KCkpOworICAgICAgICBhc3NlcnRUaGF0KGV4LmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIkFDQ0VTU19ORVRXT1JLX1NUQVRFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZVBlcm1pc3Npb25HcmFudGVkQW5kSW1wbGljaXROZXN0ZWRHcmFudGVkX3N1Y2NlZWRzKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkuUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFJlYWRTeW5jU2V0dGluZ3NJbXBsaWNpdGx5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEFmdGVyQ2FtZXJhVGVzdENmQXJtLmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEFmdGVyQ2FtZXJhVGVzdENmQXJtLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODliYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQWZ0ZXJDYW1lcmFUZXN0Q2ZBcm0ua3QKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIubGF1bmNoCisKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CitpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCitAUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQorQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCitjbGFzcyBPcGVuQXBwQWZ0ZXJDYW1lcmFUZXN0Q2ZBcm0oZmxpY2tlcjogRmxpY2tlclRlc3QpIDogT3BlbkFwcEFmdGVyQ2FtZXJhVGVzdChmbGlja2VyKSB7CisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgW0ZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzXSBmb3IgY29uZmlndXJpbmcgc2NyZWVuIG9yaWVudGF0aW9uIGFuZAorICAgICAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIGdldFBhcmFtcygpOiBDb2xsZWN0aW9uPEZsaWNrZXJUZXN0PiB7CisgICAgICAgICAgICByZXR1cm4gRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHMoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdC5rdAppbmRleCA4ZmRiYjY0Li5kMGRjNDJmIDEwMDY0NAotLS0gYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQ29sZFRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRUZXN0Lmt0CkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIubGF1bmNoCiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUG9zdHN1Ym1pdAogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmFubm90YXRpb24uRmxpY2tlclNlcnZpY2VDb21wYXRpYmxlCiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKQEAgLTcyLDYgKzczLDEwIEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBAUHJlc3VibWl0IEBUZXN0IG92ZXJyaWRlIGZ1biBhcHBMYXllclJlcGxhY2VzTGF1bmNoZXIoKSA9IHN1cGVyLmFwcExheWVyUmVwbGFjZXNMYXVuY2hlcigpCiAKKyAgICBAUG9zdHN1Ym1pdAorICAgIEBUZXN0CisgICAgb3ZlcnJpZGUgZnVuIG5hdkJhckxheWVyUG9zaXRpb25BdFN0YXJ0QW5kRW5kKCkgPSBzdXBlci5uYXZCYXJMYXllclBvc2l0aW9uQXRTdGFydEFuZEVuZCgpCisKICAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZXMgdGhlIHRlc3QgY29uZmlndXJhdGlvbnMuCmRpZmYgLS1naXQgYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQ29sZFRlc3RDZkFybS5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdENmQXJtLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NWQ5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQ29sZFRlc3RDZkFybS5rdApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5sYXVuY2gKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5GbGFreVRlc3QKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmFubm90YXRpb24uRmxpY2tlclNlcnZpY2VDb21wYXRpYmxlCitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0RmFjdG9yeQoraW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKKworQEZsaWNrZXJTZXJ2aWNlQ29tcGF0aWJsZQorQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCitAUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQorQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCitjbGFzcyBPcGVuQXBwQ29sZFRlc3RDZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOiBPcGVuQXBwQ29sZFRlc3QoZmxpY2tlcikgeworICAgIEBGbGFreVRlc3QoYnVnSWQgPSAyNzM2OTY3MzMpCisgICAgQFRlc3QKKyAgICBvdmVycmlkZSBmdW4gYXBwTGF5ZXJSZXBsYWNlc0xhdW5jaGVyKCkgPSBzdXBlci5hcHBMYXllclJlcGxhY2VzTGF1bmNoZXIoKQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgW0ZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzXSBmb3IgY29uZmlndXJpbmcgc2NyZWVuIG9yaWVudGF0aW9uIGFuZAorICAgICAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIGdldFBhcmFtcygpOiBDb2xsZWN0aW9uPEZsaWNrZXJUZXN0PiB7CisgICAgICAgICAgICByZXR1cm4gRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHMoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBGcm9tTm90aWZpY2F0aW9uQ29sZENmQXJtLmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEZyb21Ob3RpZmljYXRpb25Db2xkQ2ZBcm0ua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhNzhkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBGcm9tTm90aWZpY2F0aW9uQ29sZENmQXJtLmt0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmxhdW5jaAorCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlBvc3RzdWJtaXQKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CitpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCitAUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQorQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCitAUG9zdHN1Ym1pdAorY2xhc3MgT3BlbkFwcEZyb21Ob3RpZmljYXRpb25Db2xkQ2ZBcm0oZmxpY2tlcjogRmxpY2tlclRlc3QpIDoKKyAgICBPcGVuQXBwRnJvbU5vdGlmaWNhdGlvbkNvbGQoZmxpY2tlcikgeworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyB0aGUgdGVzdCBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlIFtGbGlja2VyVGVzdEZhY3Rvcnkubm9uUm90YXRpb25UZXN0c10gZm9yIGNvbmZpZ3VyaW5nIHNjcmVlbiBvcmllbnRhdGlvbiBhbmQKKyAgICAgICAgICogbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgICAgICovCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgICAgICBASnZtU3RhdGljCisgICAgICAgIGZ1biBnZXRQYXJhbXMoKTogQ29sbGVjdGlvbjxGbGlja2VyVGVzdD4geworICAgICAgICAgICAgcmV0dXJuIEZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzKCkKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwV2FybVRlc3RDZkFybS5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBXYXJtVGVzdENmQXJtLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzkwNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwV2FybVRlc3RDZkFybS5rdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5sYXVuY2gKKworaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuYW5ub3RhdGlvbi5GbGlja2VyU2VydmljZUNvbXBhdGlibGUKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CitpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKKworQEZsaWNrZXJTZXJ2aWNlQ29tcGF0aWJsZQorQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCitAUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQorQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCitjbGFzcyBPcGVuQXBwV2FybVRlc3RDZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOiBPcGVuQXBwV2FybVRlc3QoZmxpY2tlcikgeworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyB0aGUgdGVzdCBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlIFtGbGlja2VyVGVzdEZhY3Rvcnkubm9uUm90YXRpb25UZXN0c10gZm9yIGNvbmZpZ3VyaW5nIHNjcmVlbiBvcmllbnRhdGlvbiBhbmQKKyAgICAgICAgICogbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgICAgICovCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgICAgICBASnZtU3RhdGljCisgICAgICAgIGZ1biBnZXRQYXJhbXMoKTogQ29sbGVjdGlvbjxGbGlja2VyVGVzdD4geworICAgICAgICAgICAgcmV0dXJuIEZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzKCkKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9JbnRlcm5hbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlVGVzdC5qYXZhIGIvdGVzdHMvSW50ZXJuYWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZVRlc3QuamF2YQppbmRleCBlNzA0Y2MyLi40NmViZmVkIDEwMDY0NAotLS0gYS90ZXN0cy9JbnRlcm5hbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0ludGVybmFsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlU3RvcmVUZXN0LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JbGxmb3JtZWRMb2NhbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKQEAgLTE0MSwxNCArMTQyLDExOCBAQAogCiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMb2NhbGVJbmZvPiByZXN1bHQgPQogICAgICAgICAgICAgICAgIExvY2FsZVN0b3JlLmNvbnZlcnRFeHBsaWNpdExvY2FsZXMobG9jYWxlcywgc3VwcG9ydGVkTG9jYWxlKTsKLQogICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgcmVzdWx0LmdldCgiZW4iKS5nZXRJZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbi1VUyIsIHJlc3VsdC5nZXQoImVuLVVTIikuZ2V0SWQoKSk7CiAgICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldCgiZW4tTGF0bi1VUyIpKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldExldmVsTG9jYWxlc19sYW5ndWFnZVRpZXJfcmV0dXJuQWxsU3VwcG9ydExhbmd1YWdlcygpIHsKKyAgICAgICAgTG9jYWxlTGlzdCB0ZXN0U3VwcG9ydGVkTG9jYWxlcyA9CisgICAgICAgICAgICAgICAgTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW4tVVMsemgtSGFudC1UVyxqYS1KUCxlbi1HQixibi1JTi11LW51LWFyYWIsa3MtQXJhYi1JTixibi1JTiIpOworCisgICAgICAgIFNldDxTdHJpbmc+IGlnbm9yYWJsZUxvY2FsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlnbm9yYWJsZUxvY2FsZXMuYWRkKCJ6aC1IYW50LUhLIik7CisgICAgICAgIExvY2FsZUluZm8gcGFyZW50ID0gbnVsbDsKKworICAgICAgICBTZXQ8TG9jYWxlSW5mbz4gbG9jYWxlSW5mb3MgPSBMb2NhbGVTdG9yZS5nZXRMZXZlbExvY2FsZXMoCisgICAgICAgICAgICAgICAgbnVsbCwgaWdub3JhYmxlTG9jYWxlcywgcGFyZW50LCBmYWxzZSwgdGVzdFN1cHBvcnRlZExvY2FsZXMpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBsb2NhbGVJbmZvcy5zaXplKCkpOworICAgICAgICBsb2NhbGVJbmZvcy5mb3JFYWNoKGxvY2FsZUluZm8gLT4geworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvLmdldExvY2FsZSgpLmdldENvdW50cnkoKS5pc0VtcHR5KCkpOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiZW4iKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJ6aC1IYW50IikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiamEiKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJibiIpKSk7CisgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mb3Muc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgaW5mbyAtPiBpbmZvLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKS5lcXVhbHMoImtzLUFyYWIiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0TGV2ZWxMb2NhbGVzX3JlZ2lvblRpZXJBbmRQYXJlbnRJc0VuX3JldHVybkVuTG9jYWxlcygpIHsKKyAgICAgICAgTG9jYWxlTGlzdCB0ZXN0U3VwcG9ydGVkTG9jYWxlcyA9CisgICAgICAgICAgICAgICAgTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW4tVVMsZW4tR0IsYm4tSU4tdS1udS1hcmFiLGtzLUFyYWItSU4sZW4tWkEsYm4tSU4iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gaWdub3JhYmxlTG9jYWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaWdub3JhYmxlTG9jYWxlcy5hZGQoInpoLUhhbnQtSEsiKTsKKyAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQgPSBMb2NhbGVTdG9yZS5mcm9tTG9jYWxlKExvY2FsZS5mb3JMYW5ndWFnZVRhZygiZW4iKSk7CisKKyAgICAgICAgU2V0PExvY2FsZUluZm8+IGxvY2FsZUluZm9zID0gTG9jYWxlU3RvcmUuZ2V0TGV2ZWxMb2NhbGVzKAorICAgICAgICAgICAgICAgIG51bGwsIGlnbm9yYWJsZUxvY2FsZXMsIHBhcmVudCwgZmFsc2UsIHRlc3RTdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbG9jYWxlSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgbG9jYWxlSW5mb3MuZm9yRWFjaChsb2NhbGVJbmZvIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBsb2NhbGVJbmZvLmdldExvY2FsZSgpLmdldExhbmd1YWdlKCkpOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiZW4tVVMiKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJlbi1HQiIpKSk7CisgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mb3Muc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgaW5mbyAtPiBpbmZvLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKS5lcXVhbHMoImVuLVpBIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldExldmVsTG9jYWxlc19udW1iZXJpbmdUaWVyQW5kUGFyZW50SXNCbkluX3JldHVybkJuSW5Mb2NhbGVzKCkgeworICAgICAgICBMb2NhbGVMaXN0IHRlc3RTdXBwb3J0ZWRMb2NhbGVzID0KKyAgICAgICAgICAgICAgICBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbi1VUyx6aC1IYW50LVRXLGJuLUlOLXUtbnUtYXJhYixrcy1BcmFiLUlOLGVuLVpBLGJuLUlOLGJuLUlOLXUtbnUtYWRsbSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVMb2NhbGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZ25vcmFibGVMb2NhbGVzLmFkZCgiemgtSGFudC1ISyIpOworICAgICAgICBMb2NhbGVJbmZvIHBhcmVudCA9IExvY2FsZVN0b3JlLmZyb21Mb2NhbGUoTG9jYWxlLmZvckxhbmd1YWdlVGFnKCJibiIpKTsKKworICAgICAgICBTZXQ8TG9jYWxlSW5mbz4gbG9jYWxlSW5mb3MgPSBMb2NhbGVTdG9yZS5nZXRMZXZlbExvY2FsZXMoCisgICAgICAgICAgICAgICAgbnVsbCwgaWdub3JhYmxlTG9jYWxlcywgcGFyZW50LCBmYWxzZSwgdGVzdFN1cHBvcnRlZExvY2FsZXMpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2NhbGVJbmZvcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJuLUlOIiwgbG9jYWxlSW5mb3MuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldExldmVsTG9jYWxlc19yZWdpb25UaWVyQW5kUGFyZW50SXNCbkluQW5kSWdub3JlQm5fcmV0dXJuRW1wdHkoKSB7CisgICAgICAgIExvY2FsZUxpc3QgdGVzdFN1cHBvcnRlZExvY2FsZXMgPQorICAgICAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuLVVTLHpoLUhhbnQtVFcsYm4tSU4tdS1udS1hcmFiLGtzLUFyYWItSU4sZW4tWkEsYm4tSU4sYm4tSU4tdS1udS1hZGxtIik7CisgICAgICAgIFNldDxTdHJpbmc+IGlnbm9yYWJsZUxvY2FsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlnbm9yYWJsZUxvY2FsZXMuYWRkKCJibi1JTiIpOworICAgICAgICBMb2NhbGVJbmZvIHBhcmVudCA9IExvY2FsZVN0b3JlLmZyb21Mb2NhbGUoTG9jYWxlLmZvckxhbmd1YWdlVGFnKCJibi1JTiIpKTsKKworICAgICAgICBTZXQ8TG9jYWxlSW5mbz4gbG9jYWxlSW5mb3MgPSBMb2NhbGVTdG9yZS5nZXRMZXZlbExvY2FsZXMoCisgICAgICAgICAgICAgICAgbnVsbCwgaWdub3JhYmxlTG9jYWxlcywgcGFyZW50LCBmYWxzZSwgdGVzdFN1cHBvcnRlZExvY2FsZXMpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBsb2NhbGVJbmZvcy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0TGV2ZWxMb2NhbGVzX3JlZ2lvblRpZXJBbmRQYXJlbnRJc0JuSW5fcmV0dXJuQm5Mb2NhbGVGYW1pbHkoKSB7CisgICAgICAgIExvY2FsZUxpc3QgdGVzdFN1cHBvcnRlZExvY2FsZXMgPQorICAgICAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuLVVTLHpoLUhhbnQtVFcsYm4tSU4tdS1udS1hcmFiLGtzLUFyYWItSU4sZW4tWkEsYm4tSU4sYm4tSU4tdS1udS1hZGxtIik7CisgICAgICAgIFNldDxTdHJpbmc+IGlnbm9yYWJsZUxvY2FsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlnbm9yYWJsZUxvY2FsZXMuYWRkKCJlbi1VUyIpOworICAgICAgICBMb2NhbGVJbmZvIHBhcmVudCA9IExvY2FsZVN0b3JlLmZyb21Mb2NhbGUoTG9jYWxlLmZvckxhbmd1YWdlVGFnKCJibi1JTiIpKTsKKworICAgICAgICBTZXQ8TG9jYWxlSW5mbz4gbG9jYWxlSW5mb3MgPSBMb2NhbGVTdG9yZS5nZXRMZXZlbExvY2FsZXMoCisgICAgICAgICAgICAgICAgbnVsbCwgaWdub3JhYmxlTG9jYWxlcywgcGFyZW50LCBmYWxzZSwgdGVzdFN1cHBvcnRlZExvY2FsZXMpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsb2NhbGVJbmZvcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJibi1JTi11LW51LWFkbG0iKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJibi1JTi11LW51LWFyYWIiKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJibi1JTiIpKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TG9jYWxlSW5mbz4gZ2V0RmFrZVN1cHBvcnRlZExvY2FsZXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGxvY2FsZXMgPSB7ImVuLVVTIiwgInpoLUhhbnQtVFciLCAiamEtSlAiLCAiZW4tR0IifTsKKyAgICAgICAgU3RyaW5nW10gbG9jYWxlcyA9IHsiZW4tVVMiLCAiemgtSGFudC1UVyIsICJqYS1KUCIsICJlbi1HQiIsICJlbi1VUy11LW51LWFyYWIifTsKICAgICAgICAgQXJyYXlMaXN0PExvY2FsZUluZm8+IHN1cHBvcnRlZExvY2FsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChTdHJpbmcgbG9jYWxlVGFnIDogbG9jYWxlcykgewogICAgICAgICAgICAgc3VwcG9ydGVkTG9jYWxlcy5hZGQoTG9jYWxlU3RvcmUuZnJvbUxvY2FsZShMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcobG9jYWxlVGFnKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvVm9pY2VJbnRlcmFjdGlvbi9zcmMvY29tL2FuZHJvaWQvdGVzdC92b2ljZWludGVyYWN0aW9uL01haW5JbnRlcmFjdGlvblNlcnZpY2UuamF2YSBiL3Rlc3RzL1ZvaWNlSW50ZXJhY3Rpb24vc3JjL2NvbS9hbmRyb2lkL3Rlc3Qvdm9pY2VpbnRlcmFjdGlvbi9NYWluSW50ZXJhY3Rpb25TZXJ2aWNlLmphdmEKaW5kZXggZjE4M2E5Yi4uYjdmNWIxNSAxMDA2NDQKLS0tIGEvdGVzdHMvVm9pY2VJbnRlcmFjdGlvbi9zcmMvY29tL2FuZHJvaWQvdGVzdC92b2ljZWludGVyYWN0aW9uL01haW5JbnRlcmFjdGlvblNlcnZpY2UuamF2YQorKysgYi90ZXN0cy9Wb2ljZUludGVyYWN0aW9uL3NyYy9jb20vYW5kcm9pZC90ZXN0L3ZvaWNlaW50ZXJhY3Rpb24vTWFpbkludGVyYWN0aW9uU2VydmljZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkFsd2F5c09uSG90d29yZERldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5BbHdheXNPbkhvdHdvcmREZXRlY3Rvci5DYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuRXZlbnRQYXlsb2FkOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLlZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTg0LDI0ICs4MywxNiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBbHdheXNPbkhvdHdvcmREZXRlY3Rvci5TVEFURV9LRVlQSFJBU0VfVU5FTlJPTExFRDoKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTVEFURV9LRVlQSFJBU0VfVU5FTlJPTExFRCIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBlbnJvbGwgPSBtSG90d29yZERldGVjdG9yLmNyZWF0ZUVucm9sbEludGVudCgpOwotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJOZWVkIHRvIGVucm9sbCB3aXRoICIgKyBlbnJvbGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNyZWF0ZUVucm9sbEludGVudCBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSW50ZW50IGVucm9sbCA9IG1Ib3R3b3JkRGV0ZWN0b3IuY3JlYXRlRW5yb2xsSW50ZW50KCk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiTmVlZCB0byBlbnJvbGwgd2l0aCAiICsgZW5yb2xsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuU1RBVEVfS0VZUEhSQVNFX0VOUk9MTEVEOgogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRCAtIHN0YXJ0aW5nIHJlY29nbml0aW9uIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Ib3R3b3JkRGV0ZWN0b3Iuc3RhcnRSZWNvZ25pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHdheXNPbkhvdHdvcmREZXRlY3Rvci5SRUNPR05JVElPTl9GTEFHX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJzdGFydFJlY29nbml0aW9uIHN1Y2NlZWRlZCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRSZWNvZ25pdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0YXJ0UmVjb2duaXRpb24gZmFpbGVkIiwgZSk7CisgICAgICAgICAgICAgICAgaWYgKG1Ib3R3b3JkRGV0ZWN0b3Iuc3RhcnRSZWNvZ25pdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsd2F5c09uSG90d29yZERldGVjdG9yLlJFQ09HTklUSU9OX0ZMQUdfTk9ORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRSZWNvZ25pdGlvbiBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJzdGFydFJlY29nbml0aW9uIGZhaWxlZCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdDIvY21kL0xpbmsuaCBiL3Rvb2xzL2FhcHQyL2NtZC9MaW5rLmgKaW5kZXggNWZkZmI2Ni4uMmNlMjE2NyAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdDIvY21kL0xpbmsuaAorKysgYi90b29scy9hYXB0Mi9jbWQvTGluay5oCkBAIC0yMDksNiArMjA5LDggQEAKICAgICBBZGRPcHRpb25hbEZsYWcoIi0tY29tcGlsZS1zZGstdmVyc2lvbi1uYW1lIiwKICAgICAgICAgIlZlcnNpb24gbmFtZSB0byBpbmplY3QgaW50byB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBpZiBub25lIGlzIHByZXNlbnQuIiwKICAgICAgICAgJm9wdGlvbnNfLm1hbmlmZXN0X2ZpeGVyX29wdGlvbnMuY29tcGlsZV9zZGtfdmVyc2lvbl9jb2RlbmFtZSk7CisgICAgQWRkT3B0aW9uYWxGbGFnTGlzdCgiLS1maW5nZXJwcmludC1wcmVmaXgiLCAiRmluZ2VycHJpbnQgcHJlZml4IHRvIGFkZCB0byBpbnN0YWxsIGNvbnN0cmFpbnRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9uc18ubWFuaWZlc3RfZml4ZXJfb3B0aW9ucy5maW5nZXJwcmludF9wcmVmaXhlcyk7CiAgICAgQWRkT3B0aW9uYWxTd2l0Y2goIi0tc2hhcmVkLWxpYiIsICJHZW5lcmF0ZXMgYSBzaGFyZWQgQW5kcm9pZCBydW50aW1lIGxpYnJhcnkuIiwKICAgICAgICAgJnNoYXJlZF9saWJfKTsKICAgICBBZGRPcHRpb25hbFN3aXRjaCgiLS1zdGF0aWMtbGliIiwgIkdlbmVyYXRlIGEgc3RhdGljIEFuZHJvaWQgbGlicmFyeS4iLCAmc3RhdGljX2xpYl8pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdDIvZHVtcC9EdW1wTWFuaWZlc3QuY3BwIGIvdG9vbHMvYWFwdDIvZHVtcC9EdW1wTWFuaWZlc3QuY3BwCmluZGV4IGM2NmY0ZTUuLmE0M2JmMWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQyL2R1bXAvRHVtcE1hbmlmZXN0LmNwcAorKysgYi90b29scy9hYXB0Mi9kdW1wL0R1bXBNYW5pZmVzdC5jcHAKQEAgLTIxMjAsNiArMjEyMCwzMyBAQAogICB9CiB9OwogCisvKiogUmVwcmVzZW50cyA8aW5zdGFsbC1jb25zdHJhaW50cz4gZWxlbWVudHMuICoqLworY2xhc3MgSW5zdGFsbENvbnN0cmFpbnRzIDogcHVibGljIE1hbmlmZXN0RXh0cmFjdG9yOjpFbGVtZW50IHsKKyBwdWJsaWM6CisgIEluc3RhbGxDb25zdHJhaW50cygpID0gZGVmYXVsdDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbmdlcnByaW50X3ByZWZpeGVzOworCisgIHZvaWQgRXh0cmFjdCh4bWw6OkVsZW1lbnQqIGVsZW1lbnQpIG92ZXJyaWRlIHsKKyAgICBmb3IgKHhtbDo6RWxlbWVudCogY2hpbGQgOiBlbGVtZW50LT5HZXRDaGlsZEVsZW1lbnRzKCkpIHsKKyAgICAgIGlmIChjaGlsZC0+bmFtZSA9PSAiZmluZ2VycHJpbnQtcHJlZml4IikgeworICAgICAgICB4bWw6OkF0dHJpYnV0ZSogYXR0ciA9IGNoaWxkLT5GaW5kQXR0cmlidXRlKGtBbmRyb2lkTmFtZXNwYWNlLCAidmFsdWUiKTsKKyAgICAgICAgaWYgKGF0dHIpIHsKKyAgICAgICAgICBmaW5nZXJwcmludF9wcmVmaXhlcy5wdXNoX2JhY2soYXR0ci0+dmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBQcmludCh0ZXh0OjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZSB7CisgICAgaWYgKCFmaW5nZXJwcmludF9wcmVmaXhlcy5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLT5QcmludChTdHJpbmdQcmludGYoImluc3RhbGwtY29uc3RyYWludHM6XG4iKSk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByZWZpeCA6IGZpbmdlcnByaW50X3ByZWZpeGVzKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KFN0cmluZ1ByaW50ZigiICBmaW5nZXJwcmludC1wcmVmaXg9JyVzJ1xuIiwgcHJlZml4LmNfc3RyKCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKIC8qKiBSZXByZXNlbnRzIDxvcmlnaW5hbC1wYWNrYWdlPiBlbGVtZW50cy4gKiovCiBjbGFzcyBPcmlnaW5hbFBhY2thZ2UgOiBwdWJsaWMgTWFuaWZlc3RFeHRyYWN0b3I6OkVsZW1lbnQgewogIHB1YmxpYzoKQEAgLTI4NjksNyArMjg5Niw3IEBACiBjb25zdGV4cHIgY29uc3QgY2hhciogR2V0RXhwZWN0ZWRUYWdGb3JUeXBlKCkgewogICAvLyBUaGlzIGFycmF5IGRvZXMgbm90IGFwcGVhciBhdCBydW50aW1lLCBhcyBHZXRFeHBlY3RlZFRhZ0ZvclR5cGUgZnVuY3Rpb24gaXMgdXNlZCBieSBjb21waWxlcgogICAvLyB0byBpbmplY3QgcHJvcGVyICdleHBlY3RlZF90YWcnIGludG8gRWxlbWVudENhc3QuCi0gIHN0ZDo6YXJyYXk8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBib29sPiwgMzc+IHRhZ3MgPSB7CisgIHN0ZDo6YXJyYXk8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBib29sPiwgMzg+IHRhZ3MgPSB7CiAgICAgICBzdGQ6Om1ha2VfcGFpcigiYWN0aW9uIiwgc3RkOjppc19zYW1lPEFjdGlvbiwgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhY3Rpdml0eSIsIHN0ZDo6aXNfc2FtZTxBY3Rpdml0eSwgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhZGRpdGlvbmFsLWNlcnRpZmljYXRlIiwgc3RkOjppc19zYW1lPEFkZGl0aW9uYWxDZXJ0aWZpY2F0ZSwgVD46OnZhbHVlKSwKQEAgLTI4NzgsNiArMjkwNSw3IEBACiAgICAgICBzdGQ6Om1ha2VfcGFpcigiY29tcGF0aWJsZS1zY3JlZW5zIiwgc3RkOjppc19zYW1lPENvbXBhdGlibGVTY3JlZW5zLCBUPjo6dmFsdWUpLAogICAgICAgc3RkOjptYWtlX3BhaXIoImZlYXR1cmUtZ3JvdXAiLCBzdGQ6OmlzX3NhbWU8RmVhdHVyZUdyb3VwLCBUPjo6dmFsdWUpLAogICAgICAgc3RkOjptYWtlX3BhaXIoImlucHV0LXR5cGUiLCBzdGQ6OmlzX3NhbWU8SW5wdXRUeXBlLCBUPjo6dmFsdWUpLAorICAgICAgc3RkOjptYWtlX3BhaXIoImluc3RhbGwtY29uc3RyYWludHMiLCBzdGQ6OmlzX3NhbWU8SW5zdGFsbENvbnN0cmFpbnRzLCBUPjo6dmFsdWUpLAogICAgICAgc3RkOjptYWtlX3BhaXIoImludGVudC1maWx0ZXIiLCBzdGQ6OmlzX3NhbWU8SW50ZW50RmlsdGVyLCBUPjo6dmFsdWUpLAogICAgICAgc3RkOjptYWtlX3BhaXIoIm1ldGEtZGF0YSIsIHN0ZDo6aXNfc2FtZTxNZXRhRGF0YSwgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJtYW5pZmVzdCIsIHN0ZDo6aXNfc2FtZTxNYW5pZmVzdCwgVD46OnZhbHVlKSwKQEAgLTI5NDgsNiArMjk3Niw3IEBACiAgICAgICAgICAgeyJjb21wYXRpYmxlLXNjcmVlbnMiLCAmQ3JlYXRlVHlwZTxDb21wYXRpYmxlU2NyZWVucz59LAogICAgICAgICAgIHsiZmVhdHVyZS1ncm91cCIsICZDcmVhdGVUeXBlPEZlYXR1cmVHcm91cD59LAogICAgICAgICAgIHsiaW5wdXQtdHlwZSIsICZDcmVhdGVUeXBlPElucHV0VHlwZT59LAorICAgICAgICAgIHsiaW5zdGFsbC1jb25zdHJhaW50cyIsICZDcmVhdGVUeXBlPEluc3RhbGxDb25zdHJhaW50cz59LAogICAgICAgICAgIHsiaW50ZW50LWZpbHRlciIsICZDcmVhdGVUeXBlPEludGVudEZpbHRlcj59LAogICAgICAgICAgIHsibWFuaWZlc3QiLCAmQ3JlYXRlVHlwZTxNYW5pZmVzdD59LAogICAgICAgICAgIHsibWV0YS1kYXRhIiwgJkNyZWF0ZVR5cGU8TWV0YURhdGE+fSwKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlci5jcHAgYi90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuY3BwCmluZGV4IDU2ZDkwNzUuLjUzZjBhYmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlci5jcHAKKysrIGIvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmNwcApAQCAtNzQ5LDYgKzc0OSwyMyBAQAogICAgIGF0dHItPnZhbHVlID0gb3B0aW9uc18uY29tcGlsZV9zZGtfdmVyc2lvbl9jb2RlbmFtZS52YWx1ZSgpOwogICB9CiAKKyAgaWYgKCFvcHRpb25zXy5maW5nZXJwcmludF9wcmVmaXhlcy5lbXB0eSgpKSB7CisgICAgeG1sOjpFbGVtZW50KiBpbnN0YWxsX2NvbnN0cmFpbnRzX2VsID0gcm9vdC0+RmluZENoaWxkKHt9LCAiaW5zdGFsbC1jb25zdHJhaW50cyIpOworICAgIGlmIChpbnN0YWxsX2NvbnN0cmFpbnRzX2VsID09IG51bGxwdHIpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjx4bWw6OkVsZW1lbnQ+IGluc3RhbGxfY29uc3RyYWludHMgPSBzdGQ6Om1ha2VfdW5pcXVlPHhtbDo6RWxlbWVudD4oKTsKKyAgICAgIGluc3RhbGxfY29uc3RyYWludHMtPm5hbWUgPSAiaW5zdGFsbC1jb25zdHJhaW50cyI7CisgICAgICBpbnN0YWxsX2NvbnN0cmFpbnRzX2VsID0gaW5zdGFsbF9jb25zdHJhaW50cy5nZXQoKTsKKyAgICAgIHJvb3QtPkFwcGVuZENoaWxkKHN0ZDo6bW92ZShpbnN0YWxsX2NvbnN0cmFpbnRzKSk7CisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCA6IG9wdGlvbnNfLmZpbmdlcnByaW50X3ByZWZpeGVzKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8eG1sOjpFbGVtZW50PiBwcmVmaXhfZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPHhtbDo6RWxlbWVudD4oKTsKKyAgICAgIHByZWZpeF9lbC0+bmFtZSA9ICJmaW5nZXJwcmludC1wcmVmaXgiOworICAgICAgeG1sOjpBdHRyaWJ1dGUqIGF0dHIgPSBwcmVmaXhfZWwtPkZpbmRPckNyZWF0ZUF0dHJpYnV0ZSh4bWw6OmtTY2hlbWFBbmRyb2lkLCAidmFsdWUiKTsKKyAgICAgIGF0dHItPnZhbHVlID0gcHJlZml4OworICAgICAgaW5zdGFsbF9jb25zdHJhaW50c19lbC0+QXBwZW5kQ2hpbGQoc3RkOjptb3ZlKHByZWZpeF9lbCkpOworICAgIH0KKyAgfQorCiAgIHhtbDo6WG1sQWN0aW9uRXhlY3V0b3IgZXhlY3V0b3I7CiAgIGlmICghQnVpbGRSdWxlcygmZXhlY3V0b3IsIGNvbnRleHQtPkdldERpYWdub3N0aWNzKCkpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmggYi90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuaAppbmRleCA5MGY1MTc3Li4xNzVhYjZmIDEwMDY0NAotLS0gYS90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuaAorKysgYi90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuaApAQCAtMTgsMTEgKzE4LDEwIEBACiAjZGVmaW5lIEFBUFRfTElOS19NQU5JRkVTVEZJWEVSX0gKIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJhbmRyb2lkLWJhc2UvbWFjcm9zLmgiCi0KICNpbmNsdWRlICJwcm9jZXNzL0lSZXNvdXJjZVRhYmxlQ29uc3VtZXIuaCIKLQogI2luY2x1ZGUgInhtbC9YbWxBY3Rpb25FeGVjdXRvci5oIgogI2luY2x1ZGUgInhtbC9YbWxEb20uaCIKIApAQCAtNzUsNiArNzQsOSBAQAogICAvLyAnYW5kcm9pZDpjb21waWxlU2RrVmVyc2lvbkNvZGVuYW1lJyBpbiB0aGUgPG1hbmlmZXN0PiB0YWcuCiAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGNvbXBpbGVfc2RrX3ZlcnNpb25fY29kZW5hbWU7CiAKKyAgLy8gVGhlIGZpbmdlcnByaW50IHByZWZpeGVzIHRvIGJlIGFkZGVkIHRvIHRoZSA8aW5zdGFsbC1jb25zdHJhaW50cz4gdGFnLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmluZ2VycHJpbnRfcHJlZml4ZXM7CisKICAgLy8gV2hldGhlciB2YWxpZGF0aW9uIGVycm9ycyBzaG91bGQgYmUgdHJlYXRlZCBvbmx5IGFzIHdhcm5pbmdzLiBJZiB0aGlzIGlzICd0cnVlJywgdGhlbiBhbgogICAvLyBpbmNvcnJlY3Qgbm9kZSB3aWxsIG5vdCByZXN1bHQgaW4gYW4gZXJyb3IsIGJ1dCBvbmx5IGFzIGEgd2FybmluZywgYW5kIHRoZSBwYXJzaW5nIHdpbGwKICAgLy8gY29udGludWUuCmRpZmYgLS1naXQgYS90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXJfdGVzdC5jcHAgYi90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXJfdGVzdC5jcHAKaW5kZXggNzE4MGFlNi4uMWI4ZjA1YiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyX3Rlc3QuY3BwCisrKyBiL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlcl90ZXN0LmNwcApAQCAtOTY1LDYgKzk2NSw2MyBAQAogICBBU1NFUlRfVEhBVChtYW5pZmVzdCwgSXNOdWxsKCkpOwogfQogCitURVNUX0YoTWFuaWZlc3RGaXhlclRlc3QsIEluc2VydEZpbmdlcnByaW50UHJlZml4SWZOb3RFeGlzdCkgeworICBzdGQ6OnN0cmluZyBpbnB1dCA9IFIiKAorICAgICAgPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkIj4KKyAgICAgIDwvbWFuaWZlc3Q+KSI7CisgIE1hbmlmZXN0Rml4ZXJPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZmluZ2VycHJpbnRfcHJlZml4ZXMgPSB7ImZvbyIsICJiYXIifTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8eG1sOjpYbWxSZXNvdXJjZT4gbWFuaWZlc3QgPSBWZXJpZnlXaXRoT3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7CisgIEFTU0VSVF9USEFUKG1hbmlmZXN0LCBOb3ROdWxsKCkpOworICB4bWw6OkVsZW1lbnQqIGluc3RhbGxfY29uc3RyYWludHMgPSBtYW5pZmVzdC0+cm9vdC5nZXQoKS0+RmluZENoaWxkKHt9LCAiaW5zdGFsbC1jb25zdHJhaW50cyIpOworICBBU1NFUlRfVEhBVChpbnN0YWxsX2NvbnN0cmFpbnRzLCBOb3ROdWxsKCkpOworICBzdGQ6OnZlY3Rvcjx4bWw6OkVsZW1lbnQqPiBmaW5nZXJwcmludF9wcmVmaXhlcyA9IGluc3RhbGxfY29uc3RyYWludHMtPkdldENoaWxkRWxlbWVudHMoKTsKKyAgRVhQRUNUX0VRKGZpbmdlcnByaW50X3ByZWZpeGVzLnNpemUoKSwgMik7CisgIHhtbDo6QXR0cmlidXRlKiBhdHRyOworICBFWFBFQ1RfVEhBVChmaW5nZXJwcmludF9wcmVmaXhlc1swXS0+bmFtZSwgU3RyRXEoImZpbmdlcnByaW50LXByZWZpeCIpKTsKKyAgYXR0ciA9IGZpbmdlcnByaW50X3ByZWZpeGVzWzBdLT5GaW5kQXR0cmlidXRlKHhtbDo6a1NjaGVtYUFuZHJvaWQsICJ2YWx1ZSIpOworICBBU1NFUlRfVEhBVChhdHRyLCBOb3ROdWxsKCkpOworICBFWFBFQ1RfVEhBVChhdHRyLT52YWx1ZSwgU3RyRXEoImZvbyIpKTsKKyAgRVhQRUNUX1RIQVQoZmluZ2VycHJpbnRfcHJlZml4ZXNbMV0tPm5hbWUsIFN0ckVxKCJmaW5nZXJwcmludC1wcmVmaXgiKSk7CisgIGF0dHIgPSBmaW5nZXJwcmludF9wcmVmaXhlc1sxXS0+RmluZEF0dHJpYnV0ZSh4bWw6OmtTY2hlbWFBbmRyb2lkLCAidmFsdWUiKTsKKyAgQVNTRVJUX1RIQVQoYXR0ciwgTm90TnVsbCgpKTsKKyAgRVhQRUNUX1RIQVQoYXR0ci0+dmFsdWUsIFN0ckVxKCJiYXIiKSk7Cit9CisKK1RFU1RfRihNYW5pZmVzdEZpeGVyVGVzdCwgQXBwZW5kRmluZ2VycHJpbnRQcmVmaXhJZkV4aXN0cykgeworICBzdGQ6OnN0cmluZyBpbnB1dCA9IFIiKAorICAgICAgPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkIj4KKyAgICAgICAgICA8aW5zdGFsbC1jb25zdHJhaW50cz4KKyAgICAgICAgICAgIDxmaW5nZXJwcmludC1wcmVmaXggYW5kcm9pZDp2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgIDwvaW5zdGFsbC1jb25zdHJhaW50cz4KKyAgICAgIDwvbWFuaWZlc3Q+KSI7CisgIE1hbmlmZXN0Rml4ZXJPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZmluZ2VycHJpbnRfcHJlZml4ZXMgPSB7ImJhciIsICJiYXoifTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8eG1sOjpYbWxSZXNvdXJjZT4gbWFuaWZlc3QgPSBWZXJpZnlXaXRoT3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7CisgIEFTU0VSVF9USEFUKG1hbmlmZXN0LCBOb3ROdWxsKCkpOworICB4bWw6OkVsZW1lbnQqIGluc3RhbGxfY29uc3RyYWludHMgPSBtYW5pZmVzdC0+cm9vdC5nZXQoKS0+RmluZENoaWxkKHt9LCAiaW5zdGFsbC1jb25zdHJhaW50cyIpOworICBBU1NFUlRfVEhBVChpbnN0YWxsX2NvbnN0cmFpbnRzLCBOb3ROdWxsKCkpOworICBzdGQ6OnZlY3Rvcjx4bWw6OkVsZW1lbnQqPiBmaW5nZXJwcmludF9wcmVmaXhlcyA9IGluc3RhbGxfY29uc3RyYWludHMtPkdldENoaWxkRWxlbWVudHMoKTsKKyAgRVhQRUNUX0VRKGZpbmdlcnByaW50X3ByZWZpeGVzLnNpemUoKSwgMyk7CisgIHhtbDo6QXR0cmlidXRlKiBhdHRyOworICBFWFBFQ1RfVEhBVChmaW5nZXJwcmludF9wcmVmaXhlc1swXS0+bmFtZSwgU3RyRXEoImZpbmdlcnByaW50LXByZWZpeCIpKTsKKyAgYXR0ciA9IGZpbmdlcnByaW50X3ByZWZpeGVzWzBdLT5GaW5kQXR0cmlidXRlKHhtbDo6a1NjaGVtYUFuZHJvaWQsICJ2YWx1ZSIpOworICBBU1NFUlRfVEhBVChhdHRyLCBOb3ROdWxsKCkpOworICBFWFBFQ1RfVEhBVChhdHRyLT52YWx1ZSwgU3RyRXEoImZvbyIpKTsKKyAgRVhQRUNUX1RIQVQoZmluZ2VycHJpbnRfcHJlZml4ZXNbMV0tPm5hbWUsIFN0ckVxKCJmaW5nZXJwcmludC1wcmVmaXgiKSk7CisgIGF0dHIgPSBmaW5nZXJwcmludF9wcmVmaXhlc1sxXS0+RmluZEF0dHJpYnV0ZSh4bWw6OmtTY2hlbWFBbmRyb2lkLCAidmFsdWUiKTsKKyAgQVNTRVJUX1RIQVQoYXR0ciwgTm90TnVsbCgpKTsKKyAgRVhQRUNUX1RIQVQoYXR0ci0+dmFsdWUsIFN0ckVxKCJiYXIiKSk7CisgIEVYUEVDVF9USEFUKGZpbmdlcnByaW50X3ByZWZpeGVzWzJdLT5uYW1lLCBTdHJFcSgiZmluZ2VycHJpbnQtcHJlZml4IikpOworICBhdHRyID0gZmluZ2VycHJpbnRfcHJlZml4ZXNbMl0tPkZpbmRBdHRyaWJ1dGUoeG1sOjprU2NoZW1hQW5kcm9pZCwgInZhbHVlIik7CisgIEFTU0VSVF9USEFUKGF0dHIsIE5vdE51bGwoKSk7CisgIEVYUEVDVF9USEFUKGF0dHItPnZhbHVlLCBTdHJFcSgiYmF6IikpOworfQorCiBURVNUX0YoTWFuaWZlc3RGaXhlclRlc3QsIFVzZXNMaWJyYXJ5TXVzdEhhdmVOb25FbXB0eU5hbWUpIHsKICAgc3RkOjpzdHJpbmcgaW5wdXQgPSBSIigKICAgICAgIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCmRpZmYgLS1naXQgYS93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLmphdmEgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLmphdmEKaW5kZXggNDgwOWJlZi4uNjNlNDcxYiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5qYXZhCisrKyBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuamF2YQpAQCAtMTcsNyArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwOwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TeXN0ZW1BcGk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKQEAgLTM3LDYgKzQxLDcgQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUluc3RhbnRUZXRoZXJFbmFibGVkOworICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtSW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudDsKICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwogCiAgICAgLyoqCkBAIC00NCw5ICs0OSwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSW5zdGFudFRldGhlckVuYWJsZWQ7CisgICAgICAgIHByaXZhdGUgSW50ZW50IG1JbnN0YW50VGV0aGVyU2V0dGluZ3NJbnRlbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHt9CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIHN0YXRlIG9mIEluc3RhbnQgVGV0aGVyIGluIHNldHRpbmdzCkBAIC02MCw2ICs2OSwyMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGludGVudCB0aGF0IHdpbGwgb3BlbiB0aGUgSW5zdGFudCBUZXRoZXIgc2V0dGluZ3MgcGFnZS4KKyAgICAgICAgICogVGhlIGludGVudCB3aWxsIGJlIHN0b3JlZCBhcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0LiBUaGUgcGVuZGluZworICAgICAgICAgKiBpbnRlbnQgd2lsbCBiZSBzZXQgYXMge0BsaW5rIFBlbmRpbmdJbnRlbnQjRkxBR19JTU1VVEFCTEV9IGFuZAorICAgICAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudCNGTEFHX09ORV9TSE9UfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBCdWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQoQE5vbk51bGwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgbUluc3RhbnRUZXRoZXJTZXR0aW5nc0ludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGV4dHJhcyBidW5kbGUKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBCdWlsZGVyIG9iamVjdC4KQEAgLTc3LDEyICsxMDAsMjIgQEAKICAgICAgICAgICovCiAgICAgICAgIEBOb25OdWxsCiAgICAgICAgIHB1YmxpYyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKG1JbnN0YW50VGV0aGVyRW5hYmxlZCwgbUV4dHJhcyk7CisgICAgICAgICAgICBpZiAobUluc3RhbnRUZXRoZXJTZXR0aW5nc0ludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW50VGV0aGVyU2V0dGluZ3NJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfSU1NVVRBQkxFIHwgUGVuZGluZ0ludGVudC5GTEFHX09ORV9TSE9UKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUobUluc3RhbnRUZXRoZXJFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ludGVudCwgbUV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUobUluc3RhbnRUZXRoZXJFbmFibGVkLCBudWxsLCBtRXh0cmFzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZShib29sZWFuIGluc3RhbnRUZXRoZXJFbmFibGVkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgcHJpdmF0ZSBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGJvb2xlYW4gaW5zdGFudFRldGhlckVuYWJsZWQsCisgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQsIEJ1bmRsZSBleHRyYXMpIHsKKwogICAgICAgICBtSW5zdGFudFRldGhlckVuYWJsZWQgPSBpbnN0YW50VGV0aGVyRW5hYmxlZDsKKyAgICAgICAgbUluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQgPSBwZW5kaW5nSW50ZW50OwogICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwogICAgIH0KIApAQCAtOTYsNiArMTI5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGVuZGluZyBpbnRlbnQgdG8gb3BlbiBJbnN0YW50IFRldGhlciBzZXR0aW5ncyBwYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwZW5kaW5nIGludGVudCB0aGF0IG9wZW5zIHRoZSBzZXR0aW5ncyBwYWdlLCBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZ2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50OworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGV4dHJhcyBCdW5kbGUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdW5kbGUgb2JqZWN0LgpAQCAtMTA5LDEyICsxNTIsMTQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIG90aGVyID0gKFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUpIG9iajsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW50VGV0aGVyRW5hYmxlZCA9PSBvdGhlci5pc0luc3RhbnRUZXRoZXJFbmFibGVkKCk7CisgICAgICAgIHJldHVybiBtSW5zdGFudFRldGhlckVuYWJsZWQgPT0gb3RoZXIuaXNJbnN0YW50VGV0aGVyRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMobUluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgb3RoZXIuZ2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1JbnN0YW50VGV0aGVyRW5hYmxlZCk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobUluc3RhbnRUZXRoZXJFbmFibGVkLCBtSW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjQsNiArMTY5LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoQE5vbk51bGwgUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBtSW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIDApOwogICAgICAgICBkZXN0LndyaXRlQm9vbGVhbihtSW5zdGFudFRldGhlckVuYWJsZWQpOwogICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KQEAgLTEzNSw4ICsxODEsMTAgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBzdGF0aWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSByZWFkRnJvbVBhcmNlbChATm9uTnVsbCBQYXJjZWwgaW4pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGluLnJlYWRCb29sZWFuKCksCi0gICAgICAgICAgICAgICAgaW4ucmVhZEJ1bmRsZSgpKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBib29sZWFuIGluc3RhbnRUZXRoZXJFbmFibGVkID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGluc3RhbnRUZXRoZXJFbmFibGVkLCBwZW5kaW5nSW50ZW50LCBleHRyYXMpOwogICAgIH0KIAogICAgIEBOb25OdWxsCkBAIC0xNTYsNiArMjA0LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoIlNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVbIikKICAgICAgICAgICAgICAgICAuYXBwZW5kKCJpbnN0YW50VGV0aGVyRW5hYmxlZD0iKS5hcHBlbmQobUluc3RhbnRUZXRoZXJFbmFibGVkKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlBlbmRpbmdJbnRlbnQ9IikuYXBwZW5kKG1JbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50LnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiZXh0cmFzPSIpLmFwcGVuZChtRXh0cmFzLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2UuamF2YSBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvc2VydmljZS9TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggNTcxMDhlNC4uODdjYTk5ZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L3NlcnZpY2UvU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCkBAIC02OCw5ICs2OCw3IEBACiAgICAgICAgICAgICBuZXcgUmVtb3RlQ2FsbGJhY2tMaXN0PD4oKTsKICAgICBwcml2YXRlIExpc3Q8SG90c3BvdE5ldHdvcms+IG1Ib3RzcG90TmV0d29ya3MgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICBwcml2YXRlIExpc3Q8S25vd25OZXR3b3JrPiBtS25vd25OZXR3b3JrcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBtU2V0dGluZ3NTdGF0ZSA9Ci0gICAgICAgICAgICBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCkuc2V0SW5zdGFudFRldGhlckVuYWJsZWQoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoQnVuZGxlLkVNUFRZKS5idWlsZCgpOworICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBtU2V0dGluZ3NTdGF0ZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBIb3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMgbUhvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cyA9CiAgICAgICAgICAgICBuZXcgSG90c3BvdE5ldHdvcmtDb25uZWN0aW9uU3RhdHVzLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAuc2V0U3RhdHVzKEhvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5DT05ORUNUSU9OX1NUQVRVU19VTktOT1dOKQpAQCAtMjAyLDYgKzIwMCwxMyBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBnZXRTZXR0aW5nc1N0YXRlKCkgewogICAgICAgICAgICAgICAgIGNoZWNrUGVybWlzc2lvbnMoKTsKKyAgICAgICAgICAgICAgICAvLyBEb25lIGxhemlseSBzaW5jZSBjcmVhdGluZyBpdCBuZWVkcyBhIGNvbnRleHQuCisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc1N0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3RhdGUgPSBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKEJ1bmRsZS5FTVBUWSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc1N0YXRlOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS93aWZpL3Rlc3RzL0FuZHJvaWQuYnAgYi93aWZpL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYzkxMDVmNy4uN2EyOTk2OSAxMDA2NDQKLS0tIGEvd2lmaS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3dpZmkvdGVzdHMvQW5kcm9pZC5icApAQCAtMzYsNiArMzYsNyBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWR4LnRlc3QucnVsZXMiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5jb3JlIiwKICAgICAgICAgImZyYW1ld29ya3MtYmFzZS10ZXN0dXRpbHMiLAogICAgICAgICAiZ3VhdmEiLAogICAgICAgICAibW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IiwKZGlmZiAtLWdpdCBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEKaW5kZXggNzU3OGRmZC4uNzEyMzkwODcgMTAwNjQ0Ci0tLSBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC00OTcsOCArNDk3LDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGdldFNldHRpbmdzU3RhdGVfc2VydmljZUNvbm5lY3RlZF9zaG91bGRSZXR1cm5TdGF0ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBTaGFyZWRDb25uZWN0aXZpdHlNYW5hZ2VyLmNyZWF0ZShtQ29udGV4dCk7Ci0gICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgc3RhdGUgPSBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0SW5zdGFudFRldGhlckVuYWJsZWQodHJ1ZSkuc2V0RXh0cmFzKG5ldyBCdW5kbGUoKSkuYnVpbGQoKTsKKyAgICAgICAgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBzdGF0ZSA9CisgICAgICAgICAgICAgICAgbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlcihtQ29udGV4dCkuc2V0SW5zdGFudFRldGhlckVuYWJsZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMobmV3IEJ1bmRsZSgpKS5idWlsZCgpOwogICAgICAgICBtYW5hZ2VyLnNldFNlcnZpY2UobVNlcnZpY2UpOwogICAgICAgICB3aGVuKG1TZXJ2aWNlLmdldFNldHRpbmdzU3RhdGUoKSkudGhlblJldHVybihzdGF0ZSk7CiAKZGlmZiAtLWdpdCBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlVGVzdC5qYXZhIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVUZXN0LmphdmEKaW5kZXggNzUyYjc0OS4uNWUxN2RmYiAxMDA2NDQKLS0tIGEvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVUZXN0LmphdmEKKysrIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVUZXN0LmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmNvcmUuYXBwLkFwcGxpY2F0aW9uUHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMzAsOCArMzIsMTIgQEAKIEBTbWFsbFRlc3QKIHB1YmxpYyBjbGFzcyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlVGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlNUQU5UX1RFVEhFUl9TVEFURSA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVOVF9BQ1RJT04gPSAiaW5zdGFudC50ZXRoZXIuc2V0dGluZ3MiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlNUQU5UX1RFVEhFUl9TVEFURV8xID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVOVF9BQ1RJT05fMSA9ICJpbnN0YW50LnRldGhlci5zZXR0aW5nczEiOworCisKICAgICAvKioKICAgICAgKiBWZXJpZmllcyBwYXJjZWwgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCiAgICAgICovCkBAIC0zOSwxNiArNDUsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyY2VsT3BlcmF0aW9uKCkgewogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIHN0YXRlID0gYnVpbGRTZXR0aW5nc1N0YXRlQnVpbGRlcigpLmJ1aWxkKCk7CiAKLSAgICAgICAgUGFyY2VsIHBhcmNlbFcgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIHN0YXRlLndyaXRlVG9QYXJjZWwocGFyY2VsVywgMCk7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcmNlbFcubWFyc2hhbGwoKTsKLSAgICAgICAgcGFyY2VsVy5yZWN5Y2xlKCk7Ci0KLSAgICAgICAgUGFyY2VsIHBhcmNlbFIgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIHBhcmNlbFIudW5tYXJzaGFsbChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgcGFyY2VsUi5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIFBhcmNlbCBwYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHN0YXRlLndyaXRlVG9QYXJjZWwocGFyY2VsLCAwKTsKKyAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBmcm9tUGFyY2VsID0KLSAgICAgICAgICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWxSKTsKKyAgICAgICAgICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogCiAgICAgICAgIGFzc2VydFRoYXQoZnJvbVBhcmNlbCkuaXNFcXVhbFRvKHN0YXRlKTsKICAgICAgICAgYXNzZXJ0VGhhdChmcm9tUGFyY2VsLmhhc2hDb2RlKCkpLmlzRXF1YWxUbyhzdGF0ZS5oYXNoQ29kZSgpKTsKQEAgLTY2LDYgKzY3LDEwIEBACiAgICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlciBidWlsZGVyID0gYnVpbGRTZXR0aW5nc1N0YXRlQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLnNldEluc3RhbnRUZXRoZXJFbmFibGVkKElOU1RBTlRfVEVUSEVSX1NUQVRFXzEpOwogICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkZXIuYnVpbGQoKSkuaXNOb3RFcXVhbFRvKHN0YXRlMSk7CisKKyAgICAgICAgYnVpbGRlciA9IGJ1aWxkU2V0dGluZ3NTdGF0ZUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50KG5ldyBJbnRlbnQoSU5URU5UX0FDVElPTl8xKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRlci5idWlsZCgpKS5pc05vdEVxdWFsVG8oc3RhdGUxKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg2LDcgKzkxLDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlciBidWlsZFNldHRpbmdzU3RhdGVCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEluc3RhbnRUZXRoZXJFbmFibGVkKElOU1RBTlRfVEVUSEVSX1NUQVRFKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Qcm92aWRlci5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAuc2V0SW5zdGFudFRldGhlckVuYWJsZWQoSU5TVEFOVF9URVRIRVJfU1RBVEUpCisgICAgICAgICAgICAgICAgLnNldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQobmV3IEludGVudChJTlRFTlRfQUNUSU9OKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvc2VydmljZS9TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlVGVzdC5qYXZhIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvc2VydmljZS9TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGI4YjZiNzY3Li41MTRiYTNjIDEwMDY0NAotLS0gYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2VUZXN0LmphdmEKKysrIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvc2VydmljZS9TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlVGVzdC5qYXZhCkBAIC03NSw5ICs3NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIC5hZGRTZWN1cml0eVR5cGUoU0VDVVJJVFlfVFlQRV9FQVApLnNldE5ldHdvcmtQcm92aWRlckluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUV09SS19QUk9WSURFUl9JTkZPKS5idWlsZCgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8S25vd25OZXR3b3JrPiBLTk9XTl9ORVRXT1JLUyA9IExpc3Qub2YoS05PV05fTkVUV09SSyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBTRVRUSU5HU19TVEFURSA9Ci0gICAgICAgICAgICBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCkuc2V0SW5zdGFudFRldGhlckVuYWJsZWQodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhCdW5kbGUuRU1QVFkpLmJ1aWxkKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSG90c3BvdE5ldHdvcmtDb25uZWN0aW9uU3RhdHVzIFRFVEhFUl9ORVRXT1JLX0NPTk5FQ1RJT05fU1RBVFVTID0KICAgICAgICAgICAgIG5ldyBIb3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMuQnVpbGRlcigpLnNldFN0YXR1cyhDT05ORUNUSU9OX1NUQVRVU19VTktOT1dOKQogICAgICAgICAgICAgICAgICAgICAuc2V0SG90c3BvdE5ldHdvcmsoSE9UU1BPVF9ORVRXT1JLKS5zZXRFeHRyYXMoQnVuZGxlLkVNUFRZKS5idWlsZCgpOwpAQCAtMTU1LDEwICsxNTIsMTEgQEAKICAgICAgICAgU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZSBzZXJ2aWNlID0gY3JlYXRlU2VydmljZSgpOwogICAgICAgICBJU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZS5TdHViIGJpbmRlciA9CiAgICAgICAgICAgICAgICAgKElTaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlLlN0dWIpIHNlcnZpY2Uub25CaW5kKG5ldyBJbnRlbnQoKSk7CisgICAgICAgIHdoZW4obUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkudGhlblJldHVybigiYW5kcm9pZC5uZXQud2lmaS5ub251cGRhdGFibGUudGVzdCIpOwogCi0gICAgICAgIHNlcnZpY2Uuc2V0U2V0dGluZ3NTdGF0ZShTRVRUSU5HU19TVEFURSk7CisgICAgICAgIHNlcnZpY2Uuc2V0U2V0dGluZ3NTdGF0ZShidWlsZFNldHRpbmdzU3RhdGUoKSk7CiAKLSAgICAgICAgYXNzZXJ0VGhhdChiaW5kZXIuZ2V0U2V0dGluZ3NTdGF0ZSgpKS5pc0VxdWFsVG8oU0VUVElOR1NfU1RBVEUpOworICAgICAgICBhc3NlcnRUaGF0KGJpbmRlci5nZXRTZXR0aW5nc1N0YXRlKCkpLmlzRXF1YWxUbyhidWlsZFNldHRpbmdzU3RhdGUoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIzMiw0ICsyMzAsMTAgQEAKICAgICAgICAgc2VydmljZS5hdHRhY2hCYXNlQ29udGV4dChtQ29udGV4dCk7CiAgICAgICAgIHJldHVybiBzZXJ2aWNlOwogICAgIH0KKworICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBidWlsZFNldHRpbmdzU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKG1Db250ZXh0KS5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZCh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50KG5ldyBJbnRlbnQoKSkKKyAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKEJ1bmRsZS5FTVBUWSkuYnVpbGQoKTsKKyAgICB9CiB9Cg==