diff --git a/addons/cetmix_tower_server/models/cetmix_tower.py b/addons/cetmix_tower_server/models/cetmix_tower.py new file mode 100644 index 0000000..8cea0bc --- /dev/null +++ b/addons/cetmix_tower_server/models/cetmix_tower.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHRpbWUKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIG9kb28gaW1wb3J0IF8sIGFwaSwgbW9kZWxzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKCmZyb20gLiBpbXBvcnQgdG9vbHMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBOT1RfRk9VTkQsIFNTSF9DT05ORUNUSU9OX0VSUk9SCgpfbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQ2V0bWl4VG93ZXIobW9kZWxzLkFic3RyYWN0TW9kZWwpOgogICAgIiIiR2VuZXJpYyBtb2RlbCB1c2VkIHRvIHNpbXBsaWZ5IE9kb28gYXV0b21hdGlvbi4KICAgIFVzZWQgdG8ga2VlcCBtYWluIGludGVncmF0aW9uIGZ1bmN0aW9uIGluIGEgc2luZ2xlIHBsYWNlLgogICAgIiIiCgogICAgX25hbWUgPSAiY2V0bWl4LnRvd2VyIgogICAgX2Rlc2NyaXB0aW9uID0gIkNldG1peCBUb3dlciBPZG9vIEF1dG9tYXRpb24iCgogICAgQGFwaS5tb2RlbAogICAgZGVmIHNlcnZlcl9jcmVhdGVfZnJvbV90ZW1wbGF0ZShzZWxmLCB0ZW1wbGF0ZV9yZWZlcmVuY2UsIHNlcnZlcl9uYW1lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgVEhJUyBNRVRIT0QgSVMgREVQUkVDQVRFRC4gVVNFIFRIRSAnY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlJyBNT0RFTCBESVJFQ1RMWS4KICAgICAgICAiIiIKICAgICAgICBfbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJzZXJ2ZXJfY3JlYXRlX2Zyb21fdGVtcGxhdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgIgogICAgICAgICAgICAiYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAiCiAgICAgICAgICAgICJVc2UgdGhlICdjeC50b3dlci5zZXJ2ZXIudGVtcGxhdGUnIG1vZGVsIGRpcmVjdGx5IGluc3RlYWQuIgogICAgICAgICkKICAgICAgICByZXR1cm4gc2VsZi5lbnZbImN4LnRvd2VyLnNlcnZlci50ZW1wbGF0ZSJdLmNyZWF0ZV9zZXJ2ZXJfZnJvbV90ZW1wbGF0ZSgKICAgICAgICAgICAgdGVtcGxhdGVfcmVmZXJlbmNlPXRlbXBsYXRlX3JlZmVyZW5jZSwgc2VydmVyX25hbWU9c2VydmVyX25hbWUsICoqa3dhcmdzCiAgICAgICAgKQoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBzZXJ2ZXJfcnVuX2NvbW1hbmQoCiAgICAgICAgc2VsZiwgc2VydmVyX3JlZmVyZW5jZSwgY29tbWFuZF9yZWZlcmVuY2UsIGdldF9yZXN1bHQ9VHJ1ZSwgKip2YXJpYWJsZV92YWx1ZXMKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgVEhJUyBNRVRIT0QgSVMgREVQUkVDQVRFRC4gVVNFIFRIRSAnY3gudG93ZXIuc2VydmVyJyBNT0RFTCBESVJFQ1RMWS4KICAgICAgICAiIiIKCiAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAic2VydmVyX3J1bl9jb21tYW5kOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCAiCiAgICAgICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAiVXNlIHRoZSAnY3gudG93ZXIuc2VydmVyJyBtb2RlbCBkaXJlY3RseSBpbnN0ZWFkLiIKICAgICAgICApCiAgICAgICAgc2VydmVyID0gc2VsZi5lbnZbImN4LnRvd2VyLnNlcnZlciJdLmdldF9ieV9yZWZlcmVuY2Uoc2VydmVyX3JlZmVyZW5jZSkKICAgICAgICBpZiBub3Qgc2VydmVyOgogICAgICAgICAgICByZXR1cm4geyJleGl0X2NvZGUiOiBOT1RfRk9VTkQsICJtZXNzYWdlIjogXygiU2VydmVyIG5vdCBmb3VuZCIpfQogICAgICAgIGNvbW1hbmQgPSBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZCJdLmdldF9ieV9yZWZlcmVuY2UoY29tbWFuZF9yZWZlcmVuY2UpCiAgICAgICAgaWYgbm90IGNvbW1hbmQ6CiAgICAgICAgICAgIHJldHVybiB7ImV4aXRfY29kZSI6IE5PVF9GT1VORCwgIm1lc3NhZ2UiOiBfKCJDb21tYW5kIG5vdCBmb3VuZCIpfQoKICAgICAgICAjIFdpbGwgcmV0dXJuIGNvbW1hbmQgcmVzdWx0IGlmIGdldF9yZXN1bHQgaXMgVHJ1ZQogICAgICAgICMgT3RoZXJ3aXNlIHdpbGwgc2F2ZSB0byBsb2cgYW5kIHJldHVybiBOb25lCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZXJ2ZXIud2l0aF9jb250ZXh0KG5vX2NvbW1hbmRfbG9nPWdldF9yZXN1bHQpLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBjb21tYW5kLCAqKnsidmFyaWFibGVfdmFsdWVzIjogdmFyaWFibGVfdmFsdWVzfSBpZiB2YXJpYWJsZV92YWx1ZXMgZWxzZSB7fQogICAgICAgICkKCiAgICAgICAgIyBSZXR1cm4gY29tbWFuZCByZXN1bHQgaWYgZ2V0X3Jlc3VsdCBpcyBUcnVlCiAgICAgICAgaWYgY29tbWFuZF9yZXN1bHQ6CiAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1hbmRfcmVzdWx0LmdldCgic3RhdHVzIikKICAgICAgICAgICAgcmVzcG9uc2UgPSBjb21tYW5kX3Jlc3VsdC5nZXQoInJlc3BvbnNlIiwgIiIpCiAgICAgICAgICAgIGVycm9yID0gY29tbWFuZF9yZXN1bHQuZ2V0KCJlcnJvciIsICIiKQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImV4aXRfY29kZSI6IHN0YXR1cywKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogcmVzcG9uc2Ugb3IgZXJyb3IsCiAgICAgICAgICAgIH0KCiAgICBkZWYgc2VydmVyX3J1bl9mbGlnaHRfcGxhbigKICAgICAgICBzZWxmLCBzZXJ2ZXJfcmVmZXJlbmNlLCBmbGlnaHRfcGxhbl9yZWZlcmVuY2UsICoqdmFyaWFibGVfdmFsdWVzCiAgICApOgogICAgICAgICIiIlRISVMgTUVUSE9EIElTIERFUFJFQ0FURUQuIFVTRSBUSEUgJ2N4LnRvd2VyLnNlcnZlcicgTU9ERUwgRElSRUNUTFkuIiIiCiAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAic2VydmVyX3J1bl9mbGlnaHRfcGxhbjogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgIgogICAgICAgICAgICAid2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICIKICAgICAgICAgICAgIlVzZSB0aGUgJ2N4LnRvd2VyLnNlcnZlcicgbW9kZWwgZGlyZWN0bHkgaW5zdGVhZC4iCiAgICAgICAgKQogICAgICAgIHNlcnZlciA9IHNlbGYuZW52WyJjeC50b3dlci5zZXJ2ZXIiXS5nZXRfYnlfcmVmZXJlbmNlKHNlcnZlcl9yZWZlcmVuY2UpCiAgICAgICAgaWYgbm90IHNlcnZlcjoKICAgICAgICAgICAgIyBUaGlzIGlzIG5vdCB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0bwogICAgICAgICAgICAjIGF2b2lkIGNvbXBsZXggcmVzcG9uc2UgaGFuZGxpbmcKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZmxpZ2h0X3BsYW4gPSBzZWxmLmVudlsiY3gudG93ZXIucGxhbiJdLmdldF9ieV9yZWZlcmVuY2UoZmxpZ2h0X3BsYW5fcmVmZXJlbmNlKQogICAgICAgIGlmIG5vdCBmbGlnaHRfcGxhbjoKICAgICAgICAgICAgIyBUaGlzIGlzIG5vdCB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0bwogICAgICAgICAgICAjIGF2b2lkIGNvbXBsZXggcmVzcG9uc2UgaGFuZGxpbmcKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlcnZlci5ydW5fZmxpZ2h0X3BsYW4oCiAgICAgICAgICAgIGZsaWdodF9wbGFuLAogICAgICAgICAgICAqKnsidmFyaWFibGVfdmFsdWVzIjogdmFyaWFibGVfdmFsdWVzfSBpZiB2YXJpYWJsZV92YWx1ZXMgZWxzZSB7fSwKICAgICAgICApCgogICAgQGFwaS5tb2RlbAogICAgZGVmIHNlcnZlcl9zZXRfdmFyaWFibGVfdmFsdWUoc2VsZiwgc2VydmVyX3JlZmVyZW5jZSwgdmFyaWFibGVfcmVmZXJlbmNlLCB2YWx1ZSk6CiAgICAgICAgIiIiVEhJUyBNRVRIT0QgSVMgREVQUkVDQVRFRC4gVVNFIFRIRSAnY3gudG93ZXIuc2VydmVyJyBNT0RFTCBESVJFQ1RMWS4iIiIKICAgICAgICBfbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJzZXJ2ZXJfc2V0X3ZhcmlhYmxlX3ZhbHVlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCAiCiAgICAgICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAiVXNlIHRoZSAnY3gudG93ZXIuc2VydmVyJyBtb2RlbCBkaXJlY3RseSBpbnN0ZWFkLiIKICAgICAgICApCiAgICAgICAgc2VydmVyID0gc2VsZi5lbnZbImN4LnRvd2VyLnNlcnZlciJdLmdldF9ieV9yZWZlcmVuY2Uoc2VydmVyX3JlZmVyZW5jZSkKICAgICAgICBpZiBub3Qgc2VydmVyOgogICAgICAgICAgICByZXR1cm4geyJleGl0X2NvZGUiOiBOT1RfRk9VTkQsICJtZXNzYWdlIjogXygiU2VydmVyIG5vdCBmb3VuZCIpfQogICAgICAgIHZhcmlhYmxlID0gc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlIl0uZ2V0X2J5X3JlZmVyZW5jZSh2YXJpYWJsZV9yZWZlcmVuY2UpCiAgICAgICAgaWYgbm90IHZhcmlhYmxlOgogICAgICAgICAgICByZXR1cm4geyJleGl0X2NvZGUiOiBOT1RfRk9VTkQsICJtZXNzYWdlIjogXygiVmFyaWFibGUgbm90IGZvdW5kIil9CgogICAgICAgICMgQ2hlY2sgaWYgdmFyaWFibGUgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgc2VydmVyCiAgICAgICAgdmFyaWFibGVfdmFsdWVfcmVjb3JkID0gdmFyaWFibGUudmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgdjogdi5zZXJ2ZXJfaWQgPT0gc2VydmVyCiAgICAgICAgKQogICAgICAgIGlmIHZhcmlhYmxlX3ZhbHVlX3JlY29yZDoKICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVfcmVjb3JkLnZhbHVlX2NoYXIgPSB2YWx1ZQogICAgICAgICAgICByZXN1bHQgPSB7ImV4aXRfY29kZSI6IDAsICJtZXNzYWdlIjogXygiVmFyaWFibGUgdmFsdWUgdXBkYXRlZCIpfQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIudmFyaWFibGUudmFsdWUiXS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogdmFyaWFibGUuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6IHZhbHVlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdCA9IHsiZXhpdF9jb2RlIjogMCwgIm1lc3NhZ2UiOiBfKCJWYXJpYWJsZSB2YWx1ZSBjcmVhdGVkIil9CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBzZXJ2ZXJfZ2V0X3ZhcmlhYmxlX3ZhbHVlKAogICAgICAgIHNlbGYsIHNlcnZlcl9yZWZlcmVuY2UsIHZhcmlhYmxlX3JlZmVyZW5jZSwgY2hlY2tfZ2xvYmFsPVRydWUKICAgICk6CiAgICAgICAgIiIiVEhJUyBNRVRIT0QgSVMgREVQUkVDQVRFRC4gVVNFIFRIRSAnY3gudG93ZXIuc2VydmVyJyBNT0RFTCBESVJFQ1RMWS4iIiIKICAgICAgICBfbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJzZXJ2ZXJfZ2V0X3ZhcmlhYmxlX3ZhbHVlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCAiCiAgICAgICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAiVXNlIHRoZSAnY3gudG93ZXIuc2VydmVyJyBtb2RlbCBkaXJlY3RseSBpbnN0ZWFkLiIKICAgICAgICApCiAgICAgICAgaWYgbm90IGNoZWNrX2dsb2JhbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZ2V0X3ZhcmlhYmxlX3ZhbHVlOiAnY2hlY2tfZ2xvYmFsJyBpcyBkZXByZWNhdGVkIGFuZCAiCiAgICAgICAgICAgICAgICAid2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICIKICAgICAgICAgICAgICAgICJHbG9iYWwgdmFsdWVzIGFyZSBhbHdheXMgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yLAogICAgICAgICAgICApCgogICAgICAgICMgR2V0IHNlcnZlciBieSByZWZlcmVuY2UKICAgICAgICBzZXJ2ZXIgPSBzZWxmLmVudlsiY3gudG93ZXIuc2VydmVyIl0uZ2V0X2J5X3JlZmVyZW5jZShzZXJ2ZXJfcmVmZXJlbmNlKQogICAgICAgIGlmIG5vdCBzZXJ2ZXI6CiAgICAgICAgICAgIF9sb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZ2V0X3ZhcmlhYmxlX3ZhbHVlOiBTZXJ2ZXIgbm90IGZvdW5kIGZvciByZWZlcmVuY2UgJyVzJyIsCiAgICAgICAgICAgICAgICBzZXJ2ZXJfcmVmZXJlbmNlLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlIl0KICAgICAgICAgICAgLl9nZXRfdmFyaWFibGVfdmFsdWVzX2J5X3JlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICB2YXJpYWJsZV9yZWZlcmVuY2VzPVt2YXJpYWJsZV9yZWZlcmVuY2VdLCBzZXJ2ZXI9c2VydmVyCiAgICAgICAgICAgICkKICAgICAgICAgICAgLmdldCh2YXJpYWJsZV9yZWZlcmVuY2UpCiAgICAgICAgKQoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBzZXJ2ZXJfY2hlY2tfc3NoX2Nvbm5lY3Rpb24oCiAgICAgICAgc2VsZiwKICAgICAgICBzZXJ2ZXJfcmVmZXJlbmNlLAogICAgICAgIGF0dGVtcHRzPTUsCiAgICAgICAgd2FpdF90aW1lPTEwLAogICAgICAgIHRyeV9jb21tYW5kPVRydWUsCiAgICAgICAgdHJ5X2ZpbGU9VHJ1ZSwKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgU1NIIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBhdmFpbGFibGUuCiAgICAgICAgVGhpcyBtZXRob2QgdXNlcyB0aGUgYHRlc3Rfc3NoX2Nvbm5lY3Rpb25gIG1ldGhvZAogICAgICAgIG9mIHRoZSAnY3gudG93ZXIuc2VydmVyJyBtb2RlbC4KICAgICAgICBJdCB0cmllcyB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgbXVsdGlwbGUgdGltZXMKICAgICAgICBhbmQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiB0aGUgUHl0aG9uIGNvbW1hbmRzIG9yCiAgICAgICAgT2RvbyBhdXRvbWF0ZWQgYWN0aW9ucy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyX3JlZmVyZW5jZSAoQ2hhcik6IFNlcnZlciByZWZlcmVuY2UuCiAgICAgICAgICAgIGF0dGVtcHRzIChpbnQpOiBOdW1iZXIgb2YgYXR0ZW1wdHMgdG8gdHJ5IHRoZSBjb25uZWN0aW9uLgogICAgICAgICAgICAgICAgRGVmYXVsdCBpcyA1LgogICAgICAgICAgICB3YWl0X3RpbWUgKGludCk6IFdhaXQgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gY29ubmVjdGlvbiBhdHRlbXB0cy4KICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgMTAgc2Vjb25kcy4KICAgICAgICAgICAgdHJ5X2NvbW1hbmQgKGJvb2wpOiBUcnkgdG8gZXhlY3V0ZSBhIGNvbW1hbmQuCiAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIFRydWUuCiAgICAgICAgICAgIHRyeV9maWxlIChib29sKTogVHJ5IGZpbGUgb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgVHJ1ZS4KICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbGlkYXRpb25FcnJvcjoKICAgICAgICAgICAgICAgIElmIHRoZSBwcm92aWRlZCBzZXJ2ZXIgcmVmZXJlbmNlIGlzIGludmFsaWQgb3IKICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIGZvdW5kLgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IHsKICAgICAgICAgICAgICAgICJleGl0X2NvZGUiOiBpbnQsCiAgICAgICAgICAgICAgICAgICAgMCBmb3Igc3VjY2VzcywKICAgICAgICAgICAgICAgICAgICBlcnJvciBjb2RlIGZvciBmYWlsdXJlCiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0ciAgIyBEZXNjcmlwdGlvbiBvZiB0aGUgcmVzdWx0CiAgICAgICAgICAgIH0KICAgICAgICAiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLmVudlsiY3gudG93ZXIuc2VydmVyIl0uZ2V0X2J5X3JlZmVyZW5jZShzZXJ2ZXJfcmVmZXJlbmNlKQogICAgICAgIGlmIG5vdCBzZXJ2ZXI6CiAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJObyBzZXJ2ZXIgZm91bmQgZm9yIHRoZSBwcm92aWRlZCByZWZlcmVuY2UuIikpCgogICAgICAgICMgVHJ5IGNvbm5lY3RpbmcgbXVsdGlwbGUgdGltZXMKICAgICAgICBmb3IgYXR0ZW1wdCBpbiByYW5nZSgxLCBhdHRlbXB0cyArIDEpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBfbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgJXMgb2YgJXMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgJXMiLAogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQsCiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHMsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyX3JlZmVyZW5jZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlcnZlci50ZXN0X3NzaF9jb25uZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIHJhaXNlX29uX2Vycm9yPVRydWUsCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuX25vdGlmaWNhdGlvbj1GYWxzZSwKICAgICAgICAgICAgICAgICAgICB0cnlfY29tbWFuZD10cnlfY29tbWFuZCwKICAgICAgICAgICAgICAgICAgICB0cnlfZmlsZT10cnlfZmlsZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5nZXQoInN0YXR1cyIpID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgImV4aXRfY29kZSI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogXygiQ29ubmVjdGlvbiBzdWNjZXNzZnVsLiIpLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIGF0dGVtcHQgPT0gYXR0ZW1wdHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgImV4aXRfY29kZSI6IFNTSF9DT05ORUNUSU9OX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IF8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbm5lY3QgYWZ0ZXIgJShhdHRlbXB0cylzIGF0dGVtcHRzLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6ICUoZXJyKXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHM9YXR0ZW1wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI9cmVzdWx0LmdldCgiZXJyb3IiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHQKICAgICAgICAgICAgICAgIGlmIGF0dGVtcHQgPT0gYXR0ZW1wdHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgImV4aXRfY29kZSI6IFNTSF9DT05ORUNUSU9OX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IF8oIkZhaWxlZCB0byBjb25uZWN0LiBFcnJvcjogJShlcnIpcyIsIGVycj1lKSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHRpbWUuc2xlZXAod2FpdF90aW1lKQoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBzZXJ2ZXJfdmFsaWRhdGVfc2VjcmV0KAogICAgICAgIHNlbGYsIHNlY3JldF92YWx1ZSwgc2VjcmV0X3JlZmVyZW5jZSwgc2VydmVyX3JlZmVyZW5jZT1Ob25lCiAgICApOgogICAgICAgICIiIgogICAgICAgIFZhbGlkYXRlcyB0aGUgcHJvdmlkZWQgc2VjcmV0IHZhbHVlIGFnYWluc3QgdGhlIGFjdHVhbCBzZWNyZXQuCgogICAgICAgIEFjY2VwdHMgZWl0aGVyIGEgZnVsbCBpbmxpbmUgcmVmZXJlbmNlIChlLmcuICMhY3h0b3dlci5zZWNyZXQuPFJFRkVSRU5DRT4hIykKICAgICAgICBvciBqdXN0IGEgPFJFRkVSRU5DRT4uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlY3JldF92YWx1ZSAoQ2hhcik6IFZhbHVlIHRvIHZhbGlkYXRlCiAgICAgICAgICAgIHNlY3JldF9yZWZlcmVuY2UgKENoYXIpOiBSZWZlcmVuY2UgY29kZSBvciBpbmxpbmUgcmVmZXJlbmNlCiAgICAgICAgICAgIHNlcnZlcl9yZWZlcmVuY2UgKENoYXIsIG9wdGlvbmFsKTogUmVmZXJlbmNlIGNvZGUgb2YgdGhlIHNlcnZlcgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEJvb2w6IFRydWUgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHNlY3JldCwgRmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5lbnZbImN4LnRvd2VyLnNlcnZlciJdCiAgICAgICAgaWYgc2VydmVyX3JlZmVyZW5jZToKICAgICAgICAgICAgc2VydmVyID0gc2VydmVyLmdldF9ieV9yZWZlcmVuY2Uoc2VydmVyX3JlZmVyZW5jZSkKCiAgICAgICAgIyBUcnkgdG8gZXh0cmFjdCByZWZlcmVuY2UgZnJvbSBpbmxpbmUgZm9ybWF0IHVzaW5nIF9leHRyYWN0X2tleV9wYXJ0cwogICAgICAgIGtleV9wYXJ0cyA9IHNlbGYuZW52WyJjeC50b3dlci5rZXkiXS5fZXh0cmFjdF9rZXlfcGFydHMoc2VjcmV0X3JlZmVyZW5jZSkKICAgICAgICBpZiBrZXlfcGFydHM6CiAgICAgICAgICAgICMgX2V4dHJhY3Rfa2V5X3BhcnRzIHJldHVybnMgYSB0dXBsZTogKGtleV90eXBlLCByZWZlcmVuY2UpLgogICAgICAgICAgICAjIFdlIG9ubHkgbmVlZCB0aGUgcmVmZXJlbmNlIHBhcnQgaGVyZS4KICAgICAgICAgICAgc2VjcmV0X3JlZmVyZW5jZSA9IGtleV9wYXJ0c1sxXQoKICAgICAgICB2YWx1ZSA9IHNlbGYuZW52WyJjeC50b3dlci5rZXkiXS5fcmVzb2x2ZV9rZXlfdHlwZV9zZWNyZXQoCiAgICAgICAgICAgIHNlY3JldF9yZWZlcmVuY2UsIHNlcnZlcl9pZD1zZXJ2ZXIuaWQKICAgICAgICApCiAgICAgICAgcmV0dXJuIHZhbHVlID09IHNlY3JldF92YWx1ZQoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBnZW5lcmF0ZV9yYW5kb21faWQoc2VsZiwgc2VjdGlvbnM9MSwgcG9wdWxhdGlvbj00LCBzZXBhcmF0b3I9Ii0iKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgbWV0aG9kIHRoYXQgYWxsb3dzIHRvIGdlbmVyYXRlIGEgcmFuZG9tIGlkCiAgICAgICAgd2l0aCBjdXN0b21pemFibGUgc2VjdGlvbnMgYW5kIHBvcHVsYXRpb24uCiAgICAgICAgU3VjaCBpZHMgYXJlIG1vcmUgaHVtYW4gcmVhZGFibGUgYW5kIGxlc3MgbGlrZWx5IHRvIGNvbGxpZGUuCgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzZWN0aW9ucyAoaW50KTogTnVtYmVyIG9mIHNlY3Rpb25zIHRvIGdlbmVyYXRlLgogICAgICAgICAgICBwb3B1bGF0aW9uIChpbnQpOiBQb3B1bGF0aW9uIG9mIHRoZSBzZWN0aW9ucy4KICAgICAgICAgICAgc2VwYXJhdG9yIChzdHIpOiBTZXBhcmF0b3IgYmV0d2VlbiBzZWN0aW9ucy4KICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBzdHI6IFJhbmRvbSBpZAogICAgICAgICIiIgogICAgICAgIHJldHVybiB0b29scy5nZW5lcmF0ZV9yYW5kb21faWQoCiAgICAgICAgICAgIHNlY3Rpb25zPXNlY3Rpb25zLCBwb3B1bGF0aW9uPXBvcHVsYXRpb24sIHNlcGFyYXRvcj1zZXBhcmF0b3IKICAgICAgICApCgogICAgQGFwaS5tb2RlbAogICAgZGVmIGlzX3ZhbGlkX3VybChzZWxmLCB1cmwsIG5vX3NjaGVtZV9jaGVjaz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIFVSTCBpcyBhIHZhbGlkIFVSTC4KICAgICAgICBUaGUgYHVybHBhcnNlYCBmdW5jdGlvbiBmcm9tIHRoZSBgdXJsbGliLnBhcnNlYCBtb2R1bGUgaXMgdXNlZC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgdXJsIChzdHIpOiBVUkwgdG8gY2hlY2sKICAgICAgICAgICAgbm9fc2NoZW1lX2NoZWNrIChib29sKTogSWYgVHJ1ZSwgdGhlIHNjaGVtZSBjaGVjayB3aWxsIGJlIHNraXBwZWQuCiAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBGYWxzZS4KICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBib29sOiBUcnVlIGlmIHRoZSBVUkwgaXMgdmFsaWQsIEZhbHNlIG90aGVyd2lzZQogICAgICAgICIiIgogICAgICAgIHJldHVybiB0b29scy5pc192YWxpZF91cmwodXJsPXVybCwgbm9fc2NoZW1lX2NoZWNrPW5vX3NjaGVtZV9jaGVjaykK \ No newline at end of file