Ly8gRVBGIC0gUHJvY2VzcyAtPiBPcGVuQ2VydCAtIEFSRw0KDQpwcmUgew0KICAnUnVubmluZyBFVEwnLnByaW50bG4oKTsNCiAgLy92YXIgYXJnOj0gbmV3IEFSRyFDYXNlOw0KICANCiAgICB2YXIgcHJvY2Vzc0NvbXBvbmVudCA6IExJQiFQcm9jZXNzQ29tcG9uZW50Ow0KCXByb2Nlc3NDb21wb25lbnQgPSAgTElCIVByb2Nlc3NDb21wb25lbnQuYWxsSW5zdGFuY2VzKCkuZmlyc3Q7DQoJDQp9CQ0KCQ0KcnVsZSBQcm9jZXNzQ29tcG9uZW50MkNhc2UNCnRyYW5zZm9ybSBsIDogTElCIVByb2Nlc3NDb21wb25lbnQNCgl0byBhcmcgOiBBUkchQ2FzZXsNCglndWFyZCA6IGwucHJvY2Vzcy5pc1R5cGVPZihMSUIhRGVsaXZlcnlQcm9jZXNzKSANCgkNCgl2YXIgc3RyID0gIlByb2Nlc3MgPSAiICsgbC5uYW1lOw0KCXN0ci5wcmludGxuKCk7DQoJDQoJZm9yIChhY3QgaW4gTElCIUFjdGl2aXR5LmFsbEluc3RhbmNlcy5zZWxlY3QoYWN0fGFjdC5pc1R5cGVPZihMSUIhQWN0aXZpdHkpKSl7Ly9sLmdldFRhc2tEZXNjcmlwdG9ycyhsLnByb2Nlc3MuYnJlYWtkb3duRWxlbWVudCkpIHsNCgkJCWFyZy5hcmd1bWVudC5hZGQoYWN0LmVxdWl2YWxlbnQoKSk7DQoJfQ0KCQ0KfQ0KCQ0KCQ0KLypUcmFuc2Zvcm0gQWN0aXZpdHkgdG8gQ2xhaW0qLwkJDQoNCnJ1bGUgQWN0aXZpdHkyQ2xhaW0NCgl0cmFuc2Zvcm0gYWN0IDogTElCIUFjdGl2aXR5DQoJdG8gYWNsOkFSRyFDbGFpbXsNCgkvL2d1YXJkIDpjb25TZWxlY3Rpb24uY29udGFpbnMoYWN0LmdldENvbnRhaW5lclByb2Nlc3NDb21wb25lbnQoKS5pZCkNCg0KCQlhY2wuaWQ9IkcuQWN0IithY3QuaWQ7DQoJCWFjbC5uYW1lPSJBY3Rpdml0eTogIisgYWN0Lm5hbWU7DQoJCWFjbC5kZXNjcmlwdGlvbj0iQWN0aXZpdHk6ICIrIGFjdC5uYW1lOw0KCQkvL2FjdC5uYW1lLnByaW50bG4oKTsNCgkJDQoJCWlmKGFjdC5nZXRUYXNrRGVzY3JpcHRvcnMoYWN0LmJyZWFrZG93bkVsZW1lbnQpIDw+bnVsbCl7DQoJCS8vdmFyIHN0cmExID0gIkFjdGl2aXR5IG5hbWUgID0gIiArIGFjdC5uYW1lOw0KCQkvL3N0cmExLnByaW50bG4oKTsNCgkJCQkJDQoJCQkNCgkJCSAgDQoJCQkvKlRhc2sgRGVzY3JpcHRvcnMgLT4gbGlua2VkIHRvIEFjdGl2aXR5Ki8JDQoJCQlmb3IodGQgaW4gYWN0LmdldFRhc2tEZXNjcmlwdG9ycyhhY3QuYnJlYWtkb3duRWxlbWVudCkpey8vYWN0LmJyZWFrZG93bkVsZW1lbnQNCgkJCS8vdmFyIHN0cmEzID0gIlREID0gIiArIHRkLm5hbWU7DQoJCQkvL3N0cmEzLnByaW50bG4oKTsNCgkJCQ0KCQkJCXZhciBjbHRkID0gbmV3IEFSRyFDbGFpbTsNCgkJCQl2YXIgY3hhID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJCQ0KCQkJCWNsdGQuaWQ9IkcuVGQiK3RkLmlkOw0KCQkJCWNsdGQubmFtZT0iVGFza0Rlc2NyaXB0b3I6ICIrdGQubmFtZTsNCgkJCQljbHRkLmRlc2NyaXB0aW9uPXRkLmJyaWVmRGVzY3JpcHRpb247DQoJCQkJLy92YXIgc3RyYTQgPSAiQ2xhaW0gPSAiICsgY2x0ZC5uYW1lOw0KCQkJCS8vc3RyYTQucHJpbnRsbigpOw0KDQoJCQkJY3hhLm5hbWUgPSAnQWN0X1RkJzsgDQoJCQkJY3hhLnNvdXJjZS5hZGQoYWNsKTsNCiAgCQkgCQljeGEudGFyZ2V0LmFkZChjbHRkKTsNCiAgCQkgCQkvL3ZhciBzdHJhNSA9ICJTb3VyY2UgPSAiICsgY3hhLnNvdXJjZS5uYW1lOw0KCQkJCS8vc3RyYTUucHJpbnRsbigpOw0KCQkJCS8vdmFyIHN0cmE2ID0gIlRhcmdldCA9ICIgKyBjeGEudGFyZ2V0Lm5hbWU7DQoJCQkJLy9zdHJhNi5wcmludGxuKCk7DQoNCiAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKGN4YSk7DQoJCQkJYXJnLmFyZ3VtZW50LmFkZChjbHRkKTsJDQoNCgkJCQkJICAJCQ0KICAJCQkJLypSb2xlIERlc2NyaXB0b3JzIC0+IGF0dGFjaGVkIHRvIFRhc2sgRGVzY3JpcHRvciovDQogIAkJCQlpZih0ZC5nZXRUYXNrUGFydGljaXBhbnRzKCkgPD5udWxsKXsNCiAgCQkJCQ0KICAJCQkJCXZhciBhciA9IG5ldyBBUkchQXJndW1lbnRSZWFzb25pbmc7DQogIAkgICAgCQkJYXJnLmFyZ3VtZW50LmFkZChhcik7DQogIAkgICAgCQkJYXIuaWQ9IlRkLlJkIit0ZC5pZDsNCgkJCQkJYXIubmFtZT0iQXJndW1lbnQgb3ZlciByb2xlIGRlc2NyaXB0b3JzIjsNCgkJICAgIAkJYXIuZGVzY3JpcHRpb249IkFyZ3VtZW50IG92ZXIgcm9sZSBkZXNjcmlwdG9ycyI7DQogIAkNCgkJCQkJZm9yKHJkIGluIHRkLmdldFRhc2tQYXJ0aWNpcGFudHMoKSl7DQoJCQkJCS8vdmFyIHN0cnIxID0gIkFyZ3VtZW50UmVhc29uaW5nID0gIiArIHJkLmlkOw0KCQkJCQkvL3N0cnIxLnByaW50bG4oKTsNCgkJCQkNCgkJCQkJCXZhciBjYSA9IG5ldyBBUkchQ2xhaW07DQoJCQkJCQl2YXIgaWVjID0gbmV3IEFSRyFJbmZvcm1hdGlvbkVsZW1lbnRDaXRhdGlvbjsNCgkJCQkJCXZhciB4ID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJCQkJCXZhciB5ID0gbmV3IEFSRyFBc3NlcnRlZEV2aWRlbmNlOw0KCQkJCQ0KCQkJCQkJLy9yZCAtPiBzdWItY2xhaW0NCgkJCQkJCWNhLm5hbWU9IlN1Yi1Hb2FsLVJkOiAiK3JkLm5hbWU7DQoJCQkJCQljYS5pZD0iRyIrdGQuaWQrIi5SZCIrcmQuaWQ7DQoJCQkJCQljYS5kZXNjcmlwdGlvbj1yZC5icmllZkRlc2NyaXB0aW9uICsgcmQubmFtZSArICIgc2hvdWxkIGJlIGNlcnRpZmllZCI7DQoJCQkJCQkvLyBpcyBjZXJ0aWZpZWQuDQoJCQkJDQogIAkJIAkJCQkvL0Fzc2VydGVkIGluZmVyZW5jZSBsaW5rcyBBcmd1bWVudCB0byBTdWItQ2xhaW0NCiAgCQkgCQkJCXgubmFtZSA9ICdBcmRfQ3JkJzsgDQoJCSAJCQkJeC5zb3VyY2UuYWRkKGFyKTsNCgkJIAkJCQl4LnRhcmdldC5hZGQoY2EpOw0KCQkJCQ0KCQkJCQkJLy9yZCAtPiBzb2x1dGlvbg0KCQkJCQkJaWVjLm5hbWU9IHJkLm5hbWUrIidzIGNlcnRpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFibGUiOw0KCQkJCQkJaWVjLmlkPSJFIityZC5pZDsNCgkJCQkJCWllYy5kZXNjcmlwdGlvbj1yZC5icmllZkRlc2NyaXB0aW9uK3JkLm5hbWUgKyAiJ3MgY2VydGlmaWNhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSI7CQ0KCQkJCQkJaWVjLnR5cGUgPSBBUkchSW5mb3JtYXRpb25FbGVtZW50VHlwZSNTb2x1dGlvbjsNCiAgCQkJCQkJLy9pZWMudG9CZUluc3RhbnRpYXRlZCA9ZmFsc2U7DQoJCQkJDQoJCQkJCQkvL0Fzc2VydGVkIEV2aWRlbmNlIExpbmtzIFN1Yi1jbGFpbSB0byBTb2x1dGlvbg0KCQkJCQkJeS5uYW1lID0gJ0NyZF9FcmQnOyANCgkJCQkJCXkuc291cmNlLmFkZChjYSk7DQogIAkJIAkJCQl5LnRhcmdldC5hZGQoaWVjKTsNCiAgCQkgCQkNCiAgCQkgCQkJCWFyZy5hcmd1bWVudC5hZGQoeCk7DQogIAkJIAkJCQlhcmcuYXJndW1lbnQuYWRkKHkpOwkJDQogIAkJIAkJCQlhcmcuYXJndW1lbnQuYWRkKGNhKTsNCiAgCQkgCQkJCWFyZy5hcmd1bWVudC5hZGQoaWVjKTsNCiAgCQkgCQkNCgkJCQkJfQ0KCQkJCQkvL0Fzc2VydGVkIEluZmVyZW5jZSBMaW5rcyBDbGFpbSB0byBBcmd1bWVudA0KCQkgCQkJdmFyIHogPSBuZXcgQVJHIUFzc2VydGVkSW5mZXJlbmNlOw0KICAJCSAJCQl6Lm5hbWUgPSAiQ2x0ZF9BcmQiOyANCgkJIAkJCXouc291cmNlLmFkZChjbHRkKTsNCgkJIAkJCXoudGFyZ2V0LmFkZChhcik7DQoJCSAJCQlhcmcuYXJndW1lbnQuYWRkKHopOw0KCQkJCX0NCgkJCQkNCgkJCQkNCgkJCQkvKiBXb3JrUHJvZHVjdCBEZXNjcmlwdG9ycyAtPiBhdHRhY2hlZCB0byBUYXNrIERlc2NyaXB0b3IgKi8NCgkJCQlpZih0ZC5nZXRXb3JrUHJvZHVjdHMoKSA8Pm51bGwpew0KCQkJCQl2YXIgYXJ3ID0gbmV3IEFSRyFBcmd1bWVudFJlYXNvbmluZzsNCgkgIAkgICAgCQlhcmcuYXJndW1lbnQuYWRkKGFydyk7DQoJCQkJCWFydy5uYW1lPSJBcmd1bWVudCBvdmVyIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyI7DQoJCQkJCWFydy5kZXNjcmlwdGlvbj0iQXJndW1lbnQgb3ZlciB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMiOw0KCQkJCQlhcncuaWQ9IlRkLldwIit0ZC5pZDsNCgkJCQkNCgkJCQkJZm9yKHdwIGluIHRkLmdldFdvcmtQcm9kdWN0cygpKXsNCgkJCQkNCgkJCQkJCXZhciBjbHcgPSBuZXcgQVJHIUNsYWltOw0KCQkJCQkJdmFyIGlldyA9IG5ldyBBUkchSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb247DQoJCQkJCQl2YXIgeHcgPSBuZXcgQVJHIUFzc2VydGVkSW5mZXJlbmNlOw0KCQkJCQkJdmFyIHl3ID0gbmV3IEFSRyFBc3NlcnRlZEV2aWRlbmNlOw0KCQkJCQkNCgkJCQkJCS8vd3AgLT4gc3ViLWNsYWltDQoJCQkJCQljbHcubmFtZT0iU3ViLUdvYWwtV3A6ICIrd3AubmFtZTsNCgkJCQkJCWNsdy5pZD0iRyIrdGQuaWQrIi5XcCIrd3AuaWQ7DQoJCQkJCQljbHcuZGVzY3JpcHRpb249d3AubmFtZSArICIgaXMgcGxhbm5lZCI7DQoJCQkJCQkvL3ZhciBzdHJyMjEgPSAiQ2xhaW0gPSAiICsgd3AubmFtZTsNCgkJCQkJCS8vc3RycjIxLnByaW50bG4oKTsNCgkJCQkJDQoJICAJCSAJCQkvL0Fzc2VydGVkIGluZmVyZW5jZSBsaW5rcyBBcmd1bWVudCB0byBTdWItQ2xhaW0NCgkgIAkJIAkJCXh3Lm5hbWUgPSAnQXdwX0N3cCc7IA0KCQkJIAkJCXh3LnNvdXJjZS5hZGQoYXJ3KTsNCgkJCSAJCQl4dy50YXJnZXQuYWRkKGNsdyk7DQoJCQkJCQ0KCQkJCQkJLy93cCAtPiBzb2x1dGlvbg0KCQkJCQkJaWV3Lm5hbWU9IHdwLm5hbWUrIiBzaG91bGQgYmUgZmlsbGVkLWluIHRlbXBsYXRlIjsNCgkJCQkJCWlldy5pZD0iRSIrd3AuaWQ7DQoJCQkJCQlpZXcuZGVzY3JpcHRpb249IHdwLm5hbWUgKyAiIHNob3VsZCBiZSBmaWxsZWQtaW4gdGVtcGxhdGUiOwkvLyJFXyIrd3AubmFtZSArIA0KCQkJCQkJaWV3LnR5cGUgPSBBUkchSW5mb3JtYXRpb25FbGVtZW50VHlwZSNTb2x1dGlvbjsNCgkgIAkJCQkJLy9pZXcudG9CZUluc3RhbnRpYXRlZCA9ZmFsc2U7DQoJICAJCQkJCS8vdmFyIHN0cjMgPSAic29sdXRpb24gPSAiICsgaWV3Lm5hbWU7DQoJCQkJCQkvL3N0cjMucHJpbnRsbigpOw0KCQkJCQkNCgkJCQkJCS8vIEFzc2VydGVkIEV2aWRlbmNlIExpbmtzIFN1Yi1jbGFpbSB0byBTb2x1dGlvbg0KCQkJCQkJeXcubmFtZSA9ICdDd3BfRXdwJzsgDQoJCQkJCQl5dy5zb3VyY2UuYWRkKGNsdyk7DQoJICAJCSAJCQl5dy50YXJnZXQuYWRkKGlldyk7DQoJICAJCSAJCQ0KCSAgCQkgCQkJYXJnLmFyZ3VtZW50LmFkZCh4dyk7DQoJICAJCSAJCQlhcmcuYXJndW1lbnQuYWRkKHl3KTsJCQ0KCSAgCQkgCQkJYXJnLmFyZ3VtZW50LmFkZChjbHcpOw0KCSAgCQkgCQkJYXJnLmFyZ3VtZW50LmFkZChpZXcpOwkNCgkJCQkJfQ0KCQkJDQoJCQkJCXZhciB6dyA9IG5ldyBBUkchQXNzZXJ0ZWRJbmZlcmVuY2U7DQoJICAJCSAJCXp3Lm5hbWUgPSAiQ2x0ZF9Bd3AiOyANCgkJCSAJCXp3LnNvdXJjZS5hZGQoY2x0ZCk7DQoJCQkgCQl6dy50YXJnZXQuYWRkKGFydyk7DQoJCQkgCQlhcmcuYXJndW1lbnQuYWRkKHp3KTsNCgkJCQl9DQoJCQkJCQ0KCQkJCQ0KCQkJCS8qIEd1aWRsaW5lIC0+IGF0dGFjaGVkIHRvIFRhc2sgRGVzY3JpcHRvciAqLw0KCQkJCWlmKHRkLmdldEd1aWRlbGluZXMoKSA8PiBudWxsKXsNCgkJCQ0KCQkJCQlmb3IoZ3UgaW4gdGQuZ2V0R3VpZGVsaW5lcygpKXsNCgkJCQ0KCQkJCQkJdmFyIGFndWsgPSBuZXcgQVJHIUFyZ3VtZW50UmVhc29uaW5nOw0KCQkgIAkgICAgCQlhcmcuYXJndW1lbnQuYWRkKGFndWspOw0KCQkJCQkJYWd1ay5pZD0iVGQuR3UuIit0ZC5pZDsNCgkJCQkJCWFndWsubmFtZT0iQXJndW1lbnQgb3ZlciBndWlkZWxpbmVzIjsNCgkJCQkJCWFndWsuZGVzY3JpcHRpb249IkFyZ3VtZW50IG92ZXIgZ3VpZGVsaW5lcyI7DQoJCQkJCQkvL3ZhciBzdHJyMjEgPSAiZ3VpID0gIiArIGd1Lm5hbWU7DQoJCQkJCQkvL3N0cnIyMS5wcmludGxuKCk7DQoJCQkJCQ0KCQkJCQkJdmFyIGNsZ2sgPSBuZXcgQVJHIUNsYWltOw0KCQkJCQkJdmFyIGllZ2sgPSBuZXcgQVJHIUluZm9ybWF0aW9uRWxlbWVudENpdGF0aW9uOw0KCQkJCQkJdmFyIHhnayA9IG5ldyBBUkchQXNzZXJ0ZWRJbmZlcmVuY2U7DQoJCQkJCQl2YXIgeWdrID0gbmV3IEFSRyFBc3NlcnRlZEV2aWRlbmNlOw0KCQkJCQkJDQoJCQkJCQljbGdrLmlkPSJHIit0ZC5pZCsiLkd1IitndS5pZDsNCgkJCQkJCWNsZ2submFtZT0iU3ViLUdvYWwtR3U6ICIrZ3UubmFtZTsNCgkJCQkJCWNsZ2suZGVzY3JpcHRpb249Z3UubmFtZSArICIgaXMgcGxhbm5lZCI7DQoJCQkJCQkNCgkJICAJCSAJCS8vQXNzZXJ0ZWQgaW5mZXJlbmNlIGxpbmtzIEFyZ3VtZW50IHRvIFN1Yi1DbGFpbQ0KCQkgIAkJIAkJeGdrLm5hbWUgPSAnQWd1X0NndSc7IA0KCQkJCSAJCXhnay5zb3VyY2UuYWRkKGFndWspOw0KCQkJCSAJCXhnay50YXJnZXQuYWRkKGNsZ2spOw0KCQkJCQkJDQoJCQkJCQlpZWdrLmlkPSJFIitndS5pZDsNCgkJCQkJCWllZ2submFtZT1ndS5uYW1lKyIgc2hvdWxkIGJlIGZvbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVtcGFsdGUiOw0KCQkJCQkJaWVnay5kZXNjcmlwdGlvbj0gZ3UubmFtZSsiIHNob3VsZCBiZSBmb2xsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlbXBhbHRlIjsNCgkJCQkJCWllZ2sudHlwZSA9IEFSRyFJbmZvcm1hdGlvbkVsZW1lbnRUeXBlI1NvbHV0aW9uOw0KCQkgIAkJCQkvL2llZ2sudG9CZUluc3RhbnRpYXRlZCA9ZmFsc2U7DQoJCSAgCQkJCS8vdmFyIHN0cjMgPSAic29sdXRpb24gPSAiICsgaWVnLm5hbWU7DQoJCQkJCQkvL3N0cjMucHJpbnRsbigpOw0KCQkJCQkJDQoJCQkJCQkvLyBBc3NlcnRlZCBFdmlkZW5jZSBMaW5rcyBTdWItY2xhaW0gdG8gU29sdXRpb24NCgkJCQkJCXlnay5uYW1lID0gJ0NndV9FZ3UnOyANCgkJCQkJCXlnay5zb3VyY2UuYWRkKGNsZ2spOw0KCQkgIAkJIAkJeWdrLnRhcmdldC5hZGQoaWVnayk7DQoJCSAgCQkgCQkNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoeGdrKTsNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoeWdrKTsJCQ0KCQkgIAkJIAkJYXJnLmFyZ3VtZW50LmFkZChjbGdrKTsNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoaWVnayk7DQoJCSAgCQkgCQkNCgkJCSAgCQkgCXZhciB6Z2sgPSBuZXcgQVJHIUFzc2VydGVkSW5mZXJlbmNlOw0KCQkJICAJCSAJemdrLm5hbWUgPSAiQ2x0ZF9BZ3UiOyANCgkJCQkJIAl6Z2suc291cmNlLmFkZChjbHRkKTsNCgkJCQkJIAl6Z2sudGFyZ2V0LmFkZChhZ3VrKTsNCgkJCQkJIAlhcmcuYXJndW1lbnQuYWRkKHpnayk7DQoJCQkJCX0NCgkJCQl9IA0KCQkJCQ0KCQkJCS8qIENoZWNrbGlzdCAtPiBhdHRhY2hlZCB0byBUYXNrIERlc2NyaXB0b3IgKi8NCgkJCQ0KCQkJCWlmKHRkLmdldENoZWNrbGlzdHMoKSA8Pm51bGwpew0KCSAgCQ0KCQkJCQlmb3IoY2hlIGluIHRkLmdldENoZWNrbGlzdHMoKSl7DQoJCQkJDQoJCQkJCQl2YXIgYXJjID0gbmV3IEFSRyFBcmd1bWVudFJlYXNvbmluZzsNCgkJCSAgCSAgICAJYXJnLmFyZ3VtZW50LmFkZChhcmMpOw0KCQkJICAJICAgIAlhcmMuaWQ9IlRkLkNoIit0ZC5pZDsNCgkJCQkJCWFyYy5uYW1lPSJBcmd1bWVudCBvdmVyIGNoZWNrbGlzdHMiOw0KCQkJCQkJYXJjLmRlc2NyaXB0aW9uPSJBcmd1bWVudCBvdmVyIGNoZWNrbGlzdHMiOw0KCQkJCQkgICAgLy92YXIgc3RyYzEgPSAiY2hlY2tsaXN0ID0gIiArIGNoZS5uYW1lOw0KCQkJCQkJLy9zdHJjMS5wcmludGxuKCk7DQoJCQkJCQkNCgkJCQkJCXZhciBjYyA9IG5ldyBBUkchQ2xhaW07DQoJCQkJCQl2YXIgaWNjID0gbmV3IEFSRyFJbmZvcm1hdGlvbkVsZW1lbnRDaXRhdGlvbjsNCgkJCQkJCXZhciB4YyA9IG5ldyBBUkchQXNzZXJ0ZWRJbmZlcmVuY2U7DQoJCQkJCQl2YXIgeWMgPSBuZXcgQVJHIUFzc2VydGVkRXZpZGVuY2U7DQoJCQkJCQkNCgkJCQkJCS8vY2hlIC0+IHN1Yi1jbGFpbQ0KCQkJCQkJY2MuaWQ9IkciK3RkLmlkKyIuQ2giK2NoZS5pZDsNCgkJCQkJCWNjLm5hbWU9IlN1Yi1Hb2FsLUNoOiAiK2NoZS5uYW1lOw0KCQkJCQkJY2MuZGVzY3JpcHRpb249Y2hlLmJyaWVmRGVzY3JpcHRpb24gKyAiaXMgcGxhbm5lZCI7DQoJCQkJCQkNCgkJICAJCSAJCS8vQXNzZXJ0ZWQgaW5mZXJlbmNlIGxpbmtzIEFyZ3VtZW50IHRvIFN1Yi1DbGFpbQ0KCQkgIAkJIAkJeGMubmFtZSA9ICdBY2hfQ2NoJzsgDQoJCQkJIAkJeGMuc291cmNlLmFkZChhcmMpOw0KCQkJCSAJCXhjLnRhcmdldC5hZGQoY2MpOw0KCQkJCQkJDQoJCQkJCQkvL2NoZWNrbGlzdCAtPiBzb2x1dGlvbg0KCQkJCQkJaWNjLmlkPSJFIitjaGUuaWQ7DQoJCQkJCQlpY2MubmFtZT0gY2hlLm5hbWUrIiBzaG91bGQgYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkIjsNCgkJCQkJCWljYy5kZXNjcmlwdGlvbj0gY2hlLmJyaWVmRGVzY3JpcHRpb247CQ0KCQkJCQkJaWNjLnR5cGUgPSBBUkchSW5mb3JtYXRpb25FbGVtZW50VHlwZSNTb2x1dGlvbjsNCgkJICAJCQkJLy9pY2MudG9CZUluc3RhbnRpYXRlZCA9ZmFsc2U7DQoJCSAgCQkJCS8vdmFyIHN0cmM0ID0gInNvbHV0aW9uID0gIiArIGljYy5uYW1lOw0KCQkJCQkJLy9zdHJjNC5wcmludGxuKCk7DQoJCQkJCQkNCgkJCQkJCS8vIEFzc2VydGVkIEV2aWRlbmNlIExpbmtzIFN1Yi1jbGFpbSB0byBTb2x1dGlvbg0KCQkJCQkJeWMubmFtZSA9ICdDY2hfRWNoJzsgDQoJCQkJCQl5Yy5zb3VyY2UuYWRkKGNjKTsNCgkJICAJCSAJCXljLnRhcmdldC5hZGQoaWNjKTsNCgkJICAJCSAJCS8veWMuc291cmNlLnByaW50bG4oKTsNCgkJICAJCSAJCQ0KCQkgIAkJIAkJYXJnLmFyZ3VtZW50LmFkZCh4Yyk7DQoJCSAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKHljKTsJCQ0KCQkgIAkJIAkJYXJnLmFyZ3VtZW50LmFkZChjYyk7DQoJCSAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKGljYyk7DQoJCQkJCQkNCgkJCQkJCS8vQXNzZXJ0ZWQgSW5mZXJlbmNlIExpbmtzIENsYWltIHRvIEFyZ3VtZW50DQoJCQkJIAkJdmFyIHpjID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJICAJCSAJCXpjLm5hbWUgPSAiQ2x0ZF9BY2giOyANCgkJCQkgCQl6Yy5zb3VyY2UuYWRkKGNsdGQpOw0KCQkJCSAJCXpjLnRhcmdldC5hZGQoYXJjKTsNCgkJCQkgCQlhcmcuYXJndW1lbnQuYWRkKHpjKTsNCgkJCQkJfQ0KCQkJCX0gCQkNCgkJDQoJCQkJLyogRXhhbXBsZSAtPiBhdHRhY2hlZCB0byBUYXNrIERlc2NyaXB0b3IgKi8NCgkJCQ0KCQkJCWlmKHRkLmdldEV4YW1wbGVzKCkgPD5udWxsKXsNCgkgIAkNCgkJCQkJZm9yKGV4cCBpbiB0ZC5nZXRFeGFtcGxlcygpKXsNCgkJCQkNCgkJCQkJCXZhciBhcmUgPSBuZXcgQVJHIUFyZ3VtZW50UmVhc29uaW5nOw0KCQkJICAJICAgIAlhcmcuYXJndW1lbnQuYWRkKGFyZSk7DQoJCQkgIAkgICAgCWFyZS5pZD0iVGQuRXgiK3RkLmlkOw0KCQkJCQkJYXJlLm5hbWU9IkFyZ3VtZW50IG92ZXIgZXhhbXBsZXMiOw0KCQkJCQkJYXJlLmRlc2NyaXB0aW9uPSJBcmd1bWVudCBvdmVyIGV4YW1wbGVzIjsNCgkJCQkJICAgIC8vdmFyIHN0cmUxID0gImV4YW1wbGUgPSAiICsgZXhwLm5hbWU7DQoJCQkJCQkvL3N0cmUxLnByaW50bG4oKTsNCgkJCQkJCQ0KCQkJCQkJdmFyIGNlID0gbmV3IEFSRyFDbGFpbTsNCgkJCQkJCXZhciBpZWUgPSBuZXcgQVJHIUluZm9ybWF0aW9uRWxlbWVudENpdGF0aW9uOw0KCQkJCQkJdmFyIHhlID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJCQkJCXZhciB5ZSA9IG5ldyBBUkchQXNzZXJ0ZWRFdmlkZW5jZTsNCgkJCQkJCQ0KCQkJCQkJLy9leHBhbXBsZSAtPiBzdWItY2xhaW0NCgkJCQkJCWNlLmlkPSJHIit0ZC5pZCsiLkV4IitleHAuaWQ7DQoJCQkJCQljZS5uYW1lPSJTdWItR29hbC1FeDogIitleHAubmFtZTsNCgkJCQkJCWNlLmRlc2NyaXB0aW9uPWV4cC5icmllZkRlc2NyaXB0aW9uICsgZXhwLm5hbWUgKyAiIGlzIHBsYW5uZWQiOw0KCQkJCQkJDQoJCSAgCQkgCQkvL0Fzc2VydGVkIGluZmVyZW5jZSBsaW5rcyBBcmd1bWVudCB0byBTdWItQ2xhaW0NCgkJICAJCSAJCXhlLm5hbWUgPSAnQWV4X0NleCc7IA0KCQkJCSAJCXhlLnNvdXJjZS5hZGQoYXJlKTsNCgkJCQkgCQl4ZS50YXJnZXQuYWRkKGNlKTsNCgkJCQkJCS8vdmFyIHN0cmUzID0gIkFzc2VydGVkSW5mZXJlbmNlID0gIiArIHhlLnRhcmdldDsNCgkJCQkJCS8vc3RyZTMucHJpbnRsbigpOw0KCQkJCQkJDQoJCQkJCQkvL2V4cGFtcGxlIC0+IHNvbHV0aW9uDQoJCQkJCQlpZWUuaWQ9IkUiK2V4cC5pZDsNCgkJCQkJCWllZS5uYW1lPSBleHAubmFtZTsgLy8rIiBzaG91bGQgYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkIjsNCgkJCQkJCWllZS5kZXNjcmlwdGlvbj0gZXhwLmJyaWVmRGVzY3JpcHRpb24gKyBleHAubmFtZTsJDQoJCQkJCQlpZWUudHlwZSA9IEFSRyFJbmZvcm1hdGlvbkVsZW1lbnRUeXBlI1NvbHV0aW9uOw0KCQkgIAkJCQkvL2llZS50b0JlSW5zdGFudGlhdGVkID1mYWxzZTsNCgkJICAJCQkJLy92YXIgc3RyZTQgPSBpZWUubmFtZSArICIgc2hvdWxkIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZCI7DQoJCQkJCQkvL3N0cmU0LnByaW50bG4oKTsNCgkJCQkJCQ0KCQkJCQkJLy8gQXNzZXJ0ZWQgRXZpZGVuY2UgTGlua3MgU3ViLWNsYWltIHRvIFNvbHV0aW9uDQoJCQkJCQl5ZS5uYW1lID0gJ0NleF9FZXgnOyANCgkJCQkJCXllLnNvdXJjZS5hZGQoY2UpOw0KCQkgIAkJIAkJeWUudGFyZ2V0LmFkZChpZWUpOw0KCQkgIAkJIAkJLy95ZS5zb3VyY2UucHJpbnRsbigpOw0KCQkgIAkJIAkJDQoJCSAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKHhlKTsNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoeWUpOwkJDQoJCSAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKGNlKTsNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoaWVlKTsNCgkJCQkJCQ0KCQkJCQkJLy9Bc3NlcnRlZCBJbmZlcmVuY2UgTGlua3MgQ2xhaW0gdG8gQXJndW1lbnQNCgkJCQkgCQl2YXIgemUgPSBuZXcgQVJHIUFzc2VydGVkSW5mZXJlbmNlOw0KCQkgIAkJIAkJemUubmFtZSA9ICJDbHRkX0FleCI7IA0KCQkJCSAJCXplLnNvdXJjZS5hZGQoY2x0ZCk7DQoJCQkJIAkJemUudGFyZ2V0LmFkZChhcmUpOw0KCQkJCSAJCWFyZy5hcmd1bWVudC5hZGQoemUpOw0KCQkJCQkJDQoJCQkJCX0NCgkJCQl9DQoJCQkNCgkJCQ0KCQkJCS8qIFRvb2xNZW50b3IgLT4gYXR0YWNoZWQgdG8gVGFzayBEZXNjcmlwdG9yICovDQoJCQkNCgkJCQlpZih0ZC50YXNrPD5udWxsKXsNCgkJCQl2YXIgdGFzaz1MSUIhVGFzay5hbGxJbnN0YW5jZXMuc2VsZWN0T25lKHRhc2t8dGFzay5pZD10ZC50YXNrKTsNCgkJCQkvL3ZhciBzdHJ0MSA9ICJ0YXNrbmFtZSAiICsgdGFzay5uYW1lOw0KCQkJCS8vc3RydDEucHJpbnRsbigpOw0KCQkJCS8vdmFyIHRvb2xNZW50b3I7DQoJDQoJCQkJCWZvciAodG0gaW4gdGFzay5nZXR0b29sTWVudG9ycygpKXsNCgkJCQkJLy92YXIgc3RydDIgPSAidG9vbE1lbnRvcklkICIgKyB0bS5uYW1lOw0KCQkJCQkvL3N0cnQyLnByaW50bG4oKTsNCgkJCQkJLy9hY3QucGFydGljaXBhbnQuYWRkKExJQiFUb29sTWVudG9yLmFsbEluc3RhbmNlcy5zZWxlY3RPbmUodG18dG0uaWQ9dG9vbE1lbnRvcklkKS5lcXVpdmFsZW50KCkpOw0KCQkJCQ0KCQkJCQkJdmFyIGFydCA9IG5ldyBBUkchQXJndW1lbnRSZWFzb25pbmc7DQoJCQkJCQlhcnQubmFtZT0iQXJndW1lbnQgb3ZlciB0b29sIG1lbnRvcnMiOw0KCQkJCQkJYXJ0LmlkPSJUZC5UbSIrdGQuaWQ7DQoJCQkJCQlhcnQuZGVzY3JpcHRpb249IkFyZ3VtZW50IG92ZXIgdG9vbCBtZW50b3JzIjsNCgkJCQkJCWFyZy5hcmd1bWVudC5hZGQoYXJ0KTsNCgkJCQkJCQ0KCQkJCQkJLy92YXIgc3RycjEgPSAiUyA9ICIgKyBhcnQubmFtZTsNCgkJCQkJCS8vc3RycjEucHJpbnRsbigpOw0KCQkJCQkJDQoJCQkJCQl2YXIgY2x0ID0gbmV3IEFSRyFDbGFpbTsNCgkJCQkJCXZhciBpZXQgPSBuZXcgQVJHIUluZm9ybWF0aW9uRWxlbWVudENpdGF0aW9uOw0KCQkJCQkJdmFyIHh0ID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJCQkJCXZhciB5dCA9IG5ldyBBUkchQXNzZXJ0ZWRFdmlkZW5jZTsNCgkJCQkJCQ0KCQkJCQkNCgkJCQkJCWNsdC5pZD0iRyIrdGQuaWQrIi5UbSIrdG0uaWQ7DQoJCQkJCQljbHQubmFtZT0iU3ViLUdvYWwtVG06ICIrdG0ubmFtZTsNCgkJCQkJCWNsdC5kZXNjcmlwdGlvbj10bS5icmllZkRlc2NyaXB0aW9uICsgdG0ubmFtZSArICIgaGFzIHRvIGJlIHF1YWxpZmllZCI7DQoJCQkJCQkvL3ZhciBzdHJyMjEyID0gIkNsYWltID0gIiArIHRtLm5hbWU7DQoJCQkJCQkvL3N0cnIyMTIucHJpbnRsbigpOw0KCQkgIAkJIAkJDQoJCSAgCQkgCQl4dC5uYW1lID0gJ0F0bV9DdG0nOyANCgkJCQkgCQl4dC5zb3VyY2UuYWRkKGFydCk7DQoJCQkJIAkJeHQudGFyZ2V0LmFkZChjbHQpOw0KCQkJCQkJDQoJCQkJCQlpZXQuaWQ9IkUiK3RtLmlkOw0KCQkJCQkJaWV0Lm5hbWU9IHRtLm5hbWUrIpJzIHF1YWxpZmljYXRpb25zIjsNCgkJCQkJCWlldC5kZXNjcmlwdGlvbj0iRV8iK3RtLm5hbWUrICKScyBxdWFsaWZpY2F0aW9ucyI7CS8vIkVfIit3cC5uYW1lICsgDQoJCQkJCQlpZXQudHlwZSA9IEFSRyFJbmZvcm1hdGlvbkVsZW1lbnRUeXBlI1NvbHV0aW9uOw0KCQkgIAkJCQkvL2llYy50b0JlSW5zdGFudGlhdGVkID1mYWxzZTsNCgkJICAJCQ0KCQkgIAkJCQkvL3ZhciBzdHJlMyA9ICJzb2x1dGlvbiA9ICIgKyBpZXQubmFtZTsNCgkJCQkJCS8vc3RyZTMucHJpbnRsbigpOw0KCQkJCQkJDQoJCQkJCQl5dC5uYW1lID0gJ0N0bV9FdG0nOyANCgkJCQkJCXl0LnNvdXJjZS5hZGQoY2x0KTsNCgkJICAJCSAJCXl0LnRhcmdldC5hZGQoaWV0KTsJICAJCSAJCQ0KCQkgIAkJIAkJDQoJCSAgCQkgCQl2YXIgenRtID0gbmV3IEFSRyFBc3NlcnRlZEluZmVyZW5jZTsNCgkJICAJCSAJCXp0bS5uYW1lID0gIkNsdGRfQXRtIjsgDQoJCQkJIAkJenRtLnNvdXJjZS5hZGQoY2x0ZCk7DQoJCQkJIAkJenRtLnRhcmdldC5hZGQoYXJ0KTsNCgkJCQkJCS8vdmFyIHN0cmU1ID0gIkFzc2VydGVkSW5mZXJlbmNlID0gIiArIHp0bS50YXJnZXQubmFtZTsNCgkJCQkJCS8vc3RyZTUucHJpbnRsbigpOw0KCQkJCQkJLy92YXIgc3RyZTYgPSAiQXNzZXJ0ZWRJbmZlcmVuY2UgPSAiICsgenRtLnNvdXJjZS5uYW1lOw0KCQkJCQkJLy9zdHJlNi5wcmludGxuKCk7DQoJCSAgCQkgCQkNCgkJICAJCSAgIAkJYXJnLmFyZ3VtZW50LmFkZCh4dCk7DQoJCSAgCQkgCQlhcmcuYXJndW1lbnQuYWRkKHl0KTsJCQ0KCQkgIAkJIAkJYXJnLmFyZ3VtZW50LmFkZChjbHQpOw0KCQkgIAkJIAkJYXJnLmFyZ3VtZW50LmFkZChpZXQpOwkNCgkJICAJCSAJCWFyZy5hcmd1bWVudC5hZGQoenRtKTsJDQoJCQkJCX0JDQoJCQkJfQ0KCQkJDQoJCQkJCQ0KCQkJfQkNCgkJCQ0KCQkNCgkJfQ0KDQoJCWFyZy5hcmd1bWVudC5hZGQoYWNsKTsNCgl9DQoJDQoJDQoJDQovLwlvcGVyYXRpb24gQW55IGdldEFjdGl2aXRpZXMoc291cmNlIDogU2V0KExJQiFCcmVhZGtEb3duRWxlbWVudCkpOlNldChMSUIhQWN0aXZpdHkpIHsNCgkvL3ZhciByZXMgPSBzb3VyY2Uuc2VsZWN0KGFjdHxhY3QuaXNUeXBlT2YoTElCIUFjdGl2aXR5KSk7DQovL30NCg0Kb3BlcmF0aW9uIEFueSBnZXRUYXNrRGVzY3JpcHRvcnMoc291cmNlIDogU2V0KExJQiFCcmVhZGtEb3duRWxlbWVudCkpOlNldChMSUIhVGFza0Rlc2NyaXB0b3Ipew0KCXJldHVybiBzb3VyY2Uuc2VsZWN0KHRkfHRkLmlzVHlwZU9mKExJQiFUYXNrRGVzY3JpcHRvcikpOw0KCXRkLmlkLnByaW50bG4oKTsNCn0NCg0Kb3BlcmF0aW9uIEFueSBnZXRUYXNrRGVzY3JpcHRvcihpZDpTdHJpbmcpOkxJQiFCcmVha2Rvd25FbGVtZW50ew0KCXJldHVybiBMSUIhVGFza0Rlc2NyaXB0b3IuYWxsSW5zdGFuY2Uuc2VsZWN0T25lKHRkfHRkLmlkPWlkKTsNCn0NCgkNCm9wZXJhdGlvbiBMSUIhVGFza0Rlc2NyaXB0b3IgZ2V0VGFza1BhcnRpY2lwYW50cygpOlNldChMSUIhUm9sZURlc2NyaXB0b3Ipew0KCXZhciByZXM9bmV3IFNldChMSUIhUm9sZURlc2NyaXB0b3IpOw0KCSAgCQkNCgkvLyBwZXJmb3JtZWRQcmltYXJpbHlCeTsgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7IGFzc2lzdGVkQnkNCglmb3IocCBpbiBzZWxmLnBlcmZvcm1lZFByaW1hcmlseUJ5KXsNCgkJcmVzLmFkZChMSUIhUm9sZURlc2NyaXB0b3IuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZShyb2xlfHJvbGUuaWQ9cCkpOw0KCX0NCglmb3IoYSBpbiBzZWxmLmFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KXsNCgkJcmVzLmFkZChMSUIhUm9sZURlc2NyaXB0b3IuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZShyb2xlfHJvbGUuaWQ9YSkpOw0KCQkvL3ZhciBzdHJyMyA9ICJhID0gIiArIGE7DQoJCS8vc3RycjMucHJpbnRsbigpOw0KCX0NCglmb3IoYXNpIGluIHNlbGYuYXNzaXN0ZWRCeSl7DQoJCXJlcy5hZGQoTElCIVJvbGVEZXNjcmlwdG9yLmFsbEluc3RhbmNlcy5zZWxlY3RPbmUocm9sZXxyb2xlLmlkPWFzaSkpOw0KCQkvL3ZhciBzdHJyNCA9ICJhc2kgPSAiICsgYXNpOw0KCQkvL3N0cnI0LnByaW50bG4oKTsNCgl9DQoJcmV0dXJuIHJlczsNCn0NCg0Kb3BlcmF0aW9uIExJQiFUYXNrRGVzY3JpcHRvciBnZXRXb3JrUHJvZHVjdHMoKTpTZXQoTElCIVdvcmtQcm9kdWN0RGVzY3JpcHRvcil7DQoJdmFyIHJlcz1uZXcgU2V0KExJQiFXb3JrUHJvZHVjdERlc2NyaXB0b3IpOw0KCSAgCQkNCgkvLyBleHRlcm5hbElucHV0OyBvcHRpb25hbElucHV0OyBtYW5kYXRvcnlJbnB1dDsgb3V0cHV0DQoJZm9yKGVpIGluIHNlbGYuZXh0ZXJuYWxJbnB1dCl7DQoJCXJlcy5hZGQoTElCIVdvcmtQcm9kdWN0RGVzY3JpcHRvci5hbGxJbnN0YW5jZXMuc2VsZWN0T25lKHdvcmtQcm9kdWN0fHdvcmtQcm9kdWN0LmlkPWVpKSk7DQoJCS8vdmFyIHN0cnI2ID0gImVpID0gIiArIGVpOw0KCQkvL3N0cnI2LnByaW50bG4oKTsNCgl9DQoJZm9yKG9pIGluIHNlbGYub3B0aW9uYWxJbnB1dCl7DQoJCXJlcy5hZGQoTElCIVdvcmtQcm9kdWN0RGVzY3JpcHRvci5hbGxJbnN0YW5jZXMuc2VsZWN0T25lKHdvcmtQcm9kdWN0fHdvcmtQcm9kdWN0LmlkPW9pKSk7DQoJCS8vdmFyIHN0cnIzID0gIm9pID0gIiArIG9pOw0KCQkvL3N0cnIzLnByaW50bG4oKTsNCgl9DQoJZm9yKG1pIGluIHNlbGYubWFuZGF0b3J5SW5wdXQpew0KCQlyZXMuYWRkKExJQiFXb3JrUHJvZHVjdERlc2NyaXB0b3IuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZSh3b3JrUHJvZHVjdHx3b3JrUHJvZHVjdC5pZD1taSkpOw0KCQkvL3ZhciBzdHJyNCA9ICJtaSA9ICIgKyBtaTsNCgkJLy9zdHJyNC5wcmludGxuKCk7DQoJfQ0KCQ0KCWZvcihvIGluIHNlbGYub3V0cHV0KXsNCglyZXMuYWRkKExJQiFXb3JrUHJvZHVjdERlc2NyaXB0b3IuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZSh3b3JrUHJvZHVjdHx3b3JrUHJvZHVjdC5pZD1vKSk7DQoJCS8vdmFyIHN0cnI1ID0gIm8gPSAiICsgbzsNCgkJLy9zdHJyNS5wcmludGxuKCk7DQoJfQ0KCXJldHVybiByZXM7DQp9DQoNCm9wZXJhdGlvbiBMSUIhVGFza0Rlc2NyaXB0b3IgZ2V0R3VpZGVsaW5lcygpOlNldChMSUIhR3VpZGVsaW5lKXsNCgl2YXIgcmVzPW5ldyBTZXQoTElCIUd1aWRlbGluZSk7DQoJCQlmb3IoZ3UgaW4gc2VsZi5ndWlkZWxpbmUpew0KCQkJcmVzLmFkZChMSUIhR3VpZGVsaW5lLmFsbEluc3RhbmNlcy5zZWxlY3RPbmUoZ3VpZGVsaW5lfGd1aWRlbGluZS5pZD1ndSkpOw0KCQkJCQkvL3ZhciBzdHJyNiA9ICJndWlkID0gIiArIGd1Ow0KCQkJCQkvL3N0cnI2LnByaW50bG4oKTsNCgl9DQoJcmV0dXJuIHJlczsNCn0NCg0Kb3BlcmF0aW9uIExJQiFUYXNrRGVzY3JpcHRvciBnZXRDaGVja2xpc3RzKCk6U2V0KExJQiFDaGVja2xpc3Qpew0KCXZhciByZXM9bmV3IFNldChMSUIhQ2hlY2tsaXN0KTsNCglmb3IoY2hlIGluIHNlbGYuY2hlY2tsaXN0KXsNCgkJcmVzLmFkZChMSUIhQ2hlY2tsaXN0LmFsbEluc3RhbmNlcy5zZWxlY3RPbmUoY2hlY2tsaXN0fGNoZWNrbGlzdC5pZD1jaGUpKTsNCgkJLy92YXIgc3RycjQgPSAiY2hlY2sgPSAiICsgY2hlY2tsaXN0Ow0KCQkvL3N0cnI0LnByaW50bG4oKTsNCgl9DQoJcmV0dXJuIHJlczsNCn0NCg0Kb3BlcmF0aW9uIExJQiFUYXNrRGVzY3JpcHRvciBnZXRFeGFtcGxlcygpOlNldChMSUIhRXhhbXBsZSl7DQoJdmFyIHJlcz1uZXcgU2V0KExJQiFFeGFtcGxlKTsNCgkJCWZvcihleHAgaW4gc2VsZi5leGFtcGxlKXsNCgkJCXJlcy5hZGQoTElCIUV4YW1wbGUuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZShleGFtcGxlfGV4YW1wbGUuaWQ9ZXhwKSk7DQoJCQkJCS8vdmFyIHN0cmU2ID0gImV4cGwgPSAiICsgZXhwOw0KCQkJCQkvL3N0cmU2LnByaW50bG4oKTsNCgl9DQoJcmV0dXJuIHJlczsNCn0NCg0Kb3BlcmF0aW9uIExJQiFUYXNrIGdldHRvb2xNZW50b3JzKCk6U2V0KExJQiFUb29sTWVudG9yKXsNCgl2YXIgcmVzPW5ldyBTZXQoTElCIVRvb2xNZW50b3IpOw0KCQkJZm9yKHRtIGluIHNlbGYudG9vbE1lbnRvcil7DQoJCQlyZXMuYWRkKExJQiFUb29sTWVudG9yLmFsbEluc3RhbmNlcy5zZWxlY3RPbmUodG9vbE1lbnRvcnx0b29sTWVudG9yLmlkPXRtKSk7DQoJCQkJLy92YXIgc3RydDYgPSAiVE0gPSAiICsgdG07DQoJCQkJLy9zdHJ0Ni5wcmludGxuKCk7DQoJCQl9DQoNCglyZXR1cm4gcmVzOw0KCS8vcmVzLnByaW50bGluKCk7DQp9DQoNCg0Kb3BlcmF0aW9uIExJQiFUb29sTWVudG9yIGdldFRvb2woKTpMSUIhVG9vbHsNCglyZXR1cm4gTElCIVRvb2wuYWxsSW5zdGFuY2VzLnNlbGVjdE9uZSh0b29sfHRvb2wudG9vbE1lbnRvci5jb250YWlucyhzZWxmLmlkKSk7DQp9DQoNCgkNCg0KcG9zdHsJDQoiRW5kIG9mIHRyYW5zZm9ybWF0aW9uIi5wcmludGxuKCk7DQp9DQoNCg0KDQoNCg==