1 line
15 KiB
Python
1 line
15 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IGxvZ2dpbmcKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwpmcm9tIG9kb28uZXhjZXB0aW9ucyBpbXBvcnQgVmFsaWRhdGlvbkVycm9yCmZyb20gb2Rvby50b29scy5zYWZlX2V2YWwgaW1wb3J0IHNhZmVfZXZhbAoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBQTEFOX0xJTkVfQ09ORElUSU9OX0NIRUNLX0ZBSUxFRAoKX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEN4VG93ZXJQbGFuTGluZShtb2RlbHMuTW9kZWwpOgogICAgIiIiRmxpZ2h0IFBsYW4gTGluZSIiIgoKICAgIF9uYW1lID0gImN4LnRvd2VyLnBsYW4ubGluZSIKICAgIF9pbmhlcml0ID0gWwogICAgICAgICJjeC50b3dlci5yZWZlcmVuY2UubWl4aW4iLAogICAgXQogICAgX29yZGVyID0gInNlcXVlbmNlLCBwbGFuX2lkIgogICAgX2Rlc2NyaXB0aW9uID0gIkNldG1peCBUb3dlciBGbGlnaHQgUGxhbiBMaW5lIgoKICAgIGFjdGl2ZSA9IGZpZWxkcy5Cb29sZWFuKHJlbGF0ZWQ9InBsYW5faWQuYWN0aXZlIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIHNlcXVlbmNlID0gZmllbGRzLkludGVnZXIoZGVmYXVsdD0xMCkKICAgIG5hbWUgPSBmaWVsZHMuQ2hhcihyZWxhdGVkPSJjb21tYW5kX2lkLm5hbWUiLCByZWFkb25seT1UcnVlKQogICAgcGxhbl9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBzdHJpbmc9IkZsaWdodCBQbGFuIiwKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnBsYW4iLAogICAgICAgIGF1dG9fam9pbj1UcnVlLAogICAgICAgIG9uZGVsZXRlPSJjYXNjYWRlIiwKICAgICkKICAgIGFjdGlvbiA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgc2VsZWN0aW9uPWxhbWJkYSBzZWxmOiBzZWxmLmNvbW1hbmRfaWQuX3NlbGVjdGlvbl9hY3Rpb24oKSwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9hY3Rpb24iLAogICAgICAgIHJlcXVpcmVkPVRydWUsCiAgICAgICAgcmVhZG9ubHk9RmFsc2UsCiAgICApCiAgICBjb21tYW5kX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuY29tbWFuZCIsCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBvbmRlbGV0ZT0icmVzdHJpY3QiLAogICAgICAgIGRvbWFpbj0iWygnYWN0aW9uJywgJz0nLCBhY3Rpb24pXSIsCiAgICApCiAgICBub3RlID0gZmllbGRzLlRleHQocmVsYXRlZD0iY29tbWFuZF9pZC5ub3RlIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIHBhdGggPSBmaWVsZHMuQ2hhcigKICAgICAgICBoZWxwPSJMb2NhdGlvbiB3aGVyZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQuIE92ZXJyaWRlcyBjb21tYW5kIGRlZmF1bHQgcGF0aC4gIgogICAgICAgICJZb3UgY2FuIHVzZSB7eyB2YXJpYWJsZXMgfX0gaW4gcGF0aCIsCiAgICApCgogICAgdXNlX3N1ZG8gPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBoZWxwPSJXaWxsIHVzZSBzdWRvIGJhc2VkIG9uIHNlcnZlciBzZXR0aW5ncy4iCiAgICAgICAgIklmIG5vIHN1ZG8gaXMgY29uZmlndXJlZCB3aWxsIHJ1biB3aXRob3V0IHN1ZG8iCiAgICApCiAgICBhY3Rpb25faWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIHN0cmluZz0iQWN0aW9ucyIsCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5wbGFuLmxpbmUuYWN0aW9uIiwKICAgICAgICBpbnZlcnNlX25hbWU9ImxpbmVfaWQiLAogICAgICAgIGF1dG9fam9pbj1UcnVlLAogICAgICAgIGNvcHk9VHJ1ZSwKICAgICAgICBoZWxwPSJBY3Rpb25zIHRyaWdnZXIgYmFzZWQgb24gY29tbWFuZCByZXN1bHQuIgogICAgICAgICIgSWYgZW1wdHkgbmV4dCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQiLAogICAgKQogICAgY29tbWFuZF9jb2RlID0gZmllbGRzLlRleHQoCiAgICAgICAgcmVsYXRlZD0iY29tbWFuZF9pZC5jb2RlIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgKQogICAgdGFnX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkocmVsYXRlZD0iY29tbWFuZF9pZC50YWdfaWRzIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIGFjY2Vzc19sZXZlbCA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgcmVsYXRlZD0icGxhbl9pZC5hY2Nlc3NfbGV2ZWwiLAogICAgICAgIHJlYWRvbmx5PVRydWUsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICkKICAgIGNvbmRpdGlvbiA9IGZpZWxkcy5DaGFyKAogICAgICAgIGhlbHA9IkNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhpcyBGbGlnaHQgUGxhbiBMaW5lICIKICAgICAgICAid2lsbCBiZSBsYXVuY2hlZC4gZS5nLjoge3sgb2Rvb192ZXJzaW9ufX0gPT0gJzE0LjAnIiwKICAgICkKICAgIHZhcmlhYmxlX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci52YXJpYWJsZSIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX3BsYW5fbGluZV92YXJpYWJsZV9yZWwiLAogICAgICAgIGNvbHVtbjE9InBsYW5fbGluZV9pZCIsCiAgICAgICAgY29sdW1uMj0idmFyaWFibGVfaWQiLAogICAgICAgIHN0cmluZz0iVmFyaWFibGVzIiwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV92YXJpYWJsZV9pZHMiLAogICAgICAgIHN0b3JlPVRydWUsCiAgICApCiAgICAjIC0tIENvbW1hbmQgcmVsYXRlZCBlbnRpdGllcwogICAgcGxhbl9ydW5faWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5wbGFuIiwKICAgICAgICByZWxhdGVkPSJjb21tYW5kX2lkLmZsaWdodF9wbGFuX2lkIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIHN0cmluZz0iUnVuIEZsaWdodCBQbGFuIiwKICAgICkKICAgIHBsYW5fcnVuX2xpbmVfaWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIucGxhbi5saW5lIiwKICAgICAgICByZWxhdGVkPSJjb21tYW5kX2lkLmZsaWdodF9wbGFuX2lkLmxpbmVfaWRzIiwKICAgICAgICBzdHJpbmc9IkZsaWdodCBQbGFuIExpbmVzIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgKQogICAgZmlsZV90ZW1wbGF0ZV9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiLAogICAgICAgIHJlbGF0ZWQ9ImNvbW1hbmRfaWQuZmlsZV90ZW1wbGF0ZV9pZCIsCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgICkKICAgIGZpbGVfdGVtcGxhdGVfY29kZSA9IGZpZWxkcy5UZXh0KAogICAgICAgIHN0cmluZz0iVGVtcGxhdGUgQ29kZSIsCiAgICAgICAgcmVsYXRlZD0iZmlsZV90ZW1wbGF0ZV9pZC5jb2RlIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgKQoKICAgIEBhcGkuZGVwZW5kcygiY29uZGl0aW9uIikKICAgIGRlZiBfY29tcHV0ZV92YXJpYWJsZV9pZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSB2YXJpYWJsZV9pZHMgYmFzZWQgb24gY29uZGl0aW9uIGZpZWxkLgogICAgICAgICIiIgogICAgICAgIHRlbXBsYXRlX21peGluX29iaiA9IHNlbGYuZW52WyJjeC50b3dlci50ZW1wbGF0ZS5taXhpbiJdCiAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmOgogICAgICAgICAgICByZWNvcmQudmFyaWFibGVfaWRzID0gdGVtcGxhdGVfbWl4aW5fb2JqLl9wcmVwYXJlX3ZhcmlhYmxlX2NvbW1hbmRzKAogICAgICAgICAgICAgICAgWyJjb25kaXRpb24iXSwgZm9yY2VfcmVjb3JkPXJlY29yZAogICAgICAgICAgICApCgogICAgZGVmIF9jb21wdXRlX2FjdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21wdXRlIGFjdGlvbiBiYXNlZCBvbiBjb21tYW5kLgogICAgICAgICIiIgoKICAgICAgICAjIFdlIHNldCBhY3Rpb24gb25seSBvbmNlLCBzbyB0aGVyZSBpcyBubyAnZGVwZW5kcycgaW4gdGhpcyBmdW5jdGlvbgogICAgICAgIGZvciByZWNvcmQgaW4gc2VsZjoKICAgICAgICAgICAgaWYgcmVjb3JkLmFjdGlvbjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHJlY29yZC5jb21tYW5kX2lkOgogICAgICAgICAgICAgICAgcmVjb3JkLmFjdGlvbiA9IHJlY29yZC5jb21tYW5kX2lkLmFjdGlvbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVjb3JkLmFjdGlvbiA9IEZhbHNlCgogICAgQGFwaS5jb25zdHJhaW5zKCJjb21tYW5kX2lkIikKICAgIGRlZiBfY2hlY2tfY29tbWFuZF9pZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayByZWN1cnNpdmUgcGxhbiBsaW5lIGV4ZWN1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBmb3IgbGluZSBpbiBzZWxmOgogICAgICAgICAgICAjIENoZWNrIHJlY3Vyc2l2ZSBwbGFuIGxpbmUgZXhlY3V0aW9uCiAgICAgICAgICAgIHZpc2l0ZWRfcGxhbnMgPSBzZXQoKQogICAgICAgICAgICBzZWxmLl9jaGVja19yZWN1cnNpdmVfcGxhbihsaW5lLmNvbW1hbmRfaWQsIHZpc2l0ZWRfcGxhbnMpCgogICAgQGFwaS5vbmNoYW5nZSgiYWN0aW9uIikKICAgIGRlZiBfaW52ZXJzZV9hY3Rpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzZXQgY29tbWFuZCB3aGVuIGFjdGlvbiBjaGFuZ2VzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29tbWFuZF9pZCA9IEZhbHNlCgogICAgZGVmIF9jaGVja19yZWN1cnNpdmVfcGxhbihzZWxmLCBjb21tYW5kLCB2aXNpdGVkX3BsYW5zKToKICAgICAgICAiIiIKICAgICAgICBSZWN1cnNpdmVseSBjaGVjayBpZiB0aGUgY29tbWFuZCBwbGFuIGNyZWF0ZXMgYSBjeWNsZS4KICAgICAgICBSYWlzZSBhIFZhbGlkYXRpb25FcnJvciBpZiBhIGN5Y2xlIGlzIGRldGVjdGVkLgogICAgICAgICIiIgogICAgICAgIGlmIGNvbW1hbmQuZmxpZ2h0X3BsYW5faWQgYW5kIGNvbW1hbmQuYWN0aW9uID09ICJwbGFuIjoKICAgICAgICAgICAgaWYgY29tbWFuZC5mbGlnaHRfcGxhbl9pZC5pZCBpbiB2aXNpdGVkX3BsYW5zOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJSZWN1cnNpdmUgcGxhbiBjYWxsIGRldGVjdGVkIGluIHBsYW4gJShuYW1lKXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1jb21tYW5kLmZsaWdodF9wbGFuX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB2aXNpdGVkX3BsYW5zLmFkZChjb21tYW5kLmZsaWdodF9wbGFuX2lkLmlkKQogICAgICAgICAgICAjIHJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBsaW5lcyBpbiB0aGUgcGxhbgogICAgICAgICAgICBmb3IgbGluZSBpbiBjb21tYW5kLmZsaWdodF9wbGFuX2lkLmxpbmVfaWRzOgogICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfcmVjdXJzaXZlX3BsYW4obGluZS5jb21tYW5kX2lkLCB2aXNpdGVkX3BsYW5zKQoKICAgIGRlZiBfcnVuKHNlbGYsIHNlcnZlciwgcGxhbl9sb2dfcmVjb3JkLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUnVuIGNvbW1hbmQgZnJvbSB0aGUgRmxpZ2h0IFBsYW4gbGluZQoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzZXJ2ZXIgKGN4LnRvd2VyLnNlcnZlcigpKTogU2VydmVyIG9iamVjdAogICAgICAgICAgICBwbGFuX2xvZ19yZWNvcmQgKGN4LnRvd2VyLnBsYW4ubG9nKCkpOiBMb2cgcmVjb3JkIG9iamVjdAogICAgICAgICAgICBrd2FyZ3MgKGRpY3QpOiBPcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgICAgICAgIEZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIGJ1dCBub3QgbGltaXRlZCB0bzoKICAgICAgICAgICAgICAgICAgICAtICJwbGFuX2xvZyI6IHt2YWx1ZXMgcGFzc2VkIHRvIGZsaWdodHBsYW4gbG9nZ2VyfQogICAgICAgICAgICAgICAgICAgIC0gImxvZyI6IHt2YWx1ZXMgcGFzc2VkIHRvIGNvbW1hbmQgbG9nZ2VyfQogICAgICAgICAgICAgICAgICAgIC0gImtleSI6IHt2YWx1ZXMgcGFzc2VkIHRvIGtleSBwYXJzZXJ9CgogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCgogICAgICAgICMgU2V0IGN1cnJlbnQgbGluZSBhcyBjdXJyZW50bHkgZXhlY3V0ZWQgaW4gbG9nCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkLnBsYW5fbGluZV9leGVjdXRlZF9pZCA9IHNlbGYKCiAgICAgICAgIyBJdCBpcyBuZWNlc3NhcnkgdG8gc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBwbGFuIGxvZwogICAgICAgICMgd2FzIGNyZWF0ZWQgZm9yIGEgY29tbWFuZCBsb2cgdGhhdCBoYXMgdGhlIGNvbW1hbmQgYWN0aW9uIOKAnHBsYW7igJ0KICAgICAgICBmbGlnaHRfcGxhbl9jb21tYW5kX2xvZyA9IGt3YXJncy5nZXQoImZsaWdodF9wbGFuX2NvbW1hbmRfbG9nIikKICAgICAgICBpZiBmbGlnaHRfcGxhbl9jb21tYW5kX2xvZzoKICAgICAgICAgICAgZmxpZ2h0X3BsYW5fY29tbWFuZF9sb2cudHJpZ2dlcmVkX3BsYW5fbG9nX2lkID0gcGxhbl9sb2dfcmVjb3JkLmlkCgogICAgICAgICMgUGFzcyBwbGFuX2xvZyB0byBjb21tYW5kIHNvIGl0IHdpbGwgYmUgc2F2ZWQgaW4gY29tbWFuZCBsb2cKICAgICAgICBsb2dfdmFscyA9IGt3YXJncy5nZXQoImxvZyIsIHt9KQogICAgICAgIGxvZ192YWxzLnVwZGF0ZSh7InBsYW5fbG9nX2lkIjogcGxhbl9sb2dfcmVjb3JkLmlkfSkKICAgICAgICBrd2FyZ3MudXBkYXRlKHsibG9nIjogbG9nX3ZhbHN9KQoKICAgICAgICAjIFNldCAnc3VkbycgdmFsdWUKICAgICAgICB1c2Vfc3VkbyA9IHNlbGYudXNlX3N1ZG8gYW5kIHNlcnZlci51c2Vfc3VkbwoKICAgICAgICAjIFVzZSBzdWRvIHRvIGJ5cGFzcyBhY2Nlc3MgcnVsZXMgZm9yIGV4ZWN1dGUgY29tbWFuZCB3aXRoIGhpZ2hlciBhY2Nlc3MgbGV2ZWwKICAgICAgICBjb21tYW5kX2FzX3Jvb3QgPSBzZWxmLnN1ZG8oKS5jb21tYW5kX2lkCgogICAgICAgICMgU2V0IHBhdGgKICAgICAgICBwYXRoID0gc2VsZi5wYXRoIG9yIGNvbW1hbmRfYXNfcm9vdC5wYXRoCiAgICAgICAgaWYgcGxhbl9sb2dfcmVjb3JkLndheXBvaW50X2lkOgogICAgICAgICAgICBrd2FyZ3NbIndheXBvaW50Il0gPSBwbGFuX2xvZ19yZWNvcmQud2F5cG9pbnRfaWQKICAgICAgICBzZXJ2ZXIucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIGNvbW1hbmQ9Y29tbWFuZF9hc19yb290LAogICAgICAgICAgICBwYXRoPXBhdGgsCiAgICAgICAgICAgIHN1ZG89dXNlX3N1ZG8sCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1wbGFuX2xvZ19yZWNvcmQuamV0X3RlbXBsYXRlX2lkLAogICAgICAgICAgICBqZXQ9cGxhbl9sb2dfcmVjb3JkLmpldF9pZCwKICAgICAgICAgICAgKiprd2FyZ3MsCiAgICAgICAgKQoKICAgIGRlZiBfaXNfZXhlY3V0YWJsZV9saW5lKAogICAgICAgIHNlbGYsIHNlcnZlciwgamV0X3RlbXBsYXRlPU5vbmUsIGpldD1Ob25lLCB2YXJpYWJsZV92YWx1ZXM9Tm9uZQogICAgKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGlzIGxpbmUgY2FuIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIGl0cyBjb25kaXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpOiBUaGUgc2VydmVyIG9uIHdoaWNoIGNvbmRpdGlvbnMgYXJlIGNoZWNrZWQuCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZSAoY3gudG93ZXIuamV0LnRlbXBsYXRlKCkpOiBUaGUgamV0IHRlbXBsYXRlIGJlaW5nIHVzZWQuCiAgICAgICAgICAgIGpldCAoY3gudG93ZXIuamV0KCkpOiBUaGUgamV0IGJlaW5nIHVzZWQuCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcyAoZGljdCwgb3B0aW9uYWwpOiBDdXN0b20gdmFsdWVzIHByb3ZpZGVkIHdoZW4gcnVubmluZyB0aGUKICAgICAgICAgICAgICAgIGZsaWdodCBwbGFuLiBUaGVzZSB2YWx1ZXMgYXJlIG1lcmdlZCB3aXRoIHNlcnZlciB2YXJpYWJsZXMgd2hlbgogICAgICAgICAgICAgICAgcmVuZGVyaW5nIHRoZSBjb25kaXRpb24uCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGJvb2w6IFRydWUgaWYgdGhlIGxpbmUgY2FuIGJlIGV4ZWN1dGVkLCBvdGhlcndpc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICBjb25kaXRpb24gPSBzZWxmLmNvbmRpdGlvbgogICAgICAgIGlmIGNvbmRpdGlvbjoKICAgICAgICAgICAgdmFyaWFibGVzID0gc2VsZi5jb21tYW5kX2lkLmdldF92YXJpYWJsZXNfZnJvbV9jb2RlKGNvbmRpdGlvbikgICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgICAgICBpZiB2YXJpYWJsZXM6CiAgICAgICAgICAgICAgICB2YXJpYWJsZV9vYmogPSBzZWxmLmVudlsiY3gudG93ZXIudmFyaWFibGUiXQogICAgICAgICAgICAgICAgc2VydmVyX3ZhbHVlcyA9IHZhcmlhYmxlX29iai5fZ2V0X3ZhcmlhYmxlX3ZhbHVlc19ieV9yZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXI9c2VydmVyLAogICAgICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgamV0PWpldCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICMgTWVyZ2Ugd2l0aCBjdXN0b20gdmFsdWVzIHBhc3NlZCB0byB0aGUgZmxpZ2h0IHBsYW4gKGlmIGFueSkKICAgICAgICAgICAgICAgIG1lcmdlZF92YWx1ZXMgPSB7KipzZXJ2ZXJfdmFsdWVzLCAqKih2YXJpYWJsZV92YWx1ZXMgb3Ige30pfQogICAgICAgICAgICAgICAgaWYgbWVyZ2VkX3ZhbHVlczoKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBzZWxmLmNvbW1hbmRfaWQucmVuZGVyX2NvZGVfY3VzdG9tKAogICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24sIHB5dGhvbmljX21vZGU9VHJ1ZSwgKiptZXJnZWRfdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBGb3IgZXZhbHVhdGUgYSBzdHJpbmcgdGhhdCBjb250YWlucyBhbiBleHByZXNzaW9uIHRoYXQgbW9zdGx5IHVzZXMKICAgICAgICAgICAgIyBQeXRob24gY29uc3RhbnRzLCBhcml0aG1ldGljIGV4cHJlc3Npb25zIGFuZCB0aGUgb2JqZWN0cyBkaXJlY3RseSBwcm92aWRlZAogICAgICAgICAgICAjIGluIGNvbnRleHQgd2UgbmVlZCB1c2UgYHNhZmVfZXZhbGAKICAgICAgICAgICAgIyBXZSBjYXRjaCBhbGwgZXhjZXB0aW9ucyBhbmQgcmV0dXJuIEZhbHNlIHRvIGF2b2lkIHJhaXNpbmcgYW4gZXhjZXB0aW9uCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNhZmVfZXZhbChjb25kaXRpb24pCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9sb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkVycm9yIGV2YWx1YXRpbmcgY29uZGl0aW9uICclcycgZm9yIHBsYW4gbGluZSAnJXMnICIKICAgICAgICAgICAgICAgICAgICAiaW4gcGxhbiAnJXMnIGZvciBzZXJ2ZXIgJyVzJy4gTGluZSBpcyBza2lwcGVkLiBFcnJvcjogJXMiLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGFuX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RyKGUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBBc3N1bWUgdGhlIGxpbmUgY2FuIGJlIGV4ZWN1dGVkIGlmIG5vIGNvbmRpdGlvbiBpcyBzcGVjaWZpZWQKCiAgICBkZWYgX3NraXAoc2VsZiwgc2VydmVyLCBwbGFuX2xvZ19yZWNvcmQsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBUcmlnZ2VyZWQgd2hlbiBwbGFuIGxpbmUgc2tpcHBlZCBieSBjb25kaXRpb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQoKICAgICAgICAjIFNldCBjdXJyZW50IGxpbmUgYXMgY3VycmVudGx5IGV4ZWN1dGVkIGluIGxvZwogICAgICAgIHBsYW5fbG9nX3JlY29yZC5wbGFuX2xpbmVfZXhlY3V0ZWRfaWQgPSBzZWxmCgogICAgICAgICMgTG9nIHRoZSB1bnN1Y2Nlc3NmdWwgZXhlY3V0aW9uIGF0dGVtcHQKICAgICAgICBub3cgPSBmaWVsZHMuRGF0ZXRpbWUubm93KCkKICAgICAgICBsb2dfdmFscyA9IGt3YXJncy5nZXQoImxvZyIsIHt9KQogICAgICAgIGxvZ192YWxzLnVwZGF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5fbG9nX2lkIjogcGxhbl9sb2dfcmVjb3JkLmlkLAogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6IHNlbGYuY29uZGl0aW9uLAogICAgICAgICAgICAgICAgImlzX3NraXBwZWQiOiBUcnVlLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5sb2ciXS5yZWNvcmQoCiAgICAgICAgICAgIHNlcnZlcl9pZD1zZXJ2ZXIuaWQsCiAgICAgICAgICAgIGNvbW1hbmRfaWQ9c2VsZi5jb21tYW5kX2lkLmlkLCAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCiAgICAgICAgICAgIHN0YXJ0X2RhdGU9bm93LAogICAgICAgICAgICBmaW5pc2hfZGF0ZT1ub3csCiAgICAgICAgICAgIHN0YXR1cz1QTEFOX0xJTkVfQ09ORElUSU9OX0NIRUNLX0ZBSUxFRCwKICAgICAgICAgICAgZXJyb3I9XygiUGxhbiBsaW5lIGNvbmRpdGlvbiBjaGVjayBmYWlsZWQuIiksCiAgICAgICAgICAgICoqbG9nX3ZhbHMsCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X2RlcGVuZGVudF9tb2RlbF9yZWxhdGlvbl9maWVsZHMoc2VsZik6CiAgICAgICAgIiIiQ2hlY2sgY3gudG93ZXIucmVmZXJlbmNlLm1peGluIGZvciB0aGUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9kZXBlbmRlbnRfbW9kZWxfcmVsYXRpb25fZmllbGRzKCkKICAgICAgICByZXR1cm4gcmVzICsgWyJhY3Rpb25faWRzIl0KCiAgICBkZWYgX2dldF9wcmVfcG9wdWxhdGVkX21vZGVsX2RhdGEoc2VsZik6CiAgICAgICAgIiIiQ2hlY2sgY3gudG93ZXIucmVmZXJlbmNlLm1peGluIGZvciB0aGUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9wcmVfcG9wdWxhdGVkX21vZGVsX2RhdGEoKQogICAgICAgIHJlcy51cGRhdGUoeyJjeC50b3dlci5wbGFuLmxpbmUiOiBbImN4LnRvd2VyLnBsYW4iLCAicGxhbl9pZCJdfSkKICAgICAgICByZXR1cm4gcmVzCg== |