1 line
30 KiB
Python
1 line
30 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJTZXJ2ZXJMb2coVGVzdFRvd2VySmV0c0NvbW1vbik6CiAgICAiIiJUZXN0IHRoZSBjeC50b3dlci5zZXJ2ZXIubG9nIG1vZGVsIGFjY2VzcyByaWdodHMuIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgQ3JlYXRlIHRlc3Qgc2VydmVyIGxvZ3MKICAgICAgICBjbHMuc2VydmVyX2xvZ18xID0gY2xzLlNlcnZlckxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgTG9nIDEiLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IGNscy5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLnNlcnZlcl9sb2dfMiA9IGNscy5TZXJ2ZXJMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IExvZyAyIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBjbHMuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJsb2dfdHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGFkZGl0aW9uYWwgc2VydmVyIGZvciB0ZXN0aW5nCiAgICAgICAgY2xzLnNlcnZlcl8yID0gY2xzLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIDIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAidGVzdDIiLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJ0ZXN0MiIsCiAgICAgICAgICAgICAgICAic3NoX3BvcnQiOiAyMiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBVc2UgcHJlLWNyZWF0ZWQgamV0X3RlbXBsYXRlX3Rlc3QgYW5kIGpldF90ZXN0IGZyb20gVGVzdFRvd2VySmV0c0NvbW1vbgogICAgICAgICMgRW5zdXJlIGpldF90ZW1wbGF0ZV90ZXN0IGhhcyBzZXJ2ZXJfdGVzdF8xIGluIHNlcnZlcl9pZHMKICAgICAgICBjbHMuamV0X3RlbXBsYXRlX3Rlc3Qud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWyg0LCBjbHMuc2VydmVyX3Rlc3RfMS5pZCldfSkKCiAgICAgICAgIyBDcmVhdGUgc2VydmVyIGxvZ3MgbGlua2VkIHRvIEpldAogICAgICAgIGNscy5zZXJ2ZXJfbG9nX2pldF8xID0gY2xzLlNlcnZlckxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgSmV0IExvZyAxIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBjbHMuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBjbHMuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjEiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjbHMuc2VydmVyX2xvZ19qZXRfMiA9IGNscy5TZXJ2ZXJMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEpldCBMb2cgMiIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogY2xzLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgc2VydmVyIGxvZ3MgbGlua2VkIHRvIEpldCBUZW1wbGF0ZQogICAgICAgIGNscy5zZXJ2ZXJfbG9nX2pldF90ZW1wbGF0ZV8xID0gY2xzLlNlcnZlckxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgSmV0IFRlbXBsYXRlIExvZyAxIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBjbHMuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBjbHMuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjEiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjbHMuc2VydmVyX2xvZ19qZXRfdGVtcGxhdGVfMiA9IGNscy5TZXJ2ZXJMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEpldCBUZW1wbGF0ZSBMb2cgMiIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogY2xzLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICBkZWYgdGVzdF91c2VyX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHVzZXIgYWNjZXNzIHRvIHNlcnZlciBsb2dzIiIiCiAgICAgICAgIyBBZGQgdXNlciB0byBzZXJ2ZXIncyB1c2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMTogVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA9PSAiMSIKICAgICAgICAjIC0gdXNlciBpcyBpbiBzZXJ2ZXIncyB1c2VyX2lkcwogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgImluIiwgW3NlbGYuc2VydmVyX2xvZ18xLmlkLCBzZWxmLnNlcnZlcl9sb2dfMi5pZF0pXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgYWxsIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgJzEnIgogICAgICAgICAgICAiIHdoZW4gaW4gdXNlcl9pZHMiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDI6IFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBub3QgaW4gc2VydmVyJ3MgdXNlcl9pZHMKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldLCAgIyBSZW1vdmUgYWxsIHVzZXJzCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuc2VydmVyX2xvZ18xLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMzogVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIGFjY2Vzc19sZXZlbCA+ICIxIgogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGhpZ2hfYWNjZXNzX2xvZyA9ICgKICAgICAgICAgICAgc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYudXNlcikKICAgICAgICAgICAgLnN1ZG8oKQogICAgICAgICAgICAuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkhpZ2ggQWNjZXNzIExvZyIsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIGhpZ2hfYWNjZXNzX2xvZy5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbG9ncyB3aXRoIGFjY2Vzc19sZXZlbCA+ICcxJyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgbWFuYWdlciBhY2Nlc3MgdG8gc2VydmVyIGxvZ3MiIiIKICAgICAgICAjIEFkZCBtYW5hZ2VyIHRvIHNlcnZlcidzIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FzZSAxOiBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsIDw9ICIyIgogICAgICAgICMgLSBtYW5hZ2VyIGlzIGluIHNlcnZlcidzIG1hbmFnZXJfaWRzCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiaW4iLCBbc2VsZi5zZXJ2ZXJfbG9nXzEuaWQsIHNlbGYuc2VydmVyX2xvZ18yLmlkXSldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgbG9ncyB3aGVuIGluIG1hbmFnZXJfaWRzIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAyOiBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBhbmQgd3JpdGUgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsIDw9ICIyIgogICAgICAgICMgLSBtYW5hZ2VyIGlzIGluIHNlcnZlcidzIG1hbmFnZXJfaWRzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXdfbG9nID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk1hbmFnZXIgVGVzdCBMb2ciLAogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBsb2dzIHdoZW4gaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMiCiAgICAgICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXdfbG9nLndyaXRlKHsibmFtZSI6ICJVcGRhdGVkIE5hbWUifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIGxvZ3Mgd2hlbiBpbiBzZXJ2ZXIncyBtYW5hZ2VyX2lkcyIKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2xvZy5uYW1lLCAiVXBkYXRlZCBOYW1lIikKCiAgICAgICAgIyBDYXNlIDM6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdW5saW5rIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA8PSAiMiIKICAgICAgICAjIC0gY3JlYXRlZCBieSBtYW5hZ2VyCiAgICAgICAgIyAtIG1hbmFnZXIgaXMgaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5ld19sb2cudW5saW5rKCkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVubGluayBvd24gbG9ncyB3aGVuIGluIHNlcnZlcidzIG1hbmFnZXJfaWRzIgogICAgICAgICAgICApCgogICAgICAgICMgQ2FzZSA0OiBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byB1bmxpbmsgbG9ncyBjcmVhdGVkIGJ5IG90aGVycwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnNlcnZlcl9sb2dfMS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS51bmxpbmsoKQoKICAgICAgICAjIENhc2UgNTogTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNjZXNzIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgPiAiMiIKICAgICAgICBoaWdoX2FjY2Vzc19sb2cgPSAoCiAgICAgICAgICAgIHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpCiAgICAgICAgICAgIC5zdWRvKCkKICAgICAgICAgICAgLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJIaWdoIEFjY2VzcyBMb2ciLAogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBoaWdoX2FjY2Vzc19sb2cuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgPiAnMiciLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9yb290X2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHJvb3QgdXNlciB1bnJlc3RyaWN0ZWQgYWNjZXNzIiIiCiAgICAgICAgIyBDcmVhdGUgdGVzdCBsb2dzIHdpdGggdmFyaW91cyBjb25kaXRpb25zCiAgICAgICAgdGVzdF9sb2dzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYucm9vdCkuY3JlYXRlKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBmIlJvb3QgVGVzdCBMb2cge2xldmVsfSIsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6IGxldmVsLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIGxldmVsIGluIFsiMSIsICIyIiwgIjMiXQogICAgICAgICAgICBdCiAgICAgICAgKQoKICAgICAgICAjIFJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgbG9ncyByZWdhcmRsZXNzIG9mIGNvbmRpdGlvbnMKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKFsoImlkIiwgImluIiwgdGVzdF9sb2dzLmlkcyldKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGhhdmUgdW5yZXN0cmljdGVkIHJlYWQgYWNjZXNzIHRvIGFsbCBsb2dzIiwKICAgICAgICApCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbGwgbG9ncwogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIGxvZyBpbiB0ZXN0X2xvZ3M6CiAgICAgICAgICAgICAgICBsb2cud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgYnkgUm9vdCJ9KQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIGFueSBsb2dzIikKCiAgICAgICAgIyBSb290IHNob3VsZCBiZSBhYmxlIHRvIHVubGluayBhbGwgbG9ncwogICAgICAgIHRyeToKICAgICAgICAgICAgdGVzdF9sb2dzLnVubGluaygpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gdW5saW5rIGFueSBsb2dzIikKCiAgICBkZWYgdGVzdF9sb2dfdGV4dF9hY2Nlc3NfcmVzdHJpY3Rpb25zKHNlbGYpOgogICAgICAgICIiIlRlc3QgbG9nX3RleHQgZmllbGQgYWNjZXNzIGNvbnRyb2xzIiIiCiAgICAgICAgdGVzdF9sb2cgPSBzZWxmLlNlcnZlckxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkFjY2VzcyBUZXN0IExvZyIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJsb2dfdGV4dCI6ICI8cD5UZXN0IGNvbnRlbnQ8L3A+IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyAxLiBWZXJpZnkgcmVhZCBhY2Nlc3MgZm9yIGFsbCByb2xlcwogICAgICAgIGZvciB1c2VyIGluIChzZWxmLnJvb3QsIHNlbGYubWFuYWdlciwgc2VsZi51c2VyKToKICAgICAgICAgICAgY29udGVudCA9IHRlc3RfbG9nLndpdGhfdXNlcih1c2VyKS5sb2dfdGV4dAogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgY29udGVudCwgIjxwPlRlc3QgY29udGVudDwvcD4iLCBmInt1c2VyLm5hbWV9IHNob3VsZCByZWFkIGxvZ190ZXh0IgogICAgICAgICAgICApCgogICAgICAgICMgMi4gVmVyaWZ5IHdyaXRlIHByb2hpYml0aW9uIGZvciBhbGwgcm9sZXMKICAgICAgICBmb3IgdXNlciBpbiAoc2VsZi5yb290LCBzZWxmLm1hbmFnZXIsIHNlbGYudXNlcik6CiAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICAgICBBY2Nlc3NFcnJvciwgbXNnPWYie3VzZXIubmFtZX0gc2hvdWxkbid0IG1vZGlmeSBsb2dfdGV4dCIKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHRlc3RfbG9nLndpdGhfdXNlcih1c2VyKS53cml0ZSh7ImxvZ190ZXh0IjogIjxwPk1vZGlmaWVkPC9wPiJ9KQoKICAgIGRlZiB0ZXN0X2xvZ190ZXh0X3JlZnJlc2hfbWVjaGFuaXNtKHNlbGYpOgogICAgICAgICIiIlRlc3QgbG9nX3RleHQgY2FuIG9ubHkgYmUgdXBkYXRlZCB2aWEgcmVmcmVzaCBhY3Rpb24iIiIKICAgICAgICB0ZXN0X2xvZyA9IHNlbGYuU2VydmVyTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUmVmcmVzaCBUZXN0IExvZyIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJsb2dfdGV4dCI6ICI8cD5Jbml0aWFsPC9wPiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgMS4gRGlyZWN0IHdyaXRlIGF0dGVtcHRzIHNob3VsZCBmYWlsCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHRlc3RfbG9nLnN1ZG8oKS53cml0ZSh7ImxvZ190ZXh0IjogIjxwPklsbGVnYWwgVXBkYXRlPC9wPiJ9KQoKICAgICAgICAjIDIuIFZlcmlmeSByZWZyZXNoIGFjdGlvbiB1cGRhdGVzIGNvbnRlbnQKICAgICAgICBvcmlnaW5hbF9jb250ZW50ID0gdGVzdF9sb2cubG9nX3RleHQKICAgICAgICB0ZXN0X2xvZy5hY3Rpb25fdXBkYXRlX2xvZygpCgogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIHRlc3RfbG9nLmxvZ190ZXh0LAogICAgICAgICAgICBvcmlnaW5hbF9jb250ZW50LAogICAgICAgICAgICAiYWN0aW9uX3VwZGF0ZV9sb2coKSBzaG91bGQgdXBkYXRlIGxvZ190ZXh0IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbG9nX3RleHRfY29weShzZWxmKToKICAgICAgICAiIiJEdXBsaWNhdGluZyBhIGxvZyBtdXN0IE5PVCBrZWVwIHRoZSBsb2cgb3V0cHV0IiIiCiAgICAgICAgb3JpZ2luYWwgPSBzZWxmLlNlcnZlckxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk9yaWdpbmFsIExvZyIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJsb2dfdGV4dCI6ICI8cD5PcmlnaW5hbCBjb250ZW50PC9wPiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNvcGllZCA9IG9yaWdpbmFsLmNvcHkoKQoKICAgICAgICAjIGxvZ190ZXh0IG11c3QgYmUgY2xlYXJlZCBiZWNhdXNlIGNvcHk9RmFsc2UKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvcGllZC5sb2dfdGV4dCwgIkNvcGllZCBsb2cgbXVzdCBub3Qga2VlcCBsb2dfdGV4dCIpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjb3BpZWQuaWQsIG9yaWdpbmFsLmlkKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKGNvcGllZC5uYW1lKSkKCiAgICBkZWYgdGVzdF9qZXRfdXNlcl9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCB1c2VyIGFjY2VzcyB0byBzZXJ2ZXIgbG9ncyB2aWEgSmV0IiIiCiAgICAgICAgIyBTZXQgdXNlciB0byBqZXQncyB1c2VyX2lkcyAocmVwbGFjZXMgYW55IGV4aXN0aW5nIHVzZXJzKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYudXNlci5pZF0pXX0pCgogICAgICAgICMgQ2FzZSAxOiBVc2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsID09ICIxIgogICAgICAgICMgLSB1c2VyIGlzIGluIGpldCdzIHVzZXJfaWRzCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiaW4iLCBbc2VsZi5zZXJ2ZXJfbG9nX2pldF8xLmlkLCBzZWxmLnNlcnZlcl9sb2dfamV0XzIuaWRdKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgJzEnIgogICAgICAgICAgICAiIHdoZW4gaW4gamV0J3MgdXNlcl9pZHMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY3MuaWQsIHNlbGYuc2VydmVyX2xvZ19qZXRfMS5pZCkKCiAgICAgICAgIyBDYXNlIDI6IFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBub3QgaW4gamV0J3MgdXNlcl9pZHMKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsidXNlcl9pZHMiOiBbKDUsIDAsIDApXX0pICAjIFJlbW92ZSBhbGwgdXNlcnMKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfbG9nX2pldF8xLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIG5vdCBpbiBqZXQncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMzogVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIGFjY2Vzc19sZXZlbCA+ICIxIgogICAgICAgICMgU2V0IHVzZXIgYmFjayB0byBqZXQncyB1c2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYudXNlci5pZF0pXX0pCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuc2VydmVyX2xvZ19qZXRfMi5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbG9ncyB3aXRoIGFjY2Vzc19sZXZlbCA+ICcxJyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2pldF9tYW5hZ2VyX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IG1hbmFnZXIgYWNjZXNzIHRvIHNlcnZlciBsb2dzIHZpYSBKZXQiIiIKICAgICAgICAjIFNldCBtYW5hZ2VyIHRvIGpldCdzIG1hbmFnZXJfaWRzIChyZXBsYWNlcyBhbnkgZXhpc3RpbmcgbWFuYWdlcnMpCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldfSkKCiAgICAgICAgIyBDYXNlIDE6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuOgogICAgICAgICMgLSBhY2Nlc3NfbGV2ZWwgPD0gIjIiCiAgICAgICAgIyAtIG1hbmFnZXIgaXMgaW4gamV0J3MgdXNlcl9pZHMgb3IgbWFuYWdlcl9pZHMKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtzZWxmLnNlcnZlcl9sb2dfamV0XzEuaWQsIHNlbGYuc2VydmVyX2xvZ19qZXRfMi5pZF0pXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgYWxsIGxvZ3Mgd2hlbiBpbiBqZXQncyBtYW5hZ2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYW5kIHdyaXRlIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA8PSAiMiIKICAgICAgICAjIC0gbWFuYWdlciBpcyBpbiBqZXQncyBtYW5hZ2VyX2lkcwogICAgICAgIHRyeToKICAgICAgICAgICAgbmV3X2xvZyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJNYW5hZ2VyIEpldCBUZXN0IExvZyIsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBsb2dzIHdoZW4gaW4gamV0J3MgbWFuYWdlcl9pZHMiKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5ld19sb2cud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgSmV0IE5hbWUifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBsb2dzIHdoZW4gaW4gamV0J3MgbWFuYWdlcl9pZHMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2xvZy5uYW1lLCAiVXBkYXRlZCBKZXQgTmFtZSIpCgogICAgICAgICMgQ2FzZSAzOiBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVubGluayB3aGVuOgogICAgICAgICMgLSBhY2Nlc3NfbGV2ZWwgPD0gIjIiCiAgICAgICAgIyAtIGNyZWF0ZWQgYnkgbWFuYWdlcgogICAgICAgICMgLSBtYW5hZ2VyIGlzIGluIGpldCdzIG1hbmFnZXJfaWRzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXdfbG9nLnVubGluaygpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB1bmxpbmsgb3duIGxvZ3Mgd2hlbiBpbiBqZXQncyBtYW5hZ2VyX2lkcyIKICAgICAgICAgICAgKQoKICAgICAgICAjIENhc2UgNDogTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gdW5saW5rIGxvZ3MgY3JlYXRlZCBieSBvdGhlcnMKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfbG9nX2pldF8xLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgICAgICMgQ2FzZSA1OiBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY2Nlc3MgbG9ncyB3aXRoIGFjY2Vzc19sZXZlbCA+ICIyIgogICAgICAgIGhpZ2hfYWNjZXNzX2xvZyA9ICgKICAgICAgICAgICAgc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikKICAgICAgICAgICAgLnN1ZG8oKQogICAgICAgICAgICAuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkhpZ2ggQWNjZXNzIEpldCBMb2ciLAogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAgICAgImxvZ190eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBoaWdoX2FjY2Vzc19sb2cuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgPiAnMiciLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDY6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuIGluIGpldCdzIHVzZXJfaWRzCiAgICAgICAgIyBSZW1vdmUgbWFuYWdlcnMgYW5kIGFkZCBtYW5hZ2VyIHRvIGpldCdzIHVzZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sICAjIFJlbW92ZSBtYW5hZ2VycwogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLCAgIyBTZXQgdG8gdXNlcnMKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtzZWxmLnNlcnZlcl9sb2dfamV0XzEuaWQsIHNlbGYuc2VydmVyX2xvZ19qZXRfMi5pZF0pXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBpbiBqZXQncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2pldF90ZW1wbGF0ZV91c2VyX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHVzZXIgYWNjZXNzIHRvIHNlcnZlciBsb2dzIHZpYSBKZXQgVGVtcGxhdGUiIiIKICAgICAgICAjIFNldCB1c2VyIHRvIGpldCB0ZW1wbGF0ZSdzIHVzZXJfaWRzIChyZXBsYWNlcyBhbnkgZXhpc3RpbmcgdXNlcnMpCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldfSkKCiAgICAgICAgIyBDYXNlIDE6IFVzZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuOgogICAgICAgICMgLSBhY2Nlc3NfbGV2ZWwgPT0gIjEiCiAgICAgICAgIyAtIHVzZXIgaXMgaW4gamV0IHRlbXBsYXRlJ3MgdXNlcl9pZHMKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgImlkIiwKICAgICAgICAgICAgICAgICAgICAiaW4iLAogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfbG9nX2pldF90ZW1wbGF0ZV8xLmlkLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9sb2dfamV0X3RlbXBsYXRlXzIuaWQsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgbG9ncyB3aXRoIGFjY2Vzc19sZXZlbCAnMSciCiAgICAgICAgICAgICIgd2hlbiBpbiBqZXQgdGVtcGxhdGUncyB1c2VyX2lkcyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjcy5pZCwgc2VsZi5zZXJ2ZXJfbG9nX2pldF90ZW1wbGF0ZV8xLmlkKQoKICAgICAgICAjIENhc2UgMjogVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIG5vdCBpbiBqZXQgdGVtcGxhdGUncyB1c2VyX2lkcwogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldfSkgICMgUmVtb3ZlIGFsbCB1c2VycwogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnNlcnZlcl9sb2dfamV0X3RlbXBsYXRlXzEuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIHdoZW4gbm90IGluIGpldCB0ZW1wbGF0ZSdzIHVzZXJfaWRzIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAzOiBVc2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIHdoZW4gYWNjZXNzX2xldmVsID4gIjEiCiAgICAgICAgIyBTZXQgdXNlciBiYWNrIHRvIGpldCB0ZW1wbGF0ZSdzIHVzZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldfSkKICAgICAgICByZWNzID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfbG9nX2pldF90ZW1wbGF0ZV8yLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCBsb2dzIHdpdGggYWNjZXNzX2xldmVsID4gJzEnIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfamV0X3RlbXBsYXRlX21hbmFnZXJfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgbWFuYWdlciBhY2Nlc3MgdG8gc2VydmVyIGxvZ3MgdmlhIEpldCBUZW1wbGF0ZSIiIgogICAgICAgICMgU2V0IG1hbmFnZXIgdG8gamV0IHRlbXBsYXRlJ3MgbWFuYWdlcl9pZHMgKHJlcGxhY2VzIGFueSBleGlzdGluZyBtYW5hZ2VycykKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV19KQoKICAgICAgICAjIENhc2UgMTogTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA8PSAiMiIKICAgICAgICAjIC0gbWFuYWdlciBpcyBpbiBqZXQgdGVtcGxhdGUncyB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcwogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAiaWQiLAogICAgICAgICAgICAgICAgICAgICJpbiIsCiAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9sb2dfamV0X3RlbXBsYXRlXzEuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2xvZ19qZXRfdGVtcGxhdGVfMi5pZCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgbG9ncyB3aGVuIgogICAgICAgICAgICAiIGluIGpldCB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAyOiBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBhbmQgd3JpdGUgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsIDw9ICIyIgogICAgICAgICMgLSBtYW5hZ2VyIGlzIGluIGpldCB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXdfbG9nID0gc2VsZi5TZXJ2ZXJMb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk1hbmFnZXIgSmV0IFRlbXBsYXRlIFRlc3QgTG9nIiwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgICAgICJsb2dfdHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgbG9ncyB3aGVuICIKICAgICAgICAgICAgICAgICJpbiBqZXQgdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIKICAgICAgICAgICAgKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5ld19sb2cud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgSmV0IFRlbXBsYXRlIE5hbWUifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIGxvZ3Mgd2hlbiAiCiAgICAgICAgICAgICAgICAiaW4gamV0IHRlbXBsYXRlJ3MgbWFuYWdlcl9pZHMiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19sb2cubmFtZSwgIlVwZGF0ZWQgSmV0IFRlbXBsYXRlIE5hbWUiKQoKICAgICAgICAjIENhc2UgMzogTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB1bmxpbmsgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsIDw9ICIyIgogICAgICAgICMgLSBjcmVhdGVkIGJ5IG1hbmFnZXIKICAgICAgICAjIC0gbWFuYWdlciBpcyBpbiBqZXQgdGVtcGxhdGUncyBtYW5hZ2VyX2lkcwogICAgICAgIHRyeToKICAgICAgICAgICAgbmV3X2xvZy51bmxpbmsoKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKAogICAgICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdW5saW5rIG93biBsb2dzIgogICAgICAgICAgICAgICAgIiB3aGVuIGluIGpldCB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzIgogICAgICAgICAgICApCgogICAgICAgICMgQ2FzZSA0OiBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byB1bmxpbmsgbG9ncyBjcmVhdGVkIGJ5IG90aGVycwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnNlcnZlcl9sb2dfamV0X3RlbXBsYXRlXzEud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKCiAgICAgICAgIyBDYXNlIDU6IE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyBsb2dzIHdpdGggYWNjZXNzX2xldmVsID4gIjIiCiAgICAgICAgaGlnaF9hY2Nlc3NfbG9nID0gKAogICAgICAgICAgICBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKQogICAgICAgICAgICAuc3VkbygpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSGlnaCBBY2Nlc3MgSmV0IFRlbXBsYXRlIExvZyIsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgcmVjcyA9IHNlbGYuU2VydmVyTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIGhpZ2hfYWNjZXNzX2xvZy5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbG9ncyB3aXRoIGFjY2Vzc19sZXZlbCA+ICcyJyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgNjogTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW4gaW4gamV0IHRlbXBsYXRlJ3MgdXNlcl9pZHMKICAgICAgICAjIFJlbW92ZSBtYW5hZ2VycyBhbmQgYWRkIG1hbmFnZXIgdG8gamV0IHRlbXBsYXRlJ3MgdXNlcl9pZHMKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwgICMgUmVtb3ZlIG1hbmFnZXJzCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sICAjIFNldCB0byB1c2VycwogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLlNlcnZlckxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAiaWQiLAogICAgICAgICAgICAgICAgICAgICJpbiIsCiAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9sb2dfamV0X3RlbXBsYXRlXzEuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2xvZ19qZXRfdGVtcGxhdGVfMi5pZCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNzKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuIGluIGpldCB0ZW1wbGF0ZSdzIHVzZXJfaWRzIiwKICAgICAgICApCg== |