diff --git a/addons/cetmix_tower_server/models/cx_tower_plan.py b/addons/cetmix_tower_server/models/cx_tower_plan.py new file mode 100644 index 0000000..651096a --- /dev/null +++ b/addons/cetmix_tower_server/models/cx_tower_plan.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSBvcGVyYXRvciBpbXBvcnQgaW5kZXhPZgoKZnJvbSBvZG9vIGltcG9ydCBfLCBhcGksIGZpZWxkcywgbW9kZWxzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKZnJvbSBvZG9vLnRvb2xzLnNhZmVfZXZhbCBpbXBvcnQgZXhwcl9ldmFsCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0ICgKICAgIEFOT1RIRVJfUExBTl9SVU5OSU5HLAogICAgUExBTl9MSU5FX0NPTkRJVElPTl9DSEVDS19GQUlMRUQsCiAgICBQTEFOX0xJTkVfTk9UX0FTU0lHTkVELAogICAgUExBTl9OT1RfQVNTSUdORUQsCiAgICBQTEFOX05PVF9DT01QQVRJQkxFX1dJVEhfU0VSVkVSLAopCgoKY2xhc3MgQ3hUb3dlclBsYW4obW9kZWxzLk1vZGVsKToKICAgICIiIkNldG1peCBUb3dlciBmbGlnaHQgcGxhbiIiIgoKICAgIF9uYW1lID0gImN4LnRvd2VyLnBsYW4iCiAgICBfZGVzY3JpcHRpb24gPSAiQ2V0bWl4IFRvd2VyIEZsaWdodCBQbGFuIgogICAgX2luaGVyaXQgPSBbCiAgICAgICAgImN4LnRvd2VyLnJlZmVyZW5jZS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLmFjY2Vzcy5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLmFjY2Vzcy5yb2xlLm1peGluIiwKICAgICAgICAiY3gudG93ZXIudGFnLm1peGluIiwKICAgIF0KICAgIF9vcmRlciA9ICJuYW1lIGFzYyIKCiAgICBhY3RpdmUgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PVRydWUpCiAgICBhbGxvd19wYXJhbGxlbF9ydW4gPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBoZWxwPSJJZiBlbmFibGVkLCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmxpZ2h0IHBsYW4gIgogICAgICAgICJjYW4gYmUgcnVuIG9uIHRoZSBzYW1lIHNlcnZlciBhdCB0aGUgc2FtZSB0aW1lLlxuIgogICAgICAgICJPdGhlcndpc2UsIEFOT1RIRVJfUExBTl9SVU5OSU5HIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkIGlmIGFub3RoZXIiCiAgICAgICAgIiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBmbGlnaHQgcGxhbiBpcyBhbHJlYWR5IHJ1bm5pbmciCiAgICApCgogICAgY29sb3IgPSBmaWVsZHMuSW50ZWdlcihoZWxwPSJGb3IgYmV0dGVyIHZpc3VhbGl6YXRpb24gaW4gdmlld3MiKQogICAgc2VydmVyX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoc3RyaW5nPSJTZXJ2ZXJzIiwgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIiKQogICAgdGFnX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX3BsYW5fdGFnX3JlbCIsCiAgICAgICAgY29sdW1uMT0icGxhbl9pZCIsCiAgICAgICAgY29sdW1uMj0idGFnX2lkIiwKICAgICkKICAgIGxpbmVfaWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIHN0cmluZz0iTGluZXMiLAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIucGxhbi5saW5lIiwKICAgICAgICBpbnZlcnNlX25hbWU9InBsYW5faWQiLAogICAgICAgIGF1dG9fam9pbj1UcnVlLAogICAgICAgIGNvcHk9VHJ1ZSwKICAgICkKICAgIGNvbW1hbmRfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBzdHJpbmc9IkNvbW1hbmRzIiwKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmNvbW1hbmQiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9jb21tYW5kX2ZsaWdodF9wbGFuX3VzZWRfaWRfcmVsIiwKICAgICAgICBjb2x1bW4xPSJwbGFuX2lkIiwKICAgICAgICBjb2x1bW4yPSJjb21tYW5kX2lkIiwKICAgICAgICBoZWxwPSJDb21tYW5kcyB1c2VkIGluIHRoaXMgZmxpZ2h0IHBsYW4iLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX2NvbW1hbmRfaWRzIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgKQogICAgbm90ZSA9IGZpZWxkcy5UZXh0KCkKICAgIG9uX2Vycm9yX2FjdGlvbiA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgc3RyaW5nPSJPbiBFcnJvciIsCiAgICAgICAgc2VsZWN0aW9uPVsKICAgICAgICAgICAgKCJlIiwgIkV4aXQgd2l0aCBjb21tYW5kIGV4aXQgY29kZSIpLAogICAgICAgICAgICAoImVjIiwgIkV4aXQgd2l0aCBjdXN0b20gZXhpdCBjb2RlIiksCiAgICAgICAgICAgICgibiIsICJSdW4gbmV4dCBjb21tYW5kIiksCiAgICAgICAgXSwKICAgICAgICByZXF1aXJlZD1UcnVlLAogICAgICAgIGRlZmF1bHQ9ImUiLAogICAgICAgIGhlbHA9IlRoaXMgYWN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIG9uIGVycm9yICIKICAgICAgICAiaWYgbm8gY29tbWFuZCBhY3Rpb24gY2FuIGJlIGFwcGxpZWQiLAogICAgKQogICAgY3VzdG9tX2V4aXRfY29kZSA9IGZpZWxkcy5JbnRlZ2VyKAogICAgICAgIGhlbHA9IldpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb21tYW5kIGV4aXQgY29kZSIKICAgICkKCiAgICBhY2Nlc3NfbGV2ZWxfd2Fybl9tc2cgPSBmaWVsZHMuVGV4dCgKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9jb21tYW5kX2FjY2Vzc19sZXZlbCIsCiAgICAgICAgY29tcHV0ZV9zdWRvPVRydWUsCiAgICApCgogICAgIyAtLS0tIEFjY2Vzcy4gQWRkIHJlbGF0aW9uIGZvciBtaXhpbiBmaWVsZHMKICAgIHVzZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfcGxhbl91c2VyX3JlbCIsCiAgICApCiAgICBtYW5hZ2VyX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX3BsYW5fbWFuYWdlcl9yZWwiLAogICAgKQoKICAgIEBhcGkuZGVwZW5kcygibGluZV9pZHMuY29tbWFuZF9pZC5hY2Nlc3NfbGV2ZWwiLCAiYWNjZXNzX2xldmVsIikKICAgIGRlZiBfY29tcHV0ZV9jb21tYW5kX2FjY2Vzc19sZXZlbChzZWxmKToKICAgICAgICAiIiJDaGVjayBpZiB0aGUgYWNjZXNzIGxldmVsIG9mIGEgY29tbWFuZCBpbiB0aGUgcGxhbgogICAgICAgIGlzIGhpZ2hlciB0aGFuIHRoZSBwbGFuJ3MgYWNjZXNzIGxldmVsIiIiCiAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmOgogICAgICAgICAgICBjb21tYW5kcyA9IHJlY29yZC5tYXBwZWQoImxpbmVfaWRzIikubWFwcGVkKCJjb21tYW5kX2lkIikKICAgICAgICAgICAgIyBSZXRyaWV2ZSBhbGwgY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmbGlnaHQgcGxhbgogICAgICAgICAgICBjb21tYW5kc193aXRoX2hpZ2hlcl9hY2Nlc3MgPSBjb21tYW5kcy5maWx0ZXJlZCgKICAgICAgICAgICAgICAgIGxhbWJkYSBjLCBhY2Nlc3NfbGV2ZWw9cmVjb3JkLmFjY2Vzc19sZXZlbDogYy5hY2Nlc3NfbGV2ZWwKICAgICAgICAgICAgICAgID4gYWNjZXNzX2xldmVsCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgY29tbWFuZHNfd2l0aF9oaWdoZXJfYWNjZXNzOgogICAgICAgICAgICAgICAgY29tbWFuZF9uYW1lcyA9ICIsICIuam9pbihjb21tYW5kc193aXRoX2hpZ2hlcl9hY2Nlc3MubWFwcGVkKCJuYW1lIikpCiAgICAgICAgICAgICAgICByZWNvcmQuYWNjZXNzX2xldmVsX3dhcm5fbXNnID0gXygKICAgICAgICAgICAgICAgICAgICAiVGhlIGFjY2VzcyBsZXZlbCBvZiBjb21tYW5kKHMpICclKGNvbW1hbmRfbmFtZXMpcycgaW5jbHVkZWQgaW4gdGhlIgogICAgICAgICAgICAgICAgICAgICIgY3VycmVudCBGbGlnaHQgcGxhbiBpcyBoaWdoZXIgdGhhbiB0aGUgYWNjZXNzIGxldmVsIG9mIHRoZSIKICAgICAgICAgICAgICAgICAgICAiIEZsaWdodCBwbGFuIGl0c2VsZi4gUGxlYXNlIGVuc3VyZSB0aGF0IHlvdSB3YW50IHRvIGFsbG93IgogICAgICAgICAgICAgICAgICAgICIgdGhvc2UgY29tbWFuZHMgdG8gYmUgcnVuIGFueXdheS4iLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfbmFtZXM9Y29tbWFuZF9uYW1lcywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlY29yZC5hY2Nlc3NfbGV2ZWxfd2Fybl9tc2cgPSBGYWxzZQoKICAgIEBhcGkuZGVwZW5kcygibGluZV9pZHMiLCAibGluZV9pZHMuY29tbWFuZF9pZCIpCiAgICBkZWYgX2NvbXB1dGVfY29tbWFuZF9pZHMoc2VsZik6CiAgICAgICAgIiIiQ29tcHV0ZSBjb21tYW5kIGlkcyIiIgogICAgICAgIGZvciBwbGFuIGluIHNlbGY6CiAgICAgICAgICAgIHBsYW4uY29tbWFuZF9pZHMgPSBbKDYsIDAsIHBsYW4ubGluZV9pZHMubWFwcGVkKCJjb21tYW5kX2lkIikuaWRzKV0KCiAgICBkZWYgYWN0aW9uX29wZW5fcGxhbl9sb2dzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE9wZW4gY3VycmVudCBmbGlnaHQgcGxhbiBsb2cgcmVjb3JkcwogICAgICAgICIiIgogICAgICAgIGFjdGlvbiA9IHNlbGYuZW52WyJpci5hY3Rpb25zLmFjdGlvbnMiXS5fZm9yX3htbF9pZCgKICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuYWN0aW9uX2N4X3Rvd2VyX3BsYW5fbG9nIgogICAgICAgICkKICAgICAgICBhY3Rpb25bImRvbWFpbiJdID0gWygicGxhbl9pZCIsICI9Iiwgc2VsZi5pZCldCiAgICAgICAgcmV0dXJuIGFjdGlvbgoKICAgIGRlZiBfZ2V0X2RlcGVuZGVudF9tb2RlbF9yZWxhdGlvbl9maWVsZHMoc2VsZik6CiAgICAgICAgIiIiQ2hlY2sgY3gudG93ZXIucmVmZXJlbmNlLm1peGluIGZvciB0aGUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9kZXBlbmRlbnRfbW9kZWxfcmVsYXRpb25fZmllbGRzKCkKICAgICAgICByZXR1cm4gcmVzICsgWyJsaW5lX2lkcyJdCgogICAgZGVmIF9pc19wbGFuX2luY29tcGF0aWJsZV93aXRoX3NlcnZlcihzZWxmLCBzZXJ2ZXIpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIHRoZSBmbGlnaHQgcGxhbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNlcnZlci4KICAgICAgICBOb3RlOiB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGludmVyc2UgbG9naWMgdG8gc2ltcGxpZnkgdGhlIGNoZWNrcy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyIChjeC50b3dlci5zZXJ2ZXIoKSk6IFNlcnZlciBvYmplY3QKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQ2hhciBvciBGYWxzZTogSW5jb21wYXRpYmxlIHJlYXNvbiBvciBGYWxzZSBpZiBjb21wYXRpYmxlCiAgICAgICAgIiIiCgogICAgICAgICMgQ2hlY2sgaWYgdGhlIGZsaWdodCBwbGFuIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2VydmVyCiAgICAgICAgaWYgbm90IHNlbGYuc2VydmVyX2lkczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgc2VydmVyLmlkIG5vdCBpbiBzZWxmLnNlcnZlcl9pZHMuaWRzOgogICAgICAgICAgICByZXR1cm4gXygiRmxpZ2h0IHBsYW4gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VydmVyIikKCiAgICAgICAgIyBDaGVjayBpZiB0aGUgZmxpZ2h0IHBsYW4gY29tbWFuZHMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2VydmVyCiAgICAgICAgZm9yIGNvbW1hbmQgaW4gc2VsZi5jb21tYW5kX2lkczoKICAgICAgICAgICAgIyBDaGVjayB0aGUgZW50aXJlIGNvbW1hbmQgZmlyc3QKICAgICAgICAgICAgaWYgbm90IGNvbW1hbmQuX2NoZWNrX3NlcnZlcl9jb21wYXRpYmlsaXR5KHNlcnZlcik6CiAgICAgICAgICAgICAgICByZXR1cm4gXygKICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCAlKGNvbW1hbmRfbmFtZSlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNlcnZlciIsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9uYW1lPWNvbW1hbmQubmFtZSwKICAgICAgICAgICAgICAgICkgICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgbmVzdGVkIGZsaWdodCBwbGFuIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2VydmVyCiAgICAgICAgICAgIGlmIGNvbW1hbmQuYWN0aW9uID09ICJwbGFuIjoKICAgICAgICAgICAgICAgIHBsYW5fY2hlY2tfcmVzdWx0ID0gKAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuZmxpZ2h0X3BsYW5faWQuX2lzX3BsYW5faW5jb21wYXRpYmxlX3dpdGhfc2VydmVyKHNlcnZlcikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHBsYW5fY2hlY2tfcmVzdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFuX2NoZWNrX3Jlc3VsdAoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2dldF9wb3N0X2NyZWF0ZV9maWVsZHMoc2VsZik6CiAgICAgICAgcmVzID0gc3VwZXIoKS5fZ2V0X3Bvc3RfY3JlYXRlX2ZpZWxkcygpCiAgICAgICAgcmV0dXJuIHJlcyArIFsibGluZV9pZHMiXQoKICAgIGRlZiBfcnVuX3NpbmdsZShzZWxmLCBzZXJ2ZXIsIGpldF90ZW1wbGF0ZT1Ob25lLCBqZXQ9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICIiIlJ1biBzaW5nbGUgRmxpZ2h0IFBsYW4gb24gYSBzaW5nbGUgc2VydmVyCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpOiBTZXJ2ZXIgb2JqZWN0CiAgICAgICAgICAgIGpldF90ZW1wbGF0ZSAoY3gudG93ZXIuamV0LnRlbXBsYXRlKCkpOiBqZXQgdGVtcGxhdGUgcmVjb3JkCiAgICAgICAgICAgIGpldCAoY3gudG93ZXIuamV0KCkpOiBqZXQgcmVjb3JkCiAgICAgICAgICAgIGt3YXJncyAoZGljdCk6IE9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgRm9sbG93aW5nIGFyZSBzdXBwb3J0ZWQgYnV0IG5vdCBsaW1pdGVkIHRvOgogICAgICAgICAgICAgICAgICAgIC0gInBsYW5fbG9nIjoge3ZhbHVlcyBwYXNzZWQgdG8gZmxpZ2h0cGxhbiBsb2dnZXJ9CiAgICAgICAgICAgICAgICAgICAgLSAibG9nIjoge3ZhbHVlcyBwYXNzZWQgdG8gbG9nZ2VyfQogICAgICAgICAgICAgICAgICAgIC0gImtleSI6IHt2YWx1ZXMgcGFzc2VkIHRvIGtleSBwYXJzZXJ9CiAgICAgICAgICAgICAgICAgICAgLSAidmFyaWFibGVfdmFsdWVzIiwgZGljdCgpOiBjdXN0b20gdmFyaWFibGUgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgb2YgYHt2YXJpYWJsZV9yZWZlcmVuY2U6IHZhcmlhYmxlX3ZhbHVlfWAKICAgICAgICAgICAgICAgICAgICAgICAgZWcgYHsnb2Rvb192ZXJzaW9uJzogJzE2LjAnfWAKICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBiZSBhcHBsaWVkIG9ubHkgaWYgdXNlciBoYXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGxvZ19yZWNvcmQgKGN4LnRvd2VyLnBsYW4ubG9nKCkpOiBwbGFuIGxvZyByZWNvcmQKICAgICAgICAiIiIKCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICAjIEVuc3VyZSB3ZSBoYXZlIGEgc2luZ2xlIHNlcnZlciByZWNvcmQKICAgICAgICBzZXJ2ZXIuZW5zdXJlX29uZSgpCgogICAgICAgICMgQ2hlY2sgaWYgSmV0IGJlbG9uZ3MgdG8gdGhlIHNlcnZlcgogICAgICAgIGlmIGpldCBhbmQgamV0LnNlcnZlcl9pZCAhPSBzZXJ2ZXI6CiAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgIkpldCAlKGpldClzIGRvZXMgbm90IGJlbG9uZyB0byBzZXJ2ZXIgJShzZXJ2ZXIpcyIsCiAgICAgICAgICAgICAgICAgICAgamV0PWpldC5uYW1lLAogICAgICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIubmFtZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHBsYW4gYWNjZXNzIGJlZm9yZSBydW5uaW5nCiAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBwb3NzaWJsZSBhY2Nlc3MgdmlvbGF0aW9ucwogICAgICAgIHNlbGYuY2hlY2tfYWNjZXNzX3JpZ2h0cygicmVhZCIpCiAgICAgICAgc2VsZi5jaGVja19hY2Nlc3NfcnVsZSgicmVhZCIpCgogICAgICAgICMgU2F2ZSBqZXQgdGVtcGxhdGUgYW5kIGpldCBpbiBrd2FyZ3MKICAgICAgICBwbGFuX2xvZ192YWxzID0ga3dhcmdzLmdldCgicGxhbl9sb2ciLCB7fSkKICAgICAgICBpZiBqZXRfdGVtcGxhdGU6CiAgICAgICAgICAgIHBsYW5fbG9nX3ZhbHNbImpldF90ZW1wbGF0ZV9pZCJdID0gamV0X3RlbXBsYXRlLmlkCiAgICAgICAgaWYgamV0OgogICAgICAgICAgICBwbGFuX2xvZ192YWxzWyJqZXRfaWQiXSA9IGpldC5pZAogICAgICAgIGt3YXJnc1sicGxhbl9sb2ciXSA9IHBsYW5fbG9nX3ZhbHMKCiAgICAgICAgIyBBY2Nlc3MgbG9nIGFzIHJvb3QgdG8gYnlwYXNzIGFjY2VzcyByZXN0cmljdGlvbnMKICAgICAgICBwbGFuX2xvZ19vYmogPSBzZWxmLmVudlsiY3gudG93ZXIucGxhbi5sb2ciXS5zdWRvKCkKCiAgICAgICAgIyBDaGVjayBpZiBmbGlnaHQgcGxhbiBhbmQgYWxsIGl0cyBjb21tYW5kcyBjYW4gYmUgcnVuIG9uIHRoaXMgc2VydmVyCiAgICAgICAgIyBUaGlzIGNoZWNrIGlzIHNraXBwZWQgaWYgJ2Zyb21fY29tbWFuZCcgY29udGV4dCBrZXkgaXMgc2V0IHRvIFRydWUKICAgICAgICBpZiBub3Qgc2VsZi5lbnYuY29udGV4dC5nZXQoImZyb21fY29tbWFuZCIpOgogICAgICAgICAgICBwbGFuX2lzX2luY29tcGF0aWJsZSA9IHNlbGYuX2lzX3BsYW5faW5jb21wYXRpYmxlX3dpdGhfc2VydmVyKHNlcnZlcikKICAgICAgICAgICAgaWYgcGxhbl9pc19pbmNvbXBhdGlibGU6CiAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIGxvZyByZWNvcmQgd2l0aCB0aGUgY3VzdG9tIG1lc3NhZ2UgYW5kIGV4aXQKICAgICAgICAgICAgICAgIHBsYW5fbG9nX2t3YXJncyA9IGt3YXJncy5nZXQoInBsYW5fbG9nIiwge30pCiAgICAgICAgICAgICAgICBwbGFuX2xvZ19rd2FyZ3NbImN1c3RvbV9tZXNzYWdlIl0gPSBwbGFuX2lzX2luY29tcGF0aWJsZQogICAgICAgICAgICAgICAga3dhcmdzWyJwbGFuX2xvZyJdID0gcGxhbl9sb2dfa3dhcmdzCiAgICAgICAgICAgICAgICBwbGFuX2xvZyA9IHBsYW5fbG9nX29iai5yZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgc2VydmVyPXNlcnZlciwKICAgICAgICAgICAgICAgICAgICBwbGFuPXNlbGYsCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzPVBMQU5fTk9UX0NPTVBBVElCTEVfV0lUSF9TRVJWRVIsCiAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gcGxhbl9sb2cKCiAgICAgICAgIyBDaGVjayBpZiB0aGUgc2FtZSBwbGFuIGlzIGJlaW5nIHJ1biBvbiB0aGlzIHNlcnZlciByaWdodCBub3cKICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd19wYXJhbGxlbF9ydW4gb3Igc2VsZi5lbnYuY29udGV4dC5nZXQoCiAgICAgICAgICAgICJwcmV2ZW50X3BsYW5fcmVjdXJzaW9uIgogICAgICAgICk6CiAgICAgICAgICAgIGRvbWFpbiA9IFsKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZXJ2ZXIuaWQpLAogICAgICAgICAgICAgICAgKCJwbGFuX2lkIiwgIj0iLCBzZWxmLmlkKSwgICMgdHlwZTogaWdub3JlCiAgICAgICAgICAgICAgICAoImlzX3J1bm5pbmciLCAiPSIsIFRydWUpLAogICAgICAgICAgICBdCiAgICAgICAgICAgIGlmIGpldF90ZW1wbGF0ZToKICAgICAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQoKCJqZXRfdGVtcGxhdGVfaWQiLCAiPSIsIGpldF90ZW1wbGF0ZS5pZCkpCiAgICAgICAgICAgIGlmIGpldDoKICAgICAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQoKCJqZXRfaWQiLCAiPSIsIGpldC5pZCkpCiAgICAgICAgICAgIHJ1bm5pbmdfY291bnQgPSBwbGFuX2xvZ19vYmouc2VhcmNoX2NvdW50KGRvbWFpbj1kb21haW4pCiAgICAgICAgICAgIGlmIHJ1bm5pbmdfY291bnQgPiAwOgogICAgICAgICAgICAgICAgcGxhbl9sb2cgPSBwbGFuX2xvZ19vYmoucmVjb3JkKAogICAgICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsIHBsYW49c2VsZiwgc3RhdHVzPUFOT1RIRVJfUExBTl9SVU5OSU5HLCAqKmt3YXJncwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuIHBsYW5fbG9nCgogICAgICAgICMgU3RhcnQgRmxpZ2h0IFBsYW4gYW5kIHJldHVybiB0aGUgbG9nIHJlY29yZAogICAgICAgIHJldHVybiBwbGFuX2xvZ19vYmouc3RhcnQoCiAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgIHBsYW49c2VsZiwKICAgICAgICAgICAgKiprd2FyZ3MsCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0X25leHRfYWN0aW9uX3ZhbHVlcyhzZWxmLCBjb21tYW5kX2xvZyk6CiAgICAgICAgIiIiR2V0IG5leHQgYWN0aW9uIHZhbHVlcyBiYXNlZCBvZiBwcmV2aW91cyBjb21tYW5kIHJlc3VsdDoKCiAgICAgICAgICAgIC0gQWN0aW9uIHRvIHByb2NlZWQKICAgICAgICAgICAgLSBFeGl0IGNvZGUKICAgICAgICAgICAgLSBOZXh0IGxpbmUgb2YgdGhlIHBsYW4gaWYgbmV4dCBsaW5lIHNob3VsZCBiZSBydW4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgY29tbWFuZF9sb2cgKGN4LnRvd2VyLmNvbW1hbmQubG9nKCkpOiBDb21tYW5kIGxvZyByZWNvcmQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgYWN0aW9uLCBleGl0X2NvZGUsIG5leHRfbGluZSAoU2VsZWN0aW9uLCBJbnRlZ2VyLCBjeC50b3dlci5wbGFuLmxpbmUoKSkKCiAgICAgICAgIiIiCiAgICAgICAgIyBJdGVyYXRlIGFsbCBhY3Rpb25zIGFuZCByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIG9uZS4KICAgICAgICAjIElmIG5vIGFjdGlvbiBpcyBmb3VuZCByZXR1cm4gdGhlIGRlZmF1bHQgcGxhbiB2YWx1ZXMKICAgICAgICAjIElmIHRoZSBsaW5lIGlzIHRoZSBsYXN0IG9uZSByZXR1cm4gbGFzdCBjb21tYW5kIGV4aXQgY29kZQoKICAgICAgICBpZiBub3QgY29tbWFuZF9sb2cucGxhbl9sb2dfaWQ6ICAjIEV4aXQgd2l0aCBjdXN0b20gY29kZSAiUGxhbiBub3QgZm91bmQiCiAgICAgICAgICAgIHJldHVybiAiZWMiLCBQTEFOX05PVF9BU1NJR05FRCwgTm9uZQoKICAgICAgICBjdXJyZW50X2xpbmUgPSBjb21tYW5kX2xvZy5wbGFuX2xvZ19pZC5wbGFuX2xpbmVfZXhlY3V0ZWRfaWQKICAgICAgICBpZiBub3QgY3VycmVudF9saW5lOgogICAgICAgICAgICByZXR1cm4gImVjIiwgUExBTl9MSU5FX05PVF9BU1NJR05FRCwgTm9uZQoKICAgICAgICAjIERlZmF1bHQgdmFsdWVzCiAgICAgICAgZXhpdF9jb2RlID0gY29tbWFuZF9sb2cuY29tbWFuZF9zdGF0dXMKICAgICAgICBzZXJ2ZXIgPSBjb21tYW5kX2xvZy5zZXJ2ZXJfaWQKICAgICAgICBqZXRfdGVtcGxhdGUgPSBjb21tYW5kX2xvZy5qZXRfdGVtcGxhdGVfaWQKICAgICAgICBqZXQgPSBjb21tYW5kX2xvZy5qZXRfaWQKCiAgICAgICAgIyBDaGVjayBsaW5lIGNvbmRpdGlvbgogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9ICgKICAgICAgICAgICAgY29tbWFuZF9sb2cudmFyaWFibGVfdmFsdWVzIG9yIGNvbW1hbmRfbG9nLnBsYW5fbG9nX2lkLnZhcmlhYmxlX3ZhbHVlcyBvciB7fQogICAgICAgICkKICAgICAgICBpZiBub3QgY3VycmVudF9saW5lLl9pc19leGVjdXRhYmxlX2xpbmUoCiAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIGpldD1qZXQsCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcz12YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgKToKICAgICAgICAgICAgIyBJbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIG5leHQgbGluZSBpZiBjb25kaXRpb24gZmFpbHMKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9uZXh0X2FjdGlvbl9zdGF0ZSgKICAgICAgICAgICAgICAgICJuIiwgUExBTl9MSU5FX0NPTkRJVElPTl9DSEVDS19GQUlMRUQsIGN1cnJlbnRfbGluZQogICAgICAgICAgICApCgogICAgICAgICMgQ2hlY2sgcGxhbiBhY3Rpb24gbGluZXMKICAgICAgICBmb3IgYWN0aW9uX2xpbmUgaW4gY3VycmVudF9saW5lLmFjdGlvbl9pZHM6CiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gPSAoCiAgICAgICAgICAgICAgICBmIntleGl0X2NvZGV9IHthY3Rpb25fbGluZS5jb25kaXRpb259IHthY3Rpb25fbGluZS52YWx1ZV9jaGFyfSIKICAgICAgICAgICAgKQogICAgICAgICAgICAjIEV2YWx1YXRlIGV4cHJlc3Npb24gdXNpbmcgc2FmZV9ldmFsCiAgICAgICAgICAgIGlmIGV4cHJfZXZhbChjb25kaXRpb25hbF9leHByZXNzaW9uKToKICAgICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbl9saW5lLmFjdGlvbgogICAgICAgICAgICAgICAgIyBVc2UgY3VzdG9tIGV4aXQgY29kZSBpZiBhY3Rpb24gcmVxdWlyZXMgaXQKICAgICAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiZWMiIGFuZCBhY3Rpb25fbGluZS5jdXN0b21fZXhpdF9jb2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGV4aXRfY29kZSA9IGFjdGlvbl9saW5lLmN1c3RvbV9leGl0X2NvZGUKCiAgICAgICAgICAgICAgICAjIEFwcGx5IGFjdGlvbi1kZWZpbmVkIHZhbHVlcyBpbnRvIHRoZSB2YXJpYWJsZSB2YWx1ZXMgY29udGV4dAogICAgICAgICAgICAgICAgZm9yIHZhcmlhYmxlX3ZhbHVlIGluIGFjdGlvbl9saW5lLnZhcmlhYmxlX3ZhbHVlX2lkczoKICAgICAgICAgICAgICAgICAgICByZWYgPSB2YXJpYWJsZV92YWx1ZS52YXJpYWJsZV9pZC5yZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXNbcmVmXSA9IHZhcmlhYmxlX3ZhbHVlLnZhbHVlX2NoYXIKCiAgICAgICAgICAgICAgICAjIFBlcnNpc3QgdGhlIHVwZGF0ZWQgY3VzdG9tIHZhbHVlcyBvbmx5IGluIGxvZ3MKICAgICAgICAgICAgICAgICMgc28gdGhleSByZW1haW4gYXZhaWxhYmxlIHdpdGhpbiB0aGUgY3VycmVudCBmbGlnaHQgcGxhbiBjb250ZXh0CiAgICAgICAgICAgICAgICB1cGRhdGVkX3ZhbHVlcyA9IGRpY3QodmFyaWFibGVfdmFsdWVzKQogICAgICAgICAgICAgICAgY29tbWFuZF9sb2cudmFyaWFibGVfdmFsdWVzID0gdXBkYXRlZF92YWx1ZXMKICAgICAgICAgICAgICAgIGlmIGNvbW1hbmRfbG9nLnBsYW5fbG9nX2lkOgogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfbG9nLnBsYW5fbG9nX2lkLnZhcmlhYmxlX3ZhbHVlcyA9IHVwZGF0ZWRfdmFsdWVzCgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9uZXh0X2FjdGlvbl9zdGF0ZShhY3Rpb24sIGV4aXRfY29kZSwgY3VycmVudF9saW5lKQoKICAgICAgICAjIElmIG5vIGFjdGlvbiBtYXRjaGVkLCBmYWxsYmFjayB0byBkZWZhdWx0IG9uZXMKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X25leHRfYWN0aW9uX3N0YXRlKE5vbmUsIGV4aXRfY29kZSwgY3VycmVudF9saW5lKQoKICAgIGRlZiBfZ2V0X25leHRfYWN0aW9uX3N0YXRlKHNlbGYsIGFjdGlvbiwgZXhpdF9jb2RlLCBjdXJyZW50X2xpbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZSB0aGUgbmV4dCBhY3Rpb24sIGV4aXQgY29kZSwgYW5kIG5leHQgbGluZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWN0aW9uIChTZWxlY3Rpb24pOiBBY3Rpb24gdG8gcHJvY2VlZAogICAgICAgICAgICBleGl0X2NvZGUgKEludGVnZXIpOiBFeGl0IGNvZGUKICAgICAgICAgICAgY3VycmVudF9saW5lIChjeC50b3dlci5wbGFuLmxpbmUoKSk6IEN1cnJlbnQgbGluZQoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBhY3Rpb24sIGV4aXRfY29kZSwgbmV4dF9saW5lIChTZWxlY3Rpb24sIEludGVnZXIsIGN4LnRvd2VyLnBsYW4ubGluZSgpKQogICAgICAgICIiIgogICAgICAgIGxpbmVzID0gY3VycmVudF9saW5lLnBsYW5faWQubGluZV9pZHMKICAgICAgICBpc19sYXN0X2xpbmUgPSBjdXJyZW50X2xpbmUgPT0gbGluZXNbLTFdCgogICAgICAgICMgSWYgbm8gY29uZGl0aW9ucyB3ZXJlIG1ldCBmYWxsYmFjayB0byBkZWZhdWx0IG9uZXMKICAgICAgICBpZiBub3QgYWN0aW9uOgogICAgICAgICAgICBhY3Rpb24gPSAibiIgaWYgZXhpdF9jb2RlID09IDAgZWxzZSBjdXJyZW50X2xpbmUucGxhbl9pZC5vbl9lcnJvcl9hY3Rpb24KCiAgICAgICAgICAgICMgRXhpdCB3aXRoIGN1c3RvbSBjb2RlCiAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiZWMiOgogICAgICAgICAgICAgICAgZXhpdF9jb2RlID0gY3VycmVudF9saW5lLnBsYW5faWQuY3VzdG9tX2V4aXRfY29kZQoKICAgICAgICAjIERldGVybWluZSB0aGUgbmV4dCBsaW5lIGlmIGN1cnJlbnQgaXMgbm90IHRoZSBsYXN0IG9uZQogICAgICAgIG5leHRfbGluZSA9IE5vbmUKICAgICAgICBpZiBhY3Rpb24gPT0gIm4iIGFuZCBub3QgaXNfbGFzdF9saW5lOgogICAgICAgICAgICBuZXh0X2xpbmUgPSBsaW5lc1tpbmRleE9mKGxpbmVzLCBjdXJyZW50X2xpbmUpICsgMV0KCiAgICAgICAgIyBFeGl0IHdpdGggY29tbWFuZCBjb2RlIGlmIG5vdCBleGl0aW5nIHdpdGggY3VzdG9tIGNvZGUKICAgICAgICBpZiBpc19sYXN0X2xpbmUgYW5kIGFjdGlvbiAhPSAiZWMiOgogICAgICAgICAgICBhY3Rpb24gPSAiZSIKCiAgICAgICAgcmV0dXJuIGFjdGlvbiwgZXhpdF9jb2RlLCBuZXh0X2xpbmUKCiAgICBkZWYgX3J1bl9uZXh0X2FjdGlvbihzZWxmLCBjb21tYW5kX2xvZyk6CiAgICAgICAgIiIiUnVuIG5leHQgYWN0aW9uIGJhc2VkIG9uIHRoZSBjb21tYW5kIHJlc3VsdAoKICAgICAgICBBcmdzOgogICAgICAgICAgICBjb21tYW5kX2xvZyAoY3gudG93ZXIuY29tbWFuZC5sb2coKSk6IENvbW1hbmQgbG9nIHJlY29yZAogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgYWN0aW9uLCBleGl0X2NvZGUsIHBsYW5fbGluZSA9IHNlbGYuX2dldF9uZXh0X2FjdGlvbl92YWx1ZXMoY29tbWFuZF9sb2cpCiAgICAgICAgcGxhbl9sb2cgPSBjb21tYW5kX2xvZy5wbGFuX2xvZ19pZAoKICAgICAgICAjIFVwZGF0ZSBsb2cgbWVzc2FnZQogICAgICAgIGlmIGV4aXRfY29kZSA9PSBQTEFOX0xJTkVfQ09ORElUSU9OX0NIRUNLX0ZBSUxFRDoKICAgICAgICAgICAgIyBzYXZlIGxvZyBleGl0IGNvZGUgYXMgc3VjY2VzcwogICAgICAgICAgICBleGl0X2NvZGUgPSAwCgogICAgICAgICMgUnVuIG5leHQgbGluZQogICAgICAgIGlmIGFjdGlvbiA9PSAibiIgYW5kIHBsYW5fbGluZToKICAgICAgICAgICAgc2VydmVyID0gY29tbWFuZF9sb2cuc2VydmVyX2lkCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IGNvbW1hbmRfbG9nLnZhcmlhYmxlX3ZhbHVlcyBvciBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMKICAgICAgICAgICAgaWYgcGxhbl9saW5lLl9pc19leGVjdXRhYmxlX2xpbmUoCiAgICAgICAgICAgICAgICBzZXJ2ZXI9c2VydmVyLAogICAgICAgICAgICAgICAgamV0X3RlbXBsYXRlPXBsYW5fbG9nLmpldF90ZW1wbGF0ZV9pZCwKICAgICAgICAgICAgICAgIGpldD1wbGFuX2xvZy5qZXRfaWQsCiAgICAgICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXM9dmFyaWFibGVfdmFsdWVzLAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcGxhbl9saW5lLl9ydW4oCiAgICAgICAgICAgICAgICAgICAgc2VydmVyLAogICAgICAgICAgICAgICAgICAgIHBsYW5fbG9nLAogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcz12YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwbGFuX2xpbmUuX3NraXAoCiAgICAgICAgICAgICAgICAgICAgc2VydmVyLAogICAgICAgICAgICAgICAgICAgIHBsYW5fbG9nLAogICAgICAgICAgICAgICAgICAgIGxvZz17InZhcmlhYmxlX3ZhbHVlcyI6IGRpY3QodmFyaWFibGVfdmFsdWVzIG9yIHt9KX0sCiAgICAgICAgICAgICAgICApCgogICAgICAgICMgRXhpdAogICAgICAgIGlmIGFjdGlvbiBpbiBbImUiLCAiZWMiXToKICAgICAgICAgICAgcGxhbl9sb2cuZmluaXNoKGV4aXRfY29kZSkKCiAgICAgICAgIyBOQjogd2UgYXJlIG5vdCBwdXR0aW5nIGFueSBmYWxsYmFjayBoZXJlIGluIGNhc2UKICAgICAgICAjIHNvbWVvbmUgbmVlZHMgdG8gaW5oZXJpdCBhbmQgZXh0ZW5kIHRoaXMgZnVuY3Rpb24K \ No newline at end of file