diff --git a/addons/cetmix_tower_server/models/cx_tower_scheduled_task.py b/addons/cetmix_tower_server/models/cx_tower_scheduled_task.py new file mode 100644 index 0000000..288118e --- /dev/null +++ b/addons/cetmix_tower_server/models/cx_tower_scheduled_task.py @@ -0,0 +1 @@ +aW1wb3J0IGxvZ2dpbmcKZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCgpmcm9tIGRhdGV1dGlsLnJlbGF0aXZlZGVsdGEgaW1wb3J0IHJlbGF0aXZlZGVsdGEKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwpmcm9tIG9kb28uZXhjZXB0aW9ucyBpbXBvcnQgVmFsaWRhdGlvbkVycm9yCgpfbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQ3hUb3dlclNjaGVkdWxlZFRhc2sobW9kZWxzLk1vZGVsKToKICAgICIiIgogICAgU2NoZWR1bGVkIFRhc2tzLgogICAgVXNlZCB0byBzY2hlZHVsZSBjb21tYW5kcyBhbmQgZmxpZ2h0IHBsYW5zIHRvIHJ1biBvbiBzZXJ2ZXJzIGFuZCBqZXRzLgogICAgIiIiCgogICAgX25hbWUgPSAiY3gudG93ZXIuc2NoZWR1bGVkLnRhc2siCiAgICBfZGVzY3JpcHRpb24gPSAiU2NoZWR1bGVkIFRhc2siCiAgICBfaW5oZXJpdCA9IFsiY3gudG93ZXIuYWNjZXNzLnJvbGUubWl4aW4iLCAiY3gudG93ZXIucmVmZXJlbmNlLm1peGluIl0KICAgIF9vcmRlciA9ICJzZXF1ZW5jZSwgbmV4dF9jYWxsIgoKICAgIGFjdGl2ZSA9IGZpZWxkcy5Cb29sZWFuKGRlZmF1bHQ9VHJ1ZSkKICAgIHNlcXVlbmNlID0gZmllbGRzLkludGVnZXIoZGVmYXVsdD0xMCkKICAgIHNlcnZlcl9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgICJjeC50b3dlci5zZXJ2ZXIiLAogICAgICAgICJjeF90b3dlcl9zY2hlZHVsZWRfdGFza19zZXJ2ZXJfcmVsIiwKICAgICAgICAic2NoZWR1bGVkX3Rhc2tfaWQiLAogICAgICAgICJzZXJ2ZXJfaWQiLAogICAgICAgIHN0cmluZz0iU2VydmVycyIsCiAgICApCiAgICBzZXJ2ZXJfdGVtcGxhdGVfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBzdHJpbmc9IlNlcnZlciBUZW1wbGF0ZXMiLAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlIiwKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfc2VydmVyX3RlbXBsYXRlX3NjaGVkdWxlZF90YXNrX3JlbCIsCiAgICAgICAgY29sdW1uMT0ic2NoZWR1bGVkX3Rhc2tfaWQiLAogICAgICAgIGNvbHVtbjI9InNlcnZlcl90ZW1wbGF0ZV9pZCIsCiAgICApCiAgICBqZXRfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICAiY3gudG93ZXIuamV0IiwKICAgICAgICAiY3hfdG93ZXJfc2NoZWR1bGVkX3Rhc2tfamV0X3JlbCIsCiAgICAgICAgInNjaGVkdWxlZF90YXNrX2lkIiwKICAgICAgICAiamV0X2lkIiwKICAgICAgICBzdHJpbmc9IkpldHMiLAogICAgKQogICAgamV0X3RlbXBsYXRlX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgc3RyaW5nPSJKZXQgVGVtcGxhdGVzIiwKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZSIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9zY2hlZHVsZWRfdGFza19yZWwiLAogICAgICAgIGNvbHVtbjE9InNjaGVkdWxlZF90YXNrX2lkIiwKICAgICAgICBjb2x1bW4yPSJqZXRfdGVtcGxhdGVfaWQiLAogICAgKQogICAgYWN0aW9uID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBbKCJjb21tYW5kIiwgIkNvbW1hbmQiKSwgKCJwbGFuIiwgIkZsaWdodCBQbGFuIildLCByZXF1aXJlZD1UcnVlCiAgICApCiAgICBjb21tYW5kX2lkID0gZmllbGRzLk1hbnkyb25lKCJjeC50b3dlci5jb21tYW5kIiwgc3RyaW5nPSJDb21tYW5kIikKICAgIHBsYW5faWQgPSBmaWVsZHMuTWFueTJvbmUoc3RyaW5nPSJGbGlnaHQgUGxhbiIsIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIucGxhbiIpCiAgICBpc19ydW5uaW5nID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1GYWxzZSwgcmVhZG9ubHk9VHJ1ZSkKICAgIGludGVydmFsX251bWJlciA9IGZpZWxkcy5JbnRlZ2VyKGRlZmF1bHQ9MSwgaGVscD0iUmVwZWF0IGV2ZXJ5IHguIikKICAgIGludGVydmFsX3R5cGUgPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIFsKICAgICAgICAgICAgKCJtaW51dGVzIiwgIk1pbnV0ZXMiKSwKICAgICAgICAgICAgKCJob3VycyIsICJIb3VycyIpLAogICAgICAgICAgICAoImRheXMiLCAiRGF5cyIpLAogICAgICAgICAgICAoImRvdyIsICJEYXlzIG9mIFdlZWsiKSwKICAgICAgICAgICAgKCJ3ZWVrcyIsICJXZWVrcyIpLAogICAgICAgICAgICAoIm1vbnRocyIsICJNb250aHMiKSwKICAgICAgICBdLAogICAgICAgIHN0cmluZz0iSW50ZXJ2YWwgVW5pdCIsCiAgICAgICAgZGVmYXVsdD0ibW9udGhzIiwKICAgICkKICAgIG5leHRfY2FsbCA9IGZpZWxkcy5EYXRldGltZSgKICAgICAgICBzdHJpbmc9Ik5leHQgRXhlY3V0aW9uIERhdGUiLAogICAgICAgIHJlcXVpcmVkPVRydWUsCiAgICAgICAgZGVmYXVsdD1maWVsZHMuRGF0ZXRpbWUubm93LAogICAgICAgIGhlbHA9Ik5leHQgcGxhbm5lZCBleGVjdXRpb24gZGF0ZSBmb3IgdGhpcyB0YXNrLiIsCiAgICApCiAgICBsYXN0X2NhbGwgPSBmaWVsZHMuRGF0ZXRpbWUoCiAgICAgICAgc3RyaW5nPSJMYXN0IEV4ZWN1dGlvbiBEYXRlIiwgaGVscD0iUHJldmlvdXMgdGltZSB0aGUgdGFzayByYW4gc3VjY2Vzc2Z1bGx5LiIKICAgICkKICAgICMgRGF5cyBvZiB3ZWVrCiAgICBtb25kYXkgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PUZhbHNlKQogICAgdHVlc2RheSA9IGZpZWxkcy5Cb29sZWFuKGRlZmF1bHQ9RmFsc2UpCiAgICB3ZWRuZXNkYXkgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PUZhbHNlKQogICAgdGh1cnNkYXkgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PUZhbHNlKQogICAgZnJpZGF5ID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1GYWxzZSkKICAgIHNhdHVyZGF5ID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1GYWxzZSkKICAgIHN1bmRheSA9IGZpZWxkcy5Cb29sZWFuKGRlZmF1bHQ9RmFsc2UpCgogICAgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcyA9IGZpZWxkcy5PbmUybWFueSgKICAgICAgICAiY3gudG93ZXIuc2NoZWR1bGVkLnRhc2suY3YiLAogICAgICAgICJzY2hlZHVsZWRfdGFza19pZCIsCiAgICAgICAgc3RyaW5nPSJDdXN0b20gVmFyaWFibGUgVmFsdWVzIiwKICAgICkKICAgIHdhcm5pbmdfbWVzc2FnZSA9IGZpZWxkcy5UZXh0KAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3dhcm5pbmdfbWVzc2FnZSIsCiAgICApCgogICAgIyAtLS0tIEFjY2Vzcy4gQWRkIHJlbGF0aW9uIGZvciBtaXhpbiBmaWVsZHMKICAgIHVzZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfc2NoZWR1bGVkX3Rhc2tfdXNlcl9yZWwiLAogICAgKQogICAgbWFuYWdlcl9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9zY2hlZHVsZWRfdGFza19tYW5hZ2VyX3JlbCIsCiAgICApCgogICAgX3NxbF9jb25zdHJhaW50cyA9IFsKICAgICAgICAoCiAgICAgICAgICAgICJpbnRlcnZhbF9wb3NpdGl2ZSIsCiAgICAgICAgICAgICJDSEVDSyAoaW50ZXJ2YWxfbnVtYmVyID4gMCkiLAogICAgICAgICAgICAiSW50ZXJ2YWwgbnVtYmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiwKICAgICAgICApLAogICAgXQoKICAgIEBhcGkuY29uc3RyYWlucygKICAgICAgICAiaW50ZXJ2YWxfdHlwZSIsCiAgICAgICAgIm1vbmRheSIsCiAgICAgICAgInR1ZXNkYXkiLAogICAgICAgICJ3ZWRuZXNkYXkiLAogICAgICAgICJ0aHVyc2RheSIsCiAgICAgICAgImZyaWRheSIsCiAgICAgICAgInNhdHVyZGF5IiwKICAgICAgICAic3VuZGF5IiwKICAgICkKICAgIGRlZiBfY2hlY2tfZGF5c19vZl93ZWVrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBkYXkgb2Ygd2VlayBpcyBzZWxlY3RlZAogICAgICAgICIiIgogICAgICAgIGZvciB0YXNrIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHRhc2suaW50ZXJ2YWxfdHlwZSA9PSAiZG93IiBhbmQgbm90IGFueSgKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB0YXNrLm1vbmRheSwKICAgICAgICAgICAgICAgICAgICB0YXNrLnR1ZXNkYXksCiAgICAgICAgICAgICAgICAgICAgdGFzay53ZWRuZXNkYXksCiAgICAgICAgICAgICAgICAgICAgdGFzay50aHVyc2RheSwKICAgICAgICAgICAgICAgICAgICB0YXNrLmZyaWRheSwKICAgICAgICAgICAgICAgICAgICB0YXNrLnNhdHVyZGF5LAogICAgICAgICAgICAgICAgICAgIHRhc2suc3VuZGF5LAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgZGF5IG9mIHdlZWsgbXVzdCBiZSBzZWxlY3RlZCBmb3IgdGhlIHRhc2sgJyVzJy4iLAogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmRpc3BsYXlfbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgQGFwaS5kZXBlbmRzKCJpbnRlcnZhbF9udW1iZXIiLCAiaW50ZXJ2YWxfdHlwZSIpCiAgICBkZWYgX2NvbXB1dGVfd2FybmluZ19tZXNzYWdlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNob3cgd2FybmluZyBvbiB0aGUgdGFzayBmb3JtIGlmIGludGVydmFsIGluIHRoZSBzY2hlZHVsZWQgdGFzawogICAgICAgIGlzIGxlc3MgdGhhbiBpbnRlcnZhbCBpbiB0aGUgdW5kZXJsYXlpbmcgY3JvbiBqb2IuCiAgICAgICAgIiIiCiAgICAgICAgY3JvbiA9IHNlbGYuZW52LnJlZigKICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuaXJfY3Jvbl9ydW5fc2NoZWR1bGVkX3Rhc2tzIiwgcmFpc2VfaWZfbm90X2ZvdW5kPUZhbHNlCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBjcm9uOgogICAgICAgICAgICBzZWxmLndhcm5pbmdfbWVzc2FnZSA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFVzaW5nIG5vdydzIGRhdGUgYXMgdGhlIGJhc2UgcG9pbnQgZW5zdXJlcyBhIGNvbnNpc3RlbnQgYW5kIGNvbXBhcmFibGUKICAgICAgICAjIHJlZmVyZW5jZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBuZXh0IHNjaGVkdWxlZCBleGVjdXRpb24gZm9yIGJvdGggdGhlIGNyb24KICAgICAgICAjIGFuZCB0aGUgdGFza3MuCiAgICAgICAgbm93ID0gZmllbGRzLkRhdGV0aW1lLm5vdygpCiAgICAgICAgIyBfZ2V0X25leHRfY2FsbCBpcyBkZXNpZ25lZCBmb3IgdGFza3MsIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGZvciB0aGUKICAgICAgICAjIGNyb24gcmVjb3JkLCBhcyBib3RoIHNoYXJlIHRoZSBzYW1lIGludGVydmFsIGZpZWxkcy4gVGhpcyBrZWVwcyBpbnRlcnZhbAogICAgICAgICMgY29tcGFyaXNvbiBsb2dpYyBjb25zaXN0ZW50LgogICAgICAgIGNyb25fbmV4dCA9IHNlbGYuX2dldF9uZXh0X2NhbGwoY3Jvbiwgbm93KQoKICAgICAgICBmb3IgdGFzayBpbiBzZWxmOgogICAgICAgICAgICBpZiB0YXNrLmludGVydmFsX3R5cGUgPT0gImRvdyI6CiAgICAgICAgICAgICAgICB0YXNrLndhcm5pbmdfbWVzc2FnZSA9IEZhbHNlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0YXNrX25leHQgPSBzZWxmLl9nZXRfbmV4dF9jYWxsKHRhc2ssIG5vdykKICAgICAgICAgICAgaWYgdGFza19uZXh0IDwgY3Jvbl9uZXh0OgogICAgICAgICAgICAgICAgdGFzay53YXJuaW5nX21lc3NhZ2UgPSBfKAogICAgICAgICAgICAgICAgICAgICJUaGUgc2VsZWN0ZWQgdGFzayBpbnRlcnZhbCBpcyB0b28gbG93IGluIHJlbGF0aW9uIHRvIHRoZSBnZW5lcmFsICIKICAgICAgICAgICAgICAgICAgICAic3lzdGVtIHNldHRpbmdzLiBUaGlzIG1heSBsZWFkIHRvIHRhc2sgZXhlY3V0aW9uIGRlbGF5cy4iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0YXNrLndhcm5pbmdfbWVzc2FnZSA9IEZhbHNlCgogICAgZGVmIGFjdGlvbl9ydW4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIHNjaGVkdWxlZCBhY3Rpb24gYW5kIHJlc2NoZWR1bGUgbmV4dCBjYWxsLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9ydW4oKQoKICAgIGRlZiBhY3Rpb25fb3Blbl9jb21tYW5kX2xvZ3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgT3BlbiBjdXJyZW50IHNjaGVkdWxlZCB0YXNrIGNvbW1hbmQgbG9nIHJlY29yZHMKICAgICAgICAiIiIKICAgICAgICBhY3Rpb24gPSBzZWxmLmVudlsiaXIuYWN0aW9ucy5hY3Rpb25zIl0uX2Zvcl94bWxfaWQoCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmFjdGlvbl9jeF90b3dlcl9jb21tYW5kX2xvZyIKICAgICAgICApCiAgICAgICAgYWN0aW9uWyJkb21haW4iXSA9IFsoInNjaGVkdWxlZF90YXNrX2lkIiwgIj0iLCBzZWxmLmlkKV0gICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgIHJldHVybiBhY3Rpb24KCiAgICBkZWYgYWN0aW9uX29wZW5fcGxhbl9sb2dzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE9wZW4gY3VycmVudCBzY2hlZHVsZWQgdGFzayBmbGlnaHRwbGFuIGxvZyByZWNvcmRzCiAgICAgICAgIiIiCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0aW9ucyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5hY3Rpb25fY3hfdG93ZXJfcGxhbl9sb2ciCiAgICAgICAgKQogICAgICAgIGFjdGlvblsiZG9tYWluIl0gPSBbKCJzY2hlZHVsZWRfdGFza19pZCIsICI9Iiwgc2VsZi5pZCldICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICByZXR1cm4gYWN0aW9uCgogICAgQGFwaS5tb2RlbAogICAgZGVmIF9ydW5fc2NoZWR1bGVkX3Rhc2tzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENyb246IGZpbmRzIGR1ZSB0YXNrcyBhbmQgcnVucyB0aGVpciBhY3Rpb25zIChjb21tYW5kL3BsYW4pLgogICAgICAgIEhhbmRsZXMgZXJyb3JzIHBlci10YXNrIGFuZCByZXNlcnZlcyB0YXNrcyBhdG9taWNhbGx5IHRvIGF2b2lkIGRvdWJsZSBleGVjdXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbm93ID0gZmllbGRzLkRhdGV0aW1lLm5vdygpCiAgICAgICAgZHVlX3Rhc2tzID0gc2VsZi5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgibmV4dF9jYWxsIiwgIjw9Iiwgbm93KSwKICAgICAgICAgICAgICAgICgiYWN0aXZlIiwgIj0iLCBUcnVlKSwKICAgICAgICAgICAgICAgICgiaXNfcnVubmluZyIsICI9IiwgRmFsc2UpLAogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBkdWVfdGFza3M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkdWVfdGFza3Mud2l0aF9jb250ZXh0KGZyb21fY3Jvbj1UcnVlKS5fcnVuKCkKCiAgICBkZWYgX3J1bihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSdW4gc2NoZWR1bGVkIGFjdGlvbiBhbmQgcmVzY2hlZHVsZSBuZXh0IGNhbGwuCiAgICAgICAgIiIiCiAgICAgICAgdGFza3MgPSBzZWxmLl9yZXNlcnZlX3Rhc2tzKCkKICAgICAgICBpZiBub3QgdGFza3M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLmVudi5jb250ZXh0LmdldCgiZnJvbV9jcm9uIik6CiAgICAgICAgICAgICMgV0FSTklORzogRXhwbGljaXQgY29tbWl0IQogICAgICAgICAgICAjIFRoaXMgY29tbWl0IGlzIG1hZGUgKipvbmx5Kiogd2hlbiBjYWxsZWQgZnJvbSBjcm9uIChjb250ZXh0WyJmcm9tX2Nyb24iXSkuCiAgICAgICAgICAgICMgUmVhc29uOiBUbyBhdG9taWNhbGx5IHJlc2VydmUgc2NoZWR1bGVkIHRhc2tzIGJ5IHNldHRpbmcgaXNfcnVubmluZz1UcnVlLAogICAgICAgICAgICAjIHNvIHRoYXQgb25seSBvbmUgY3JvbiB3b3JrZXIgcHJvY2Vzc2VzIGVhY2ggdGFzaywgZXZlbiBpZiBtdWx0aXBsZSB3b3JrZXJzCiAgICAgICAgICAgICMgcGljayB1cCB0aGUgY3JvbiBqb2IgYXQgdGhlIHNhbWUgdGltZS4gV2l0aG91dCB0aGlzIGNvbW1pdCwgdGhlIGNoYW5nZQogICAgICAgICAgICAjIHdvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIG90aGVyIHRyYW5zYWN0aW9ucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjcm9uCiAgICAgICAgICAgICMgdHJhbnNhY3Rpb24sIGxlYWRpbmcgdG8gYSByYWNlIGNvbmRpdGlvbiBhbmQgcG9zc2libGUgZG91YmxlIGV4ZWN1dGlvbi4KICAgICAgICAgICAgIyBFeHBsaWNpdCBjb21taXRzIGFyZSBzdHJvbmdseSBkaXNjb3VyYWdlZCBpbiBPZG9vIGJ1c2luZXNzIGxvZ2ljIGFuZAogICAgICAgICAgICAjIHNob3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBjbGVhciBqdXN0aWZpY2F0aW9uIGFuZCBpbiBzdHJpY3RseSBjb250cm9sbGVkCiAgICAgICAgICAgICMgY29udGV4dHMgKGxpa2UgdGhpcyBjcm9uIHNjZW5hcmlvKS4gTmV2ZXIgYWRkIHRoaXMgY29tbWl0IGZvciBnZW5lcmFsCiAgICAgICAgICAgICMgYnVzaW5lc3MgZmxvd3MhCiAgICAgICAgICAgIHNlbGYuZW52LmNyLmNvbW1pdCgpICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLWNvbW1pdAoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIGZvciB0YXNrIGluIHRhc2tzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYuZW52LmNyLnNhdmVwb2ludCgpOgogICAgICAgICAgICAgICAgICAgIGlmIHRhc2suYWN0aW9uID09ICJjb21tYW5kIiBhbmQgdGFzay5jb21tYW5kX2lkOgogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLl9ydW5fY29tbWFuZCgpCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0YXNrLmFjdGlvbiA9PSAicGxhbiIgYW5kIHRhc2sucGxhbl9pZDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5fcnVuX3BsYW4oKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBfbG9nZ2VyLmV4Y2VwdGlvbihmIlNjaGVkdWxlZCB0YXNrIHt0YXNrLmlkfSBmYWlsZWQ6IHtlfSIpCgogICAgICAgICAgICAgICAgdGFza19lcnJvciA9IF8oCiAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBydW4gc2NoZWR1bGVkIHRhc2sgJyUoZilzJy4gRXJyb3I6ICUoZSlzIiwKICAgICAgICAgICAgICAgICAgICBmPXRhc2suZGlzcGxheV9uYW1lLAogICAgICAgICAgICAgICAgICAgIGU9ZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQodGFza19lcnJvcikKCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBmaW5pc2hlZF9hdCA9IGZpZWxkcy5EYXRldGltZS5ub3coKQogICAgICAgICAgICAgICAgIyBBbHdheXMgdXBkYXRlIHRoZSBzY2hlZHVsaW5nLCBldmVuIGlmIHRoZSB0YXNrIGZhaWxlZAogICAgICAgICAgICAgICAgdGFzay53cml0ZSgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXN0X2NhbGwiOiBmaW5pc2hlZF9hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIm5leHRfY2FsbCI6IHNlbGYuX2dldF9uZXh0X2NhbGwodGFzaywgdGFzay5uZXh0X2NhbGwpLAogICAgICAgICAgICAgICAgICAgICAgICAiaXNfcnVubmluZyI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKCiAgICAgICAgaWYgZXJyb3JzOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5jbGllbnQiLAogICAgICAgICAgICAgICAgInRhZyI6ICJkaXNwbGF5X25vdGlmaWNhdGlvbiIsCiAgICAgICAgICAgICAgICAicGFyYW1zIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IF8oIkZhaWx1cmUiKSwKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJcbiIuam9pbihlcnJvcnMpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidHlwZSI6ICJpci5hY3Rpb25zLmNsaWVudCIsCiAgICAgICAgICAgICJ0YWciOiAiZGlzcGxheV9ub3RpZmljYXRpb24iLAogICAgICAgICAgICAicGFyYW1zIjogewogICAgICAgICAgICAgICAgInRpdGxlIjogXygiU3VjY2VzcyIpLAogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBfKCJTY2hlZHVsZWQgdGFza3MgcnVuIHN1Y2Nlc3NmdWxseS4iKSwKICAgICAgICAgICAgfSwKICAgICAgICB9CgogICAgZGVmIF9nZXRfbmV4dF9jYWxsKHNlbGYsIHRhc2ssIGZyb21fZGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsY3VsYXRlIG5leHRfY2FsbCBkYXRldGltZQoKICAgICAgICB0YXNrOiBjeC50b3dlci5zY2hlZHVsZWQudGFzawogICAgICAgIGZyb21fZGF0ZTogZGF0ZXRpbWUKICAgICAgICAiIiIKICAgICAgICBpZiB0YXNrLmludGVydmFsX3R5cGUgPT0gImRvdyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfbmV4dF9jYWxsX2Rvdyh0YXNrLCBmcm9tX2RhdGUpCgogICAgICAgIG51bSA9IHRhc2suaW50ZXJ2YWxfbnVtYmVyIG9yIDEKICAgICAgICBpbnRlcnZhbHMgPSB7CiAgICAgICAgICAgICJtaW51dGVzIjogdGltZWRlbHRhKG1pbnV0ZXM9bnVtKSwKICAgICAgICAgICAgImhvdXJzIjogdGltZWRlbHRhKGhvdXJzPW51bSksCiAgICAgICAgICAgICJkYXlzIjogdGltZWRlbHRhKGRheXM9bnVtKSwKICAgICAgICAgICAgIndlZWtzIjogdGltZWRlbHRhKHdlZWtzPW51bSksCiAgICAgICAgICAgICJtb250aHMiOiByZWxhdGl2ZWRlbHRhKG1vbnRocz1udW0pLAogICAgICAgIH0KICAgICAgICByZXR1cm4gZnJvbV9kYXRlICsgaW50ZXJ2YWxzLmdldCh0YXNrLmludGVydmFsX3R5cGUsIHRpbWVkZWx0YSgpKQoKICAgIGRlZiBfZ2V0X3Rhc2tfc2VsZWN0ZWRfZGF5cyhzZWxmLCB0YXNrKToKICAgICAgICAiIiIKICAgICAgICBHZXQgbGlzdCBvZiBzZWxlY3RlZCB3ZWVrZGF5IG51bWJlcnMgZm9yIGEgdGFzawoKICAgICAgICB0YXNrOiBjeC50b3dlci5zY2hlZHVsZWQudGFzawogICAgICAgIFJldHVybnM6IGxpc3Qgb2Ygd2Vla2RheSBudW1iZXJzICgwPU1vbmRheSwgNj1TdW5kYXkpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZWN0ZWRfZGF5cyA9IFtdCiAgICAgICAgaWYgdGFzay5tb25kYXk6CiAgICAgICAgICAgIHNlbGVjdGVkX2RheXMuYXBwZW5kKDApCiAgICAgICAgaWYgdGFzay50dWVzZGF5OgogICAgICAgICAgICBzZWxlY3RlZF9kYXlzLmFwcGVuZCgxKQogICAgICAgIGlmIHRhc2sud2VkbmVzZGF5OgogICAgICAgICAgICBzZWxlY3RlZF9kYXlzLmFwcGVuZCgyKQogICAgICAgIGlmIHRhc2sudGh1cnNkYXk6CiAgICAgICAgICAgIHNlbGVjdGVkX2RheXMuYXBwZW5kKDMpCiAgICAgICAgaWYgdGFzay5mcmlkYXk6CiAgICAgICAgICAgIHNlbGVjdGVkX2RheXMuYXBwZW5kKDQpCiAgICAgICAgaWYgdGFzay5zYXR1cmRheToKICAgICAgICAgICAgc2VsZWN0ZWRfZGF5cy5hcHBlbmQoNSkKICAgICAgICBpZiB0YXNrLnN1bmRheToKICAgICAgICAgICAgc2VsZWN0ZWRfZGF5cy5hcHBlbmQoNikKICAgICAgICByZXR1cm4gc2VsZWN0ZWRfZGF5cwoKICAgIGRlZiBfZ2V0X25leHRfY2FsbF9kb3coc2VsZiwgdGFzaywgZnJvbV9kYXRlKToKICAgICAgICAiIiIKICAgICAgICBDYWxjdWxhdGUgbmV4dF9jYWxsIGRhdGV0aW1lIGZvciBkYXlzIG9mIHdlZWsgaW50ZXJ2YWwgdHlwZQoKICAgICAgICB0YXNrOiBjeC50b3dlci5zY2hlZHVsZWQudGFzawogICAgICAgIGZyb21fZGF0ZTogZGF0ZXRpbWUKICAgICAgICAiIiIKICAgICAgICAjIERheXMgb2Ygd2VlazogZmluZCBuZXh0IHNlbGVjdGVkIGRheSBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgIyB3ZWVrZGF5KCkgcmV0dXJucyAwPU1vbmRheSwgNj1TdW5kYXkKICAgICAgICBzZWxlY3RlZF9kYXlzID0gc2VsZi5fZ2V0X3Rhc2tfc2VsZWN0ZWRfZGF5cyh0YXNrKQogICAgICAgIGlmIG5vdCBzZWxlY3RlZF9kYXlzOgogICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgZGF5IG9mIHdlZWsgbXVzdCBiZSBzZWxlY3RlZCBmb3IgdGhlIHRhc2sgJyVzJy4iLAogICAgICAgICAgICAgICAgICAgIHRhc2suZGlzcGxheV9uYW1lLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgY3VycmVudF93ZWVrZGF5ID0gZnJvbV9kYXRlLndlZWtkYXkoKQoKICAgICAgICAjIEZpbmQgbmV4dCBzZWxlY3RlZCBkYXkgKHN0YXJ0aW5nIGZyb20gdG9tb3Jyb3cgdG8gZ2V0IG5leHQgb2NjdXJyZW5jZSkKICAgICAgICAjIENoZWNrIGRheXMgaW4gY3VycmVudCB3ZWVrIGZpcnN0IChhZnRlciB0b2RheSkKICAgICAgICBuZXh0X2RheSA9IE5vbmUKICAgICAgICBmb3IgZGF5IGluIHNlbGVjdGVkX2RheXM6CiAgICAgICAgICAgIGlmIGRheSA+IGN1cnJlbnRfd2Vla2RheToKICAgICAgICAgICAgICAgIG5leHRfZGF5ID0gZGF5CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIElmIG5vIGRheSBmb3VuZCBpbiBjdXJyZW50IHdlZWssIHRha2UgZmlyc3QgZGF5IG9mIG5leHQgd2VlawogICAgICAgIGlmIG5leHRfZGF5IGlzIE5vbmU6CiAgICAgICAgICAgIG5leHRfZGF5ID0gbWluKHNlbGVjdGVkX2RheXMpCiAgICAgICAgICAgIGRheXNfYWhlYWQgPSAoNyAtIGN1cnJlbnRfd2Vla2RheSkgKyBuZXh0X2RheQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRheXNfYWhlYWQgPSBuZXh0X2RheSAtIGN1cnJlbnRfd2Vla2RheQoKICAgICAgICAjIENyZWF0ZSBuZXcgZGF0ZXRpbWUgd2l0aCBzYW1lIHRpbWUsIG9uIHRoZSBuZXh0IHNlbGVjdGVkIGRheQogICAgICAgIG5leHRfZGF0ZSA9IGZyb21fZGF0ZSArIHRpbWVkZWx0YShkYXlzPWRheXNfYWhlYWQpCiAgICAgICAgcmV0dXJuIG5leHRfZGF0ZS5yZXBsYWNlKAogICAgICAgICAgICBob3VyPWZyb21fZGF0ZS5ob3VyLAogICAgICAgICAgICBtaW51dGU9ZnJvbV9kYXRlLm1pbnV0ZSwKICAgICAgICAgICAgc2Vjb25kPWZyb21fZGF0ZS5zZWNvbmQsCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kPWZyb21fZGF0ZS5taWNyb3NlY29uZCwKICAgICAgICApCgogICAgZGVmIF9ydW5fY29tbWFuZChzZWxmKToKICAgICAgICAiIiJSdW4gY29tbWFuZCBvbiBzZWxlY3RlZCBzZXJ2ZXJzLiIiIgogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IHsKICAgICAgICAgICAgdmFsdWUudmFyaWFibGVfaWQucmVmZXJlbmNlOiB2YWx1ZS52YWx1ZV9jaGFyCiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmLmN1c3RvbV92YXJpYWJsZV92YWx1ZV9pZHMKICAgICAgICB9CiAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAibG9nIjogeyJzY2hlZHVsZWRfdGFza19pZCI6IHNlbGYuaWR9LAogICAgICAgICAgICAidmFyaWFibGVfdmFsdWVzIjogdmFyaWFibGVfdmFsdWVzLAogICAgICAgIH0KICAgICAgICAjIFJ1biBmb3Igc2VydmVycwogICAgICAgIGZvciBzZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJfaWRzOgogICAgICAgICAgICBzZXJ2ZXIucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2lkLCAqKmt3YXJncykKICAgICAgICAjIFJ1biBmb3IgamV0cwogICAgICAgIGZvciBqZXQgaW4gc2VsZi5qZXRfaWRzOgogICAgICAgICAgICBqZXQucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2lkLCAqKmt3YXJncykKCiAgICBkZWYgX3J1bl9wbGFuKHNlbGYpOgogICAgICAgICIiIlJ1biBmbGlnaHQgcGxhbiBvbiBzZWxlY3RlZCBzZXJ2ZXJzLiIiIgogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IHsKICAgICAgICAgICAgdmFsdWUudmFyaWFibGVfaWQucmVmZXJlbmNlOiB2YWx1ZS52YWx1ZV9jaGFyCiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmLmN1c3RvbV92YXJpYWJsZV92YWx1ZV9pZHMKICAgICAgICB9CiAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAicGxhbl9sb2ciOiB7InNjaGVkdWxlZF90YXNrX2lkIjogc2VsZi5pZH0sCiAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZXMiOiB2YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgfQogICAgICAgICMgUnVuIGZvciBzZXJ2ZXJzCiAgICAgICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcl9pZHM6CiAgICAgICAgICAgIHNlcnZlci5ydW5fZmxpZ2h0X3BsYW4oc2VsZi5wbGFuX2lkLCAqKmt3YXJncykKICAgICAgICAjIFJ1biBmb3IgamV0cwogICAgICAgIGZvciBqZXQgaW4gc2VsZi5qZXRfaWRzOgogICAgICAgICAgICBqZXQucnVuX2ZsaWdodF9wbGFuKHNlbGYucGxhbl9pZCwgKiprd2FyZ3MpCgogICAgZGVmIF9yZXNlcnZlX3Rhc2tzKHNlbGYsIGxpbWl0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEF0b21pY2FsbHkgc2VsZWN0IGFuZCBsb2NrIGZyZWUgdGFza3MgZm9yIHByb2Nlc3NpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc3FsID0gIiIiCiAgICAgICAgICAgIFNFTEVDVCBpZAogICAgICAgICAgICBGUk9NIGN4X3Rvd2VyX3NjaGVkdWxlZF90YXNrCiAgICAgICAgICAgIFdIRVJFIGlzX3J1bm5pbmcgPSBGQUxTRSBBTkQgaWQgSU4gJXMKICAgICAgICAgICAgT1JERVIgQlkgaWQKICAgICAgICAiIiIKICAgICAgICBwYXJhbXMgPSBbdHVwbGUoc2VsZi5pZHMpXQogICAgICAgIGlmIGxpbWl0OgogICAgICAgICAgICBzcWwgKz0gIiBMSU1JVCAlcyIKICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChsaW1pdCkKICAgICAgICBzcWwgKz0gIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEIgogICAgICAgIHNlbGYuZW52LmNyLmV4ZWN1dGUoc3FsLCB0dXBsZShwYXJhbXMpKQoKICAgICAgICB0YXNrX2lkcyA9IFtyb3dbMF0gZm9yIHJvdyBpbiBzZWxmLmVudi5jci5mZXRjaGFsbCgpXQogICAgICAgIGlmIG5vdCB0YXNrX2lkczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnJvd3NlKCkKCiAgICAgICAgdGFza3MgPSBzZWxmLmJyb3dzZSh0YXNrX2lkcykKICAgICAgICB0YXNrcy53cml0ZSh7ImlzX3J1bm5pbmciOiBUcnVlfSkKICAgICAgICByZXR1cm4gdGFza3MK \ No newline at end of file