1 line
18 KiB
Python
1 line
18 KiB
Python
dHJ5OgogICAgZnJvbSBvZG9vLmFkZG9ucy5xdWV1ZV9qb2IudGVzdHMuY29tbW9uIGltcG9ydCB0cmFwX2pvYnMKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJhcF9qb2JzID0gTm9uZQoKZnJvbSAuY29tbW9uIGltcG9ydCBDb21tb25UZXN0CgoKY2xhc3MgVGVzdFNlcnZlcihDb21tb25UZXN0KToKICAgICIiIlRlc3Qgc2V0dGluZyBnaXQgcHJvamVjdCB0byBzZXJ2ZXIgZnJvbSBwbGFuIGxpbmUuIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgIGNscy5HaXRQcm9qZWN0UmVsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImdpdF9wcm9qZWN0X2lkIjogY2xzLmdpdF9wcm9qZWN0XzEuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiZmlsZV9pZCI6IGNscy5zZXJ2ZXJfMV9maWxlXzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgZGVmIHRlc3Rfc2VydmVyX2NyZWF0aW9uX3J1bm5pbmdfZmxpZ2h0X3BsYW4oc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IHNlcnZlciBpcyBjcmVhdGVkIHdpdGggZ2l0IHByb2plY3QgZnJvbSBwbGFuIGxpbmUuIiIiCiAgICAgICAgZ2l0X3Byb2plY3QgPSBzZWxmLkdpdFByb2plY3QuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEdpdCBQcm9qZWN0IiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGZpbGVfdGVtcGxhdGUgPSBzZWxmLkZpbGVUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkdpdCBDb25maWcgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImZpbGVfbmFtZSI6ICJyZXBvcy55YW1sIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogIi92YXIvdGVzdCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXBvc2l0b3JpZXM6XG4gIHRlc3RfcmVwbzpcbiAgICAiCiAgICAgICAgICAgICAgICAidXJsOiBodHRwczovL2dpdGh1Yi5jb20vdGVzdC9yZXBvLmdpdFxuICAgIHRhcmdldDogbWFpbiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgR2l0IENvbmZpZyBGaWxlIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZmlsZV91c2luZ190ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiZmlsZV90ZW1wbGF0ZV9pZCI6IGZpbGVfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGZsaWdodF9wbGFuID0gc2VsZi5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiR2l0IFByb2plY3QgU2V0dXAgUGxhbiIsCiAgICAgICAgICAgICAgICAibm90ZSI6ICJTZXRzIHVwIGEgZ2l0IHByb2plY3Qgb24gdGhlIHNlcnZlciIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5faWQiOiBmbGlnaHRfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgImdpdF9wcm9qZWN0X2lkIjogZ2l0X3Byb2plY3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlcnZlcl90ZW1wbGF0ZSA9IHNlbGYuU2VydmVyVGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJHaXQgU2VydmVyIFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJzc2hfcG9ydCI6IDIyLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAiZmxpZ2h0X3BsYW5faWQiOiBmbGlnaHRfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGFjdGlvbiA9IHNlcnZlcl90ZW1wbGF0ZS5hY3Rpb25fY3JlYXRlX3NlcnZlcigpCgogICAgICAgICMgT3BlbiB0aGUgd2l6YXJkIGFuZCBmaWxsIGluIHRoZSBkYXRhCiAgICAgICAgd2l6YXJkID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlLmNyZWF0ZS53aXphcmQiXQogICAgICAgICAgICAud2l0aF9jb250ZXh0KCoqYWN0aW9uWyJjb250ZXh0Il0pCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiR2l0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwIiwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX3RlbXBsYXRlX2lkIjogc2VydmVyX3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICAjIElmIGNldG1peF90b3dlcl9zZXJ2ZXJfcXVldWUgbW9kdWxlIGlzIGluc3RhbGxlZCwgdGVzdCBhc3luYyBwcm9jZXNzaW5nCiAgICAgICAgaWYgc2VsZi5lbnZbImlyLm1vZHVsZS5tb2R1bGUiXS5zZWFyY2hfY291bnQoCiAgICAgICAgICAgIFsoIm5hbWUiLCAiPSIsICJjZXRtaXhfdG93ZXJfc2VydmVyX3F1ZXVlIiksICgic3RhdGUiLCAiPSIsICJpbnN0YWxsZWQiKV0KICAgICAgICApOgogICAgICAgICAgICB3aXRoIHRyYXBfam9icygpIGFzIHRyYXA6CiAgICAgICAgICAgICAgICB3aXphcmQuYWN0aW9uX2NvbmZpcm0oKQoKICAgICAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgam9icyB3ZXJlIGNyZWF0ZWQKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKICAgICAgICAgICAgICAgICAgICBsZW4odHJhcC5lbnF1ZXVlZF9qb2JzKSwgMCwgIkpvYnMgc2hvdWxkIGhhdmUgYmVlbiBlbnF1ZXVlZCIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIEV4ZWN1dGUgYWxsIHRyYXBwZWQgam9icyB0byBzaW11bGF0ZSBhc3luYyBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgICB0cmFwLnBlcmZvcm1fZW5xdWV1ZWRfam9icygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2l6YXJkLmFjdGlvbl9jb25maXJtKCkKCiAgICAgICAgIyBOb3cgc2VhcmNoIGZvciB0aGUgY3JlYXRlZCByZWNvcmRzIGFmdGVyIGpvYnMgaGF2ZSBiZWVuIGV4ZWN1dGVkCiAgICAgICAgc2VydmVyID0gc2VsZi5TZXJ2ZXIuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoIm5hbWUiLCAiPSIsICJHaXQgU2VydmVyIiksCiAgICAgICAgICAgICAgICAoInNlcnZlcl90ZW1wbGF0ZV9pZCIsICI9Iiwgc2VydmVyX3RlbXBsYXRlLmlkKSwKICAgICAgICAgICAgXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXJ2ZXIpLCAxLCAiRXhhY3RseSBvbmUgc2VydmVyIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCIpCgogICAgICAgICMgVmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkCiAgICAgICAgZmlsZSA9IHNlbGYuRmlsZS5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VydmVyLmlkKSwgKCJuYW1lIiwgIj0iLCAicmVwb3MueWFtbCIpXQogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGZpbGUpLCAxLCAiRXhhY3RseSBvbmUgZ2l0IGNvbmZpZyBmaWxlIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCIKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRoZSBnaXQgcHJvamVjdCByZWxhdGlvbiBleGlzdHMKICAgICAgICBnaXRfcHJvamVjdF9yZWwgPSBzZWxmLkdpdFByb2plY3RSZWwuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VydmVyLmlkKSwKICAgICAgICAgICAgICAgICgiZ2l0X3Byb2plY3RfaWQiLCAiPSIsIGdpdF9wcm9qZWN0LmlkKSwKICAgICAgICAgICAgICAgICgiZmlsZV9pZCIsICI9IiwgZmlsZS5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihnaXRfcHJvamVjdF9yZWwpLCAxLCAiRXhhY3RseSBvbmUgZ2l0IHByb2plY3QgcmVsYXRpb24gc2hvdWxkIGV4aXN0IgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBnaXRfcHJvamVjdF9yZWwuZmlsZV9pZCwKICAgICAgICAgICAgZmlsZSwKICAgICAgICAgICAgIlRoZSByZWxhdGVkIGZpbGUgc2hvdWxkIGJlIHRoZSBnaXQgY29uZmlnIGZpbGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBnaXRfcHJvamVjdF9yZWwuZ2l0X3Byb2plY3RfaWQsCiAgICAgICAgICAgIGdpdF9wcm9qZWN0LAogICAgICAgICAgICAiVGhlIHJlbGF0ZWQgZ2l0IHByb2plY3Qgc2hvdWxkIG1hdGNoIHRoZSBvbmUgaW4gdGhlIGZsaWdodCBwbGFuIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZ2l0X3Byb2plY3RfcmVsLnByb2plY3RfZm9ybWF0LAogICAgICAgICAgICBnaXRfcHJvamVjdC5fZGVmYXVsdF9wcm9qZWN0X2Zvcm1hdCgpLAogICAgICAgICAgICAiUHJvamVjdCBmb3JtYXQgc2hvdWxkIG1hdGNoIHRoZSBkZWZhdWx0IGZvcm1hdCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2ZpbGVfY3JlYXRpb25fd2l0aF9naXRfcHJvamVjdF9mcm9tX2N1c3RvbV92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IGdpdCBwcm9qZWN0IHJlbGF0aW9uIGlzIGNyZWF0ZWQgd2hlbiBnaXQgcHJvamVjdAogICAgICAgIGlzIHByb3ZpZGVkIGZyb20gY3VzdG9tIHZhbHVlcyBpbiB2YXJpYWJsZV92YWx1ZXMuCiAgICAgICAgIiIiCiAgICAgICAgZ2l0X3Byb2plY3QgPSBzZWxmLkdpdFByb2plY3QuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEdpdCBQcm9qZWN0IEZyb20gQ3VzdG9tIFZhbHVlcyIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBmaWxlX3RlbXBsYXRlID0gc2VsZi5GaWxlVGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJHaXQgQ29uZmlnIFRlbXBsYXRlIEN1c3RvbSBWYWx1ZXMiLAogICAgICAgICAgICAgICAgImZpbGVfbmFtZSI6ICJyZXBvc19jdXN0b20ueWFtbCIsCiAgICAgICAgICAgICAgICAic2VydmVyX2RpciI6ICIvdmFyL3Rlc3QiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicmVwb3NpdG9yaWVzOlxuICB0ZXN0X3JlcG86XG4gICAgIgogICAgICAgICAgICAgICAgInVybDogaHR0cHM6Ly9naXRodWIuY29tL3Rlc3QvcmVwby5naXRcbiAgICB0YXJnZXQ6IG1haW4iLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3JlYXRlIEdpdCBDb25maWcgRmlsZSBDdXN0b20gVmFsdWVzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZmlsZV91c2luZ190ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiZmlsZV90ZW1wbGF0ZV9pZCI6IGZpbGVfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGZsaWdodF9wbGFuID0gc2VsZi5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiR2l0IFByb2plY3QgU2V0dXAgUGxhbiBDdXN0b20gVmFsdWVzIiwKICAgICAgICAgICAgICAgICJub3RlIjogIlNldHMgdXAgYSBnaXQgcHJvamVjdCBvbiB0aGUgc2VydmVyIGZyb20gY3VzdG9tIHZhbHVlcyIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHBsYW4gbGluZSBXSVRIT1VUIGdpdF9wcm9qZWN0X2lkIHNldAogICAgICAgICMgVGhlIGdpdCBwcm9qZWN0IHNob3VsZCBjb21lIGZyb20gY3VzdG9tIHZhbHVlcyBpbnN0ZWFkCiAgICAgICAgcGxhbl9saW5lID0gc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGZsaWdodF9wbGFuLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjb21tYW5kLmlkLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHBsYW4gbG9nCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLmVudlsiY3gudG93ZXIucGxhbi5sb2ciXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGZsaWdodF9wbGFuLmlkLAogICAgICAgICAgICAgICAgInBsYW5fbGluZV9leGVjdXRlZF9pZCI6IHBsYW5fbGluZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgY29tbWFuZCBsb2cgd2l0aCB2YXJpYWJsZV92YWx1ZXMgY29udGFpbmluZyBfX2dpdF9wcm9qZWN0X18KICAgICAgICBjb21tYW5kX2xvZyA9IHNlbGYuQ29tbWFuZExvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmQuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9sb2dfaWQiOiBwbGFuX2xvZy5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZXMiOiB7Il9fZ2l0X3Byb2plY3RfXyI6IGdpdF9wcm9qZWN0LnJlZmVyZW5jZX0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCB0aGUgbWV0aG9kIGRpcmVjdGx5IHRvIHRlc3QgdGhlIGN1c3RvbSB2YWx1ZXMgcGF0aAogICAgICAgIGZpbGUgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX2NvbW1hbmRfcnVubmVyX2ZpbGVfdXNpbmdfdGVtcGxhdGVfY3JlYXRlX2ZpbGUoCiAgICAgICAgICAgIGxvZ19yZWNvcmQ9Y29tbWFuZF9sb2csIHNlcnZlcl9kaXI9Ii92YXIvdGVzdCIKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGUsICJGaWxlIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCIpCgogICAgICAgICMgVmVyaWZ5IHRoZSBnaXQgcHJvamVjdCByZWxhdGlvbiBleGlzdHMKICAgICAgICBnaXRfcHJvamVjdF9yZWwgPSBzZWxmLkdpdFByb2plY3RSZWwuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgiZ2l0X3Byb2plY3RfaWQiLCAiPSIsIGdpdF9wcm9qZWN0LmlkKSwKICAgICAgICAgICAgICAgICgiZmlsZV9pZCIsICI9IiwgZmlsZS5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihnaXRfcHJvamVjdF9yZWwpLCAxLCAiRXhhY3RseSBvbmUgZ2l0IHByb2plY3QgcmVsYXRpb24gc2hvdWxkIGV4aXN0IgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBnaXRfcHJvamVjdF9yZWwuZmlsZV9pZCwKICAgICAgICAgICAgZmlsZSwKICAgICAgICAgICAgIlRoZSByZWxhdGVkIGZpbGUgc2hvdWxkIGJlIHRoZSBnaXQgY29uZmlnIGZpbGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBnaXRfcHJvamVjdF9yZWwuZ2l0X3Byb2plY3RfaWQsCiAgICAgICAgICAgIGdpdF9wcm9qZWN0LAogICAgICAgICAgICAiVGhlIHJlbGF0ZWQgZ2l0IHByb2plY3Qgc2hvdWxkIG1hdGNoIHRoZSBvbmUgZnJvbSBjdXN0b20gdmFsdWVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZ2l0X3Byb2plY3RfcmVsLnByb2plY3RfZm9ybWF0LAogICAgICAgICAgICBnaXRfcHJvamVjdC5fZGVmYXVsdF9wcm9qZWN0X2Zvcm1hdCgpLAogICAgICAgICAgICAiUHJvamVjdCBmb3JtYXQgc2hvdWxkIG1hdGNoIHRoZSBkZWZhdWx0IGZvcm1hdCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2ZpbGVfY3JlYXRpb25fd2l0aF9naXRfcHJvamVjdF9mcm9tX2N1c3RvbV92YWx1ZXNfcHJpb3JpdHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IGdpdCBwcm9qZWN0IGZyb20gY3VzdG9tIHZhbHVlcyB0YWtlcyBwcmlvcml0eQogICAgICAgIG92ZXIgZ2l0IHByb2plY3QgZnJvbSBwbGFuIGxpbmUuCiAgICAgICAgIiIiCiAgICAgICAgZ2l0X3Byb2plY3RfY3VzdG9tID0gc2VsZi5HaXRQcm9qZWN0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBHaXQgUHJvamVjdCBGcm9tIEN1c3RvbSBWYWx1ZXMgUHJpb3JpdHkiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgZ2l0X3Byb2plY3RfcGxhbl9saW5lID0gc2VsZi5HaXRQcm9qZWN0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBHaXQgUHJvamVjdCBGcm9tIFBsYW4gTGluZSIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBmaWxlX3RlbXBsYXRlID0gc2VsZi5GaWxlVGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJHaXQgQ29uZmlnIFRlbXBsYXRlIFByaW9yaXR5IiwKICAgICAgICAgICAgICAgICJmaWxlX25hbWUiOiAicmVwb3NfcHJpb3JpdHkueWFtbCIsCiAgICAgICAgICAgICAgICAic2VydmVyX2RpciI6ICIvdmFyL3Rlc3QiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicmVwb3NpdG9yaWVzOlxuICB0ZXN0X3JlcG86XG4gICAgIgogICAgICAgICAgICAgICAgInVybDogaHR0cHM6Ly9naXRodWIuY29tL3Rlc3QvcmVwby5naXRcbiAgICB0YXJnZXQ6IG1haW4iLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3JlYXRlIEdpdCBDb25maWcgRmlsZSBQcmlvcml0eSIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImZpbGVfdXNpbmdfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImZpbGVfdGVtcGxhdGVfaWQiOiBmaWxlX3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBmbGlnaHRfcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkdpdCBQcm9qZWN0IFNldHVwIFBsYW4gUHJpb3JpdHkiLAogICAgICAgICAgICAgICAgIm5vdGUiOiAiVGVzdHMgcHJpb3JpdHkgb2YgY3VzdG9tIHZhbHVlcyBvdmVyIHBsYW4gbGluZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHBsYW4gbGluZSBXSVRIIGdpdF9wcm9qZWN0X2lkIHNldAogICAgICAgICMgQnV0IGN1c3RvbSB2YWx1ZXMgc2hvdWxkIHRha2UgcHJpb3JpdHkKICAgICAgICBwbGFuX2xpbmUgPSBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogZmxpZ2h0X3BsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmQuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgICAgICJnaXRfcHJvamVjdF9pZCI6IGdpdF9wcm9qZWN0X3BsYW5fbGluZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgcGxhbiBsb2cKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuZW52WyJjeC50b3dlci5wbGFuLmxvZyJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogZmxpZ2h0X3BsYW4uaWQsCiAgICAgICAgICAgICAgICAicGxhbl9saW5lX2V4ZWN1dGVkX2lkIjogcGxhbl9saW5lLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBjb21tYW5kIGxvZyB3aXRoIHZhcmlhYmxlX3ZhbHVlcyBjb250YWluaW5nIF9fZ2l0X3Byb2plY3RfXwogICAgICAgICMgVGhpcyBzaG91bGQgdGFrZSBwcmlvcml0eSBvdmVyIHBsYW5fbGluZS5naXRfcHJvamVjdF9pZAogICAgICAgIGNvbW1hbmRfbG9nID0gc2VsZi5Db21tYW5kTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2xvZ19pZCI6IHBsYW5fbG9nLmlkLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3ZhbHVlcyI6IHsiX19naXRfcHJvamVjdF9fIjogZ2l0X3Byb2plY3RfY3VzdG9tLnJlZmVyZW5jZX0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCB0aGUgbWV0aG9kIGRpcmVjdGx5IHRvIHRlc3QgdGhlIGN1c3RvbSB2YWx1ZXMgcGF0aAogICAgICAgIGZpbGUgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX2NvbW1hbmRfcnVubmVyX2ZpbGVfdXNpbmdfdGVtcGxhdGVfY3JlYXRlX2ZpbGUoCiAgICAgICAgICAgIGxvZ19yZWNvcmQ9Y29tbWFuZF9sb2csIHNlcnZlcl9kaXI9Ii92YXIvdGVzdCIKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGUsICJGaWxlIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCIpCgogICAgICAgICMgVmVyaWZ5IHRoZSBnaXQgcHJvamVjdCByZWxhdGlvbiB1c2VzIHRoZSBnaXQgcHJvamVjdCBmcm9tIGN1c3RvbSB2YWx1ZXMKICAgICAgICAjIChub3QgdGhlIG9uZSBmcm9tIHBsYW4gbGluZSkKICAgICAgICBnaXRfcHJvamVjdF9yZWwgPSBzZWxmLkdpdFByb2plY3RSZWwuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgiZ2l0X3Byb2plY3RfaWQiLCAiPSIsIGdpdF9wcm9qZWN0X2N1c3RvbS5pZCksCiAgICAgICAgICAgICAgICAoImZpbGVfaWQiLCAiPSIsIGZpbGUuaWQpLAogICAgICAgICAgICBdCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oZ2l0X3Byb2plY3RfcmVsKSwgMSwgIkV4YWN0bHkgb25lIGdpdCBwcm9qZWN0IHJlbGF0aW9uIHNob3VsZCBleGlzdCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZ2l0X3Byb2plY3RfcmVsLmdpdF9wcm9qZWN0X2lkLAogICAgICAgICAgICBnaXRfcHJvamVjdF9jdXN0b20sCiAgICAgICAgICAgICJUaGUgcmVsYXRlZCBnaXQgcHJvamVjdCBzaG91bGQgbWF0Y2ggdGhlIG9uZSBmcm9tIGN1c3RvbSB2YWx1ZXMsICIKICAgICAgICAgICAgIm5vdCBmcm9tIHBsYW4gbGluZSIsCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBwbGFuIGxpbmUgZ2l0IHByb2plY3Qgd2FzIE5PVCB1c2VkCiAgICAgICAgZ2l0X3Byb2plY3RfcmVsX3BsYW5fbGluZSA9IHNlbGYuR2l0UHJvamVjdFJlbC5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICAgICAgKCJnaXRfcHJvamVjdF9pZCIsICI9IiwgZ2l0X3Byb2plY3RfcGxhbl9saW5lLmlkKSwKICAgICAgICAgICAgICAgICgiZmlsZV9pZCIsICI9IiwgZmlsZS5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGdpdF9wcm9qZWN0X3JlbF9wbGFuX2xpbmUpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiTm8gcmVsYXRpb24gc2hvdWxkIGV4aXN0IGZvciB0aGUgcGxhbiBsaW5lIGdpdCBwcm9qZWN0IiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2VydmVyX2dldF9zZXJ2ZXJzX2J5X2dpdF9yZWZfc3VjY2VzcyhzZWxmKToKICAgICAgICAiIiJDaGVjayB0aGUgc3VjY2VzcyBjYXNlIG9mIHNlcnZlci5nZXRfc2VydmVyc19ieV9naXRfcmVmIiIiCgogICAgICAgICMgMS4gVVJMIG9ubHkKICAgICAgICBzZXJ2ZXJzID0gc2VsZi5TZXJ2ZXIuZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZigKICAgICAgICAgICAgc2VsZi5yZW1vdGVfZ2l0aHViX2h0dHBzLnJlcG9faWQudXJsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVycywgc2VsZi5zZXJ2ZXJfdGVzdF8xKQoKICAgICAgICAjIDIuIFNwZWNpZmljIFVSTCB3aXRoIHNwZWNpZmljIGhlYWQKICAgICAgICBzZXJ2ZXJzID0gc2VsZi5TZXJ2ZXIuZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZigKICAgICAgICAgICAgc2VsZi5yZW1vdGVfZ2l0aHViX2h0dHBzLnJlcG9faWQudXJsLCAiMTIzIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlcnMsIHNlbGYuc2VydmVyX3Rlc3RfMSkKCiAgICAgICAgIyAyLiBTcGVjaWZpYyBVUkwgd2l0aCBzcGVjaWZpYyBoZWFkIGFuZCBoZWFkIHR5cGUKICAgICAgICBzZXJ2ZXJzID0gc2VsZi5TZXJ2ZXIuZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZigKICAgICAgICAgICAgc2VsZi5yZW1vdGVfZ2l0aHViX2h0dHBzLnJlcG9faWQudXJsLCAiMTIzIiwgInByIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlcnMsIHNlbGYuc2VydmVyX3Rlc3RfMSkKCiAgICBkZWYgdGVzdF9zZXJ2ZXJfZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZl9ub19tYXRjaChzZWxmKToKICAgICAgICAiIiJDaGVjayB0aGUgbm8gbWF0Y2ggY2FzZSBvZiBzZXJ2ZXIuZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZiIiIgoKICAgICAgICAjIDEuIFJlcG8gbGluayBkb2VzIG5vdCBleGlzdAogICAgICAgIHNlcnZlcnMgPSBzZWxmLlNlcnZlci5nZXRfc2VydmVyc19ieV9naXRfcmVmKAogICAgICAgICAgICAiaHR0cHM6Ly9naXRodWIuY29tL290aGVyLW9yZy9vdGhlci1yZXBvLmdpdCIsICJtYWluIiwgImJyYW5jaCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXJ2ZXJzKQoKICAgICAgICAjIDIuIFJlcG8gbGluayBleGlzdHMsIGJ1dCByZW1vdGUgZG9lcyBub3QgZXhpc3QKICAgICAgICBzZXJ2ZXJzID0gc2VsZi5TZXJ2ZXIuZ2V0X3NlcnZlcnNfYnlfZ2l0X3JlZigKICAgICAgICAgICAgc2VsZi5yZXBvX2NldG1peF90b3dlci51cmwsICIzMzExIiwgInByIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlcnZlcnMpCgogICAgICAgICMgMy4gUmVwbyBsaW5rIGV4aXN0cywgYnV0IHJlbW90ZSB0eXBlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgc2VydmVycyA9IHNlbGYuU2VydmVyLmdldF9zZXJ2ZXJzX2J5X2dpdF9yZWYoCiAgICAgICAgICAgIHNlbGYucmVwb19jZXRtaXhfdG93ZXIudXJsLCAibWFpbiIsICJjb21taXQiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVycykK |