From fc845bf79a23aab95cc72b26f80b2829f1bbaba0 Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 06:57:42 +0000 Subject: [PATCH] Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) --- .../models/cx_tower_webhook_authenticator.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/cetmix_tower_webhook/models/cx_tower_webhook_authenticator.py diff --git a/addons/cetmix_tower_webhook/models/cx_tower_webhook_authenticator.py b/addons/cetmix_tower_webhook/models/cx_tower_webhook_authenticator.py new file mode 100644 index 0000000..c8098bf --- /dev/null +++ b/addons/cetmix_tower_webhook/models/cx_tower_webhook_authenticator.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmltcG9ydCBpcGFkZHJlc3MKaW1wb3J0IGxvZ2dpbmcKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwpmcm9tIG9kb28uZXhjZXB0aW9ucyBpbXBvcnQgVmFsaWRhdGlvbkVycm9yCmZyb20gb2Rvby5odHRwIGltcG9ydCByZXF1ZXN0Cgpmcm9tIC5jb25zdGFudHMgaW1wb3J0ICgKICAgIERFRkFVTFRfV0VCSE9PS19BVVRIRU5USUNBVE9SX0NPREUsCiAgICBERUZBVUxUX1dFQkhPT0tfQVVUSEVOVElDQVRPUl9DT0RFX0hFTFAsCikKCl9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDeFRvd2VyV2ViaG9va0F1dGhlbnRpY2F0b3IobW9kZWxzLk1vZGVsKToKICAgIF9uYW1lID0gImN4LnRvd2VyLndlYmhvb2suYXV0aGVudGljYXRvciIKICAgIF9pbmhlcml0ID0gWwogICAgICAgICJjeC50b3dlci53ZWJob29rLmV2YWwubWl4aW4iLAogICAgXQogICAgX2Rlc2NyaXB0aW9uID0gIldlYmhvb2sgQXV0aGVudGljYXRvciIKCiAgICBsb2dfY291bnQgPSBmaWVsZHMuSW50ZWdlcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9sb2dfY291bnQiLAogICAgKQogICAgYWxsb3dlZF9pcF9hZGRyZXNzZXMgPSBmaWVsZHMuVGV4dCgKICAgICAgICBzdHJpbmc9IkFsbG93ZWQgSVBzIiwKICAgICAgICBoZWxwPSJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgYW5kL29yIHN1Ym5ldHMgIgogICAgICAgICIoZS5nLiAxOTIuMTY4LjEuMTAsMTkyLjE2OC4yLjAvMjQsMTAuMC4wLjEsMjAwMTpkYjg6Oi8zMiwyYTAwOjE0NTA6NDAwMTo4MjQ6OjIwMGUpLiAiICAjIG5vcWE6IEU1MDEKICAgICAgICAiUmVxdWVzdHMgZnJvbSBvdGhlciBhZGRyZXNzZXMgd2lsbCBiZSBkZW5pZWQuIiwKICAgICkKICAgIHRydXN0ZWRfcHJveHlfaXBzID0gZmllbGRzLlRleHQoCiAgICAgICAgc3RyaW5nPSJUcnVzdGVkIFByb3h5IElQcyIsCiAgICAgICAgaGVscD0iQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdHJ1c3RlZCBwcm94eSBJUCBhZGRyZXNzZXMgb3IgQ0lEUiByYW5nZXMgIgogICAgICAgICIoZS5nLiwgMTAuMC4wLjEsMTkyLjE2OC4xLjAvMjQpLiAiCiAgICAgICAgIk9ubHkgdGhlc2UgcHJveGllcyBjYW4gc2V0IFgtRm9yd2FyZGVkLUZvciBoZWFkZXJzLiIsCiAgICApCiAgICB2YXJpYWJsZV9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl93ZWJob29rX2F1dGhlbnRpY2F0b3JfdmFyaWFibGVfcmVsIiwKICAgICAgICBjb2x1bW4xPSJ3ZWJob29rX2F1dGhlbnRpY2F0b3JfaWQiLAogICAgICAgIGNvbHVtbjI9InZhcmlhYmxlX2lkIiwKICAgICkKCiAgICBAYXBpLmNvbnN0cmFpbnMoInRydXN0ZWRfcHJveHlfaXBzIikKICAgIGRlZiBfY2hlY2tfdHJ1c3RlZF9wcm94eV9pcHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVmFsaWRhdGUgJ3RydXN0ZWRfcHJveHlfaXBzJyBlbnRyaWVzLiBBY2NlcHRzIHNpbmdsZSBJUHMgYW5kIENJRFIgcmFuZ2VzCiAgICAgICAgKElQdjQvSVB2NikuIEVtcHR5IHZhbHVlIGlzIGFsbG93ZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICBpbnZhbGlkID0gc2VsZi5fdmFsaWRhdGVfaXBfdG9rZW4oKHJlYy50cnVzdGVkX3Byb3h5X2lwcyBvciAiIikuc3RyaXAoKSkKICAgICAgICAgICAgaWYgaW52YWxpZDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJJbnZhbGlkIHRydXN0ZWQgcHJveHkgZW50cnk6ICVzIikgJSBpbnZhbGlkKQoKICAgIEBhcGkuY29uc3RyYWlucygiYWxsb3dlZF9pcF9hZGRyZXNzZXMiKQogICAgZGVmIF9jaGVja19hbGxvd2VkX2lwX2FkZHJlc3NlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSAnYWxsb3dlZF9pcF9hZGRyZXNzZXMnIGVudHJpZXMuIEFjY2VwdHMgc2luZ2xlIElQcyBhbmQgQ0lEUgogICAgICAgIHJhbmdlcyAoSVB2NC9JUHY2KS4gRW1wdHkgdmFsdWUgaXMgYWxsb3dlZCAobWVhbnMgYWxsb3cgYWxsKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVjIGluIHNlbGY6CiAgICAgICAgICAgIGludmFsaWQgPSBzZWxmLl92YWxpZGF0ZV9pcF90b2tlbigocmVjLmFsbG93ZWRfaXBfYWRkcmVzc2VzIG9yICIiKS5zdHJpcCgpKQogICAgICAgICAgICBpZiBpbnZhbGlkOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKF8oIkludmFsaWQgYWxsb3dlZCBJUC9DSURSIGVudHJ5OiAlcyIpICUgaW52YWxpZCkKCiAgICBkZWYgX2NvbXB1dGVfbG9nX2NvdW50KHNlbGYpOgogICAgICAgICIiIkNvbXB1dGUgbG9nIGNvdW50LiIiIgogICAgICAgIHJlc3VsdCA9IHNlbGYuZW52WyJjeC50b3dlci53ZWJob29rLmxvZyJdLnJlYWRfZ3JvdXAoCiAgICAgICAgICAgIGRvbWFpbj1bKCJhdXRoZW50aWNhdG9yX2lkIiwgImluIiwgc2VsZi5pZHMpXSwKICAgICAgICAgICAgZmllbGRzPVsiYXV0aGVudGljYXRvcl9pZCJdLAogICAgICAgICAgICBncm91cGJ5PVsiYXV0aGVudGljYXRvcl9pZCJdLAogICAgICAgICkKICAgICAgICBtYXBwZWRfZGF0YSA9IHsKICAgICAgICAgICAgclsiYXV0aGVudGljYXRvcl9pZCJdWzBdOiByWyJhdXRoZW50aWNhdG9yX2lkX2NvdW50Il0gZm9yIHIgaW4gcmVzdWx0CiAgICAgICAgfQogICAgICAgIGZvciByZWMgaW4gc2VsZjoKICAgICAgICAgICAgcmVjLmxvZ19jb3VudCA9IG1hcHBlZF9kYXRhLmdldChyZWMuaWQsIDApCgogICAgZGVmIF9kZWZhdWx0X2V2YWxfY29kZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGRlZmF1bHQgUHl0aG9uIGNvZGUgZm9yIHRoZSB3ZWJob29rIGF1dGhlbnRpY2F0b3IuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIHN0cjogRGVmYXVsdCBhdXRoZW50aWNhdG9yIGNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIERFRkFVTFRfV0VCSE9PS19BVVRIRU5USUNBVE9SX0NPREUKCiAgICBkZWYgX2dldF9kZWZhdWx0X3B5dGhvbl9ldmFsX2NvZGVfaGVscChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGRlZmF1bHQgaGVscCB0ZXh0IGZvciB0aGUgYXV0aGVudGljYXRvciBjb2RlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBzdHI6IENvZGUgaGVscCBkZXNjcmlwdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gREVGQVVMVF9XRUJIT09LX0FVVEhFTlRJQ0FUT1JfQ09ERV9IRUxQCgogICAgZGVmIF9nZXRfcHl0aG9uX2V2YWxfb2Rvb19vYmplY3RzKHNlbGYsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBFeHRlbmQgdGhlIFB5dGhvbiBldmFsdWF0aW9uIGNvbnRleHQgd2l0aCBjdXN0b20gT2RvbyBvYmplY3RzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICAqKmt3YXJnczogRXh0cmEgY29udGV4dCB2YWx1ZXMsIGUuZy46CiAgICAgICAgICAgICAgICAtICJoZWFkZXJzIjogcmVxdWVzdCBoZWFkZXJzIChkaWN0KQogICAgICAgICAgICAgICAgLSAicmF3X2RhdGEiOiByZXF1ZXN0IGJvZHkgKGJ5dGVzKQogICAgICAgICAgICAgICAgLSAicGF5bG9hZCI6IHBhcnNlZCByZXF1ZXN0IHBheWxvYWQgKGRpY3QpCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IE1hcHBpbmcgb2YgdmFyaWFibGVzIGF2YWlsYWJsZSBpbiBldmFsdWF0aW9uIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgcmVzID0gewogICAgICAgICAgICAiaGVhZGVycyI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBrd2FyZ3MuZ2V0KCJoZWFkZXJzIiksCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIkRpY3Rpb25hcnkgb2YgcmVxdWVzdCBoZWFkZXJzIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyYXdfZGF0YSI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBrd2FyZ3MuZ2V0KCJyYXdfZGF0YSIpLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKCJSYXcgYm9keSBvZiB0aGUgcmVxdWVzdCAoYnl0ZXMpIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwYXlsb2FkIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IGt3YXJncy5nZXQoInBheWxvYWQiKSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygKICAgICAgICAgICAgICAgICAgICAiRGljdGlvbmFyeSBjb250YWluaW5nIHRoZSByZXF1ZXN0IHBheWxvYWQgIgogICAgICAgICAgICAgICAgICAgICIoSlNPTiBmb3IgUE9TVCwgcGFyYW1zIGZvciBHRVQpIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICAgICAgcmVzLnVwZGF0ZShzdXBlcigpLl9nZXRfcHl0aG9uX2V2YWxfb2Rvb19vYmplY3RzKCoqa3dhcmdzKSkKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIF9nZXRfZmllbGRzX2Zvcl95YW1sKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEV4dGVuZCBmaWVsZHMgYXZhaWxhYmxlIGZvciBZQU1MIGV4cG9ydC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgbGlzdFtzdHJdOiBMaXN0IG9mIGZpZWxkIG5hbWVzLgogICAgICAgICIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9maWVsZHNfZm9yX3lhbWwoKQogICAgICAgIHJlcyArPSBbCiAgICAgICAgICAgICJuYW1lIiwKICAgICAgICAgICAgImNvZGUiLAogICAgICAgICAgICAiYWxsb3dlZF9pcF9hZGRyZXNzZXMiLAogICAgICAgICAgICAidHJ1c3RlZF9wcm94eV9pcHMiLAogICAgICAgICAgICAidmFyaWFibGVfaWRzIiwKICAgICAgICAgICAgInNlY3JldF9pZHMiLAogICAgICAgIF0KICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIGF1dGhlbnRpY2F0ZShzZWxmLCByYWlzZV9vbl9lcnJvcj1UcnVlLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIHRoZSBhdXRoZW50aWNhdG9yIGNvZGUgYW5kIHJldHVybiByZXN1bHQuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJhaXNlX29uX2Vycm9yIChib29sKTogUmFpc2UgVmFsaWRhdGlvbkVycm9yIG9uIGVycm9yIGlmIFRydWUuCiAgICAgICAgICAgIGt3YXJnczogQWRkaXRpb25hbCB2YXJpYWJsZXMgcGFzc2VkIHRvIHRoZSBjb2RlIGNvbnRleHQsIGUuZy46CiAgICAgICAgICAgICAgICAtICJoZWFkZXJzIjogcmVxdWVzdCBoZWFkZXJzIChkaWN0KQogICAgICAgICAgICAgICAgLSAicmF3X2RhdGEiOiByZXF1ZXN0IGJvZHkgKGJ5dGVzKQogICAgICAgICAgICAgICAgLSAicGF5bG9hZCI6IHBhcnNlZCByZXF1ZXN0IHBheWxvYWQgKGRpY3QpCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IHsKICAgICAgICAgICAgICAgICJhbGxvd2VkIjogPGJvb2w+LAogICAgICAgICAgICAgICAgImh0dHBfY29kZSI6IDxpbnQsIG9wdGlvbmFsPiwKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogPHN0ciwgb3B0aW9uYWw+LAogICAgICAgICAgICB9CiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3J1bl93ZWJob29rX2V2YWxfY29kZSgKICAgICAgICAgICAgICAgIHNlbGYuY29kZSwKICAgICAgICAgICAgICAgIGNvbnRleHRfZXh0cmE9ewogICAgICAgICAgICAgICAgICAgICJoZWFkZXJzIjoga3dhcmdzLmdldCgiaGVhZGVycyIpLAogICAgICAgICAgICAgICAgICAgICJyYXdfZGF0YSI6IGt3YXJncy5nZXQoInJhd19kYXRhIiksCiAgICAgICAgICAgICAgICAgICAgInBheWxvYWQiOiBrd2FyZ3MuZ2V0KCJwYXlsb2FkIiksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGVmYXVsdF9yZXN1bHQ9eyJhbGxvd2VkIjogRmFsc2V9LAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBpZiByYWlzZV9vbl9lcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJBdXRoZW50aWNhdGlvbiBjb2RlIGVycm9yOiAlcyIpICUgZSkgZnJvbSBlCiAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICJhbGxvd2VkIjogRmFsc2UsCiAgICAgICAgICAgICAgICAiaHR0cF9jb2RlIjogNTAwLAogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdHIoZSksCiAgICAgICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhY3Rpb25fdmlld19sb2dzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE9wZW4gdGhlIGFjdGlvbiBkaXNwbGF5aW5nIGxvZ3MgcmVsYXRlZCB0byB0aGlzIGF1dGhlbnRpY2F0b3IuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IEFjdGlvbiBkaWN0aW9uYXJ5IGZvciBgaXIuYWN0aW9ucy5hY3Rfd2luZG93YC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQogICAgICAgIGFjdGlvbiA9IHNlbGYuZW52WyJpci5hY3Rpb25zLmFjdGlvbnMiXS5fZm9yX3htbF9pZCgKICAgICAgICAgICAgImNldG1peF90b3dlcl93ZWJob29rLmN4X3Rvd2VyX3dlYmhvb2tfbG9nX2FjdGlvbiIKICAgICAgICApCiAgICAgICAgYWN0aW9uWyJkb21haW4iXSA9IFsoImF1dGhlbnRpY2F0b3JfaWQiLCAiPSIsIHNlbGYuaWQpXQogICAgICAgIHJldHVybiBhY3Rpb24KCiAgICBkZWYgaXNfaXBfYWxsb3dlZChzZWxmLCByZW1vdGVfYWRkcik6CiAgICAgICAgIiIiCiAgICAgICAgUHJveHktYXdhcmUgYWxsb3dsaXN0IGNoZWNrLgoKICAgICAgICBTdGVwczoKICAgICAgICAgICAgMSkgQ29tcHV0ZSB0aGUgZWZmZWN0aXZlIGNsaWVudCBJUC4KICAgICAgICAgICAgMikgSWYgJ2FsbG93ZWRfaXBfYWRkcmVzc2VzJyBpcyBlbXB0eTogYWxsb3cgZXZlcnlvbmUgKGJhY2t3YXJkIGNvbXBhdGlibGUpLgogICAgICAgICAgICAzKSBPdGhlcndpc2UsIGFsbG93IG9ubHkgaWYgdGhlIGNsaWVudCBJUCBiZWxvbmdzIHRvIGFueSBuZXR3b3JrIGluCiAgICAgICAgICAgICAgICdhbGxvd2VkX2lwX2FkZHJlc3NlcycuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJlbW90ZV9hZGRyIChzdHIpOiBJbW1lZGlhdGUgVENQIHBlZXIgSVAgKGNvbnRyb2xsZXItcHJvdmlkZWQpLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBib29sOiBUcnVlIGlmIGNsaWVudCBJUCBpcyBhbGxvd2VkLCBGYWxzZSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKCiAgICAgICAgY2xpZW50X2lwID0gc2VsZi5fZWZmZWN0aXZlX2NsaWVudF9pcChyZW1vdGVfYWRkcikKICAgICAgICBpZiBub3QgY2xpZW50X2lwOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgc3BlYyA9IChzZWxmLmFsbG93ZWRfaXBfYWRkcmVzc2VzIG9yICIiKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGFsbG93ZWRfbmV0cyA9IHNlbGYuX3BhcnNlX2lwX2xpc3RfdG9fbmV0d29ya3Moc3BlYykKICAgICAgICBpZiBub3QgYWxsb3dlZF9uZXRzOgogICAgICAgICAgICAjIE1pc2NvbmZpZ3VyZWQgYWxsb3dsaXN0OiBmYWlsIGNsb3NlZAogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIGFueShjbGllbnRfaXAgaW4gbmV0IGZvciBuZXQgaW4gYWxsb3dlZF9uZXRzKQoKICAgIGRlZiBfZWZmZWN0aXZlX2NsaWVudF9pcChzZWxmLCByZW1vdGVfYWRkcik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSB0aGUgZWZmZWN0aXZlIGNsaWVudCBJUCBmb3IgdGhlIGN1cnJlbnQgSFRUUCByZXF1ZXN0LgoKICAgICAgICBTZWN1cml0eSBtb2RlbDoKICAgICAgICAgICAgLSBUaGUgaW1tZWRpYXRlIFRDUCBwZWVyIGlzICdyZW1vdGVfYWRkcicKICAgICAgICAgICAgICAob3IgcmVxdWVzdC5odHRwcmVxdWVzdC5yZW1vdGVfYWRkcikuCiAgICAgICAgICAgIC0gWC1Gb3J3YXJkZWQtRm9yIC8gWC1SZWFsLUlQIGFyZSBob25vcmVkIE9OTFkgaWYgdGhlIGltbWVkaWF0ZSBwZWVyCiAgICAgICAgICAgICAgaXMgd2l0aGluICd0cnVzdGVkX3Byb3h5X2lwcycgKHNpbmdsZSBJUHMgb3IgQ0lEUiByYW5nZXMpLgogICAgICAgICAgICAtIElmIG5vdCBiZWhpbmQgYSB0cnVzdGVkIHByb3h5LCBoZWFkZXJzIGFyZSBpZ25vcmVkIHRvIHByZXZlbnQgc3Bvb2ZpbmcuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJlbW90ZV9hZGRyIChzdHIpOiBJbW1lZGlhdGUgVENQIHBlZXIgSVAgcGFzc2VkIGJ5IHRoZSBjb250cm9sbGVyLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBpcGFkZHJlc3MuSVB2NEFkZHJlc3N8aXBhZGRyZXNzLklQdjZBZGRyZXNzfE5vbmU6CiAgICAgICAgICAgIEVmZmVjdGl2ZSBjbGllbnQgSVAgb3IgTm9uZS4KICAgICAgICAiIiIKICAgICAgICBpbW1lZGlhdGVfcGVlciA9IHJlbW90ZV9hZGRyIG9yIGdldGF0dHIoCiAgICAgICAgICAgIGdldGF0dHIocmVxdWVzdCwgImh0dHByZXF1ZXN0IiwgTm9uZSksICJyZW1vdGVfYWRkciIsIE5vbmUKICAgICAgICApCiAgICAgICAgaWYgbm90IGltbWVkaWF0ZV9wZWVyOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltbWVkaWF0ZV9pcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKGltbWVkaWF0ZV9wZWVyKQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgY2xpZW50X2lwID0gaW1tZWRpYXRlX2lwICAjIGRlZmF1bHQgdG8gaW1tZWRpYXRlIHBlZXIKICAgICAgICB0cnVzdGVkX25ldHMgPSBzZWxmLl9wYXJzZV9pcF9saXN0X3RvX25ldHdvcmtzKAogICAgICAgICAgICAoc2VsZi50cnVzdGVkX3Byb3h5X2lwcyBvciAiIikuc3RyaXAoKQogICAgICAgICkKICAgICAgICBoZWFkZXJzID0gZ2V0YXR0cihnZXRhdHRyKHJlcXVlc3QsICJodHRwcmVxdWVzdCIsIE5vbmUpLCAiaGVhZGVycyIsIHt9KSBvciB7fQogICAgICAgIGlzX3RydXN0ZWRfcHJveHkgPSAoCiAgICAgICAgICAgIGFueShpbW1lZGlhdGVfaXAgaW4gbmV0IGZvciBuZXQgaW4gdHJ1c3RlZF9uZXRzKSBpZiB0cnVzdGVkX25ldHMgZWxzZSBGYWxzZQogICAgICAgICkKCiAgICAgICAgaWYgaXNfdHJ1c3RlZF9wcm94eToKICAgICAgICAgICAgY2FuZGlkYXRlID0gc2VsZi5fZXh0cmFjdF9pcF9mcm9tX2hlYWRlcihoZWFkZXJzLmdldCgiWC1Gb3J3YXJkZWQtRm9yIikpCiAgICAgICAgICAgIGlmIG5vdCBjYW5kaWRhdGU6CiAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBzZWxmLl9leHRyYWN0X2lwX2Zyb21faGVhZGVyKGhlYWRlcnMuZ2V0KCJYLVJlYWwtSVAiKSkKICAgICAgICAgICAgaWYgY2FuZGlkYXRlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNsaWVudF9pcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKGNhbmRpZGF0ZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIGltbWVkaWF0ZSBwZWVyIGlmIGNhbmRpZGF0ZSBpcyBpbnZhbGlkLgogICAgICAgICAgICAgICAgICAgIF9sb2dnZXIud2FybmluZygiSW52YWxpZCBJUC9DSURSIGVudHJ5IikKCiAgICAgICAgcmV0dXJuIGNsaWVudF9pcAoKICAgIGRlZiBfZXh0cmFjdF9pcF9mcm9tX2hlYWRlcihzZWxmLCBoZWFkZXJfdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIEV4dHJhY3QgdGhlIGZpcnN0IHZhbGlkIElQIGZyb20gYSBwcm94eS1wcm92aWRlZCBoZWFkZXIuCgogICAgICAgIEJlaGF2aW9yOgogICAgICAgICAgICAtIEZvciBYLUZvcndhcmRlZC1Gb3IsIHRoZSBsZWZ0LW1vc3QgZW50cnkgaXMKICAgICAgICAgICAgICBjb25zaWRlcmVkIHRoZSBvcmlnaW5hbCBjbGllbnQgSVAuCiAgICAgICAgICAgIC0gRm9yIFgtUmVhbC1JUCwgdGhlIHZhbHVlIGl0c2VsZiBpcyBjb25zaWRlcmVkLgogICAgICAgICAgICAtIEFueSBub24tSVAgdG9rZW5zIGFyZSBza2lwcGVkLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBoZWFkZXJfdmFsdWUgKHN0cik6IFJhdyBoZWFkZXIgdmFsdWUgKG1heSBjb250YWluIGNvbW1hcyBmb3IgWEZGKS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgc3RyfE5vbmU6IENvbXByZXNzZWQgSVB2NC9JUHY2IHN0cmluZywgb3IgTm9uZSBpZiBub3RoaW5nIHZhbGlkIGlzIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoZWFkZXJfdmFsdWU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZvciB0b2tlbiBpbiBoZWFkZXJfdmFsdWUuc3BsaXQoIiwiKToKICAgICAgICAgICAgaXBfc3RyID0gdG9rZW4uc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgaXBfc3RyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGlwYWRkcmVzcy5pcF9hZGRyZXNzKGlwX3N0cikuY29tcHJlc3NlZAogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX2lwX2xpc3RfdG9fbmV0d29ya3Moc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCBhIENTViBvZiBJUHMvQ0lEUnMgaW50byBhIGxpc3Qgb2YgaXBfbmV0d29yayBvYmplY3RzLgogICAgICAgIFNpbmdsZSBJUHMgYXJlIG5vcm1hbGl6ZWQgdG8gLzMyIChJUHY0KSBvciAvMTI4IChJUHY2KS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc3BlYyAoc3RyKTogQ1NWIG9mIElQcy9DSURScy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgbGlzdFtpcGFkZHJlc3MuSVB2NE5ldHdvcmt8aXBhZGRyZXNzLklQdjZOZXR3b3JrXQogICAgICAgICIiIgogICAgICAgIG5ldHMgPSBbXQogICAgICAgIGlmIG5vdCBzcGVjOgogICAgICAgICAgICByZXR1cm4gbmV0cwogICAgICAgIGZvciBwYXJ0IGluIHNwZWMuc3BsaXQoIiwiKToKICAgICAgICAgICAgcyA9IChwYXJ0IG9yICIiKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbmV0cy5hcHBlbmQoaXBhZGRyZXNzLmlwX25ldHdvcmsocywgc3RyaWN0PUZhbHNlKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIElQL0NJRFIgZW50cnkgZW5jb3VudGVyZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICJ0cnVzdGVkX3Byb3h5X2lwcyBjb25maWd1cmF0aW9uLiIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhzKQogICAgICAgICAgICAgICAgbmV0cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgaXBhZGRyZXNzLmlwX25ldHdvcmsoCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLmV4cGxvZGVkICsgKCIvMzIiIGlmIGlwLnZlcnNpb24gPT0gNCBlbHNlICIvMTI4IikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgaW52YWxpZCBlbnRyaWVzIHNpbGVudGx5OyB2YWxpZGF0aW9uIGlzIGhhbmRsZWQgYnkgY29uc3RyYWludHMuCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIHJldHVybiBuZXRzCgogICAgZGVmIF92YWxpZGF0ZV9pcF90b2tlbihzZWxmLCBzcGVjKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGZpcnN0IGludmFsaWQgdG9rZW4gZnJvbSBhIENTViBvZiBJUHMvQ0lEUnMsCiAgICAgICAgb3IgTm9uZSBpZiBhbGwgdmFsaWQuCiAgICAgICAgQWNjZXB0cyBzaW5nbGUgSVBzIGFuZCBDSURSIHJhbmdlcyAoSVB2NC9JUHY2KS4KICAgICAgICBFbXB0eS93aGl0ZXNwYWNlIHRva2VucyBhcmUgaWdub3JlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc3BlYzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmb3IgcGFydCBpbiBzcGVjLnNwbGl0KCIsIik6CiAgICAgICAgICAgIHMgPSAocGFydCBvciAiIikuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlwYWRkcmVzcy5pcF9uZXR3b3JrKHMsIHN0cmljdD1GYWxzZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgX2xvZ2dlci53YXJuaW5nKCJJbnZhbGlkIElQL0NJRFIgZW50cnkgZW5jb3VudGVyZWQiKQogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpcGFkZHJlc3MuaXBfYWRkcmVzcyhzKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBzCiAgICAgICAgcmV0dXJuIE5vbmUK \ No newline at end of file