diff --git a/addons/cetmix_tower_server/tests/test_jet_state.py b/addons/cetmix_tower_server/tests/test_jet_state.py new file mode 100644 index 0000000..2c0bf4a --- /dev/null +++ b/addons/cetmix_tower_server/tests/test_jet_state.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvciwgVmFsaWRhdGlvbkVycm9yCgpmcm9tIC5jb21tb25famV0cyBpbXBvcnQgVGVzdFRvd2VySmV0c0NvbW1vbgoKCmNsYXNzIFRlc3RUb3dlckpldFN0YXRlKFRlc3RUb3dlckpldHNDb21tb24pOgogICAgIiIiCiAgICBUZXN0IHRoZSBKZXQgU3RhdGUgbW9kZWwgZnVuY3Rpb25hbGl0eQogICAgIiIiCgogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAgICAjICAgc2V0X3N0YXRlIFRlc3RzCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKCiAgICBkZWYgdGVzdF9zZXRfc3RhdGVfc3VjY2Vzc191c2VyX2xldmVsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3Qgc2V0X3N0YXRlIHN1Y2NlZWRzIHdoZW4gdXNlciBoYXMgc3VmZmljaWVudCBhY2Nlc3MgbGV2ZWwuCiAgICAgICAgVXNlciAobGV2ZWwgMSkgY2FuIHNldCBzdGF0ZSB3aXRoIGxldmVsIDEuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBVc2VyIGFjY2VzcyBsZXZlbCAoMSkKICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcuYWNjZXNzX2xldmVsID0gIjEiCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgRW5zdXJlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0IGFuZCBzZXJ2ZXIKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi51c2VyLmlkKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gaW5pdGlhbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBzZWxmLnN0YXRlX2luaXRpYWwKCiAgICAgICAgIyBVc2VyIHNob3VsZCBiZSBhYmxlIHRvIHNldCBzdGF0ZQogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy53aXRoX3VzZXIoc2VsZi51c2VyKS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5zdGF0ZV9pZCwKICAgICAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLAogICAgICAgICAgICAiSmV0IHNob3VsZCBiZSBzZXQgdG8gdXNlci1sZXZlbCBzdGF0ZSBieSB1c2VyIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2V0X3N0YXRlX3N1Y2Nlc3NfbWFuYWdlcl9sZXZlbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHNldF9zdGF0ZSBzdWNjZWVkcyB3aGVuIG1hbmFnZXIgaGFzIHN1ZmZpY2llbnQgYWNjZXNzIGxldmVsLgogICAgICAgIE1hbmFnZXIgKGxldmVsIDIpIGNhbiBzZXQgc3RhdGUgd2l0aCBsZXZlbCAyLgogICAgICAgICIiIgogICAgICAgICMgVXNlIGV4aXN0aW5nIHN0YXRlIGFuZCBzZXQgaXQgdG8gTWFuYWdlciBhY2Nlc3MgbGV2ZWwgKDIpCiAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLmFjY2Vzc19sZXZlbCA9ICIyIgogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIEVuc3VyZSBtYW5hZ2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGpldCBhbmQgc2VydmVyCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBzZXQgc3RhdGUKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLnNldF9zdGF0ZShzZWxmLmpldF90ZXN0KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZCwKICAgICAgICAgICAgIkpldCBzaG91bGQgYmUgc2V0IHRvIG1hbmFnZXItbGV2ZWwgc3RhdGUgYnkgbWFuYWdlciIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NldF9zdGF0ZV9zdWNjZXNzX3Jvb3RfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBzZXRfc3RhdGUgc3VjY2VlZHMgd2hlbiByb290IGhhcyBzdWZmaWNpZW50IGFjY2VzcyBsZXZlbC4KICAgICAgICBSb290IChsZXZlbCAzKSBjYW4gc2V0IHN0YXRlIHdpdGggbGV2ZWwgMy4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIFJvb3QgYWNjZXNzIGxldmVsICgzKQogICAgICAgIHNlbGYuc3RhdGVfZXJyb3IuYWNjZXNzX2xldmVsID0gIjMiCiAgICAgICAgc2VsZi5zdGF0ZV9lcnJvci5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIFNldCBqZXQgdG8gcnVubmluZyBzdGF0ZSAod2hpY2ggaGFzIGFjdGlvbiB0byBlcnJvcikKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byBzZXQgc3RhdGUKICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLndpdGhfdXNlcihzZWxmLnJvb3QpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5zZXRfc3RhdGUoc2VsZi5qZXRfdGVzdCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLAogICAgICAgICAgICAiSmV0IHNob3VsZCBiZSBzZXQgdG8gcm9vdC1sZXZlbCBzdGF0ZSBieSByb290IiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2V0X3N0YXRlX2FjY2Vzc19lcnJvcl91c2VyX3RvX21hbmFnZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBzZXRfc3RhdGUgcmFpc2VzIEFjY2Vzc0Vycm9yIHdoZW4gdXNlciAobGV2ZWwgMSkKICAgICAgICB0cmllcyB0byBzZXQgbWFuYWdlci1sZXZlbCBzdGF0ZSAobGV2ZWwgMikuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBNYW5hZ2VyIGFjY2VzcyBsZXZlbCAoMikKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuYWNjZXNzX2xldmVsID0gIjIiCiAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgRW5zdXJlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0IGFuZCBzZXJ2ZXIgKGZvciB0aGUgYWNjZXNzIGNoZWNrIHRvIHdvcmspCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gc2V0IG1hbmFnZXItbGV2ZWwgc3RhdGUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQud2l0aF91c2VyKHNlbGYudXNlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCgogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNldCB0aGUiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiU2hvdWxkIHJhaXNlIEFjY2Vzc0Vycm9yIHdpdGggYXBwcm9wcmlhdGUgbWVzc2FnZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5uYW1lLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSBzdGF0ZSBuYW1lIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2V0X3N0YXRlX2FjY2Vzc19lcnJvcl91c2VyX3RvX3Jvb3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBzZXRfc3RhdGUgcmFpc2VzIEFjY2Vzc0Vycm9yIHdoZW4gdXNlciAobGV2ZWwgMSkKICAgICAgICB0cmllcyB0byBzZXQgcm9vdC1sZXZlbCBzdGF0ZSAobGV2ZWwgMykuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBSb290IGFjY2VzcyBsZXZlbCAoMykKICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLmFjY2Vzc19sZXZlbCA9ICIzIgogICAgICAgIHNlbGYuc3RhdGVfZXJyb3IuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgYW5kIHNlcnZlciAoZm9yIHRoZSBhY2Nlc3MgY2hlY2sgdG8gd29yaykKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi51c2VyLmlkKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gcnVubmluZyBzdGF0ZSAod2hpY2ggaGFzIGFjdGlvbiB0byBlcnJvcikKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gc2V0IHJvb3QtbGV2ZWwgc3RhdGUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLndpdGhfdXNlcihzZWxmLnVzZXIpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICAgICApLnNldF9zdGF0ZShzZWxmLmpldF90ZXN0KQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiWW91IGFyZSBub3QgYWxsb3dlZCB0byBzZXQgdGhlIiwKICAgICAgICAgICAgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBBY2Nlc3NFcnJvciB3aXRoIGFwcHJvcHJpYXRlIG1lc3NhZ2UiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLm5hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIHN0YXRlIG5hbWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9zZXRfc3RhdGVfYWNjZXNzX2Vycm9yX21hbmFnZXJfdG9fcm9vdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHNldF9zdGF0ZSByYWlzZXMgQWNjZXNzRXJyb3Igd2hlbiBtYW5hZ2VyIChsZXZlbCAyKQogICAgICAgIHRyaWVzIHRvIHNldCByb290LWxldmVsIHN0YXRlIChsZXZlbCAzKS4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIFJvb3QgYWNjZXNzIGxldmVsICgzKQogICAgICAgIHNlbGYuc3RhdGVfZXJyb3IuYWNjZXNzX2xldmVsID0gIjMiCiAgICAgICAgc2VsZi5zdGF0ZV9lcnJvci5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIEVuc3VyZSBtYW5hZ2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGpldCBhbmQgc2VydmVyIChmb3IgdGhlIGFjY2VzcyBjaGVjayB0byB3b3JrKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCgogICAgICAgICMgU2V0IGpldCB0byBydW5uaW5nIHN0YXRlICh3aGljaCBoYXMgYWN0aW9uIHRvIGVycm9yKQogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBzZWxmLnN0YXRlX3J1bm5pbmcKCiAgICAgICAgIyBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBzZXQgcm9vdC1sZXZlbCBzdGF0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHNlbGYuc3RhdGVfZXJyb3Iud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCgogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNldCB0aGUiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiU2hvdWxkIHJhaXNlIEFjY2Vzc0Vycm9yIHdpdGggYXBwcm9wcmlhdGUgbWVzc2FnZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuc3RhdGVfZXJyb3IubmFtZSwKICAgICAgICAgICAgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugc2hvdWxkIGluY2x1ZGUgc3RhdGUgbmFtZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NldF9zdGF0ZV9tYW5hZ2VyX2Nhbl9hY2Nlc3NfdXNlcl9sZXZlbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHNldF9zdGF0ZSBzdWNjZWVkcyB3aGVuIG1hbmFnZXIgKGxldmVsIDIpIHdobyBJUyBpbiBtYW5hZ2VyX2lkcwogICAgICAgIGFjY2Vzc2VzIHVzZXItbGV2ZWwgc3RhdGUgKGxldmVsIDEpLgogICAgICAgIEhpZ2hlciBhY2Nlc3MgbGV2ZWxzIGNhbiBhY2Nlc3MgbG93ZXIgbGV2ZWwgc3RhdGVzLgogICAgICAgICIiIgogICAgICAgICMgVXNlIGV4aXN0aW5nIHN0YXRlIGFuZCBzZXQgaXQgdG8gVXNlciBhY2Nlc3MgbGV2ZWwgKDEpCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmFjY2Vzc19sZXZlbCA9ICIxIgogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIEVuc3VyZSBtYW5hZ2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGpldCBhbmQgc2VydmVyCiAgICAgICAgIyBNYW5hZ2VyIElTIGluIG1hbmFnZXJfaWRzLCBzbyB0aGV5IGtlZXAgdGhlaXIgbWFuYWdlciBhY2Nlc3MgbGV2ZWwgKDIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIGluaXRpYWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9pbml0aWFsCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBzZXQgdXNlci1sZXZlbCBzdGF0ZQogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5zdGF0ZV9pZCwKICAgICAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBzZXQgdXNlci1sZXZlbCBzdGF0ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NldF9zdGF0ZV9tYW5hZ2VyX25vdF9pbl9tYW5hZ2VyX2lkc190cmVhdGVkX2FzX3VzZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBzZXRfc3RhdGUgdHJlYXRzIG1hbmFnZXIgKGxldmVsIDIpIHdobyBpcyBOT1QgaW4gbWFuYWdlcl9pZHMKICAgICAgICBhcyB1c2VyIChsZXZlbCAxKS4KICAgICAgICBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHNldCB1c2VyLWxldmVsIHN0YXRlIGJ1dCBub3QgbWFuYWdlci1sZXZlbCBzdGF0ZS4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIFVzZXIgYWNjZXNzIGxldmVsICgxKQogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy5hY2Nlc3NfbGV2ZWwgPSAiMSIKICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgYW5kIHNlcnZlciB2aWEgdXNlcl9pZHMKICAgICAgICAjIGJ1dCBOT1QgdmlhIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICAjIEV4cGxpY2l0bHkgZW5zdXJlIG1hbmFnZXIgaXMgTk9UIGluIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gaW5pdGlhbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBzZWxmLnN0YXRlX2luaXRpYWwKCiAgICAgICAgIyBNYW5hZ2VyICh0cmVhdGVkIGFzIHVzZXIpIHNob3VsZCBiZSBhYmxlIHRvIHNldCB1c2VyLWxldmVsIHN0YXRlCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5zZXRfc3RhdGUoc2VsZi5qZXRfdGVzdCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcsCiAgICAgICAgICAgICJNYW5hZ2VyIG5vdCBpbiBtYW5hZ2VyX2lkcyBzaG91bGQgYmUgYWJsZSB0byBzZXQgdXNlci1sZXZlbCBzdGF0ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NldF9zdGF0ZV9tYW5hZ2VyX25vdF9pbl9tYW5hZ2VyX2lkc19jYW5ub3RfYWNjZXNzX21hbmFnZXJfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBzZXRfc3RhdGUgcmFpc2VzIEFjY2Vzc0Vycm9yIHdoZW4gbWFuYWdlciAobGV2ZWwgMikgd2hvIGlzIE5PVAogICAgICAgIGluIG1hbmFnZXJfaWRzIHRyaWVzIHRvIHNldCBtYW5hZ2VyLWxldmVsIHN0YXRlIChsZXZlbCAyKS4KICAgICAgICBNYW5hZ2VyIHNob3VsZCBiZSB0cmVhdGVkIGFzIHVzZXIgKGxldmVsIDEpIGFuZCBjYW5ub3QgYWNjZXNzIGxldmVsIDIuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBNYW5hZ2VyIGFjY2VzcyBsZXZlbCAoMikKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuYWNjZXNzX2xldmVsID0gIjIiCiAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgRW5zdXJlIG1hbmFnZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0IGFuZCBzZXJ2ZXIgdmlhIHVzZXJfaWRzCiAgICAgICAgIyBidXQgTk9UIHZpYSBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgIyBFeHBsaWNpdGx5IGVuc3VyZSBtYW5hZ2VyIGlzIE5PVCBpbiBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgTWFuYWdlciAodHJlYXRlZCBhcyB1c2VyKSBzaG91bGQgbm90IGJlIGFibGUgdG8gc2V0IG1hbmFnZXItbGV2ZWwgc3RhdGUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCgogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNldCB0aGUiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiU2hvdWxkIHJhaXNlIEFjY2Vzc0Vycm9yIHdpdGggYXBwcm9wcmlhdGUgbWVzc2FnZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5uYW1lLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSBzdGF0ZSBuYW1lIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2V0X3N0YXRlX3Jvb3RfY2FuX2FjY2Vzc19tYW5hZ2VyX2xldmVsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3Qgc2V0X3N0YXRlIHN1Y2NlZWRzIHdoZW4gcm9vdCAobGV2ZWwgMykKICAgICAgICBhY2Nlc3NlcyBtYW5hZ2VyLWxldmVsIHN0YXRlIChsZXZlbCAyKS4KICAgICAgICBIaWdoZXIgYWNjZXNzIGxldmVscyBjYW4gYWNjZXNzIGxvd2VyIGxldmVsIHN0YXRlcy4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIE1hbmFnZXIgYWNjZXNzIGxldmVsICgyKQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5hY2Nlc3NfbGV2ZWwgPSAiMiIKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byBzZXQgbWFuYWdlci1sZXZlbCBzdGF0ZQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC53aXRoX3VzZXIoc2VsZi5yb290KS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuc2V0X3N0YXRlKHNlbGYuamV0X3Rlc3QpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5zdGF0ZV9pZCwKICAgICAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLAogICAgICAgICAgICAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byBzZXQgbWFuYWdlci1sZXZlbCBzdGF0ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NldF9zdGF0ZV93aXRoX2NvbnRleHRfamV0X2lkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3Qgc2V0X3N0YXRlIHJldHJpZXZlcyBqZXQgZnJvbSBjb250ZXh0IHdoZW4gamV0IHBhcmFtZXRlciBpcyBOb25lLgogICAgICAgICIiIgogICAgICAgICMgVXNlIGV4aXN0aW5nIHN0YXRlIGFuZCBzZXQgaXQgdG8gVXNlciBhY2Nlc3MgbGV2ZWwgKDEpCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmFjY2Vzc19sZXZlbCA9ICIxIgogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIEVuc3VyZSB1c2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGpldCBhbmQgc2VydmVyCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIGluaXRpYWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9pbml0aWFsCgogICAgICAgICMgU2V0IHN0YXRlIHVzaW5nIGNvbnRleHQgaW5zdGVhZCBvZiBkaXJlY3QgcGFyYW1ldGVyCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLndpdGhfdXNlcihzZWxmLnVzZXIpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgamV0X2lkPXNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZSwKICAgICAgICApLnNldF9zdGF0ZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5zdGF0ZV9pZCwKICAgICAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLAogICAgICAgICAgICAiSmV0IHNob3VsZCBiZSBzZXQgdG8gc3RhdGUgdXNpbmcgY29udGV4dCBqZXRfaWQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9zZXRfc3RhdGVfbm9famV0X2luX2NvbnRleHRfcmV0dXJuc19zaWxlbnRseShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHNldF9zdGF0ZSByZXR1cm5zIHNpbGVudGx5IHdoZW4gbm8gamV0X2lkIGluIGNvbnRleHQKICAgICAgICBhbmQgamV0IHBhcmFtZXRlciBpcyBOb25lLgogICAgICAgICIiIgogICAgICAgICMgVXNlIGV4aXN0aW5nIHN0YXRlCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmFjY2Vzc19sZXZlbCA9ICIxIgogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy5pbnZhbGlkYXRlX3JlY29yZHNldChbImFjY2Vzc19sZXZlbCJdKQoKICAgICAgICAjIENhbGwgc2V0X3N0YXRlIHdpdGhvdXQgamV0IHBhcmFtZXRlciBhbmQgd2l0aG91dCBjb250ZXh0CiAgICAgICAgIyBTaG91bGQgcmV0dXJuIHNpbGVudGx5IHdpdGhvdXQgcmFpc2luZyBleGNlcHRpb24KICAgICAgICByZXN1bHQgPSAoCiAgICAgICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy53aXRoX3VzZXIoc2VsZi51c2VyKQogICAgICAgICAgICAud2l0aF9jb250ZXh0KGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZSkKICAgICAgICAgICAgLnNldF9zdGF0ZSgpCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gTm9uZSB3aGVuIG5vIGpldCBpbiBjb250ZXh0IikKCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKICAgICMgICB1bmxpbmsgVGVzdHMKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwoKICAgIGRlZiB0ZXN0X3VubGlua19zdWNjZXNzX3doZW5fbm90X3VzZWRfaW5fYWN0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdW5saW5rIHN1Y2NlZWRzIHdoZW4gc3RhdGUgaXMgbm90IHVzZWQgaW4gYW55IGFjdGlvbi4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBhIHN0YXRlIHRoYXQgaXMgbm90IHVzZWQgaW4gYW55IGFjdGlvbgogICAgICAgIHVudXNlZF9zdGF0ZSA9IHNlbGYuSmV0U3RhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJVbnVzZWQgU3RhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ1bnVzZWRfc3RhdGUiLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAwLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHN0YXRlX2lkID0gdW51c2VkX3N0YXRlLmlkCgogICAgICAgICMgVW5saW5rIHNob3VsZCBzdWNjZWVkCiAgICAgICAgdW51c2VkX3N0YXRlLnVubGluaygpCgogICAgICAgICMgVmVyaWZ5IHN0YXRlIGlzIGRlbGV0ZWQKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLkpldFN0YXRlLnNlYXJjaChbKCJpZCIsICI9Iiwgc3RhdGVfaWQpXSksCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIG5vdCB1c2VkIGluIGFueSBhY3Rpb24iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF91bmxpbmtfZmFpbHNfd2hlbl91c2VkX2FzX3N0YXRlX2Zyb20oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsgcmFpc2VzIFZhbGlkYXRpb25FcnJvciB3aGVuIHN0YXRlIGlzIHVzZWQgYXMgc3RhdGVfZnJvbV9pZAogICAgICAgIGluIGFuIGFjdGlvbi4KICAgICAgICAiIiIKICAgICAgICAjIHN0YXRlX3J1bm5pbmcgaXMgdXNlZCBhcyBzdGF0ZV9mcm9tX2lkIGluIGFjdGlvbl9ydW5uaW5nX3RvX3N0b3BwZWQKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLnVubGluaygpCgogICAgICAgIGVycm9yX21lc3NhZ2UgPSBzdHIoY29udGV4dC5leGNlcHRpb24pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgIlNvbWUgc3RhdGVzIGFyZSBzdGlsbCB1c2VkIGluIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyIsCiAgICAgICAgICAgIGVycm9yX21lc3NhZ2UsCiAgICAgICAgICAgICJTaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yIHdpdGggYXBwcm9wcmlhdGUgbWVzc2FnZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZC5uYW1lLAogICAgICAgICAgICBlcnJvcl9tZXNzYWdlLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSBhY3Rpb24gbmFtZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QubmFtZSwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugc2hvdWxkIGluY2x1ZGUgdGVtcGxhdGUgbmFtZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VubGlua19mYWlsc193aGVuX3VzZWRfYXNfc3RhdGVfdG8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsgcmFpc2VzIFZhbGlkYXRpb25FcnJvciB3aGVuIHN0YXRlIGlzIHVzZWQgYXMgc3RhdGVfdG9faWQKICAgICAgICBpbiBhbiBhY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgIyBzdGF0ZV9zdG9wcGVkIGlzIHVzZWQgYXMgc3RhdGVfdG9faWQgaW4gYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQudW5saW5rKCkKCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9IHN0cihjb250ZXh0LmV4Y2VwdGlvbikKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiU29tZSBzdGF0ZXMgYXJlIHN0aWxsIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBhY3Rpb25zIiwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3Igd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5hY3Rpb25fcnVubmluZ190b19zdG9wcGVkLm5hbWUsCiAgICAgICAgICAgIGVycm9yX21lc3NhZ2UsCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIGFjdGlvbiBuYW1lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5uYW1lLAogICAgICAgICAgICBlcnJvcl9tZXNzYWdlLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSB0ZW1wbGF0ZSBuYW1lIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfdW5saW5rX2ZhaWxzX3doZW5fdXNlZF9hc19zdGF0ZV90cmFuc2l0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdW5saW5rIHJhaXNlcyBWYWxpZGF0aW9uRXJyb3Igd2hlbiBzdGF0ZSBpcyB1c2VkIGFzIHN0YXRlX3RyYW5zaXRfaWQKICAgICAgICBpbiBhbiBhY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgIyBzdGF0ZV9zdG9wcGluZyBpcyB1c2VkIGFzIHN0YXRlX3RyYW5zaXRfaWQgaW4gYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX3N0b3BwaW5nLnVubGluaygpCgogICAgICAgIGVycm9yX21lc3NhZ2UgPSBzdHIoY29udGV4dC5leGNlcHRpb24pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgIlNvbWUgc3RhdGVzIGFyZSBzdGlsbCB1c2VkIGluIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyIsCiAgICAgICAgICAgIGVycm9yX21lc3NhZ2UsCiAgICAgICAgICAgICJTaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yIHdpdGggYXBwcm9wcmlhdGUgbWVzc2FnZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZC5uYW1lLAogICAgICAgICAgICBlcnJvcl9tZXNzYWdlLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSBhY3Rpb24gbmFtZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QubmFtZSwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugc2hvdWxkIGluY2x1ZGUgdGVtcGxhdGUgbmFtZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VubGlua19mYWlsc193aXRoX211bHRpcGxlX2FjdGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsgcmFpc2VzIFZhbGlkYXRpb25FcnJvciB3aXRoIG11bHRpcGxlIGFjdGlvbnMgd2hlbiBzdGF0ZQogICAgICAgIGlzIHVzZWQgaW4gbXVsdGlwbGUgYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIHN0YXRlX3J1bm5pbmcgaXMgdXNlZCBpbiBtdWx0aXBsZSBhY3Rpb25zOgogICAgICAgICMgLSBhY3Rpb25fcnVubmluZ190b19zdG9wcGVkIChzdGF0ZV9mcm9tX2lkKQogICAgICAgICMgLSBhY3Rpb25fc3RvcHBlZF90b19ydW5uaW5nIChzdGF0ZV90b19pZCkKICAgICAgICAjIC0gYWN0aW9uX3J1bm5pbmdfdG9fZXJyb3IgKHN0YXRlX2Zyb21faWQpCiAgICAgICAgIyAtIGFjdGlvbl9pbml0aWFsX3RvX3J1bm5pbmcgKHN0YXRlX3RvX2lkKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcudW5saW5rKCkKCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9IHN0cihjb250ZXh0LmV4Y2VwdGlvbikKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiU29tZSBzdGF0ZXMgYXJlIHN0aWxsIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBhY3Rpb25zIiwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3Igd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIiwKICAgICAgICApCiAgICAgICAgIyBWZXJpZnkgbXVsdGlwbGUgYWN0aW9ucyBhcmUgbWVudGlvbmVkCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5hY3Rpb25fcnVubmluZ190b19zdG9wcGVkLm5hbWUsCiAgICAgICAgICAgIGVycm9yX21lc3NhZ2UsCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIGZpcnN0IGFjdGlvbiBuYW1lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5uYW1lLAogICAgICAgICAgICBlcnJvcl9tZXNzYWdlLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSB0ZW1wbGF0ZSBuYW1lIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfdW5saW5rX2ZhaWxzX3dpdGhfbXVsdGlwbGVfc3RhdGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdW5saW5rIHJhaXNlcyBWYWxpZGF0aW9uRXJyb3Igd2hlbiB0cnlpbmcgdG8gdW5saW5rIG11bHRpcGxlIHN0YXRlcwogICAgICAgIHdoZXJlIGF0IGxlYXN0IG9uZSBpcyB1c2VkIGluIGFuIGFjdGlvbi4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBhbiB1bnVzZWQgc3RhdGUKICAgICAgICB1bnVzZWRfc3RhdGUgPSBzZWxmLkpldFN0YXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQW5vdGhlciBVbnVzZWQgU3RhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJhbm90aGVyX3VudXNlZF9zdGF0ZSIsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMDEsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVHJ5IHRvIHVubGluayBib3RoIHVudXNlZF9zdGF0ZSBhbmQgc3RhdGVfcnVubmluZyAod2hpY2ggaXMgdXNlZCkKICAgICAgICBzdGF0ZXNfdG9fdW5saW5rID0gdW51c2VkX3N0YXRlIHwgc2VsZi5zdGF0ZV9ydW5uaW5nCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHN0YXRlc190b191bmxpbmsudW5saW5rKCkKCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9IHN0cihjb250ZXh0LmV4Y2VwdGlvbikKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiU29tZSBzdGF0ZXMgYXJlIHN0aWxsIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBhY3Rpb25zIiwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3Igd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIiwKICAgICAgICApCiAgICAgICAgIyBWZXJpZnkgdGhhdCBuZWl0aGVyIHN0YXRlIHdhcyBkZWxldGVkCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICB1bnVzZWRfc3RhdGUuZXhpc3RzKCksCiAgICAgICAgICAgICJVbnVzZWQgc3RhdGUgc2hvdWxkIG5vdCBiZSBkZWxldGVkIHdoZW4gYW5vdGhlciBzdGF0ZSBmYWlscyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmV4aXN0cygpLAogICAgICAgICAgICAiVXNlZCBzdGF0ZSBzaG91bGQgbm90IGJlIGRlbGV0ZWQiLAogICAgICAgICkK \ No newline at end of file