mirror of
https://github.com/imayushsaini/Bombsquad-Ballistica-Modded-Server.git
synced 2025-10-20 00:00:39 +00:00
40 lines
132 KiB
Python
40 lines
132 KiB
Python
# ba_meta require api 7
|
|
from __future__ import annotations
|
|
from typing import TYPE_CHECKING
|
|
import base64
|
|
_sp_ = ('\n')
|
|
|
|
exec(base64.b64decode("CmltcG9ydCBiYSxfYmEscmFuZG9tLHRpbWUsZGF0ZXRpbWUsd2Vha3JlZixqc29uLG9zCmltcG9ydCBiYS5pbnRlcm5hbApmcm9tIGJhc3RkLnVpLnByb2ZpbGUgaW1wb3J0IGJyb3dzZXIKZnJvbSBiYXN0ZC5hY3RvciBpbXBvcnQgYm9tYgpmcm9tIGJhc3RkLmFjdG9yIGltcG9ydCBwb3dlcnVwYm94ICBhcyBwdXBib3gKZnJvbSBiYXN0ZC5hY3Rvci5zcGF6Ym90IGltcG9ydCBTcGF6Qm90CmZyb20gYmFzdGQuYWN0b3IuYm9tYiBpbXBvcnQgKEJvbWIsQmxhc3QpCmZyb20gYmFzdGQudWkucG9wdXAgaW1wb3J0IChQb3B1cFdpbmRvdyxQb3B1cE1lbnVXaW5kb3csUG9wdXBNZW51KQpmcm9tIGJhc3RkLmFjdG9yLnNwYXogaW1wb3J0IChTcGF6LFNwYXpGYWN0b3J5LFBpY2t1cE1lc3NhZ2UsIFB1bmNoSGl0TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc2VFeHBsb2RlTWVzc2FnZSwgQm9tYkRpZWRNZXNzYWdlKQpmcm9tIGJhc3RkLm1haW5tZW51IGltcG9ydCAoTWFpbk1lbnVBY3Rpdml0eSxNYWluTWVudVNlc3Npb24pCmZyb20gYmFzdGQuZ2FtZXV0aWxzIGltcG9ydCBTaGFyZWRPYmplY3RzCmZyb20gYmFzdGQuYWN0b3IucG93ZXJ1cGJveCBpbXBvcnQgUG93ZXJ1cEJveEZhY3RvcnkKZnJvbSBiYXN0ZC5hY3Rvci5wb3B1cHRleHQgaW1wb3J0IFBvcHVwVGV4dApmcm9tIGJhc3RkLnVpLmNvbmZpcm0gaW1wb3J0IENvbmZpcm1XaW5kb3cKZnJvbSBiYXN0ZC5hY3Rvci5zcGF6IGltcG9ydCAqCgppZiBUWVBFX0NIRUNLSU5HOgogICAgcGFzcwoKIyA9PT0gTW9kIG1hZGUgYnkgQFBhdHJvbl9Nb2R6ID09PQoKZGVmIGdldGxhbmd1YWdlKHRleHQsIHN1YnM6IHN0ciA9IE5vbmUsIGFsbWFjZW46IGxpc3QgPSBbXSk6CiAgICBpZiBhbG1hY2VuID09IFtdOiBhbG1hY2VuID0gbGlzdChyYW5nZSgxMDAwKSkKICAgIGxhbmcgPSBfYmEuYXBwLmxhbmcubGFuZ3VhZ2UKICAgIHRyYW5zbGF0ZSA9IHsiUmVzZXQiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlJlaW5pY2lhciIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiUmVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlJlaW5pY2lhciJ9LAogICAgICAgICAgICAgICAgICJOb3RoaW5nIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJTaW4gcG90ZW5jaWFkb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiTm8gcG93ZXJ1cHMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlNlbSBwb3dlcnVwcyJ9LAogICAgICAgICAgICAgICAgICJBY3Rpb24gMSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiUG90ZW5jaWFkb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiUG93ZXJ1cHMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlBvd2VydXBzIn0sCiAgICAgICAgICAgICAgICAgIkFjdGlvbiAyIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJDb25maWd1cmFjacODwrNuIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiRGVmaW5pw4PCp8ODwrVlcyJ9LAogICAgICAgICAgICAgICAgICJBY3Rpb24gMyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiRXh0cmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJFeHRyYXMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkV4dHJhcyJ9LAogICAgICAgICAgICAgICAgICJBY3Rpb24gNCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiVGllbmRhIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTdG9yZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiTG9qYSJ9LAogICAgICAgICAgICAgICAgICJBY3Rpb24gNSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQ2FuamVhciBjw4PCs2RpZ28iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkVudGVyIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkPDg8KzZGlnbyBwcm9tb2Npb25hbCJ9LAogICAgICAgICAgICAgICAgICJDdXN0b20iOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiQ3VzdG9taXplIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJDdXN0b21pemFyIn0sCiAgICAgICAgICAgICAgICAgIkltcGFpcm1lbnQgQm9tYnMiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkJvbWJhcyBtZW5vc2NhYm8iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkh5cGVyYWN0aXZlIGJvbWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJCb21iYXMgaGlwZXJhdGl2YXMifSwKICAgICAgICAgICAgICAgICAiU3BlZWQiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlZlbG9jaWRhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiU3BlZWQiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlZlbG9jaWRhZGUifSwKICAgICAgICAgICAgICAgICAiRmlyZSBCb21icyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQm9tYmFzIGRlIGZ1ZWdvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJGaXJlIEJvbWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJCb21iYXMgZGUgZm9nbyJ9LAogICAgICAgICAgICAgICAgICJJY2UgTWFuIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJIb21icmUgZGUgaGllbG8iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkljZSBtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkhvbWVtIGRlIGdlbG8ifSwKICAgICAgICAgICAgICAgICAiRmx5IEJvbWJzIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJCb21iYXMgZXhwYW5zaXZhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiRXhwYW5zaXZlIGJvbWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJCb21iYXMgZXhwYW5zaXZhcyJ9LAogICAgICAgICAgICAgICAgICJHb29kYnllIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICLDgsKhSGFzdGEgbHVlZ28hIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJHb29kYnllISIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQWRldXMhIn0sCiAgICAgICAgICAgICAgICAgIkhlYWxpbmcgRGFtYWdlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJBdXRvLWN1cmFjacODwrNuIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJIZWFsaW5nIERhbWFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQXV0by1jdXJhIn0sCiAgICAgICAgICAgICAgICAgIlRhbmsgU2hpZWxkIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJTw4PCunBlciBibGluZGFqZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiUmVpbmZvcmNlZCBzaGllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkVzY3VkbyByZWZvcsODwqdhZG8ifSwKICAgICAgICAgICAgICAgICAiVGFuayBTaGllbGQgUFRHIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJQb3JjZW50YWplIGRlIGRpc21pbnVjacODwrNuIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJQZXJjZW50YWdlIGRlY3JlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiUGVyY2VudHVhbCByZWR1emlkbyJ9LAogICAgICAgICAgICAgICAgICJIZWFsaW5nIERhbWFnZSBQVEciOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlBvcmNlbnRhamUgZGUgcmVjdXBlcmFjacODwrNuIGRlIHNhbHVkIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJQZXJjZW50YWdlIG9mIGhlYWx0aCByZWNvdmVyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlBvcmNlbnRhZ2VtIGRlIHJlY3VwZXJhw4PCp8ODwqNvIGRlIHNhw4PCumRlIn0sCiAgICAgICAgICAgICAgICAgIlNZOiBCQUxMIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJFc2ZlcmEiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlNwaGVyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiRXNmZXJhIn0sCiAgICAgICAgICAgICAgICAgIlNZOiBJbXBhY3QiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkVzcGVjaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTcGVjaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJFc3BlY2lhbCJ9LAogICAgICAgICAgICAgICAgICJTWTogRWdnIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJIdWV2aXRvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJFZ2cgc2hhcGUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIk92byJ9LAogICAgICAgICAgICAgICAgICJQb3dlcnVwIFNjYWxlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJUYW1hw4PCsW8gZGVsIHBvdGVuY2lhZG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJQb3dlcnVwcyBzaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJUYW1hbmhvIGRlIHBvd2VydXBzIn0sCiAgICAgICAgICAgICAgICAgIlBvd2VydXAgV2l0aCBTaGllbGQiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlBvdGVuY2lhZG9yZXMgY29uIGVzY3VkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiUG93ZXJ1cHMgd2l0aCBzaGllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlBvd2VydXBzIGNvbSBlc2N1ZG8ifSwKICAgICAgICAgICAgICAgICAiUG93ZXJ1cCBUaW1lIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJNb3N0cmFyIFRlbXBvcml6YWRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiU2hvdyBlbmQgdGltZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiTW9zdHJhciBjcm9uw4PCtG1ldHJvIn0sCiAgICAgICAgICAgICAgICAgIlBvd2VydXAgU3R5bGUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkZvcm1hIGRlIGxvcyBwb3RlbmNpYWRvcmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTaGFwZSBvZiBwb3dlcnVwIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJGb3JtYSBkZSBwb3dlcnVwIn0sCiAgICAgICAgICAgICAgICAgIlBvd2VydXAgTmFtZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiTW9zdHJhciBub21icmUgZW4gbG9zIHBvdGVuY2lhZG9yZXMiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlNob3cgbmFtZSBvbiBwb3dlcnVwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiTW9zdHJhciBub21lIGVtIHBvd2VydXBzIn0sCiAgICAgICAgICAgICAgICAgIlBlcmNlbnRhZ2UiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlByb2JhYmlsaWRhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiU2hvdyBwZXJjZW50YWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJNb3N0cmFyIHBvcmNlbnRhZ2VtIn0sCiAgICAgICAgICAgICAgICAgIk9ubHkgSXRlbXMiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlPDg8KzbG8gQWNjZXNvcmlvcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiT25seSB1dGVuc2lscyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQXBlbmFzIHV0ZW5zaWxpb3MifSwKICAgICAgICAgICAgICAgICAiTmV3IjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJOdWV2byIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiTmV3IiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJOb3ZvIn0sCiAgICAgICAgICAgICAgICAgIk9ubHkgQm9tYnMiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlPDg8KzbG8gQm9tYmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJPbmx5IGJvbWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJBcGVuYXMgYm9tYmFzIn0sCiAgICAgICAgICAgICAgICAgIkNvaW5zIDAiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIk1vbmVkYXMgSW5zdWZpY2llbnRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiSW5zdWZmaWNpZW50IGNvaW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJNb2VkYXMgaW5zdWZpY2llbnRlcyJ9LAogICAgICAgICAgICAgICAgICJQdXJjaGFzZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQ29tcHJhIHJlYWxpemFkYSBjb3JyZWN0YW1lbnRlIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTdWNjZXNzZnVsIHB1cmNoYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJDb21wcmEgQmVtIFN1Y2VkaWRhIn0sCiAgICAgICAgICAgICAgICAgIkRvdWJsZSBQcm9kdWN0IjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJZYSBoYXMgY29tcHJhZG8gZXN0ZSBhcnTDg8KtY3VsbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiWW91J3ZlIGFscmVhZHkgYm91Z2h0IHRoaXMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlZvY2UgamEgY29tcHJvdSBpc3RvIn0sCiAgICAgICAgICAgICAgICAgIkJvdWdodCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQ29tcHJhZG8iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkJvdWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQ29tcHJvdSJ9LAogICAgICAgICAgICAgICAgICJDb25maXJtIFB1cmNoYXNlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6IGYnVGllbmVzIHtzdWJzfSBtb25lZGFzLiB7X3NwX30gw4LCv0Rlc2VhcyBjb21wcmFyIGVzdG8/JywKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6IGYnWW91IGhhdmUge3N1YnN9IGNvaW5zLiB7X3NwX30gRG8geW91IHdhbnQgdG8gYnV5IHRoaXM/JywKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6IGYnVm9jw4PCqiB0ZW0ge3N1YnN9IG1vZWRhcy4ge19zcF99IERlc2VqYSBjb21wcmFyIGlzdG8/J30sCiAgICAgICAgICAgICAgICAgIkZpcmVCb21icyBTdG9yZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAnQm9tYmFzIGRlIGZ1ZWdvJywKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICdGaXJlIGJvbWJzJywKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICdCb21iYXMgZGUgaW5jw4PCqm5kaW8nfSwKICAgICAgICAgICAgICAgICAiVGltZXIgU3RvcmUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogJ1RlbXBvcml6YWRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAnVGltZXInLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogJ1RpbWVyJ30sCiAgICAgICAgICAgICAgICAgIlBlcmNlbnRhZ2VzIFN0b3JlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICdFeHRyYXMnLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogJ0V4dHJhcycsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAnRXh0cmFzJ30sCiAgICAgICAgICAgICAgICAgIkJsb2NrIE9wdGlvbiBTdG9yZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiBmIlV1dXBzLi57X3NwX31Fc3RhIG9wY2nDg8KzbiBlc3TDg8KhIGJsb3F1ZWFkYS57X3NwX30gUGFyYSBhY2NlZGVyIGEgZWxsYSBwdWVkZXMge19zcF99IGNvbXByYXJsYSBlbiBsYSB0aWVuZGEue19zcF99IEdyYWNpYXMuLi4iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogZiJPb29vcHMuLi57X3NwX31UaGlzIG9wdGlvbiBpcyBibG9ja2VkLiB7X3NwX30gVG8gYWNjZXNzIGl0IHlvdSBjYW4gYnV5IHtfc3BffSBpdCBpbiB0aGUgc3RvcmUue19zcF99IFRoYW5rIHlvdS4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiBmIk9vb3BzLi4ue19zcF99RXN0YSBvcMODwqfDg8KjbyBlc3TDg8KhIGJsb3F1ZWFkYS4ge19zcF99IFBhcmEgYWNlc3PDg8KhLWxvLCB2b2PDg8KqIHBvZGUge19zcF99IGNvbXByw4PCoS1sbyBuYSBsb2phLntfc3BffSBPYnJpZ2Fkby4uLiJ9LAogICAgICAgICAgICAgICAgICJUcnVlIENvZGUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIsOCwqFDw4PCs2RpZ28gY2FuamVhZG8hIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTdWNjZXNzZnVsIGNvZGUhIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICLDgsKhQ8ODwrNkaWdvIHbDg8KhbGlkbyEifSwKICAgICAgICAgICAgICAgICAiRmFsc2UgQ29kZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQ8ODwrNkaWdvIHlhIGNhbmplYWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJFeHBpcmVkIGNvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkPDg8KzZGlnbyBleHBpcmFkbyJ9LAogICAgICAgICAgICAgICAgICJJbnZhbGlkIENvZGUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkPDg8KzZGlnbyBpbnbDg8KhbGlkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiSW52YWxpZCBjb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJDw4PCs2RpZ28gaW52w4PCoWxpZG8ifSwKICAgICAgICAgICAgICAgICAiUmV3YXJkIENvZGUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogZiLDgsKhRmVsaWNpdGFjaW9uZXMhIMOCwqFHYW5hc3RlIHtzdWJzfSBtb25lZGFzISIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiBmIkNvbmdyYXR1bGF0aW9ucyEgWW91J3ZlIHtzdWJzfSBjb2lucyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiBmIlBhcmFiw4PCqW5zISBWb2PDg8KqIHRlbSB7c3Vic30gbW9lZGFzIn0sCiAgICAgICAgICAgICAgICAgIkNyZWF0b3IiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIk1vZCBjcmVhZG8gcG9yIEBQYXRyw4PCs25Nb2R6IiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJNb2QgY3JlYXRlZCBieSBAUGF0csODwrNuTW9keiIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiTW9kIGNyZWFkbyBieSBAUGF0csODwrNuTW9keiJ9LAogICAgICAgICAgICAgICAgICJNb2QgSW5mbyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiBmIlVuIG1vZCBnZW5pYWwgcXVlIHRlIHBlcm1pdGUgZ2VzdGlvbmFyIHtfc3BffSBsb3MgcG90ZW5jaWFkb3JlcyBhIHR1IGFudG9qby4ge19zcF99IHRhbWJpw4PCqW4gaW5jbHV5ZSA4IHBvdGVuY2lhZG9yZXMgZXh0cmF7X3NwX30gZGVqYW5kbyAxNyBlbiB0b3RhbC4uLiDDgsKhR3VheSEiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogZiJBIGNvb2wgbW9kIHRoYXQgYWxsb3dzIHlvdSB0byBtYW5hZ2Uge19zcF99IHBvd2VydXBzIGF0IHlvdXIgd2hpbXMuIHtfc3BffSBhbHNvIGluY2x1ZGVzIDggZXh0cmEgcG93ZXJ1cHN7X3NwX30gbGVhdmluZyAxNyBpbiB0b3RhbC4uLiBXb3chIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6IGYiVW0gbW9kIGxlZ2FsIHF1ZSBwZXJtaXRlIHF1ZSB2b2PDg8KqIGdlcmVuY2llIG9ze19zcF99IHBvd2VydXBzIGRlIGRlIGFjb3JkbyBjb20gc2V1cyBjYXByaWNob3MuIHtfc3BffSB0YW1iw4PCqW0gaW5jbHVpIDggcG93ZXJ1cHMgZXh0cmFzLHtfc3BffSBkZWl4YW5kbyAxNyBubyB0b3RhbC4uLiBVYXUhIn0sCiAgICAgICAgICAgICAgICAgIkNvaW5zIE1lc3NhZ2UiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogZiJSZWNvbXBlbnNhOiB7c3Vic30gTW9uZWRhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiBmIlJld2FyZDoge3N1YnN9IENvaW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6IGYiUmVjb21wZW5zYToge3N1YnN9IE1vZWRhcyJ9LAogICAgICAgICAgICAgICAgICJDb2lucyBMaW1pdCBNZXNzYWdlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6IGYiR2FuYXN0ZSB7YWxtYWNlblswXX0gTW9uZWRhcy57X3NwX30gUGVybyBoYXMgc3VwZXJhZG8gZWwgbMODwq1taXRlIGRlIHthbG1hY2VuWzFdfSIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiBmIllvdSB3b24ge2FsbWFjZW5bMF19IENvaW5zLiB7X3NwX30gQnV0IHlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBsaW1pdCBvZiB7YWxtYWNlblsxXX0iLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogZiJWb2PDg8KqIGdhbmhvdSB7YWxtYWNlblswXX0gTW9lZGFzLiB7X3NwX30gTWFzIHZvY8ODwqogZXhjZWRldSBvIGxpbWl0ZSBkZSB7YWxtYWNlblsxXX0ifSwKICAgICAgICAgICAgICAgICB9CiAgICBsYW5ndWFnZXMgPSBbJ1NwYW5pc2gnLCdQb3J0dWd1ZXNlJywnRW5nbGlzaCddCiAgICBpZiBsYW5nIG5vdCBpbiBsYW5ndWFnZXM6IGxhbmcgPSAnRW5nbGlzaCcKCiAgICBpZiB0ZXh0IG5vdCBpbiB0cmFuc2xhdGU6CiAgICAgICAgcmV0dXJuIHRleHQKICAgIAogICAgcmV0dXJuIHRyYW5zbGF0ZVt0ZXh0XVtsYW5nXQoKaW1wb3J0IHNldHRpbmcKc2V0dGluZ3M9c2V0dGluZy5nZXRfc2V0dGluZ3NfZGF0YSgpCgpkZWYgc2V0dGluZ3NfZGlzdHJpYnV0aW9uKCk6CiAgICByZXR1cm4gc2V0dGluZ3NbImVsUGF0cm9uUG93ZXJ1cHMiXVsic2V0dGluZ3MiXQoKCgphcGcgPSBiYS5hcHAuY29uZmlnCgphcGdbJ1BQTSBTZXR0aW5ncyddID0gc2V0dGluZ3NfZGlzdHJpYnV0aW9uKCkKCgpjb25maWcgPSBhcGdbJ1BQTSBTZXR0aW5ncyddCgpkZWYgZGVmYXVsdF9wb3dlcnVwcygpOgogICAgcmV0dXJuIHNldHRpbmdzWyJlbFBhdHJvblBvd2VydXBzIl1bIlF1YW50aXR5Il0KCgpjb25maWdbJ1Bvd2VydXBzJ10gPSBkZWZhdWx0X3Bvd2VydXBzKCkKCgpwb3dlcnVwcyA9IGNvbmZpZ1snUG93ZXJ1cHMnXQoKIyA9PT0gRVhUUkFTID09PQoKR0xPQkFMID0geyJUYWIiOiAnQWN0aW9uIDEnLAogICAgICAgICAgIkNscyBQb3dlcnVwIjogMCwKICAgICAgICAgICJDb2lucyBNZXNzYWdlIjogW119CgojID09PSBTVE9SRSA9PT0KZGVmIHByb21vX2NvZGVzKCk6CiAgICByZXR1cm4geyJHLUFtNTRpZ080Mk9zIjogW1RydWUsMTEwMF0sCiAgICAgICAgICAgICJQLXRSbzhuTThkWiI6IFtUcnVlLDI4MDBdLAogICAgICAgICAgICAiWS10VTJCM1MiOiBbVHJ1ZSw1MDBdLAogICAgICAgICAgICAiQi0wbUIzUllUMnoiOiBbVHJ1ZSw5MTBdLAogICAgICAgICAgICAiQi1Bc2QxNG1PTjlHMEQiOiBbVHJ1ZSw5MTBdLAogICAgICAgICAgICAiRC1yQWNLMGNKMjMiOiBbVHJ1ZSw5MTBdLAogICAgICAgICAgICAiRS1hMjdaTzZmM1kiOiBbVHJ1ZSw2MDBdLAogICAgICAgICAgICAiRS1BbTU0aWdPNDJPcyI6IFtUcnVlLDYwMF0sCiAgICAgICAgICAgICJFLU00dU4zSzM0WEIiOiBbVHJ1ZSw4NDBdLAogICAgICAgICAgICAiUE0tNzMxQ2xjQUYiOiBbVHJ1ZSw1MDAwMF19CiAgICAgICAgICAgIApkZWYgc3RvcmVfaXRlbXMoKToKICAgIHJldHVybiB7IkJ1eSBGaXJlYm9tYnMiOiBGYWxzZSwKICAgICAgICAgICAgIkJ1eSBPcHRpb24iOiBGYWxzZSwKICAgICAgICAgICAgIkJ1eSBQZXJjZW50YWdlIjogRmFsc2V9CgppZiBhcGcuZ2V0KCdCZWFyIENvaW4nKSBpcyBOb25lOgogICAgYXBnWydCZWFyIENvaW4nXSA9IDAKICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKICAgIAppZiBhcGcuZ2V0KCdCZWFyIENvaW4nKSBpcyBub3QgTm9uZToKICAgIGlmIGFwZ1snQmVhciBDb2luJ10gPD0gMDoKICAgICAgICBhcGdbJ0JlYXIgQ29pbiddID0gMAogICAgYXBnWydCZWFyIENvaW4nXSA9IGludChhcGdbJ0JlYXIgQ29pbiddKQoKaWYgYXBnLmdldCgnQmVhciBTdG9yZScpIGlzIE5vbmU6CiAgICBhcGdbJ0JlYXIgU3RvcmUnXSA9IHt9CiAgICAKZm9yIGksaiBpbiBzdG9yZV9pdGVtcygpLml0ZW1zKCk6CiAgICBzdG9yZSAgPSBhcGdbJ0JlYXIgU3RvcmUnXQogICAgaWYgaSBub3QgaW4gc3RvcmU6CiAgICAgICAgaWYgc3RvcmUuZ2V0KGkpIGlzIE5vbmU6CiAgICAgICAgICAgIHN0b3JlW2ldID0gagogICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKU1RPUkUgPSBhcGdbJ0JlYXIgU3RvcmUnXQoKaWYgU1RPUkUuZ2V0KCdQcm9tbyBDb2RlJykgaXMgTm9uZToKICAgIFNUT1JFWydQcm9tbyBDb2RlJ10gPSBwcm9tb19jb2RlcygpCgpmb3IgaSx4IGluIHByb21vX2NvZGVzKCkuaXRlbXMoKToKICAgIHBtY29kZSA9IFNUT1JFWydQcm9tbyBDb2RlJ10KICAgIGlmIGkgbm90IGluIHBtY29kZToKICAgICAgICBpZiBwbWNvZGUuZ2V0KGkpIGlzIE5vbmU6CiAgICAgICAgICAgIHBtY29kZVtpXSA9IHgKCmFwZy5hcHBseV9hbmRfY29tbWl0KCkKCmNsYXNzIEJlYXJTdG9yZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIHByaWNlOiBpbnQgPSAxMDAwLAogICAgICAgICAgICAgICAgIHZhbHVlOiBzdHIgPSAnJywKICAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbCA9IE5vbmUpOgogICAgICAgICAgICAgICAgICAgICAKICAgICAgICBzZWxmLnByaWNlID0gcHJpY2UKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKICAgICAgICBzZWxmLnN0b3JlID0gU1RPUkVbdmFsdWVdCiAgICAgICAgc2VsZi5jb2lucyA9IGFwZ1snQmVhciBDb2luJ10KICAgICAgICBzZWxmLmNhbGxiYWNrID0gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAKICAgIGRlZiBidXkoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuc3RvcmU6CiAgICAgICAgICAgIGlmIHNlbGYuY29pbnMgPj0gKHNlbGYucHJpY2UpOgogICAgICAgICAgICAgICAgZGVmIGNvbmZpcm0oKToKICAgICAgICAgICAgICAgICAgICBTVE9SRVtzZWxmLnZhbHVlXSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBhcGdbJ0JlYXIgQ29pbiddIC09IGludChzZWxmLnByaWNlKQogICAgICAgICAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ1B1cmNoYXNlJyksKDAsMSwwKSkKICAgICAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Nhc2hSZWdpc3RlcicpKQogICAgICAgICAgICAgICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrKCkKICAgICAgICAgICAgICAgIENvbmZpcm1XaW5kb3coZ2V0bGFuZ3VhZ2UoJ0NvbmZpcm0gUHVyY2hhc2UnLHN1YnM9c2VsZi5jb2lucyksCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD00MDAsIGhlaWdodD0xMjAsIGFjdGlvbj1jb25maXJtLCBva190ZXh0PWJhLkxzdHIocmVzb3VyY2U9J29rVGV4dCcpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnQ29pbnMgMCcpLCgxLDAsMCkpCiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Vycm9yJykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnRG91YmxlIFByb2R1Y3QnKSwoMSwwLDApKQogICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Vycm9yJykpCgogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgYXBnWydCZWFyIENvaW4nXSA9IGludChhcGdbJ0JlYXIgQ29pbiddKQogICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKCmNsYXNzIFByb21vQ29kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlOiBzdHIgPSAnJyk6CiAgICAgICAgc2VsZi5jb2RlID0gY29kZQogICAgICAgIHNlbGYuY29kZXNfc3RvcmUgPSBTVE9SRVsnUHJvbW8gQ29kZSddCiAgICAgICAgaWYgc2VsZi5jb2RlIGluIHNlbGYuY29kZXNfc3RvcmU6CiAgICAgICAgICAgIHNlbGYuY29kZV90eXBlID0gU1RPUkVbJ1Byb21vIENvZGUnXVtjb2RlXQogICAgICAgICAgICBzZWxmLnByb21vX2NvZGVfZXhwaXJlID0gc2VsZi5jb2RlX3R5cGVbMF0KICAgICAgICAgICAgc2VsZi5wcm9tb19jb2RlX2Ftb3VudCA9IHNlbGYuY29kZV90eXBlWzFdCgogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgYXBnWydCZWFyIENvaW4nXSA9IGludChhcGdbJ0JlYXIgQ29pbiddKQogICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKCiAgICBkZWYgY29kZV9jb25maXJtYXRpb24oc2VsZik6CiAgICAgICAgaWYgc2VsZi5jb2RlICE9ICIiOgogICAgICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKAogICAgICAgICAgICAgICAgYmEuTHN0cihyZXNvdXJjZT0nc3VibWl0dGluZ1Byb21vQ29kZVRleHQnKSwoMCwxLDApKQogICAgICAgICAgICBiYS50aW1lcigyLGJhLkNhbGwoc2VsZi52YWxpZGF0ZV9jb2RlKSkKCiAgICBkZWYgdmFsaWRhdGVfY29kZShzZWxmKToKICAgICAgICBpZiBzZWxmLmNvZGUgaW4gc2VsZi5jb2Rlc19zdG9yZToKICAgICAgICAgICAgaWYgc2VsZi5wcm9tb19jb2RlX2V4cGlyZToKICAgICAgICAgICAgICAgIGJhLnRpbWVyKDEuNSxiYS5DYWxsKHNlbGYuc3VjY2Vzc2Z1bF9jb2RlKSkKICAgICAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ1RydWUgQ29kZScpLCgwLDEsMCkpCiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2NoZWVyJykpCiAgICAgICAgICAgICAgICBzZWxmLmNvZGVfdHlwZVswXSA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKGdldGxhbmd1YWdlKCdGYWxzZSBDb2RlJyksKDEsMCwwKSkKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnZXJyb3InKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKGdldGxhbmd1YWdlKCdJbnZhbGlkIENvZGUnKSwoMSwwLDApKQogICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Vycm9yJykpCgogICAgZGVmIHN1Y2Nlc3NmdWxfY29kZShzZWxmKToKICAgICAgICBhcGdbJ0JlYXIgQ29pbiddICs9IHNlbGYucHJvbW9fY29kZV9hbW91bnQKICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKGdldGxhbmd1YWdlKCdSZXdhcmQgQ29kZScsCiAgICAgICAgICAgIHN1YnM9c2VsZi5wcm9tb19jb2RlX2Ftb3VudCksKDAsMSwwKSkKICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Nhc2hSZWdpc3RlcjInKSkKCk1haW5NZW51QWN0aXZpdHkuc3VwZXJfdHJhbnNpdGlvbl9pbiA9IE1haW5NZW51QWN0aXZpdHkub25fdHJhbnNpdGlvbl9pbgpkZWYgbmV3X29uX3RyYW5zaXRpb25faW4oc2VsZik6CiAgICBzZWxmLnN1cGVyX3RyYW5zaXRpb25faW4oKQogICAgbGltaXQgPSA4NDAwCiAgICBiZWFyX2NvaW4gPSBhcGdbJ0JlYXIgQ29pbiddCiAgICBjb2luc19tZXNzYWdlID0gR0xPQkFMWydDb2lucyBNZXNzYWdlJ10KICAgIHRyeToKICAgICAgICBpZiBub3QgKFNUT1JFWydCdXkgRmlyZWJvbWJzJ10gYW5kCiAgICAgICAgICAgICAgICBTVE9SRVsnQnV5IE9wdGlvbiddIGFuZAogICAgICAgICAgICAgICAgU1RPUkVbJ0J1eSBQZXJjZW50YWdlJ10pOgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiBjb2luc19tZXNzYWdlICE9IFtdOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gMAogICAgICAgICAgICAgICAgZm9yIGkgaW4gY29pbnNfbWVzc2FnZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gaQoKICAgICAgICAgICAgICAgIGlmIG5vdCBiZWFyX2NvaW4gPj0gKGxpbWl0LTEpOgogICAgICAgICAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ0NvaW5zIE1lc3NhZ2UnLHN1YnM9cmVzdWx0KSwoMCwxLDApKQogICAgICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2FzaFJlZ2lzdGVyJykpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ0NvaW5zIExpbWl0IE1lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBhbG1hY2VuPVtyZXN1bHQsbGltaXRdKSwoMSwwLDApKQogICAgICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnZXJyb3InKSkKICAgICAgICAgICAgICAgIHNlbGYuYmVhcl9jb2luX21lc3NhZ2UgPSBUcnVlCiAgICAgICAgICAgICAgICBHTE9CQUxbJ0NvaW5zIE1lc3NhZ2UnXSA9IFtdCiAgICBleGNlcHQ6IHBhc3MKClNwYXpCb3Quc3VwZXJfaGFuZGxlbWVzc2FnZSA9IFNwYXpCb3QuaGFuZGxlbWVzc2FnZQpkZWYgYm90X2hhbmRsZW1lc3NhZ2Uoc2VsZiwgbXNnOiBBbnkpOgogICAgc2VsZi5zdXBlcl9oYW5kbGVtZXNzYWdlKG1zZykKICAgIGlmIGlzaW5zdGFuY2UobXNnLCBiYS5EaWVNZXNzYWdlKToKICAgICAgICBpZiBub3Qgc2VsZi5kaWU6CiAgICAgICAgICAgIHNlbGYuZGllID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmxpbWl0ID0gODQwMAogICAgICAgICAgICBzZWxmLmZyZWVfY29pbnMgPSByYW5kb20ucmFuZGludCgxLDI1KQogICAgICAgICAgICBzZWxmLmJlYXJfY29pbnMgPSBhcGdbJ0JlYXIgQ29pbiddCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBub3Qgc2VsZi5iZWFyX2NvaW5zID49IChzZWxmLmxpbWl0KToKICAgICAgICAgICAgICAgIHNlbGYuYmVhcl9jb2lucyArPSBzZWxmLmZyZWVfY29pbnMKICAgICAgICAgICAgICAgIEdMT0JBTFsnQ29pbnMgTWVzc2FnZSddLmFwcGVuZChzZWxmLmZyZWVfY29pbnMpCgogICAgICAgICAgICAgICAgaWYgc2VsZi5iZWFyX2NvaW5zID49IChzZWxmLmxpbWl0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlYXJfY29pbnMgPSBzZWxmLmxpbWl0CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhcGdbJ0JlYXIgQ29pbiddID0gaW50KHNlbGYuYmVhcl9jb2lucykKICAgICAgICAgICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlOiBHTE9CQUxbJ0NvaW5zIE1lc3NhZ2UnXS5hcHBlbmQoc2VsZi5mcmVlX2NvaW5zKQoKZGVmIGNsc19wb3dfY29sb3IoKToKICAgIHJldHVybiBbKDEsMC4xLDAuMSksKDAuMSwwLjUsMC45KSwoMC4xLDAuOSwwLjkpLAogICAgICAgICAgICAoMC4xLDAuOSwwLjEpLCgwLjEsMSwwLjUpLCgxLDEsMC4yKSwoMiwwLjUsMC41KSwoMSwwLDYpXQoKZGVmIHJhbmRvbV9jb2xvcigpOgogICAgYSA9IHJhbmRvbS5yYW5kb20oKSozCiAgICBiID0gcmFuZG9tLnJhbmRvbSgpKjMKICAgIGMgPSByYW5kb20ucmFuZG9tKCkqMwogICAgcmV0dXJuIChhLGIsYykKCmRlZiBwb3dlcnVwX2Rpc3QoKToKICAgIHJldHVybiAoKCd0cmlwbGVfYm9tYnMnLCBwb3dlcnVwc1snVHJpcGxlJ10pLAogICAgICAgICAgICAoJ2ljZV9ib21icycsIHBvd2VydXBzWydJY2UgQm9tYnMnXSksCiAgICAgICAgICAgICgncHVuY2gnLCBwb3dlcnVwc1snUHVuY2gnXSksCiAgICAgICAgICAgICgnaW1wYWN0X2JvbWJzJywgcG93ZXJ1cHNbJ0ltcGFjdCBCb21icyddKSwKICAgICAgICAgICAgKCdsYW5kX21pbmVzJywgcG93ZXJ1cHNbJ01pbmUgQm9tYnMnXSksCiAgICAgICAgICAgICgnc3RpY2t5X2JvbWJzJywgcG93ZXJ1cHNbJ1N0aWNreSBCb21icyddKSwKICAgICAgICAgICAgKCdzaGllbGQnLCBwb3dlcnVwc1snU2hpZWxkJ10pLAogICAgICAgICAgICAoJ2hlYWx0aCcsIHBvd2VydXBzWydIZWFsdGgnXSksCiAgICAgICAgICAgICgnY3Vyc2UnLCBwb3dlcnVwc1snQ3Vyc2UnXSksCiAgICAgICAgICAgICgnc3BlZWQnLHBvd2VydXBzWydTcGVlZCddKSwKICAgICAgICAgICAgKCdoZWFsdGhfZGFtYWdlJywgcG93ZXJ1cHNbJ0hlYWxpbmcgRGFtYWdlJ10pLAogICAgICAgICAgICAoJ2dvb2RieWUnLHBvd2VydXBzWydHb29kYnllJ10pLAogICAgICAgICAgICAoJ2ljZV9tYW4nLHBvd2VydXBzWydJY2UgTWFuJ10pLAogICAgICAgICAgICAoJ3Rhbmtfc2hpZWxkJyxwb3dlcnVwc1snVGFuayBTaGllbGQnXSksCiAgICAgICAgICAgICgnaW1wYWlybWVudF9ib21icycscG93ZXJ1cHNbJ0ltcGFpcm1lbnQgQm9tYnMnXSksCiAgICAgICAgICAgICgnZmlyZV9ib21icycscG93ZXJ1cHNbJ0ZpcmUgQm9tYnMnXSksCiAgICAgICAgICAgICgnZmx5X2JvbWJzJyxwb3dlcnVwc1snRmx5IEJvbWJzJ10pKQoKZGVmIHBlcmNlbnRhZ2VfdGFua19zaGllbGQoKToKICAgIHBlcmNlbnRhZ2UgPSBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddCiAgICBwZXJjZW50YWdlX3RleHQgPSAoJzAuJykgKyBzdHIocGVyY2VudGFnZSkKICAgIHJldHVybiBmbG9hdChwZXJjZW50YWdlX3RleHQpCiAgICAKZGVmIHBlcmNlbnRhZ2VfaGVhbHRoX2RhbWFnZSgpOgogICAgcGVyY2VudGFnZSA9IGNvbmZpZ1snSGVhbGluZyBEYW1hZ2UgUFRHJ10KICAgIHBlcmNlbnRhZ2VfdGV4dCA9ICgnMC4nKSArIHN0cihwZXJjZW50YWdlKQogICAgcmV0dXJuIGZsb2F0KHBlcmNlbnRhZ2VfdGV4dCkKCiMgPT09IE1vZGlmeSBjbGFzcyA9PT0KCmNsYXNzIE5ld1Byb2ZpbGVCcm93c2VyV2luZG93KGJyb3dzZXIuUHJvZmlsZUJyb3dzZXJXaW5kb3cpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogc3RyID0gJ2luX3JpZ2h0JywKICAgICAgICAgICAgICAgICBpbl9tYWluX21lbnU6IGJvb2wgPSBUcnVlLAogICAgICAgICAgICAgICAgIHNlbGVjdGVkX3Byb2ZpbGU6IHN0ciA9IE5vbmUsCiAgICAgICAgICAgICAgICAgb3JpZ2luX3dpZGdldDogYmEuV2lkZ2V0ID0gTm9uZSk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyh0cmFuc2l0aW9uLGluX21haW5fbWVudSxzZWxlY3RlZF9wcm9maWxlLG9yaWdpbl93aWRnZXQpCiAgICAgICAKICAgICAgICBzZWxmLnNlc3Npb24gPSBiYS5pbnRlcm5hbC5nZXRfZm9yZWdyb3VuZF9ob3N0X3Nlc3Npb24oKQogICAgICAgIHVpc2NhbGUgPSBiYS5hcHAudWkudWlzY2FsZQogICAgICAgIHdpZHRoID0gKDEwMCBpZiB1aXNjYWxlIGlzCiAgICAgICAgICAgICAgICAgYmEuVUlTY2FsZS5TTUFMTCBlbHNlIC0xNCkKICAgICAgICBzaXplID0gNTAKICAgICAgICBwb3NpdGlvbiA9ICh3aWR0aCoxLjY1LDMwMCkKIAogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5zZXNzaW9uLE1haW5NZW51U2Vzc2lvbik6CiAgICAgICAgICAgIHNlbGYuYnV0dG9uID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvc2VsZWN0PVRydWUscG9zaXRpb249cG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oc2l6ZSxzaXplKSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0nJyxvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi5wb3dlcnVwbWFuYWdlcl93aW5kb3cpKQogICAgICAgICAgICAKICAgICAgICAgICAgc2l6ZSA9IHNpemUqMC42MAogICAgICAgICAgICBzZWxmLmltYWdlID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KHNpemUsc2l6ZSksZHJhd19jb250cm9sbGVyPXNlbGYuYnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsxMC41LHBvc2l0aW9uWzFdKzE3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlPWJhLmdldHRleHR1cmUoJ3Bvd2VydXBTcGVlZCcpKQogICAgCiAgICAgICAgICAgIHNlbGYudGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsyNSxwb3NpdGlvblsxXSsxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oMCwgMCksc2NhbGU9MC40NSxjb2xvcj0oMC43LDAuOSwwLjcsMS4wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2NvbnRyb2xsZXI9c2VsZi5idXR0b24sbWF4d2lkdGg9NjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0oZiJVbHRpbWF0ZSBQb3dlcnVwIHtfc3BffU1hbmFnZXIiKSxoX2FsaWduPSdjZW50ZXInLHZfYWxpZ249J2NlbnRlcicpCgogICAgZGVmIHBvd2VydXBtYW5hZ2VyX3dpbmRvdyhzZWxmKToKICAgICAgICBiYS5jb250YWluZXJ3aWRnZXQoZWRpdD1zZWxmLl9yb290X3dpZGdldCx0cmFuc2l0aW9uPSdvdXRfbGVmdCcpCiAgICAgICAgUG93ZXJ1cE1hbmFnZXJXaW5kb3coKQoKY2xhc3MgTmV3UG93ZXJ1cEJveEZhY3RvcnkocHVwYm94LlBvd2VydXBCb3hGYWN0b3J5KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudGV4X3NwZWVkID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFNwZWVkJykKICAgICAgICBzZWxmLnRleF9oZWFsdGhfZGFtYWdlID0gYmEuZ2V0dGV4dHVyZSgnaGVhcnQnKQogICAgICAgIHNlbGYudGV4X2dvb2RieWUgPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudE9uc2xhdWdodCcpCiAgICAgICAgc2VsZi50ZXhfaWNlX21hbiA9IGJhLmdldHRleHR1cmUoJ291eWFVQnV0dG9uJykKICAgICAgICBzZWxmLnRleF90YW5rX3NoaWVsZCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50U3VwZXJQdW5jaCcpCiAgICAgICAgc2VsZi50ZXhfaW1wYWlybWVudF9ib21icyA9IGJhLmdldHRleHR1cmUoJ2xldmVsSWNvbicpCiAgICAgICAgc2VsZi50ZXhfZmlyZV9ib21icyA9IGJhLmdldHRleHR1cmUoJ291eWFPQnV0dG9uJykKICAgICAgICBzZWxmLnRleF9mbHlfYm9tYnMgPSBiYS5nZXR0ZXh0dXJlKCdzdGFyJykKICAgICAgICAKICAgICAgICBzZWxmLl9wb3dlcnVwZGlzdCA9IFtdCiAgICAgICAgZm9yIHBvd2VydXAsIGZyZXEgaW4gcG93ZXJ1cF9kaXN0KCk6CiAgICAgICAgICAgIGZvciBfaSBpbiByYW5nZShpbnQoZnJlcSkpOgogICAgICAgICAgICAgICAgc2VsZi5fcG93ZXJ1cGRpc3QuYXBwZW5kKHBvd2VydXApCgogICAgZGVmIGdldF9yYW5kb21fcG93ZXJ1cF90eXBlKHNlbGYsZm9yY2V0eXBlID0gTm9uZSwgZXhjbHVkZXR5cGVzID0gTm9uZSk6CiAgICAgICAgCiAgICAgICAgdHJ5OiBzZWxmLm1hcGEgPSBiYS5nZXRhY3Rpdml0eSgpLl9tYXAuZ2V0bmFtZSgpCiAgICAgICAgZXhjZXB0OiBzZWxmLm1hcGEgPSBOb25lCiAgICAgIAogICAgICAgIHNwZWVkX2Jhbm5lZF9tYXBzID0gWydIb2NrZXkgU3RhZGl1bScsJ0xha2UgRnJpZ2lkJywnSGFwcHkgVGhvdWdodHMnXQogICAgICAKICAgICAgICBpZiBzZWxmLm1hcGEgaW4gc3BlZWRfYmFubmVkX21hcHM6CiAgICAgICAgICAgIHBvd2VydXBfZGlzYWJsZSA9IFsnc3BlZWQnXQogICAgICAgIGVsc2U6IHBvd2VydXBfZGlzYWJsZSA9IFtdCiAgICAgIAogICAgICAgIGlmIGV4Y2x1ZGV0eXBlcyBpcyBOb25lOgogICAgICAgICAgICBleGNsdWRldHlwZXMgPSBbXQogICAgICAgIGlmIGZvcmNldHlwZToKICAgICAgICAgICAgcHR5cGUgPSBmb3JjZXR5cGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9sYXN0cG93ZXJ1cHR5cGUgPT0gJ2N1cnNlJzoKICAgICAgICAgICAgICAgIHB0eXBlID0gJ2hlYWx0aCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBzZWxmLl9wb3dlcnVwZGlzdFtyYW5kb20ucmFuZGludCgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNlbGYuX3Bvd2VydXBkaXN0KSAtIDEpXQogICAgICAgICAgICAgICAgICAgIGlmIHB0eXBlIG5vdCBpbiBleGNsdWRldHlwZXMgYW5kIHB0eXBlIG5vdCBpbiBwb3dlcnVwX2Rpc2FibGU6IGJyZWFrCiAgICAgICAgc2VsZi5fbGFzdHBvd2VydXB0eXBlID0gcHR5cGUKICAgICAgICByZXR1cm4gcHR5cGUKCmRlZiBmaXJlX2VmZmVjdChzZWxmKToKICAgIGlmIHNlbGYubm9kZS5leGlzdHMoKToKICAgICAgICBiYS5lbWl0ZngocG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uLAogICAgICAgIHNjYWxlPTMsY291bnQ9NTAqMixzcHJlYWQ9MC4zLAogICAgICAgIGNodW5rX3R5cGU9J3N3ZWF0JykKICAgIGVsc2U6IHNlbGYuZmlyZV9lZmZlY3RfdGltZSA9IE5vbmUKCiMjIyMjIyMjIyMjQk9NQlMKQm9tYi5fcG1fb2xkX2JvbWIgPSBCb21iLl9faW5pdF9fCmRlZiBfYm9tYl9pbml0KHNlbGYsCiAgICAgICAgICAgICAgIHBvc2l0aW9uOiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAxLjAsIDAuMCksCiAgICAgICAgICAgICAgIHZlbG9jaXR5OiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAwLjAsIDAuMCksCiAgICAgICAgICAgICAgIGJvbWJfdHlwZTogc3RyID0gJ25vcm1hbCcsCiAgICAgICAgICAgICAgIGJsYXN0X3JhZGl1czogZmxvYXQgPSAyLjAsCiAgICAgICAgICAgICAgIGJvbWJfc2NhbGU6IGZsb2F0ID0gMS4wLAogICAgICAgICAgICAgICBzb3VyY2VfcGxheWVyOiBiYS5QbGF5ZXIgPSBOb25lLAogICAgICAgICAgICAgICBvd25lcjogYmEuTm9kZSA9IE5vbmUpOgoKICAgIHNlbGYuYm1fdHlwZSA9IGJvbWJfdHlwZQogICAgbmV3X2JvbWJfdHlwZSA9IGJvbWJfdHlwZQogICAgYm9tYnMgPSBbJ2ljZV9idWJibGUnLCdpbXBhaXJtZW50JywnZmlyZScsJ2ZseSddCiAgICAKICAgIGlmIGJvbWJfdHlwZSBpbiBib21iczoKICAgICAgICBuZXdfYm9tYl90eXBlID0gJ2ljZScKICAgICAgICAgICAgICAgICAgIAogICAgc2VsZi5fcG1fb2xkX2JvbWIocG9zaXRpb24sdmVsb2NpdHksbmV3X2JvbWJfdHlwZSxibGFzdF9yYWRpdXMsCiAgICAgICAgICAgICAgICAgICAgICBib21iX3NjYWxlLHNvdXJjZV9wbGF5ZXIsb3duZXIpCiAgICAKICAgIHRleCA9IHNlbGYubm9kZS5jb2xvcl90ZXh0dXJlCiAgICAKICAgIGlmIHNlbGYuYm1fdHlwZSA9PSAnaWNlX2J1YmJsZSc6CiAgICAgICAgc2VsZi5ib21iX3R5cGUgPSBzZWxmLmJtX3R5cGUKICAgICAgICBzZWxmLm5vZGUubW9kZWwgPSBOb25lCiAgICAgICAgc2VsZi5zaGllbGRfaWNlID0gYmEubmV3bm9kZSgnc2hpZWxkJyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgIGF0dHJzPXsnY29sb3InOiAoMC41LCAxLjAsIDcuMCksJ3JhZGl1cyc6IDAuNn0pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIHNlbGYuc2hpZWxkX2ljZSwgJ3Bvc2l0aW9uJykKICAgIGVsaWYgc2VsZi5ibV90eXBlID09ICdmaXJlJzoKICAgICAgICBzZWxmLmJvbWJfdHlwZSA9IHNlbGYuYm1fdHlwZQogICAgICAgIHNlbGYubm9kZS5tb2RlbCA9IE5vbmUKICAgICAgICBzZWxmLnNoaWVsZF9maXJlID0gYmEubmV3bm9kZSgnc2hpZWxkJyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgIGF0dHJzPXsnY29sb3InOiAoNi41LCA2LjUsIDIuMCksJ3JhZGl1cyc6IDAuNn0pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIHNlbGYuc2hpZWxkX2ZpcmUsICdwb3NpdGlvbicpCiAgICAgICAgc2VsZi5maXJlX2VmZmVjdF90aW1lID0gYmEuVGltZXIoMC4xLGJhLkNhbGwoZmlyZV9lZmZlY3Qsc2VsZikscmVwZWF0PVRydWUpCiAgICBlbGlmIHNlbGYuYm1fdHlwZSA9PSAnaW1wYWlybWVudCc6CiAgICAgICAgc2VsZi5ib21iX3R5cGUgPSBzZWxmLmJtX3R5cGUKICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdlZ2dUZXgzJykKICAgIGVsaWYgc2VsZi5ibV90eXBlID09ICdmbHknOgogICAgICAgIHNlbGYuYm9tYl90eXBlID0gc2VsZi5ibV90eXBlCiAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnZWdnVGV4MScpCgogICAgc2VsZi5ub2RlLmNvbG9yX3RleHR1cmUgPSB0ZXgKICAgIHNlbGYuaGl0X3N1YnR5cGUgPSBzZWxmLmJvbWJfdHlwZQoKICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdpY2VfYnViYmxlJzoKICAgICAgICBzZWxmLmJsYXN0X3JhZGl1cyAqPSAxLjIKICAgIGVsaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ZseSc6CiAgICAgICAgc2VsZi5ibGFzdF9yYWRpdXMgKj0gMi4yCgpkZWYgYm9tYl9oYW5kbGVtZXNzYWdlKHNlbGYsIG1zZzogQW55KSAtPiBBbnk6CiAgICBhc3NlcnQgbm90IHNlbGYuZXhwaXJlZAoKICAgIGlmIGlzaW5zdGFuY2UobXNnLCBiYS5EaWVNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5kZWxldGUoKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJvbWIuRXhwbG9kZUhpdE1lc3NhZ2UpOgogICAgICAgIG5vZGUgPSBiYS5nZXRjb2xsaXNpb24oKS5vcHBvc2luZ25vZGUKICAgICAgICBhc3NlcnQgc2VsZi5ub2RlCiAgICAgICAgbm9kZXBvcyA9IHNlbGYubm9kZS5wb3NpdGlvbgogICAgICAgIG1hZyA9IDIwMDAuMAogICAgICAgIGlmIHNlbGYuYmxhc3RfdHlwZSBpbiAoJ2ljZScsJ2ljZV9idWJibGUnKToKICAgICAgICAgICAgbWFnICo9IDAuNQogICAgICAgIGVsaWYgc2VsZi5ibGFzdF90eXBlID09ICdsYW5kX21pbmUnOgogICAgICAgICAgICBtYWcgKj0gMi41CiAgICAgICAgZWxpZiBzZWxmLmJsYXN0X3R5cGUgPT0gJ3RudCc6CiAgICAgICAgICAgIG1hZyAqPSAyLjAKICAgICAgICBlbGlmIHNlbGYuYmxhc3RfdHlwZSA9PSAnZmlyZSc6CiAgICAgICAgICAgIG1hZyAqPSAwLjYKICAgICAgICBlbGlmIHNlbGYuYmxhc3RfdHlwZSA9PSAnZmx5JzoKICAgICAgICAgICAgbWFnICo9IDUuNQoKICAgICAgICBub2RlLmhhbmRsZW1lc3NhZ2UoCiAgICAgICAgICAgIGJhLkhpdE1lc3NhZ2UocG9zPW5vZGVwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ25pdHVkZT1tYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0X3R5cGU9c2VsZi5oaXRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRfc3VidHlwZT1zZWxmLmhpdF9zdWJ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cz1zZWxmLnJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcGxheWVyPWJhLmV4aXN0aW5nKHNlbGYuX3NvdXJjZV9wbGF5ZXIpKSkKICAgICAgICBpZiBzZWxmLmJsYXN0X3R5cGUgaW4gKCdpY2UnLCdpY2VfYnViYmxlJyk6CiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChib21iLkJvbWJGYWN0b3J5LmdldCgpLmZyZWV6ZV9zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249bm9kZXBvcykKICAgICAgICAgICAgbm9kZS5oYW5kbGVtZXNzYWdlKGJhLkZyZWV6ZU1lc3NhZ2UoKSkKCiAgICByZXR1cm4gTm9uZQoKZGVmIHBvd2VydXBfdHJhbnNsYXRlZChzZWxmLCB0eXBlOiBzdHIpOgogICAgcG93ZXJ1cHNfbmFtZXMgPSB7J3RyaXBsZV9ib21icyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEJvbWJOYW1lVGV4dCcpLAogICAgICAgICAgICAgICAgJ2ljZV9ib21icyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEljZUJvbWJzTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdwdW5jaCc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cFB1bmNoTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdpbXBhY3RfYm9tYnMnOiBiYS5Mc3RyKHJlc291cmNlPSdoZWxwV2luZG93LicrJ3Bvd2VydXBJbXBhY3RCb21ic05hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnbGFuZF9taW5lcyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cExhbmRNaW5lc05hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnc3RpY2t5X2JvbWJzJzogYmEuTHN0cihyZXNvdXJjZT0naGVscFdpbmRvdy4nKydwb3dlcnVwU3RpY2t5Qm9tYnNOYW1lVGV4dCcpLAogICAgICAgICAgICAgICAgJ3NoaWVsZCc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cFNoaWVsZE5hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnaGVhbHRoJzogYmEuTHN0cihyZXNvdXJjZT0naGVscFdpbmRvdy4nKydwb3dlcnVwSGVhbHRoTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdjdXJzZSc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEN1cnNlTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdzcGVlZCc6IGdldGxhbmd1YWdlKCdTcGVlZCcpLAogICAgICAgICAgICAgICAgJ2hlYWx0aF9kYW1hZ2UnOiBnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UnKSwKICAgICAgICAgICAgICAgICdnb29kYnllJzogZ2V0bGFuZ3VhZ2UoJ0dvb2RieWUnKSwKICAgICAgICAgICAgICAgICdpY2VfbWFuJzogZ2V0bGFuZ3VhZ2UoJ0ljZSBNYW4nKSwKICAgICAgICAgICAgICAgICd0YW5rX3NoaWVsZCc6IGdldGxhbmd1YWdlKCdUYW5rIFNoaWVsZCcpLAogICAgICAgICAgICAgICAgJ2ltcGFpcm1lbnRfYm9tYnMnOiBnZXRsYW5ndWFnZSgnSW1wYWlybWVudCBCb21icycpLAogICAgICAgICAgICAgICAgJ2ZpcmVfYm9tYnMnOiBnZXRsYW5ndWFnZSgnRmlyZSBCb21icycpLAogICAgICAgICAgICAgICAgJ2ZseV9ib21icyc6IGdldGxhbmd1YWdlKCdGbHkgQm9tYnMnKX0KICAgIHNlbGYudGV4dHNbJ05hbWUnXS50ZXh0ID0gcG93ZXJ1cHNfbmFtZXNbdHlwZV0KICAgICAgICAgICAgICAgIAojIyMjIyMjIyMjI1BPV0VSVVAKcHVwYm94LlBvd2VydXBCb3guX29sZF9wYnhfID0gcHVwYm94LlBvd2VydXBCb3guX19pbml0X18KZGVmIF9wYnhfKHNlbGYsIHBvc2l0aW9uOiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAxLjAsIDAuMCksCiAgICAgICAgICBwb3dlcnVwdHlwZTogc3RyID0gJ3RyaXBsZV9ib21icycsCiAgICAgICAgICBleHBpcmU6IGJvb2wgPSBUcnVlKToKICAgIAogICAgc2VsZi5uZXdzOiBsaXN0ID0gW10KICAgIGZvciB4LGkgaW4gcG93ZXJ1cF9kaXN0KCk6IHNlbGYubmV3cy5hcHBlbmQoeCkKICAgIAogICAgc2VsZi5ib3g6IGxpc3QgPSBbXQogICAgc2VsZi50ZXh0cyA9IHt9CiAgICBzZWxmLm5ld3MgPSBzZWxmLm5ld3NbOTpdCiAgICBzZWxmLmJveC5hcHBlbmQocG93ZXJ1cHR5cGUpCiAgICBzZWxmLm5wb3dlcnVwID0gc2VsZi5ib3hbMF0KICAgIGZhY3RvcnkgPSBOZXdQb3dlcnVwQm94RmFjdG9yeS5nZXQoKQogICAgCiAgICBpZiBzZWxmLm5wb3dlcnVwIGluIHNlbGYubmV3czogbmV3X3Bvd2VydXB0eXBlID0gJ3NoaWVsZCcKICAgIGVsc2U6IG5ld19wb3dlcnVwdHlwZSA9IHBvd2VydXB0eXBlCiAgICBzZWxmLl9vbGRfcGJ4Xyhwb3NpdGlvbixuZXdfcG93ZXJ1cHR5cGUsZXhwaXJlKQogICAgCiAgICB0eXBlID0gbmV3X3Bvd2VydXB0eXBlCiAgICB0ZXggPSBzZWxmLm5vZGUuY29sb3JfdGV4dHVyZQogICAgbW9kZWwgPSBzZWxmLm5vZGUubW9kZWwKICAgIAogICAgaWYgc2VsZi5ucG93ZXJ1cCA9PSAnc3BlZWQnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfc3BlZWQKICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAnaGVhbHRoX2RhbWFnZSc6CiAgICAgICAgdHlwZSA9IHNlbGYubnBvd2VydXAKICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9oZWFsdGhfZGFtYWdlCiAgICBlbGlmIHNlbGYubnBvd2VydXAgPT0gJ2dvb2RieWUnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZ29vZGJ5ZQogICAgZWxpZiBzZWxmLm5wb3dlcnVwID09ICdpY2VfbWFuJzoKICAgICAgICB0eXBlID0gc2VsZi5ucG93ZXJ1cAogICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2ljZV9tYW4KICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAndGFua19zaGllbGQnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfdGFua19zaGllbGQKICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAnaW1wYWlybWVudF9ib21icyc6CiAgICAgICAgdHlwZSA9IHNlbGYubnBvd2VydXAKICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9pbXBhaXJtZW50X2JvbWJzCiAgICBlbGlmIHNlbGYubnBvd2VydXAgPT0gJ2ZpcmVfYm9tYnMnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZmlyZV9ib21icwogICAgZWxpZiBzZWxmLm5wb3dlcnVwID09ICdmbHlfYm9tYnMnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZmx5X2JvbWJzCgogICAgc2VsZi5wb3dlcnVwdHlwZSA9IHR5cGUKICAgIHNlbGYubm9kZS5tb2RlbCA9IG1vZGVsCiAgICBzZWxmLm5vZGUuY29sb3JfdGV4dHVyZSA9IHRleAogICAgbl9zY2FsZSA9IGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddCiAgICBzdHlsZSA9IGNvbmZpZ1snUG93ZXJ1cCBTdHlsZSddCgogICAgY3VydmUgPSBiYS5hbmltYXRlKHNlbGYubm9kZSwgJ21vZGVsX3NjYWxlJywgezA6IDAsIDAuMTQ6IDEuNiwgMC4yOiBuX3NjYWxlfSkKICAgIGJhLnRpbWVyKDAuMiwgY3VydmUuZGVsZXRlKQogICAgICAgIAogICAgZGVmIHV0aWxfdGV4dCh0eXBlOiBzdHIsIHRleHQ6IHN0ciwgc2NhbGU6IGZsb2F0ID0gMSwgY29sb3I6IGxpc3QgPSBbMSwxLDFdLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbGlzdCA9IFswLCAwLjcsIDBdLCBjb2xvcnNfbmFtZTogYm9vbCA9IEZhbHNlKToKICAgICAgICBtID0gYmEubmV3bm9kZSgnbWF0aCcsb3duZXI9c2VsZi5ub2RlLGF0dHJzPXsnaW5wdXQxJzoKICAgICAgICAgICAgKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0pLCdvcGVyYXRpb24nOiAnYWRkJ30pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIG0sICdpbnB1dDInKQogICAgICAgIHNlbGYudGV4dHNbdHlwZV0gPSBiYS5uZXdub2RlKCd0ZXh0Jyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgICAgICBhdHRycz17J3RleHQnOiBzdHIodGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAnaW5fd29ybGQnOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgJ3NjYWxlJzogMC4wMiwKICAgICAgICAgICAgICAgICAgICAgICdzaGFkb3cnOiAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAnZmxhdG5lc3MnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiAoY29sb3JbMF0sY29sb3JbMV0sY29sb3JbMl0pLAogICAgICAgICAgICAgICAgICAgICAgJ2hfYWxpZ24nOiAnY2VudGVyJ30pIAogICAgICAgIG0uY29ubmVjdGF0dHIoJ291dHB1dCcsIHNlbGYudGV4dHNbdHlwZV0sICdwb3NpdGlvbicpCiAgICAgICAgYmEuYW5pbWF0ZShzZWxmLnRleHRzW3R5cGVdLCAnc2NhbGUnLCB7MDogMC4wMTcsMC40OiAwLjAxNywgMC41OiAwLjAxKnNjYWxlfSkKICAgIAogICAgICAgIGlmIGNvbG9yc19uYW1lOgogICAgICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYudGV4dHNbdHlwZV0sICdjb2xvcicsIDMsCiAgICAgICAgICAgICAgICB7MDooMSwwLDApLAogICAgICAgICAgICAgICAgIDAuMjooMSwwLjUsMCksCiAgICAgICAgICAgICAgICAgMC40OigxLDEsMCksCiAgICAgICAgICAgICAgICAgMC42OigwLDEsMCksCiAgICAgICAgICAgICAgICAgMC44OigwLDEsMSksCiAgICAgICAgICAgICAgICAgMS4wOigxLDAsMSksCiAgICAgICAgICAgICAgICAgMS4yOigxLDAsMCl9LFRydWUpCiAgICAKICAgIGRlZiB1cGRhdGVfdGltZSh0aW1lKToKICAgICAgICBpZiBzZWxmLnRleHRzWydUaW1lJ10uZXhpc3RzKCk6CiAgICAgICAgICAgIHNlbGYudGV4dHNbJ1RpbWUnXS50ZXh0ID0gc3RyKHRpbWUpCiAgICAgICAgCiAgICBpZiBjb25maWdbJ1Bvd2VydXAgVGltZSddOgogICAgICAgIGludGVydmFsID0gaW50KHB1cGJveC5ERUZBVUxUX1BPV0VSVVBfSU5URVJWQUwpCiAgICAgICAgdGltZTIgPSAoaW50ZXJ2YWwtMSkKICAgICAgICB0aW1lID0gMQogICAgICAgIAogICAgICAgIHV0aWxfdGV4dCgnVGltZScsIHRpbWUyLCBzY2FsZT0xLjUsY29sb3I9KDIsMiwyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249WzAsMC45LDBdLCBjb2xvcnNfbmFtZT1GYWxzZSkKICAgICAgICAKICAgICAgICB3aGlsZShpbnRlcnZhbCszKToKICAgICAgICAgICAgYmEudGltZXIodGltZS0xLGJhLkNhbGwodXBkYXRlX3RpbWUsZid7dGltZTJ9cycpKQogICAgCiAgICAgICAgICAgIGlmIHRpbWUyID09IDA6CiAgICAgICAgICAgICAgICBicmVhawogICAgCiAgICAgICAgICAgIHRpbWUgKz0gMQogICAgICAgICAgICB0aW1lMiAtPSAxCiAgICAKICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBXaXRoIFNoaWVsZCddOgogICAgICAgIHNjYWxlID0gY29uZmlnWydQb3dlcnVwIFNjYWxlJ10KICAgICAgICBzZWxmLnNoaWVsZCA9IGJhLm5ld25vZGUoJ3NoaWVsZCcsb3duZXI9c2VsZi5ub2RlLGF0dHJzPXsnY29sb3InOiAoMSwxLDApLCdyYWRpdXMnOiAxLjMqc2NhbGV9KQogICAgICAgIHNlbGYubm9kZS5jb25uZWN0YXR0cigncG9zaXRpb24nLCBzZWxmLnNoaWVsZCwgJ3Bvc2l0aW9uJykKICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYuc2hpZWxkLCdjb2xvcicsMyx7MDogKDIsMCwwKSwgMC41OiAoMCwyLDApLCAxOiAoMCwxLDYpLCAxLjU6ICgyLDAsMCl9LFRydWUpCiAgICAKICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBOYW1lJ106ICAgIAogICAgICAgIHV0aWxfdGV4dCgnTmFtZScsc2VsZi5wb3dlcnVwdHlwZSxzY2FsZT0xLjIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVswLDAuNCwwXSxjb2xvcnNfbmFtZT1UcnVlKQogICAgICAgIHBvd2VydXBfdHJhbnNsYXRlZChzZWxmLHNlbGYucG93ZXJ1cHR5cGUpCiAgICAgICAgCiAgICBpZiBzdHlsZSA9PSAnU1k6IEJBTEwnOgogICAgICAgIHNlbGYubm9kZS5tb2RlbCA9IGJhLmdldG1vZGVsKCdmcm9zdHlQZWx2aXMnKQogICAgZWxpZiBzdHlsZSA9PSAnU1k6IEltcGFjdCc6CiAgICAgICAgc2VsZi5ub2RlLm1vZGVsID0gYmEuZ2V0bW9kZWwoJ2ltcGFjdEJvbWInKQogICAgZWxpZiBzdHlsZSA9PSAnU1k6IEVnZyc6CiAgICAgICAgc2VsZi5ub2RlLm1vZGVsID0gYmEuZ2V0bW9kZWwoJ2VnZycpCiAgICAgICAgCiMjIyMjIyMjIyMjU1BBWgpkZWYgX3NwZWVkX29mZl9mbGFzaChzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX3RleHR1cmUgPSBmYWN0b3J5LnRleF9zcGVlZAogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfb3BhY2l0eSA9IDEuMAogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfY3Jvc3Nfb3V0ID0gVHJ1ZQogICAgICAgIApkZWYgX3NwZWVkX3dlYXJfb2ZmKHNlbGYpOgogICAgaWYgc2VsZi5ub2RlOgogICAgICAgIHNlbGYubm9kZS5ob2NrZXkgPSBGYWxzZQogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfb3BhY2l0eSA9IDAuMAogICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgncG93ZXJkb3duMDEnKSkKICAgICAgICAKZGVmIF9pY2VfbWFuX29mZl9mbGFzaChzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX3RleHR1cmUgPSBmYWN0b3J5LnRleF9pY2VfbWFuCiAgICAgICAgc2VsZi5ub2RlLmJpbGxib2FyZF9vcGFjaXR5ID0gMS4wCiAgICAgICAgc2VsZi5ub2RlLmJpbGxib2FyZF9jcm9zc19vdXQgPSBUcnVlCiAgICAgICAgCmRlZiBfaWNlX21hbl93ZWFyX29mZihzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmID0gc2VsZi5jb2xvclswXQogICAgICAgIGkgPSAoMCwxLDQpCiAgICAgICAgCiAgICAgICAgYm9tYiA9IHNlbGYuYm1iX2NvbG9yWzBdICAgICAgICAKICAgICAgICBpZiBib21iICE9ICdpY2VfYnViYmxlJzogc2VsZi5ib21iX3R5cGUgPSBib21iCiAgICAgICAgZWxzZTogc2VsZi5ib21iX3R5cGUgPSAnbm9ybWFsJwogICAgICAgIAogICAgICAgIHNlbGYuZnJlZXplX3B1bmNoID0gRmFsc2UKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX29wYWNpdHkgPSAwLjAKICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYubm9kZSwnY29sb3InLDMsezA6IGYsIDAuMzogaSwgMC42OiBmfSkKICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ3Bvd2VyZG93bjAxJykpCiAgICAgICAgClNwYXouX3BtMl9zcHpfb2xkID0gU3Bhei5fX2luaXRfXwpkZWYgX2luaXRfc3Bhel8oc2VsZiwqYXJncywgKiprd2FyZ3MpOgogICAgc2VsZi5fcG0yX3Nwel9vbGQoKmFyZ3MsICoqa3dhcmdzKQogICAgc2VsZi5lZGdfZWZmID0gRmFsc2UKICAgIHNlbGYua2lsbF9lZmYgPSBGYWxzZQogICAgc2VsZi5mcmVlemVfcHVuY2ggPSBGYWxzZQogICAgc2VsZi5kaWUgPSBGYWxzZQogICAgc2VsZi5jb2xvcjogbGlzdCA9IFtdCiAgICBzZWxmLmNvbG9yLmFwcGVuZChzZWxmLm5vZGUuY29sb3IpCiAgICAKICAgIHNlbGYudGFua3NoaWVsZCA9IHsiVGFuayI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICJSZWR1Y3Rpb24iOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAiU2hpZWxkIjogTm9uZX0KClNwYXouX3N1cGVyX29uX3B1bmNoX3ByZXNzID0gU3Bhei5vbl9wdW5jaF9wcmVzcwpkZWYgc3Bhel9vbl9wdW5jaF9wcmVzcyhzZWxmKSAtPiBOb25lOgogICAgc2VsZi5fc3VwZXJfb25fcHVuY2hfcHJlc3MoKQoKICAgIGlmIHNlbGYudGFua3NoaWVsZFsnVGFuayddOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXSA9IFRydWUKICAgICAgICAgICAgCiAgICAgICAgICAgIHNoaWVsZCA9IGJhLm5ld25vZGUoJ3NoaWVsZCcsb3duZXI9c2VsZi5ub2RlLAogICAgICAgICAgICAgICAgYXR0cnM9eydjb2xvcic6ICg0LDEsNCksJ3JhZGl1cyc6IDEuM30pCiAgICAgICAgICAgIHNlbGYubm9kZS5jb25uZWN0YXR0cigncG9zaXRpb25fY2VudGVyJywgc2hpZWxkLCAncG9zaXRpb24nKQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi50YW5rc2hpZWxkWydTaGllbGQnXSA9IHNoaWVsZAogICAgICAgIGV4Y2VwdDogcGFzcwoKU3Bhei5fc3VwZXJfb25fcHVuY2hfcmVsZWFzZSA9IFNwYXoub25fcHVuY2hfcmVsZWFzZQpkZWYgc3Bhel9vbl9wdW5jaF9yZWxlYXNlKHNlbGYpIC0+IE5vbmU6CiAgICBzZWxmLl9zdXBlcl9vbl9wdW5jaF9yZWxlYXNlKCkKICAgIHRyeToKICAgICAgICBzZWxmLnRhbmtzaGllbGRbJ1NoaWVsZCddLmRlbGV0ZSgpCiAgICAgICAgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXSA9IEZhbHNlCiAgICBleGNlcHQ6IHBhc3MKCmRlZiBuZXdfZ2V0X2JvbWJfdHlwZV90ZXgoc2VsZikgLT4gYmEuVGV4dHVyZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBpZiBzZWxmLmJvbWJfdHlwZSA9PSAnc3RpY2t5JzoKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkudGV4X3N0aWNreV9ib21icwogICAgICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdpY2UnOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfaWNlX2JvbWJzCiAgICAgICAgaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ltcGFjdCc6CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRleF9pbXBhY3RfYm9tYnMKICAgICAgICBpZiBzZWxmLmJvbWJfdHlwZSA9PSAnaW1wYWlybWVudCc6CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRleF9pbXBhaXJtZW50X2JvbWJzCiAgICAgICAgaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ZpcmUnOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfZmlyZV9ib21icwogICAgICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdmbHknOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfZmx5X2JvbWJzCiAgICAgICAgcmV0dXJuIGZhY3RvcnkudGV4X2ltcGFjdF9ib21icwogICAgICAgICMgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCBib21iIHR5cGUnKQoKZGVmIG5ld19oYW5kbGVtZXNzYWdlKHNlbGYsIG1zZzogQW55KSAtPiBBbnk6CiAgICBhc3NlcnQgbm90IHNlbGYuZXhwaXJlZAogICAgCiAgICBpZiBpc2luc3RhbmNlKG1zZywgYmEuUGlja2VkVXBNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdodXJ0X3NvdW5kJykKICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoJ3BpY2tlZF91cCcpCgogICAgICAgIHNlbGYuX251bV90aW1lc19oaXQgKz0gMQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLlNob3VsZFNoYXR0ZXJNZXNzYWdlKToKICAgICAgICBiYS50aW1lcigwLjAwMSwgYmEuQ2FsbChzZWxmLnNoYXR0ZXIpKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLkltcGFjdERhbWFnZU1lc3NhZ2UpOgogICAgICAgIGJhLnRpbWVyKDAuMDAxLCBiYS5DYWxsKHNlbGYuX2hpdF9zZWxmLCBtc2cuaW50ZW5zaXR5KSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5Qb3dlcnVwTWVzc2FnZSk6CiAgICAgICAgZmFjdG9yeSA9IE5ld1Bvd2VydXBCb3hGYWN0b3J5LmdldCgpCiAgICAgICAgaWYgc2VsZi5fZGVhZCBvciBub3Qgc2VsZi5ub2RlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIHNlbGYucGlja191cF9wb3dlcnVwX2NhbGxiYWNrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnBpY2tfdXBfcG93ZXJ1cF9jYWxsYmFjayhzZWxmKQogICAgICAgIGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAndHJpcGxlX2JvbWJzJzoKICAgICAgICAgICAgdGV4ID0gUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X2JvbWIKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgc2VsZi5zZXRfYm9tYl9jb3VudCgzKQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8xX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMV9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzFfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX211bHRpX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgKFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDApLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5fbXVsdGlfYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9tdWx0aV9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5DYWxsKHNlbGYuX211bHRpX2JvbWJfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdsYW5kX21pbmVzJzoKICAgICAgICAgICAgc2VsZi5zZXRfbGFuZF9taW5lX2NvdW50KG1pbihzZWxmLmxhbmRfbWluZV9jb3VudCArIDMsIDMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpbXBhY3RfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdpbXBhY3QnCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5fYm9tYl93ZWFyX29mZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ3N0aWNreV9ib21icyc6CiAgICAgICAgICAgIHNlbGYuYm9tYl90eXBlID0gJ3N0aWNreScKICAgICAgICAgICAgdGV4ID0gc2VsZi5fZ2V0X2JvbWJfdHlwZV90ZXgoKQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FIC0gMjAwMCwKICAgICAgICAgICAgICAgICAgICBiYS5DYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2gpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAncHVuY2gnOgogICAgICAgICAgICBzZWxmLl9oYXNfYm94aW5nX2dsb3ZlcyA9IFRydWUKICAgICAgICAgICAgdGV4ID0gUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X3B1bmNoCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIHNlbGYuZXF1aXBfYm94aW5nX2dsb3ZlcygpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmJveGluZ19nbG92ZXNfZmxhc2hpbmcgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzNfdGV4dHVyZSA9IHRleAogICAgICAgICAgICAgICAgdF9tcyA9IGJhLnRpbWUodGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRfbXMsIGludCkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8zX3N0YXJ0X3RpbWUgPSB0X21zCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfM19lbmRfdGltZSA9ICgKICAgICAgICAgICAgICAgICAgICB0X21zICsgUE9XRVJVUF9XRUFSX09GRl9USU1FKQogICAgICAgICAgICAgICAgc2VsZi5fYm94aW5nX2dsb3Zlc193ZWFyX29mZl9mbGFzaF90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUgLSAyMDAwLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2dsb3Zlc193ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib3hpbmdfZ2xvdmVzX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9nbG92ZXNfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdzaGllbGQnOgogICAgICAgICAgICBmYWN0b3J5ID0gU3BhekZhY3RvcnkuZ2V0KCkKICAgICAgICAgICAgc2VsZi5lcXVpcF9zaGllbGRzKGRlY2F5PWZhY3Rvcnkuc2hpZWxkX2RlY2F5X3JhdGUgPiAwKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdjdXJzZSc6CiAgICAgICAgICAgIHNlbGYuY3Vyc2UoKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpY2VfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdpY2UnCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaGVhbHRoJzoKICAgICAgICAgICAgaWYgc2VsZi5lZGdfZWZmOgogICAgICAgICAgICAgICAgZiA9IHNlbGYuY29sb3JbMF0KICAgICAgICAgICAgICAgIHIgPSAoMiwwLDApCiAgICAgICAgICAgICAgICBnID0gKDAsMiwwKQogICAgICAgICAgICAgICAgYmEuYW5pbWF0ZV9hcnJheShzZWxmLm5vZGUsJ2NvbG9yJywzLHswOiByLCAwLjY6IGcsIDEuMDogZn0pCiAgICAgICAgICAgICAgICBzZWxmLmVkZ19lZmYgPSBGYWxzZQogICAgICAgICAgICBpZiBzZWxmLl9jdXJzZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jdXJzZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgZmFjdG9yeSA9IFNwYXpGYWN0b3J5LmdldCgpCiAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiBbJ21hdGVyaWFscycsICdyb2xsZXJfbWF0ZXJpYWxzJ106CiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxzID0gZ2V0YXR0cihzZWxmLm5vZGUsIGF0dHIpCiAgICAgICAgICAgICAgICAgICAgaWYgZmFjdG9yeS5jdXJzZV9tYXRlcmlhbCBpbiBtYXRlcmlhbHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vZGUsIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZShtIGZvciBtIGluIG1hdGVyaWFscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbSAhPSBmYWN0b3J5LmN1cnNlX21hdGVyaWFsKSkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5jdXJzZV9kZWF0aF90aW1lID0gMAogICAgICAgICAgICBzZWxmLmhpdHBvaW50cyA9IHNlbGYuaGl0cG9pbnRzX21heAogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQoUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X2hlYWx0aCkKICAgICAgICAgICAgc2VsZi5ub2RlLmh1cnQgPSAwCiAgICAgICAgICAgIHNlbGYuX2xhc3RfaGl0X3RpbWUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX251bV90aW1lc19oaXQgPSAwCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICd0YW5rX3NoaWVsZCc6CiAgICAgICAgICAgIHNlbGYudGFua3NoaWVsZFsnVGFuayddID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmVkZ19lZmYgPSBGYWxzZQogICAgICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF90YW5rX3NoaWVsZAogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQoKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaGVhbHRoX2RhbWFnZSc6CiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2hlYWx0aF9kYW1hZ2UKICAgICAgICAgICAgc2VsZi5lZGdfZWZmID0gVHJ1ZQogICAgICAgICAgICBmID0gc2VsZi5jb2xvclswXQogICAgICAgICAgICBpID0gKDIsMC41LDIpCiAgICAgICAgICAgIGJhLmFuaW1hdGVfYXJyYXkoc2VsZi5ub2RlLCdjb2xvcicsMyx7MDogaSwgMC41OiBpLCAwLjY6IGZ9KQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBzZWxmLnRhbmtzaGllbGRbJ1RhbmsnXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuZnJlZXplX3B1bmNoID0gRmFsc2UKCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ2dvb2RieWUnOgogICAgICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9nb29kYnllCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIHNlbGYua2lsbF9lZmYgPSBUcnVlCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdmbHlfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdmbHknCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ2ZpcmVfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdmaXJlJwogICAgICAgICAgICB0ZXggPSBzZWxmLl9nZXRfYm9tYl90eXBlX3RleCgpCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfdGV4dHVyZSA9IHRleAogICAgICAgICAgICAgICAgdF9tcyA9IGJhLnRpbWUodGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRfbXMsIGludCkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3N0YXJ0X3RpbWUgPSB0X21zCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9lbmRfdGltZSA9ICgKICAgICAgICAgICAgICAgICAgICB0X21zICsgUE9XRVJVUF9XRUFSX09GRl9USU1FKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaF90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUgLSAyMDAwLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2gpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpbXBhaXJtZW50X2JvbWJzJzoKICAgICAgICAgICAgc2VsZi5ib21iX3R5cGUgPSAnaW1wYWlybWVudCcKICAgICAgICAgICAgdGV4ID0gc2VsZi5fZ2V0X2JvbWJfdHlwZV90ZXgoKQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FIC0gMjAwMCwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQoKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaWNlX21hbic6CiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2ljZV9tYW4KICAgICAgICAgICAgc2VsZi5ib21iX3R5cGUgPSAnaWNlX2J1YmJsZScKICAgICAgICAgICAgc2VsZi5mcmVlemVfcHVuY2ggPSBUcnVlCiAgICAgICAgICAgIHNlbGYuZWRnX2VmZiA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYubm9kZS5jb2xvciA9ICgwLDEsNCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgaWNlX21hbl90aW1lID0gMTcwMDAKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAodF9tcyArIGljZV9tYW5fdGltZSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5pY2VfbWFuX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIGljZV9tYW5fdGltZSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChfaWNlX21hbl9vZmZfZmxhc2gsc2VsZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLmljZV9tYW5fdGltZXIgPSAoYmEuVGltZXIoaWNlX21hbl90aW1lLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoX2ljZV9tYW5fd2Vhcl9vZmYsc2VsZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdzcGVlZCc6CiAgICAgICAgICAgIHNlbGYubm9kZS5ob2NrZXkgPSBUcnVlCiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X3NwZWVkCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzcGVlZF90aW1lID0gMTUwMDAKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAodF9tcyArIHNwZWVkX3RpbWUpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYuc3BlZWRfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgc3BlZWRfdGltZSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChfc3BlZWRfb2ZmX2ZsYXNoLHNlbGYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5zcGVlZF90aW1lciA9IChiYS5UaW1lcihzcGVlZF90aW1lLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoX3NwZWVkX3dlYXJfb2ZmLHNlbGYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIAogICAgICAgIHNlbGYuYm1iX2NvbG9yOiBsaXN0ID0gW10gICAgCiAgICAgICAgc2VsZi5ibWJfY29sb3IuYXBwZW5kKHNlbGYuYm9tYl90eXBlKQoKICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnZmxhc2gnKQogICAgICAgIGlmIG1zZy5zb3VyY2Vub2RlOgogICAgICAgICAgICBtc2cuc291cmNlbm9kZS5oYW5kbGVtZXNzYWdlKGJhLlBvd2VydXBBY2NlcHRNZXNzYWdlKCkpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5GcmVlemVNZXNzYWdlKToKICAgICAgICBpZiBub3Qgc2VsZi5ub2RlOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIHNlbGYubm9kZS5pbnZpbmNpYmxlOgogICAgICAgICAgICBiYS5wbGF5c291bmQoU3BhekZhY3RvcnkuZ2V0KCkuYmxvY2tfc291bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgc2VsZi5zaGllbGQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuZnJvemVuOgogICAgICAgICAgICBzZWxmLmZyb3plbiA9IFRydWUKICAgICAgICAgICAgc2VsZi5ub2RlLmZyb3plbiA9IFRydWUKICAgICAgICAgICAgYmEudGltZXIoNS4wLCBiYS5DYWxsKHNlbGYuaGFuZGxlbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYS5UaGF3TWVzc2FnZSgpKSkKICAgICAgICAgICAgaWYgc2VsZi5oaXRwb2ludHMgPD0gMDoKICAgICAgICAgICAgICAgIHNlbGYuc2hhdHRlcigpCiAgICAgICAgaWYgc2VsZi5mcmVlemVfcHVuY2g6CiAgICAgICAgICAgIHNlbGYuaGFuZGxlbWVzc2FnZShiYS5UaGF3TWVzc2FnZSgpKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLlRoYXdNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLmZyb3plbiBhbmQgbm90IHNlbGYuc2hhdHRlcmVkIGFuZCBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYuZnJvemVuID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5ub2RlLmZyb3plbiA9IEZhbHNlCgogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuSGl0TWVzc2FnZSk6CiAgICAgICAgaWYgbm90IHNlbGYubm9kZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBzZWxmLm5vZGUuaW52aW5jaWJsZToKICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLmJsb2NrX3NvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBsb2NhbF90aW1lID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGxvY2FsX3RpbWUsIGludCkKICAgICAgICBpZiAoc2VsZi5fbGFzdF9oaXRfdGltZSBpcyBOb25lCiAgICAgICAgICAgICAgICBvciBsb2NhbF90aW1lIC0gc2VsZi5fbGFzdF9oaXRfdGltZSA+IDEwMDApOgogICAgICAgICAgICBzZWxmLl9udW1fdGltZXNfaGl0ICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9oaXRfdGltZSA9IGxvY2FsX3RpbWUKCiAgICAgICAgbWFnID0gbXNnLm1hZ25pdHVkZSAqIHNlbGYuaW1wYWN0X3NjYWxlCiAgICAgICAgdmVsb2NpdHlfbWFnID0gbXNnLnZlbG9jaXR5X21hZ25pdHVkZSAqIHNlbGYuaW1wYWN0X3NjYWxlICAgICAgIAogICAgICAgIGRhbWFnZV9zY2FsZSA9IDAuMjIKICAgICAgICAKICAgICAgICBkZWYgZmlyZV9lZmZlY3QoKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hpZWxkOgogICAgICAgICAgICAgICAgaWYgc2VsZi5ub2RlLmV4aXN0cygpOgogICAgICAgICAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9Myxjb3VudD01MCoyLHNwcmVhZD0wLjMsCiAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3dlYXQnKQogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdjZWxlYnJhdGUnLCA1NjApCiAgICAgICAgICAgICAgICBlbHNlOiBzZWxmLl9maXJlX3RpbWUgPSBOb25lCiAgICAgICAgICAgIGVsc2U6IHNlbGYuX2ZpcmVfdGltZSA9IE5vbmUKICAgICAgICAKICAgICAgICBkZWYgZmlyZSh0aW1lLCBkYW1hZ2UpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zaGllbGQgYW5kIG5vdCBzZWxmLl9kZWFkOgogICAgICAgICAgICAgICAgc2VsZi5oaXRwb2ludHMgLT0gZGFtYWdlCiAgICAgICAgICAgICAgICBiYS5zaG93X2RhbWFnZV9jb3VudChmJy17ZGFtYWdlfUhQJywKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vZGUucG9zaXRpb24sIG1zZy5mb3JjZV9kaXJlY3Rpb24pCiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Z1c2UwMScpKQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgZHVyYXRpb24gIT0gdGltZToKICAgICAgICAgICAgICAgIHNlbGYuX2ZpcmVfdGltZSA9IGJhLlRpbWVyKDAuMSxiYS5DYWxsKGZpcmVfZWZmZWN0KSxyZXBlYXQ9VHJ1ZSkKICAgICAgICAgICAgZWxzZTogc2VsZi5fZmlyZV90aW1lID0gTm9uZQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgc2VsZi5oaXRwb2ludHMgPCAwOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoYmEuRGllTWVzc2FnZSgpKQogICAgICAgIAogICAgICAgIGlmIG1zZy5oaXRfc3VidHlwZSA9PSAnZmx5JzoKICAgICAgICAgICAgZGFtYWdlX3NjYWxlID0gMC4wCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkX2hpdHBvaW50cyAtPSAzMDAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDwgMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoaWVsZC5kZWxldGUoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaGllbGRfZG93bl9zb3VuZCwxLjAscG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgIGVsaWYgbXNnLmhpdF9zdWJ0eXBlID09ICdmaXJlJzoKICAgICAgICAgICAgaW5kZXggPSAxCiAgICAgICAgICAgIGR1cmF0aW9uID0gNQogICAgICAgICAgICBkYW1hZ2UgPSAxMDMKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hpZWxkOgogICAgICAgICAgICAgICAgZm9yIGZpcmV4IGluIHJhbmdlKGR1cmF0aW9uKToKICAgICAgICAgICAgICAgICAgICBiYS50aW1lcihpbmRleCxiYS5DYWxsKGZpcmUsaW5kZXgsZGFtYWdlKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maXJlX3RpbWUgPSBiYS5UaW1lcigwLjEsYmEuQ2FsbChmaXJlX2VmZmVjdCkscmVwZWF0PVRydWUpCiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zaGllbGRfaGl0cG9pbnRzIC09IDgwCiAgICAgICAgICAgICAgICBpZiBzZWxmLnNoaWVsZF9oaXRwb2ludHMgPCAxOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkLmRlbGV0ZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGllbGQgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnNoaWVsZF9kb3duX3NvdW5kLDEuMCxwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgZWxpZiBtc2cuaGl0X3N1YnR5cGUgPT0gJ2ltcGFpcm1lbnQnOgogICAgICAgICAgICBkYW1hZ2Vfc2NhbGUgPSAwCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkLmRlbGV0ZSgpCiAgICAgICAgICAgICAgICBzZWxmLnNoaWVsZCA9IE5vbmUKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaGllbGRfZG93bl9zb3VuZCwxLjAscG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGl0cG9pbnRzID0gaW50KHNlbGYuaGl0cG9pbnRzKjAuODApCiAgICAgICAgICAgICAgICBzZWxmLmhpdHBvaW50cyAtPSBpbnQoaGl0cG9pbnRzKQogICAgICAgICAgICAgICAgYmEuc2hvd19kYW1hZ2VfY291bnQoKGYnLXtpbnQoaGl0cG9pbnRzLzEwKX0lJyksCiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2RlLnBvc2l0aW9uLCBtc2cuZm9yY2VfZGlyZWN0aW9uKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBzZWxmLmhpdHBvaW50cyA8IDAgb3IgaGl0cG9pbnRzIDwgOTU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoYmEuRGllTWVzc2FnZSgpKQoKICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgaWYgbXNnLmZsYXRfZGFtYWdlOgogICAgICAgICAgICAgICAgZGFtYWdlID0gbXNnLmZsYXRfZGFtYWdlICogc2VsZi5pbXBhY3Rfc2NhbGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBtc2cuZm9yY2VfZGlyZWN0aW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICAnaW1wdWxzZScsIG1zZy5wb3NbMF0sIG1zZy5wb3NbMV0sIG1zZy5wb3NbMl0sCiAgICAgICAgICAgICAgICAgICAgbXNnLnZlbG9jaXR5WzBdLCBtc2cudmVsb2NpdHlbMV0sIG1zZy52ZWxvY2l0eVsyXSwgbWFnLAogICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZywgbXNnLnJhZGl1cywgMSwgbXNnLmZvcmNlX2RpcmVjdGlvblswXSwKICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzFdLCBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdKQogICAgICAgICAgICAgICAgZGFtYWdlID0gZGFtYWdlX3NjYWxlICogc2VsZi5ub2RlLmRhbWFnZQoKICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2hpZWxkX2hpdHBvaW50cyBpcyBub3QgTm9uZQogICAgICAgICAgICBzZWxmLnNoaWVsZF9oaXRwb2ludHMgLT0gaW50KGRhbWFnZSkKICAgICAgICAgICAgc2VsZi5zaGllbGQuaHVydCA9ICgKICAgICAgICAgICAgICAgIDEuMCAtCiAgICAgICAgICAgICAgICBmbG9hdChzZWxmLnNoaWVsZF9oaXRwb2ludHMpIC8gc2VsZi5zaGllbGRfaGl0cG9pbnRzX21heCkKCiAgICAgICAgICAgIG1heF9zcGlsbG92ZXIgPSBTcGF6RmFjdG9yeS5nZXQoKS5tYXhfc2hpZWxkX3NwaWxsb3Zlcl9kYW1hZ2UKICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDw9IDA6CgogICAgICAgICAgICAgICAgc2VsZi5zaGllbGQuZGVsZXRlKCkKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkID0gTm9uZQogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnNoaWVsZF9kb3duX3NvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCgogICAgICAgICAgICAgICAgbnBvcyA9IHNlbGYubm9kZS5wb3NpdGlvbgogICAgICAgICAgICAgICAgYmEuZW1pdGZ4KHBvc2l0aW9uPShucG9zWzBdLCBucG9zWzFdICsgMC45LCBucG9zWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT1zZWxmLm5vZGUudmVsb2NpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9cmFuZG9tLnJhbmRyYW5nZSgyMCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC42LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGU9J3NwYXJrJykKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoU3BhekZhY3RvcnkuZ2V0KCkuc2hpZWxkX2hpdF9zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQoKICAgICAgICAgICAgYXNzZXJ0IG1zZy5mb3JjZV9kaXJlY3Rpb24gaXMgbm90IE5vbmUKICAgICAgICAgICAgYmEuZW1pdGZ4KHBvc2l0aW9uPW1zZy5wb3MsCiAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT0obXNnLmZvcmNlX2RpcmVjdGlvblswXSAqIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzFdICogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMl0gKiAxLjApLAogICAgICAgICAgICAgICAgICAgICAgY291bnQ9bWluKDMwLCA1ICsgaW50KGRhbWFnZSAqIDAuMDA1KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjUsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4zLAogICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3BhcmsnKQoKICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDw9IC1tYXhfc3BpbGxvdmVyOgogICAgICAgICAgICAgICAgbGVmdG92ZXJfZGFtYWdlID0gLW1heF9zcGlsbG92ZXIgLSBzZWxmLnNoaWVsZF9oaXRwb2ludHMKICAgICAgICAgICAgICAgIHNoaWVsZF9sZWZ0b3Zlcl9yYXRpbyA9IGxlZnRvdmVyX2RhbWFnZSAvIGRhbWFnZQoKICAgICAgICAgICAgICAgIG1hZyAqPSBzaGllbGRfbGVmdG92ZXJfcmF0aW8KICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZyAqPSBzaGllbGRfbGVmdG92ZXJfcmF0aW8KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2hpZWxkX2xlZnRvdmVyX3JhdGlvID0gMS4wCgogICAgICAgIGlmIG1zZy5mbGF0X2RhbWFnZToKICAgICAgICAgICAgZGFtYWdlID0gaW50KG1zZy5mbGF0X2RhbWFnZSAqIHNlbGYuaW1wYWN0X3NjYWxlICoKICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWVsZF9sZWZ0b3Zlcl9yYXRpbykKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgKICAgICAgICAgICAgICAgICdpbXB1bHNlJywgbXNnLnBvc1swXSwgbXNnLnBvc1sxXSwgbXNnLnBvc1syXSwKICAgICAgICAgICAgICAgIG1zZy52ZWxvY2l0eVswXSwgbXNnLnZlbG9jaXR5WzFdLCBtc2cudmVsb2NpdHlbMl0sIG1hZywKICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZywgbXNnLnJhZGl1cywgMCwgbXNnLmZvcmNlX2RpcmVjdGlvblswXSwKICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0sIG1zZy5mb3JjZV9kaXJlY3Rpb25bMl0pCgogICAgICAgICAgICBkYW1hZ2UgPSBpbnQoZGFtYWdlX3NjYWxlICogc2VsZi5ub2RlLmRhbWFnZSkKICAgICAgICAgICAgCiAgICAgICAgaWYgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXToKICAgICAgICAgICAgcG9yY2VudGFqZSA9IHBlcmNlbnRhZ2VfdGFua19zaGllbGQoKQogICAgICAgICAgICBkaXNtID0gaW50KGRhbWFnZSpwb3JjZW50YWplKQogICAgICAgICAgICBkYW1hZ2UgPSBpbnQoZGFtYWdlLWRpc20pCiAgICAgICAgICAgIAogICAgICAgICAgICBiYS5zaG93X2RhbWFnZV9jb3VudCgnLScgKyBzdHIoaW50KGRhbWFnZSAvIDEwKSkgKyAnJScsCiAgICAgICAgICAgICAgICBtc2cucG9zLCBtc2cuZm9yY2VfZGlyZWN0aW9uKQoKICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnaHVydF9zb3VuZCcpCgogICAgICAgIGlmIHNlbGYuZWRnX2VmZjoKICAgICAgICAgICAgcG9yY2VudGFqZSA9IHBlcmNlbnRhZ2VfaGVhbHRoX2RhbWFnZSgpCiAgICAgICAgICAgIGRtZ19kaXNtID0gaW50KGRhbWFnZSpwb3JjZW50YWplKQogICAgICAgICAgICBzZWxmLmhpdHBvaW50cyArPSBkbWdfZGlzbQoKICAgICAgICAgICAgUG9wdXBUZXh0KHRleHQ9Zicre2ludChkbWdfZGlzbS8xMCl9JScsc2NhbGU9MS41LAogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24sY29sb3I9KDAsMSwwKSkuYXV0b3JldGFpbigpCiAgICAgICAgICAgIGJhLmFuaW1hdGVfYXJyYXkoc2VsZi5ub2RlLCdjb2xvcicsMyx7MDogKDAsMSwwKSwgMC4zOTogKDAsMiwwKSwgMC40OiBzZWxmLmNvbG9yWzBdfSkKICAgICAgICAgICAgYmEucGxheXNvdW5kKGJhLmdldHNvdW5kKCdoZWFsdGhQb3dlcnVwJykpCgogICAgICAgIGlmIG1zZy5oaXRfdHlwZSA9PSAncHVuY2gnOgogICAgICAgICAgICBzZWxmLm9uX3B1bmNoZWQoZGFtYWdlKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbXNnLmdldF9zb3VyY2VfcGxheWVyKGJhLlBsYXllcikuYWN0b3IuZnJlZXplX3B1bmNoOgogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5jb2xvciA9ICgwLDEsNCkKICAgICAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2ZyZWV6ZScpKQogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKGJhLkZyZWV6ZU1lc3NhZ2UoKSkKICAgICAgICAgICAgZXhjZXB0OiBwYXNzCgogICAgICAgICAgICBpZiBkYW1hZ2UgPiAzNTA6CiAgICAgICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgYmEuc2hvd19kYW1hZ2VfY291bnQoJy0nICsgc3RyKGludChkYW1hZ2UgLyAxMCkpICsgJyUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvcywgbXNnLmZvcmNlX2RpcmVjdGlvbikKCiAgICAgICAgICAgIGlmIG1zZy5oaXRfc3VidHlwZSA9PSAnc3VwZXJfcHVuY2gnOgogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kX3N0cm9uZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgICAgIGlmIGRhbWFnZSA+IDUwMDoKICAgICAgICAgICAgICAgIHNvdW5kcyA9IFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kX3N0cm9uZwogICAgICAgICAgICAgICAgc291bmQgPSBzb3VuZHNbcmFuZG9tLnJhbmRyYW5nZShsZW4oc291bmRzKSldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzb3VuZCA9IFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kCiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChzb3VuZCwgMS4wLCBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCgogICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICBiYS5lbWl0ZngocG9zaXRpb249bXNnLnBvcywKICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5PShtc2cuZm9yY2VfZGlyZWN0aW9uWzBdICogMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0gKiAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsyXSAqIDAuNSksCiAgICAgICAgICAgICAgICAgICAgICBjb3VudD1taW4oMTAsIDEgKyBpbnQoZGFtYWdlICogMC4wMDI1KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjMsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4wMykKCiAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1tc2cucG9zLAogICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3dlYXQnLAogICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KG1zZy5mb3JjZV9kaXJlY3Rpb25bMF0gKiAxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsxXSAqIDEuMyArIDUuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdICogMS4zKSwKICAgICAgICAgICAgICAgICAgICAgIGNvdW50PW1pbigzMCwgMSArIGludChkYW1hZ2UgKiAwLjA0KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjksCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4yOCkKCiAgICAgICAgICAgIGh1cnRpbmVzcyA9IGRhbWFnZSAqIDAuMDAzCiAgICAgICAgICAgIHB1bmNocG9zID0gKG1zZy5wb3NbMF0gKyBtc2cuZm9yY2VfZGlyZWN0aW9uWzBdICogMC4wMiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvc1sxXSArIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0gKiAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgICBtc2cucG9zWzJdICsgbXNnLmZvcmNlX2RpcmVjdGlvblsyXSAqIDAuMDIpCiAgICAgICAgICAgIGZsYXNoX2NvbG9yID0gKDEuMCwgMC44LCAwLjQpCiAgICAgICAgICAgIGxpZ2h0ID0gYmEubmV3bm9kZSgKICAgICAgICAgICAgICAgICdsaWdodCcsCiAgICAgICAgICAgICAgICBhdHRycz17CiAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJzogcHVuY2hwb3MsCiAgICAgICAgICAgICAgICAgICAgJ3JhZGl1cyc6IDAuMTIgKyBodXJ0aW5lc3MgKiAwLjEyLAogICAgICAgICAgICAgICAgICAgICdpbnRlbnNpdHknOiAwLjMgKiAoMS4wICsgMS4wICogaHVydGluZXNzKSwKICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0X2F0dGVudWF0ZWQnOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAnY29sb3InOiBmbGFzaF9jb2xvcgogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgYmEudGltZXIoMC4wNiwgbGlnaHQuZGVsZXRlKQoKICAgICAgICAgICAgZmxhc2ggPSBiYS5uZXdub2RlKCdmbGFzaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycz17CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJzogcHVuY2hwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnOiAwLjE3ICsgMC4xNyAqIGh1cnRpbmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiBmbGFzaF9jb2xvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgYmEudGltZXIoMC4wNiwgZmxhc2guZGVsZXRlKQoKICAgICAgICBpZiBtc2cuaGl0X3R5cGUgPT0gJ2ltcGFjdCc6CiAgICAgICAgICAgIGFzc2VydCBtc2cuZm9yY2VfZGlyZWN0aW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1tc2cucG9zLAogICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KG1zZy5mb3JjZV9kaXJlY3Rpb25bMF0gKiAyLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsxXSAqIDIuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdICogMi4wKSwKICAgICAgICAgICAgICAgICAgICAgIGNvdW50PW1pbigxMCwgMSArIGludChkYW1hZ2UgKiAwLjAxKSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjQsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4xKQogICAgICAgIGlmIHNlbGYuaGl0cG9pbnRzID4gMDoKICAgICAgICAgICAgaWYgbXNnLmhpdF90eXBlID09ICdpbXBhY3QnIGFuZCBkYW1hZ2UgPiBzZWxmLmhpdHBvaW50czoKICAgICAgICAgICAgICAgIG5ld2RhbWFnZSA9IG1heChkYW1hZ2UgLSAyMDAsIHNlbGYuaGl0cG9pbnRzIC0gMTApCiAgICAgICAgICAgICAgICBkYW1hZ2UgPSBuZXdkYW1hZ2UKICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoJ2ZsYXNoJykKCiAgICAgICAgICAgIGlmIGRhbWFnZSA+IDAuMCBhbmQgc2VsZi5ub2RlLmhvbGRfbm9kZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5ob2xkX25vZGUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuaGl0cG9pbnRzIC09IGRhbWFnZQogICAgICAgICAgICBzZWxmLm5vZGUuaHVydCA9IDEuMCAtIGZsb2F0KAogICAgICAgICAgICAgICAgc2VsZi5oaXRwb2ludHMpIC8gc2VsZi5oaXRwb2ludHNfbWF4CgogICAgICAgICAgICBpZiBzZWxmLl9jdXJzZWQgYW5kIGRhbWFnZSA+IDA6CiAgICAgICAgICAgICAgICBiYS50aW1lcigKICAgICAgICAgICAgICAgICAgICAwLjA1LAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5jdXJzZV9leHBsb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRfc291cmNlX3BsYXllcihiYS5QbGF5ZXIpKSkKCiAgICAgICAgICAgIGlmIHNlbGYuZnJvemVuIGFuZCAoZGFtYWdlID4gMjAwIG9yIHNlbGYuaGl0cG9pbnRzIDw9IDApOgogICAgICAgICAgICAgICAgc2VsZi5zaGF0dGVyKCkKICAgICAgICAgICAgZWxpZiBzZWxmLmhpdHBvaW50cyA8PSAwOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgYmEuRGllTWVzc2FnZShob3c9YmEuRGVhdGhUeXBlLklNUEFDVCkpCgogICAgICAgIGlmIHNlbGYuaGl0cG9pbnRzIDw9IDA6CiAgICAgICAgICAgIGRhbWFnZV9hdmcgPSBzZWxmLm5vZGUuZGFtYWdlX3Ntb290aGVkICogZGFtYWdlX3NjYWxlCiAgICAgICAgICAgIGlmIGRhbWFnZV9hdmcgPiAxMDAwOgogICAgICAgICAgICAgICAgc2VsZi5zaGF0dGVyKCkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBCb21iRGllZE1lc3NhZ2UpOgogICAgICAgIHNlbGYuYm9tYl9jb3VudCArPSAxCgogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuRGllTWVzc2FnZSk6CiAgICAgICAgZGVmIGRyb3BfYm9tYigpOgogICAgICAgICAgICBmb3IgeGJvbWIgaW4gcmFuZ2UoMyk6CiAgICAgICAgICAgICAgICBwID0gc2VsZi5ub2RlLnBvc2l0aW9uCiAgICAgICAgICAgICAgICBwb3MgPSAocFswXSt4Ym9tYixwWzFdKzUscFsyXS14Ym9tYikKICAgICAgICAgICAgICAgIGJhbGwgPSBib21iLkJvbWIocG9zaXRpb249cG9zLGJvbWJfdHlwZT0naW1wYWN0JykuYXV0b3JldGFpbigpCiAgICAgICAgICAgICAgICBiYWxsLm5vZGUubW9kZWxfc2NhbGUgPSAwLjYKICAgICAgICAgICAgICAgIGJhbGwubm9kZS5tb2RlbCA9IGJhLmdldG1vZGVsKCdlZ2cnKQogICAgICAgICAgICAgICAgYmFsbC5ub2RlLmdyYXZpdHlfc2NhbGUgPSAyCgogICAgICAgIGlmIHNlbGYuZWRnX2VmZjoKICAgICAgICAgICAgc2VsZi5lZGdfZWZmID0gRmFsc2UKCiAgICAgICAgd2FzZGVhZCA9IHNlbGYuX2RlYWQKICAgICAgICBzZWxmLl9kZWFkID0gVHJ1ZQogICAgICAgIHNlbGYuaGl0cG9pbnRzID0gMAogICAgICAgIGlmIG1zZy5pbW1lZGlhdGU6CiAgICAgICAgICAgIGlmIHNlbGYubm9kZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5kZWxldGUoKQogICAgICAgIGVsaWYgc2VsZi5ub2RlOgogICAgICAgICAgICBzZWxmLm5vZGUuaHVydCA9IDEuMAogICAgICAgICAgICBpZiBzZWxmLnBsYXlfYmlnX2RlYXRoX3NvdW5kIGFuZCBub3Qgd2FzZGVhZDoKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaW5nbGVfcGxheWVyX2RlYXRoX3NvdW5kKQogICAgICAgICAgICBzZWxmLm5vZGUuZGVhZCA9IFRydWUKICAgICAgICAgICAgYmEudGltZXIoMi4wLCBzZWxmLm5vZGUuZGVsZXRlKQoKICAgICAgICAgICAgdCA9IDAKICAgICAgICAgICAgaWYgc2VsZi5raWxsX2VmZjoKICAgICAgICAgICAgICAgIGZvciBib21icyBpbiByYW5nZSgzKToKICAgICAgICAgICAgICAgICAgICBiYS50aW1lcih0LGJhLkNhbGwoZHJvcF9ib21iKSkKICAgICAgICAgICAgICAgICAgICB0ICs9IDAuMTUKICAgICAgICAgICAgICAgIHNlbGYua2lsbF9lZmYgPSBGYWxzZQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLk91dE9mQm91bmRzTWVzc2FnZSk6CiAgICAgICAgc2VsZi5oYW5kbGVtZXNzYWdlKGJhLkRpZU1lc3NhZ2UoaG93PWJhLkRlYXRoVHlwZS5GQUxMKSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5TdGFuZE1lc3NhZ2UpOgogICAgICAgIHNlbGYuX2xhc3Rfc3RhbmRfcG9zID0gKG1zZy5wb3NpdGlvblswXSwgbXNnLnBvc2l0aW9uWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5wb3NpdGlvblsyXSkKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdzdGFuZCcsIG1zZy5wb3NpdGlvblswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvc2l0aW9uWzFdLCBtc2cucG9zaXRpb25bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hbmdsZSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBDdXJzZUV4cGxvZGVNZXNzYWdlKToKICAgICAgICBzZWxmLmN1cnNlX2V4cGxvZGUoKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIFB1bmNoSGl0TWVzc2FnZSk6CiAgICAgICAgaWYgbm90IHNlbGYubm9kZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBub2RlID0gYmEuZ2V0Y29sbGlzaW9uKCkub3Bwb3Npbmdub2RlCgogICAgICAgIGlmIG5vZGUgYW5kIChub2RlIG5vdCBpbiBzZWxmLl9wdW5jaGVkX25vZGVzKToKCiAgICAgICAgICAgIHB1bmNoX21vbWVudHVtX2FuZ3VsYXIgPSAoc2VsZi5ub2RlLnB1bmNoX21vbWVudHVtX2FuZ3VsYXIgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3B1bmNoX3Bvd2VyX3NjYWxlKQogICAgICAgICAgICBwdW5jaF9wb3dlciA9IHNlbGYubm9kZS5wdW5jaF9wb3dlciAqIHNlbGYuX3B1bmNoX3Bvd2VyX3NjYWxlCgogICAgICAgICAgICBpZiBub2RlLmdldG5vZGV0eXBlKCkgIT0gJ3NwYXonOgogICAgICAgICAgICAgICAgc291bmRzID0gU3BhekZhY3RvcnkuZ2V0KCkuaW1wYWN0X3NvdW5kc19tZWRpdW0KICAgICAgICAgICAgICAgIHNvdW5kID0gc291bmRzW3JhbmRvbS5yYW5kcmFuZ2UobGVuKHNvdW5kcykpXQogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKHNvdW5kLCAxLjAsIHBvc2l0aW9uPXNlbGYubm9kZS5wb3NpdGlvbikKCiAgICAgICAgICAgIHBwb3MgPSBzZWxmLm5vZGUucHVuY2hfcG9zaXRpb24KICAgICAgICAgICAgcHVuY2hkaXIgPSBzZWxmLm5vZGUucHVuY2hfdmVsb2NpdHkKICAgICAgICAgICAgdmVsID0gc2VsZi5ub2RlLnB1bmNoX21vbWVudHVtX2xpbmVhcgoKICAgICAgICAgICAgc2VsZi5fcHVuY2hlZF9ub2Rlcy5hZGQobm9kZSkKICAgICAgICAgICAgbm9kZS5oYW5kbGVtZXNzYWdlKAogICAgICAgICAgICAgICAgYmEuSGl0TWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICBwb3M9cHBvcywKICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT12ZWwsCiAgICAgICAgICAgICAgICAgICAgbWFnbml0dWRlPXB1bmNoX3Bvd2VyICogcHVuY2hfbW9tZW50dW1fYW5ndWxhciAqIDExMC4wLAogICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZ25pdHVkZT1wdW5jaF9wb3dlciAqIDQwLAogICAgICAgICAgICAgICAgICAgIHJhZGl1cz0wLAogICAgICAgICAgICAgICAgICAgIHNyY25vZGU9c2VsZi5ub2RlLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wbGF5ZXI9c2VsZi5zb3VyY2VfcGxheWVyLAogICAgICAgICAgICAgICAgICAgIGZvcmNlX2RpcmVjdGlvbj1wdW5jaGRpciwKICAgICAgICAgICAgICAgICAgICBoaXRfdHlwZT0ncHVuY2gnLAogICAgICAgICAgICAgICAgICAgIGhpdF9zdWJ0eXBlPSgnc3VwZXJfcHVuY2gnIGlmIHNlbGYuX2hhc19ib3hpbmdfZ2xvdmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJ2RlZmF1bHQnKSkpCgogICAgICAgICAgICBtYWcgPSAtNDAwLjAKICAgICAgICAgICAgaWYgc2VsZi5faG9ja2V5OgogICAgICAgICAgICAgICAgbWFnICo9IDAuNQogICAgICAgICAgICBpZiBsZW4oc2VsZi5fcHVuY2hlZF9ub2RlcykgPT0gMToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdraWNrX2JhY2snLCBwcG9zWzBdLCBwcG9zWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBvc1syXSwgcHVuY2hkaXJbMF0sIHB1bmNoZGlyWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVuY2hkaXJbMl0sIG1hZykKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIFBpY2t1cE1lc3NhZ2UpOgogICAgICAgIGlmIG5vdCBzZWxmLm5vZGU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29sbGlzaW9uID0gYmEuZ2V0Y29sbGlzaW9uKCkKICAgICAgICAgICAgb3Bwb3Npbmdub2RlID0gY29sbGlzaW9uLm9wcG9zaW5nbm9kZQogICAgICAgICAgICBvcHBvc2luZ2JvZHkgPSBjb2xsaXNpb24ub3Bwb3Npbmdib2R5CiAgICAgICAgZXhjZXB0IGJhLk5vdEZvdW5kRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb3Bwb3Npbmdub2RlLmludmluY2libGU6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgKG9wcG9zaW5nbm9kZS5nZXRub2RldHlwZSgpID09ICdzcGF6JwogICAgICAgICAgICAgICAgYW5kIG5vdCBvcHBvc2luZ25vZGUuc2hhdHRlcmVkIGFuZCBvcHBvc2luZ2JvZHkgPT0gNCk6CiAgICAgICAgICAgIG9wcG9zaW5nYm9keSA9IDEKCiAgICAgICAgaGVsZCA9IHNlbGYubm9kZS5ob2xkX25vZGUKICAgICAgICBpZiBoZWxkIGFuZCBoZWxkLmdldG5vZGV0eXBlKCkgPT0gJ2ZsYWcnOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBzZWxmLm5vZGUuaG9sZF9ib2R5ID0gb3Bwb3Npbmdib2R5CiAgICAgICAgc2VsZi5ub2RlLmhvbGRfbm9kZSA9IG9wcG9zaW5nbm9kZQogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuQ2VsZWJyYXRlTWVzc2FnZSk6CiAgICAgICAgaWYgc2VsZi5ub2RlOgogICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnY2VsZWJyYXRlJywgaW50KG1zZy5kdXJhdGlvbiAqIDEwMDApKQoKICAgIHJldHVybiBOb25lCiAgICAgICAgCmNsYXNzIFBvd2VydXBNYW5hZ2VyV2luZG93KFBvcHVwV2luZG93KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc2l0aW9uPSAnaW5fcmlnaHQnKToKICAgICAgICBjb2x1bW5zID0gMgogICAgICAgIHNlbGYuX3dpZHRoID0gd2lkdGggPSA4MDAKICAgICAgICBzZWxmLl9oZWlnaHQgPSBoZWlnaHQgPSA1MDAKICAgICAgICBzZWxmLl9zdWJfaGVpZ2h0ID0gMjAwCiAgICAgICAgc2VsZi5fc2Nyb2xsX3dpZHRoID0gc2VsZi5fd2lkdGgqMC45MAogICAgICAgIHNlbGYuX3Njcm9sbF9oZWlnaHQgPSBzZWxmLl9oZWlnaHQgLSAxODAKICAgICAgICBzZWxmLl9zdWJfd2lkdGggPSBzZWxmLl9zY3JvbGxfd2lkdGgqMC45NTsKICAgICAgICBzZWxmLnRhYl9idXR0b25zOiBzZXQgPSB7fQogICAgICAgIHNlbGYubGlzdF9jbHNfcG93ZXI6IGxpc3QgPSBbXQogICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcnVwcyA9IGRlZmF1bHRfcG93ZXJ1cHMoKQogICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0ID0gbGlzdChzZWxmLmRlZmF1bHRfcG93ZXJ1cHMpCiAgICAgICAgc2VsZi5jb2lucyA9IGFwZ1snQmVhciBDb2luJ10KICAgICAgICBzZWxmLnBvcHVwX2Nsc19wb3dlciA9IE5vbmUKCiAgICAgICAgaWYgbm90IFNUT1JFWydCdXkgRmlyZWJvbWJzJ106CiAgICAgICAgICAgIHBvd2VydXBzWydGaXJlIEJvbWJzJ10gPSAwCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0LnJlbW92ZSgnRmlyZSBCb21icycpCgogICAgICAgIHNlbGYuY2hhcnN0ciA9IFtiYS5jaGFyc3RyKGJhLlNwZWNpYWxDaGFyLkxFRlRfQVJST1cpLAogICAgICAgICAgICAgICAgICAgICAgICBiYS5jaGFyc3RyKGJhLlNwZWNpYWxDaGFyLlJJR0hUX0FSUk9XKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmEuY2hhcnN0cihiYS5TcGVjaWFsQ2hhci5VUF9BUlJPVyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhLmNoYXJzdHIoYmEuU3BlY2lhbENoYXIuRE9XTl9BUlJPVyldCgogICAgICAgIHNlbGYudGFiZGVmcyA9IHsiQWN0aW9uIDEiOiBbJ3Bvd2VydXBJY2VCb21icycsKDEsMSwxKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb24gMiI6IFsnc2V0dGluZ3NJY29uJywoMCwxLDApXSwKICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAzIjogWydpbnZlbnRvcnlJY29uJywoMSwxLDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiA0IjogWydzdG9yZUljb24nLCgxLDEsMSldLAogICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uIDUiOiBbJ2FkdmFuY2VkSWNvbicsKDEsMSwxKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICJBYm91dCI6IFsnaGVhcnQnLCgxLjUsMC4zLDAuMyldfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZiAoU1RPUkVbJ0J1eSBGaXJlYm9tYnMnXSBhbmQKICAgICAgICAgICAgU1RPUkVbJ0J1eSBPcHRpb24nXSBhbmQKICAgICAgICAgICAgU1RPUkVbJ0J1eSBQZXJjZW50YWdlJ10pOgogICAgICAgICAgICBzZWxmLnRhYmRlZnMgPSB7IkFjdGlvbiAxIjogWydwb3dlcnVwSWNlQm9tYnMnLCgxLDEsMSldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAyIjogWydzZXR0aW5nc0ljb24nLCgwLDEsMCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAzIjogWydpbnZlbnRvcnlJY29uJywoMSwxLDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYm91dCI6IFsnaGVhcnQnLCgxLjUsMC4zLDAuMyldfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBzZWxmLmxpc3RkZWYgPSBsaXN0KHNlbGYudGFiZGVmcykKICAgICAgICAKICAgICAgICBzZWxmLmNvdW50ID0gbGVuKHNlbGYudGFiZGVmcykKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgc2VsZi5fY3VycmVudF90YWIgPSBHTE9CQUxbJ1RhYiddCgogICAgICAgIGFwcCA9IGJhLmFwcC51aQogICAgICAgIHVpc2NhbGUgPSBhcHAudWlzY2FsZQoKICAgICAgICBzZWxmLl9yb290X3dpZGdldCA9IGJhLmNvbnRhaW5lcndpZGdldChzaXplPSh3aWR0aCs5MCxoZWlnaHQrODApLHRyYW5zaXRpb249dHJhbnNpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MS41IGlmIHVpc2NhbGUgaXMgYmEuVUlTY2FsZS5TTUFMTCBlbHNlIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfb2Zmc2V0PSgwLC0zMCkgaWYgdWlzY2FsZSBpcyBiYS5VSVNjYWxlLlNNQUxMIGVsc2UgICgwLDApKQogICAgICAgIAogICAgICAgIHNlbGYuX2JhY2tCdXR0b24gPSBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCxhdXRvc2VsZWN0PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KDYwLHNlbGYuX2hlaWdodC0xNSksc2l6ZT0oMTMwLDYwKSwKICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjgsdGV4dF9zY2FsZT0xLjIsbGFiZWw9YmEuTHN0cihyZXNvdXJjZT0nYmFja1RleHQnKSwKICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fdHlwZT0nYmFjaycsb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2JhY2spKQogICAgICAgIGJhLmJ1dHRvbndpZGdldChlZGl0PXNlbGYuX2JhY2tCdXR0b24sIGJ1dHRvbl90eXBlPSdiYWNrU21hbGwnLHNpemU9KDYwLCA2MCksbGFiZWw9YmEuY2hhcnN0cihiYS5TcGVjaWFsQ2hhci5CQUNLKSkKICAgICAgICBiYS5jb250YWluZXJ3aWRnZXQoZWRpdD1zZWxmLl9yb290X3dpZGdldCxjYW5jZWxfYnV0dG9uPWIpCgogICAgICAgIHNlbGYudGl0bGV0ZXh0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQscG9zaXRpb249KDAsIGhlaWdodC0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLCB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAKICAgICAgICBpbmRleCA9IDAKICAgICAgICBmb3IgdGFiIGluIHJhbmdlKHNlbGYuY291bnQpOgogICAgICAgICAgICBmb3IgdGFiMiBpbiByYW5nZShjb2x1bW5zKToKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGFnID0gc2VsZi5saXN0ZGVmW2luZGV4XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICg2MjArKHRhYjIqMTIwKSxzZWxmLl9oZWlnaHQtNTAqMi41LSh0YWIqMTIwKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgdGFnID09ICdBYm91dCc6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJhLkxzdHIocmVzb3VyY2U9J2dhdGhlcldpbmRvdy5hYm91dFRleHQnKQogICAgICAgICAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiA0JzoKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYmEuTHN0cihyZXNvdXJjZT0nc3RvcmVUZXh0JykKICAgICAgICAgICAgICAgIGVsc2U6IHRleHQgPSBnZXRsYW5ndWFnZSh0YWcpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYudGFiX2J1dHRvbnNbdGFnXSA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQsYXV0b3NlbGVjdD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb24sc2l6ZT0oMTEwLDExMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLGxhYmVsPScnLGVuYWJsZV9zb3VuZD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90eXBlPSdzcXVhcmUnLG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLl9zZXRfdGFiLHRhZyxzb3VuZD1UcnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLnRleHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSs1NSxwb3NpdGlvblsxXSszMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPSgwLCAwKSxzY2FsZT0xLGNvbG9yPWJhLmFwcC51aS50aXRsZV9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfY29udHJvbGxlcj1zZWxmLnRhYl9idXR0b25zW3RhZ10sbWF4d2lkdGg9MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD10ZXh0LGhfYWxpZ249J2NlbnRlcicsdl9hbGlnbj0nY2VudGVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLmltYWdlID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KDYwLDYwKSxjb2xvcj1zZWxmLnRhYmRlZnNbdGFnXVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2NvbnRyb2xsZXI9c2VsZi50YWJfYnV0dG9uc1t0YWddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsyNSxwb3NpdGlvblsxXSs0MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZT1iYS5nZXR0ZXh0dXJlKHNlbGYudGFiZGVmc1t0YWddWzBdKSkKCiAgICAgICAgICAgICAgICBpbmRleCArPSAxCiAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID09IGluZGV4OgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAKICAgICAgICAgICAgaWYgc2VsZi5jb3VudCA9PSBpbmRleDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgCiAgICAgICAgc2VsZi5fc2Nyb2xsd2lkZ2V0ID0gTm9uZQogICAgICAgIHNlbGYuX3RhYl9jb250YWluZXIgPSBOb25lCiAgICAgICAgc2VsZi5fc2V0X3RhYihzZWxmLl9jdXJyZW50X3RhYikKCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICBhcGcuYXBwbHlfYW5kX2NvbW1pdCgpCgogICAgZGVmIF9zZXRfdGFiKHNlbGYsIHRhYiwgc291bmQ6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgc2VsZi5zb3VuZCA9IHNvdW5kCiAgICAgICAgR0xPQkFMWydUYWInXSA9IHRhYgogICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKICAgICAgICAKICAgICAgICBpZiBzZWxmLl90YWJfY29udGFpbmVyIGlzIG5vdCBOb25lIGFuZCBzZWxmLl90YWJfY29udGFpbmVyLmV4aXN0cygpOgogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyLmRlbGV0ZSgpCgogICAgICAgIGlmIHNlbGYuc291bmQ6CiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2xpY2swMScpKQoKICAgICAgICBpZiBzZWxmLl9zY3JvbGx3aWRnZXQ6CiAgICAgICAgICAgIHNlbGYuX3Njcm9sbHdpZGdldC5kZWxldGUoKQoKICAgICAgICBzZWxmLl9zY3JvbGx3aWRnZXQgPSBiYS5zY3JvbGx3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICBwb3NpdGlvbj0oc2VsZi5fd2lkdGgqMC4wOCw1MSoxLjgpLHNpemU9KHNlbGYuX3N1Yl93aWR0aCAtMTQwLHNlbGYuX3Njcm9sbF9oZWlnaHQgKzYwKjEuMikpCgogICAgICAgIGlmIHRhYiA9PSAnQWN0aW9uIDQnOgogICAgICAgICAgICBpZiBzZWxmLl9zY3JvbGx3aWRnZXQ6CiAgICAgICAgICAgICAgICBzZWxmLl9zY3JvbGx3aWRnZXQuZGVsZXRlKCkKICAgICAgICAgICAgc2VsZi5fc2Nyb2xsd2lkZ2V0ID0gYmEuaHNjcm9sbHdpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj0oc2VsZi5fd2lkdGgqMC4wOCw1MSoxLjgpLHNpemU9KHNlbGYuX3N1Yl93aWR0aCAtMTQwLHNlbGYuX3Njcm9sbF9oZWlnaHQgKzYwKjEuMiksCiAgICAgICAgICAgICAgICBjYXB0dXJlX2Fycm93cz1UcnVlLGNsYWltc19sZWZ0X3JpZ2h0PVRydWUpCiAgICAgICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnRpdGxldGV4dCx0ZXh0PWJhLkxzdHIocmVzb3VyY2U9J3N0b3JlVGV4dCcpKQogICAgICAgIGVsaWYgdGFiID09ICdBYm91dCc6CiAgICAgICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnRpdGxldGV4dCx0ZXh0PWJhLkxzdHIocmVzb3VyY2U9J2dhdGhlcldpbmRvdy5hYm91dFRleHQnKSkKICAgICAgICBlbHNlOiBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi50aXRsZXRleHQsdGV4dD1nZXRsYW5ndWFnZSh0YWIpKQoKICAgICAgICBjaG9pY2VzID0gWydSZXNldCcsJ09ubHkgQm9tYnMnLCdPbmx5IEl0ZW1zJywnTmV3JywnTm90aGluZyddCiAgICAgICAgY19kaXNwbGF5ID0gW10KICAgICAgICAKICAgICAgICBmb3IgZGlzcGxheSBpbiBjaG9pY2VzOgogICAgICAgICAgICBjaG9pY2VzX2Rpc3BsYXkgPSBiYS5Mc3RyKHRyYW5zbGF0ZT0oIiIsZ2V0bGFuZ3VhZ2UoZGlzcGxheSkpKQogICAgICAgICAgICBjX2Rpc3BsYXkuYXBwZW5kKGNob2ljZXNfZGlzcGxheSkKICAgIAogICAgICAgIGlmIHRhYiA9PSAnQWN0aW9uIDEnOgogICAgICAgICAgICBzZWxmLnBvcHVwX2Nsc19wb3dlciA9IFBvcHVwTWVudSgKICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICBwb3NpdGlvbj0oMTMwLHNlbGYuX3dpZHRoKjAuNjEpLAogICAgICAgICAgICAgICAgICBidXR0b25fc2l6ZT0oMTUwLDUwKSxzY2FsZT0yLjUsCiAgICAgICAgICAgICAgICAgIGNob2ljZXM9Y2hvaWNlcyx3aWR0aD0xNTAsCiAgICAgICAgICAgICAgICAgIGNob2ljZXNfZGlzcGxheT1jX2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY2hvaWNlPUdMT0JBTFsnQ2xzIFBvd2VydXAnXSwKICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9c2VsZi5fc2V0X2NvbmNlcHQpCiAgICAgICAgICAgIHNlbGYubGlzdF9jbHNfcG93ZXIuYXBwZW5kKHNlbGYucG9wdXBfY2xzX3Bvd2VyLl9idXR0b24pCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLmJ1dHRvbl9jbHNfcG93ZXIgPSBiYS5idXR0b253aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSg1MDAsc2VsZi5fd2lkdGgqMC42MSksc2l6ZT0oNTAsNTApLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLGxhYmVsPSgnJScpLHRleHRfc2NhbGU9MSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPXNlbGYuX3BlcmNlbnRhZ2Vfd2luZG93KSAKICAgICAgICAgICAgc2VsZi5saXN0X2Nsc19wb3dlci5hcHBlbmQoc2VsZi5idXR0b25fY2xzX3Bvd2VyKQogICAgICAgICAgICAKICAgICAgICAgICAgcmV3aW5kb3cgPSBbc2VsZi5wb3B1cF9jbHNfcG93ZXIuX2J1dHRvbixzZWxmLmJ1dHRvbl9jbHNfcG93ZXJdCiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgY2xzIGluIHNlbGYubGlzdF9jbHNfcG93ZXI6ICMgdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBzbyB0aGF0IHB1cHVwcyBkb24ndCBhY2N1bXVsYXRlCiAgICAgICAgICAgICAgICBpZiBjbHMgbm90IGluIHJld2luZG93OgogICAgICAgICAgICAgICAgICAgIGNscy5kZWxldGUoKQogICAgICAgICAgICAKICAgICAgICBlbGlmIHRhYiA9PSAnQWN0aW9uIDQnOgogICAgICAgICAgICBzZWxmLmJ1dHRvbl9jb2luID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCxpY29uPWJhLmdldHRleHR1cmUoJ2NvaW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0oNTUwLHNlbGYuX3dpZHRoKjAuNjE0KSxzaXplPSgxNjAsNDApLHRleHRjb2xvcj0oMCwxLDApLGNvbG9yPSgwLDEsNiksCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9MSxsYWJlbD1zdHIoYXBnWydCZWFyIENvaW4nXSksdGV4dF9zY2FsZT0xLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPU5vbmUpICNzZWxmLl9wZXJjZW50YWdlX3dpbmRvdykKICAgICAgICAgICAgc2VsZi5saXN0X2Nsc19wb3dlci5hcHBlbmQoc2VsZi5idXR0b25fY29pbikKICAgICAgICAgICAgCiAgICAgICAgICAgIHRyeTogcmV3aW5kb3cuYXBwZW5kKHNlbGYuYnV0dG9uX2NvaW4pCiAgICAgICAgICAgIGV4Y2VwdDogcmV3aW5kb3cgPSBbc2VsZi5idXR0b25fY29pbl0KICAgICAgICAgICAgZm9yIGNscyBpbiBzZWxmLmxpc3RfY2xzX3Bvd2VyOiAjIHRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgc28gdGhhdCBwdXB1cHMgZG9uJ3QgYWNjdW11bGF0ZQogICAgICAgICAgICAgICAgaWYgY2xzIG5vdCBpbiByZXdpbmRvdzoKICAgICAgICAgICAgICAgICAgICBjbHMuZGVsZXRlKCkKICAgICAgICAgICAgCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIGNscyBpbiBzZWxmLmxpc3RfY2xzX3Bvd2VyOgogICAgICAgICAgICAgICAgICAgIGNscy5kZWxldGUoKQogICAgICAgICAgICBleGNlcHQ6IHBhc3MKCiAgICAgICAgaWYgdGFiID09ICdBY3Rpb24gMSc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSBsZW4oc2VsZi5kZWZhdWx0X3Bvd2VyX2xpc3QpICogOTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICBwb3NpID0gMAogICAgICAgICAgICBpZF9wb3dlciA9IGxpc3Qoc2VsZi5kZWZhdWx0X3Bvd2VydXBzKQogICAgICAgICAgICBuZXdfcG93ZXJ1cHMgPSBpZF9wb3dlcls5Ol0KICAgICAgICAgICAgc2VsZi5saXN0cG93ZXIgPSB7fQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQoKICAgICAgICAgICAgZm9yIHBvd2VyIGluIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0OgogICAgICAgICAgICAgICAgaWYgcG93ZXIgPT0gaWRfcG93ZXJbMF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBTaGllbGROYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwU2hpZWxkJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBQdW5jaE5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBQdW5jaCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzJdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwTGFuZE1pbmVzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cExhbmRNaW5lcycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzNdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwSW1wYWN0Qm9tYnNOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwSW1wYWN0Qm9tYnMnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls0XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEljZUJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEljZUJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBCb21iTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEJvbWInKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls2XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cFN0aWNreUJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFN0aWNreUJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbN106CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBDdXJzZU5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBDdXJzZScpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzhdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwSGVhbHRoTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEhlYWx0aCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzldOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBTcGVlZCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEwXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdoZWFydCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzExXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIkdvb2RieWUhIgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50T25zbGF1Z2h0JykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTJdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ291eWFVQnV0dG9uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTNdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50U3VwZXJQdW5jaCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzE0XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdsZXZlbEljb24nKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnb3V5YU9CdXR0b24nKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNl06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnc3RhcicpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBwb3dlciBpbiBuZXdfcG93ZXJ1cHM6IGxhYmVsID0gZ2V0bGFuZ3VhZ2UocG93ZXIpCiAgICAgICAgICAgICAgICBlbHNlOiBsYWJlbCA9IGJhLkxzdHIocmVzb3VyY2U9dGV4dCkKCiAgICAgICAgICAgICAgICBhcHBlcmFuY2UgPSBwb3dlcnVwc1twb3dlcl0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gKDkwLHYtcG9zaSkKCiAgICAgICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0tMzAscG9zaXRpb25bMV0tMTUpLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLGNvbG9yPShiYS5hcHAudWkudGl0bGVfY29sb3IpLCB0ZXh0PWxhYmVsLCB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLnBvd3ByZXYgPSBiYS5pbWFnZXdpZGdldChwYXJlbnQ9YywKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0tNzAscG9zaXRpb25bMV0tMTApLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDUwLDUwKSx0ZXh0dXJlPXRleCkKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkaXBvcyA9IDAKICAgICAgICAgICAgICAgIGZvciBkaXJlYyBpbiBbJy0nLCcrJ106CiAgICAgICAgICAgICAgICAgICAgYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjcwK2RpcG9zLHBvc2l0aW9uWzFdLTEwKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjQsbGFiZWw9ZGlyZWMsYnV0dG9uX3R5cGU9J3NxdWFyZScsdGV4dF9zY2FsZT00LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmFwcGVyYW5jZV9wb3dlcnVwcyxwb3dlcixkaXJlYykpCiAgICAgICAgICAgICAgICAgICAgZGlwb3MgKz0gMTAwCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGV4dHdpZGdldCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzE5MCxwb3NpdGlvblsxXS0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9Y2xzX3Bvd19jb2xvcigpW2FwcGVyYW5jZV0sdGV4dD1zdHIoYXBwZXJhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAgICAgICAgIHNlbGYubGlzdHBvd2VyW3Bvd2VyXSA9IHRleHR3aWRnZXQKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwb3NpICs9IDkwCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGVsaWYgdGFiID09ICdBY3Rpb24gMic6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSAzNzAgaWYgbm90IFNUT1JFWydCdXkgT3B0aW9uJ10gZWxzZSA0NTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogICAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAoNDAsdi0yMCkKICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNfZGlzcGxheSA9IFtdCiAgICAgICAgICAgIGNob2ljZXMgPSBbJ0F1dG8nLCdTWTogQkFMTCcsJ1NZOiBJbXBhY3QnLCdTWTogRWdnJ10KICAgICAgICAgICAgZm9yIGRpc3BsYXkgaW4gY2hvaWNlczoKICAgICAgICAgICAgICAgIGNob2ljZXNfZGlzcGxheSA9IGJhLkxzdHIodHJhbnNsYXRlPSgiIixnZXRsYW5ndWFnZShkaXNwbGF5KSkpCiAgICAgICAgICAgICAgICBjX2Rpc3BsYXkuYXBwZW5kKGNob2ljZXNfZGlzcGxheSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwb3B1cCA9IFBvcHVwTWVudShwYXJlbnQ9YywKICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKzMwMCxwb3NpdGlvblsxXSksCiAgICAgICAgICAgICAgICAgIGJ1dHRvbl9zaXplPSgxNTAsNTApLHNjYWxlPTIuNSwKICAgICAgICAgICAgICAgICAgY2hvaWNlcz1jaG9pY2VzLHdpZHRoPTE1MCwKICAgICAgICAgICAgICAgICAgY2hvaWNlc19kaXNwbGF5PWNfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgY3VycmVudF9jaG9pY2U9Y29uZmlnWydQb3dlcnVwIFN0eWxlJ10sCiAgICAgICAgICAgICAgICAgIG9uX3ZhbHVlX2NoYW5nZV9jYWxsPWJhLkNhbGwoc2VsZi5fYWxsX3BvcHVwLCdQb3dlcnVwIFN0eWxlJykpCiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZXh0ID0gZ2V0bGFuZ3VhZ2UoJ1Bvd2VydXAgU3R5bGUnKQogICAgICAgICAgICB3dCA9IChsZW4odGV4dCkqMC44MCkKICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdLTYwK3d0LHBvc2l0aW9uWzFdKSxzaXplPSh3aWR0aCw1MCksbWF4d2lkdGg9d2lkdGgqMC45LAogICAgICAgICAgICAgICAgc2NhbGU9MS4xLGhfYWxpZ249ImNlbnRlciIsY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLHRleHQ9Z2V0bGFuZ3VhZ2UoJ1Bvd2VydXAgU3R5bGUnKSx2X2FsaWduPSJjZW50ZXIiKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRpcG9zID0gMAogICAgICAgICAgICBmb3IgZGlyZWMgaW4gWyctJywnKyddOgogICAgICAgICAgICAgICAgYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSszMTArZGlwb3MscG9zaXRpb25bMV0tMTAwKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdD1UcnVlLHNjYWxlPTAuNCxsYWJlbD1kaXJlYyxidXR0b25fdHlwZT0nc3F1YXJlJyx0ZXh0X3NjYWxlPTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi5fcG93ZXJ1cHNfc2NhbGUsZGlyZWMpKQogICAgICAgICAgICAgICAgZGlwb3MgKz0gMTAwCgogICAgICAgICAgICB0eHRfc2NhbGUgPSBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXQogICAgICAgICAgICBzZWxmLnR4dF9zY2FsZSA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzIzMCxwb3NpdGlvblsxXS0xMDUpLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLjEsaF9hbGlnbj0iY2VudGVyIixjb2xvcj0oMCwxLDApLHRleHQ9c3RyKHR4dF9zY2FsZSksdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMpCiAgICAgICAgICAgICAKICAgICAgICAgICAgdGV4dCA9IGdldGxhbmd1YWdlKCdQb3dlcnVwIFNjYWxlJykKICAgICAgICAgICAgd3QgPSAobGVuKHRleHQpKjAuODApCiAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS02MCt3dCxwb3NpdGlvblsxXS0xMDApLHNpemU9KHdpZHRoLDUwKSxtYXh3aWR0aD13aWR0aCowLjksCiAgICAgICAgICAgICAgICBzY2FsZT0xLjEsaF9hbGlnbj0iY2VudGVyIixjb2xvcj1iYS5hcHAudWkudGl0bGVfY29sb3IsdGV4dD10ZXh0LHZfYWxpZ249ImNlbnRlciIpCiAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAocG9zaXRpb25bMF0tMjAscG9zaXRpb25bMV0rNDApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5jaGVjayA9IGJhLmNoZWNrYm94d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXSszMCxwb3NpdGlvblsxXS0yMzApLHZhbHVlPWNvbmZpZ1snUG93ZXJ1cCBOYW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBOYW1lJyksbWF4d2lkdGg9c2VsZi5fc2Nyb2xsX3dpZHRoKjAuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWdldGxhbmd1YWdlKCdQb3dlcnVwIE5hbWUnKSxhdXRvc2VsZWN0PVRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYuY2hlY2sgPSBiYS5jaGVja2JveHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMzAscG9zaXRpb25bMV0tMjMwKjEuMyksdmFsdWU9Y29uZmlnWydQb3dlcnVwIFdpdGggU2hpZWxkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBXaXRoIFNoaWVsZCcpLG1heHdpZHRoPXNlbGYuX3Njcm9sbF93aWR0aCowLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1nZXRsYW5ndWFnZSgnUG93ZXJ1cCBXaXRoIFNoaWVsZCcpLGF1dG9zZWxlY3Q9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgU1RPUkVbJ0J1eSBPcHRpb24nXToKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2sgPSBiYS5jaGVja2JveHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMzAscG9zaXRpb25bMV0tMjMwKjEuNiksdmFsdWU9Y29uZmlnWydQb3dlcnVwIFRpbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBUaW1lJyksbWF4d2lkdGg9c2VsZi5fc2Nyb2xsX3dpZHRoKjAuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1nZXRsYW5ndWFnZSgnUG93ZXJ1cCBUaW1lJyksYXV0b3NlbGVjdD1UcnVlKQogICAgICAgICAgICAgICAgCiAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiAzJzoKICAgICAgICAgICAgc3ViX2hlaWdodCA9IDMwMAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLAogICAgICAgICAgICAgICAgYmFja2dyb3VuZD1GYWxzZSxzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCgogICAgICAgICAgICB2IC09IDIwCiAgICAgICAgICAgIHBvc2l0aW9uID0gKDExMCx2LTQ1KjEuNzIpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBub3QgU1RPUkVbJ0J1eSBQZXJjZW50YWdlJ106CiAgICAgICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oOTAsdi0xMDApLHNpemU9KDMwK3dpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLHRleHQ9Z2V0bGFuZ3VhZ2UoJ0Jsb2NrIE9wdGlvbiBTdG9yZScpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yPWJhLmFwcC51aS50aXRsZV9jb2xvcix2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuNSxzY2FsZT0xLjUpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PWMsCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKzEwMCxwb3NpdGlvblsxXS0yMDUpLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDgwLDgwKSx0ZXh0dXJlPWJhLmdldHRleHR1cmUoJ2xvY2snKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs3MCksc2l6ZT0oMzArd2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsdGV4dD1mIntnZXRsYW5ndWFnZSgnVGFuayBTaGllbGQgUFRHJyl9ICh7Z2V0bGFuZ3VhZ2UoJ1RhbmsgU2hpZWxkJyl9KSIsCiAgICAgICAgICAgICAgICAgICAgY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS41LHNjYWxlPTEuNSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscG9zaXRpb249cG9zaXRpb24sc2l6ZT0oMTAwLDEwMCkscmVwZWF0PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTAuNixsYWJlbD1zZWxmLmNoYXJzdHJbM10sYnV0dG9uX3R5cGU9J3NxdWFyZScsdGV4dF9zY2FsZT0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi50YW5rX3NoaWVsZF9wZXJjZW50YWdlLCdEZWNyZW1lbnQnKSkKICAgIAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscmVwZWF0PVRydWUsdGV4dF9zY2FsZT0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0qMy4yLHBvc2l0aW9uWzFdKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MC42LGxhYmVsPXNlbGYuY2hhcnN0clsyXSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYudGFua19zaGllbGRfcGVyY2VudGFnZSwnSW5jcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddCiAgICAgICAgICAgICAgICBpZiBwb3JjZW50YWplID4gNTk6IGNvbG9yID0gKDAsMSwwKQogICAgICAgICAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgICAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi50YW5rX3RleHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs1KSwKICAgICAgICAgICAgICAgICAgICBzaXplPSgzMCt3aWR0aCw1MCksaF9hbGlnbj0iY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICB0ZXh0PXN0cihwb3JjZW50YWplKSsnJScsY29sb3I9Y29sb3IsCiAgICAgICAgICAgICAgICAgICAgdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsc2NhbGU9MikKICAgIAogICAgICAgICAgICAgICAgIyAtLS0tLT4KICAgIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAoMTEwLHYtMTYwKjEuNikgICAgICAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs3MCksc2l6ZT0oMzArd2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsdGV4dD1mIntnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UgUFRHJyl9e19zcF99KHtnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UnKX0pIiwKICAgICAgICAgICAgICAgICAgICBjb2xvcj1iYS5hcHAudWkudGl0bGVfY29sb3Isdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsc2NhbGU9MS40KQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSxwb3NpdGlvbj1wb3NpdGlvbixzaXplPSgxMDAsMTAwKSxyZXBlYXQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MC42LGxhYmVsPXNlbGYuY2hhcnN0clszXSxidXR0b25fdHlwZT0nc3F1YXJlJyx0ZXh0X3NjYWxlPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZSwnRGVjcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIGIgPSBiYS5idXR0b253aWRnZXQocGFyZW50PWMsYXV0b3NlbGVjdD1UcnVlLHJlcGVhdD1UcnVlLHRleHRfc2NhbGU9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKjMuMixwb3NpdGlvblsxXSksc2l6ZT0oMTAwLDEwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTAuNixsYWJlbD1zZWxmLmNoYXJzdHJbMl0sYnV0dG9uX3R5cGU9J3NxdWFyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZSwnSW5jcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddCiAgICAgICAgICAgICAgICBpZiBwb3JjZW50YWplID4gNTk6IGNvbG9yID0gKDAsMSwwKQogICAgICAgICAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgICAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5obGdfdGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdLTE0LHBvc2l0aW9uWzFdKzUpLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDMwK3dpZHRoLDUwKSxoX2FsaWduPSJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgIHRleHQ9c3RyKHBvcmNlbnRhamUpKyclJyxjb2xvcj1jb2xvciwKICAgICAgICAgICAgICAgICAgICB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMyxzY2FsZT0yKQoKICAgICAgICBlbGlmIHRhYiA9PSAnUGVyY2VudGFnZSc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSBsZW4oc2VsZi5kZWZhdWx0X3Bvd2VyX2xpc3QpICogOTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICBwb3NpID0gMAogICAgICAgICAgICBpZF9wb3dlciA9IGxpc3Qoc2VsZi5kZWZhdWx0X3Bvd2VydXBzKQogICAgICAgICAgICBuZXdfcG93ZXJ1cHMgPSBpZF9wb3dlcls5Ol0KICAgICAgICAgICAgc2VsZi5saXN0cG93ZXIgPSB7fQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogCiAgICAgICAgICAgIGZvciBwb3dlciBpbiBzZWxmLmRlZmF1bHRfcG93ZXJfbGlzdDoKICAgICAgICAgICAgICAgIGlmIHBvd2VyID09IGlkX3Bvd2VyWzBdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwU2hpZWxkTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFNoaWVsZCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzFdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwUHVuY2hOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwUHVuY2gnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsyXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cExhbmRNaW5lc05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBMYW5kTWluZXMnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclszXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEltcGFjdEJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEltcGFjdEJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBJY2VCb21ic05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBJY2VCb21icycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwQm9tYk5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBCb21iJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNl06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBTdGlja3lCb21ic05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBTdGlja3lCb21icycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzddOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwQ3Vyc2VOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwQ3Vyc2UnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls4XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEhlYWx0aE5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBIZWFsdGgnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls5XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwU3BlZWQnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxMF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnaGVhcnQnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxMV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJHb29kYnllISIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudE9uc2xhdWdodCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEyXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdvdXlhVUJ1dHRvbicpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEzXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudFN1cGVyUHVuY2gnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnbGV2ZWxJY29uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ291eWFPQnV0dG9uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTZdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3N0YXInKQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgcG93ZXIgaW4gbmV3X3Bvd2VydXBzOiBsYWJlbCA9IGdldGxhbmd1YWdlKHBvd2VyKQogICAgICAgICAgICAgICAgZWxzZTogbGFiZWwgPSBiYS5Mc3RyKHJlc291cmNlPXRleHQpCgogICAgICAgICAgICAgICAgYXBwZXJhbmNlID0gcG93ZXJ1cHNbcG93ZXJdCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICg5MCx2LXBvc2kpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0zMCxwb3NpdGlvblsxXS0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksIHRleHQ9bGFiZWwsIHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS4zKQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYucG93cHJldiA9IGJhLmltYWdld2lkZ2V0KHBhcmVudD1jLAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXS03MCxwb3NpdGlvblsxXS0xMCksCiAgICAgICAgICAgICAgICAgICAgc2l6ZT0oNTAsNTApLHRleHR1cmU9dGV4KQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHB0ZyA9IHN0cihzZWxmLnRvdGFsX3BlcmNlbnRhZ2UocG93ZXIpKQogICAgICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzE3MCxwb3NpdGlvblsxXS0xMCksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KDAsMSwwKSx0ZXh0PShmJ3twdGd9JScpLHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS4zKQogICAgICAgICAKICAgICAgICAgICAgICAgIHBvc2kgKz0gOTAKICAgICAgICAgICAgICAgIAogICAgICAgIGVsaWYgdGFiID09ICdBY3Rpb24gNCc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSAzNzAKICAgICAgICAgICAgd2lkdGggPSAzMDAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB1ID0gd2lkdGggLSA2MAogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHdpZHRoKzUwMCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogICAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAodSsxNTAsdi0yNTApCiAgICAgICAgICAgIG5fcG9zID0gMAogICAgICAgICAgICBwcmljZXMgPSBbNzU2MCwgNTE1MCwgMzM2MF0KICAgICAgICAgICAgc3RyX25hbWUgPSBbIkZpcmVCb21icyBTdG9yZSIsIlRpbWVyIFN0b3JlIiwiUGVyY2VudGFnZXMgU3RvcmUiXQogICAgICAgICAgICBpbWFnZXMgPSBbIm91eWFPQnV0dG9uIiwic2V0dGluZ3NJY29uIiwiaW52ZW50b3J5SWNvbiJdCiAgICAgICAgICAgIAogICAgICAgICAgICBpbmRleCA9IDAKICAgICAgICAgICAgZm9yIHN0b3JlIGluIHN0b3JlX2l0ZW1zKCk6CiAgICAgICAgICAgICAgICBwID0gcHJpY2VzW2luZGV4XQogICAgICAgICAgICAgICAgdHh0ID0gc3RyX25hbWVbaW5kZXhdCiAgICAgICAgICAgICAgICBsYWJlbCA9IGdldGxhbmd1YWdlKHR4dCkKICAgICAgICAgICAgICAgIHR4X3BvcyA9IGxlbihsYWJlbCkqMS44CiAgICAgICAgICAgICAgICBsYl9zY2FsZSA9IGxlbihsYWJlbCkqMC4yMAogICAgICAgICAgICAgICAgcHJldmlldyA9IGltYWdlc1tpbmRleF0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgU1RPUkVbc3RvcmVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBnZXRsYW5ndWFnZSgnQm91Z2h0JykKICAgICAgICAgICAgICAgICAgICBpY29uID0gYmEuZ2V0dGV4dHVyZSgnZ3JhcGhpY3NJY29uJykKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICgwLjUyLDAuNDgsMC42MykKICAgICAgICAgICAgICAgICAgICB0eHRfc2NhbGUgPSAxLjUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHN0cihwKQogICAgICAgICAgICAgICAgICAgIGljb24gPSBiYS5nZXR0ZXh0dXJlKCdjb2luJykKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICgwLjUsMC40LDAuOTMpCiAgICAgICAgICAgICAgICAgICAgdHh0X3NjYWxlID0gMgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjEwLW5fcG9zLHBvc2l0aW9uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oMjUwLDgwKSxzY2FsZT0wLjcsbGFiZWw9dGV4dCx0ZXh0X3NjYWxlPXR4dF9zY2FsZSxpY29uPWljb24sY29sb3I9Y29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zY2FsZT0xLjcsb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2J1eV9vYmplY3Qsc3RvcmUscCkpCgogICAgICAgICAgICAgICAgcyA9IDE4MAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscG9zaXRpb249KHBvc2l0aW9uWzBdKzIxMC1uX3Bvcyxwb3NpdGlvblsxXSs1NSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KHMscyszMCksc2NhbGU9MSxsYWJlbD0nJyxjb2xvcj1jb2xvcixidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2J1eV9vYmplY3Qsc3RvcmUscCkpCiAgICAKICAgICAgICAgICAgICAgIHMgLT0gODAKICAgICAgICAgICAgICAgIGkgPSBiYS5pbWFnZXdpZGdldChwYXJlbnQ9YyxkcmF3X2NvbnRyb2xsZXI9YiwKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjUwLW5fcG9zLHBvc2l0aW9uWzFdKzE0MCksCiAgICAgICAgICAgICAgICAgICAgc2l6ZT0ocyxzKSx0ZXh0dXJlPWJhLmdldHRleHR1cmUocHJldmlldykpCiAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXSsyNzAtbl9wb3MscG9zaXRpb25bMV0rMTAxKSwKICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLGNvbG9yPShiYS5hcHAudWkudGl0bGVfY29sb3IpLHRleHQ9bGFiZWwsdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD0xMzApCiAgICAKICAgICAgICAgICAgICAgIG5fcG9zICs9IDI4MAogICAgICAgICAgICAgICAgaW5kZXggKz0gMQogICAgCiAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiA1JzoKICAgICAgICAgICAgc3ViX2hlaWdodCA9IDM3MAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLGJhY2tncm91bmQ9RmFsc2UsCiAgICAgICAgICAgICAgICBzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCiAgICAgICAgICAgICAgIAogICAgICAgICAgICBwb3NpdGlvbiA9ICgwLHYtMzApCiAgICAKICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzgwLHBvc2l0aW9uWzFdLTMwKSxzaXplPSh3aWR0aCs2MCw1MCksc2NhbGU9MSwKICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksdGV4dD1iYS5Mc3RyKAogICAgICAgICAgICAgICAgcmVzb3VyY2U9J3NldHRpbmdzV2luZG93QWR2YW5jZWQuZW50ZXJQcm9tb0NvZGVUZXh0Jyksdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMpCiAgICAKICAgICAgICAgICAgc2VsZi5wcm9tb2NvZGVfdGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzgwLHBvc2l0aW9uWzFdLTEwMCksc2l6ZT0od2lkdGgrNjAsNTApLHNjYWxlPTEsCiAgICAgICAgICAgICAgICBlZGl0YWJsZT1UcnVlLGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksdGV4dD0nJywgdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsCiAgICAgICAgICAgICAgICBtYXhfY2hhcnM9MzAsZGVzY3JpcHRpb249YmEuTHN0cihyZXNvdXJjZT0nc2V0dGluZ3NXaW5kb3dBZHZhbmNlZC5lbnRlclByb21vQ29kZVRleHQnKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLnByb21vY29kZV9idXR0b24gPSBiYS5idXR0b253aWRnZXQoCiAgICAgICAgICAgICAgICBwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMTYwLHBvc2l0aW9uWzFdLTE3MCksCiAgICAgICAgICAgICAgICBzaXplPSgyMDAsIDYwKSxzY2FsZT0xLjAsbGFiZWw9YmEuTHN0cihyZXNvdXJjZT0nc3VibWl0VGV4dCcpLAogICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1zZWxmLl9wcm9tb2NvZGUpCiAgICAKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWJfaGVpZ2h0ID0gMAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLAogICAgICAgICAgICAgICAgYmFja2dyb3VuZD1GYWxzZSxzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCgogICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oMTEwLCB2LTIwKSxzaXplPSh3aWR0aCw1MCksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLjQsY29sb3I9KDAuMiwxLjIsMC4yKSxoX2FsaWduPSJjZW50ZXIiLHZfYWxpZ249ImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSgiVWx0aW1hdGUgUG93ZXJ1cCBNYW5hZ2VyIHYxLjciKSxtYXh3aWR0aD13aWR0aCozMCkKCiAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPSgxMTAsIHYtOTApLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTEsY29sb3I9KDEuMywwLjUsMS4wKSxoX2FsaWduPSJjZW50ZXIiLHZfYWxpZ249ImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWdldGxhbmd1YWdlKCdDcmVhdG9yJyksbWF4d2lkdGg9d2lkdGgqMzApCgogICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oMTEwLCB2LTIyMCksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MSxjb2xvcj0oMS4wLDEuMiwwLjMpLGhfYWxpZ249ImNlbnRlciIsdl9hbGlnbj0iY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Z2V0bGFuZ3VhZ2UoJ01vZCBJbmZvJyksbWF4d2lkdGg9d2lkdGgqMzApCiAgICAKICAgICAgICBmb3Igc2VsZWN0X3RhYixidXR0b25fdGFiIGluIHNlbGYudGFiX2J1dHRvbnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgc2VsZWN0X3RhYiA9PSB0YWI6CiAgICAgICAgICAgICAgICBiYS5idXR0b253aWRnZXQoZWRpdD1idXR0b25fdGFiLGNvbG9yPSgwLjUsMC40LDEuNSkpCiAgICAgICAgICAgIGVsc2U6IGJhLmJ1dHRvbndpZGdldChlZGl0PWJ1dHRvbl90YWIsY29sb3I9KDAuNTIsMC40OCwwLjYzKSkKCiAgICBkZWYgX2FsbF9wb3B1cChzZWxmLCB0YWc6IHN0ciwgcG9wdXA6IHN0cikgLT4gTm9uZToKICAgICAgICBjb25maWdbdGFnXSA9IHBvcHVwCiAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKICAgIGRlZiBfc2V0X2NvbmNlcHQoc2VsZiwgY29uY2VwdDogc3RyKSAtPiBOb25lOgogICAgICAgIEdMT0JBTFsnQ2xzIFBvd2VydXAnXSA9IGNvbmNlcHQKCiAgICAgICAgaWYgY29uY2VwdCA9PSAnUmVzZXQnOgogICAgICAgICAgICBmb3IgcG93ZXIsIGRlZmx0IGluIGRlZmF1bHRfcG93ZXJ1cHMoKS5pdGVtcygpOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gZGVmbHQKICAgICAgICBlbGlmIGNvbmNlcHQgPT0gJ05vdGhpbmcnOgogICAgICAgICAgICBmb3IgcG93ZXIgaW4gZGVmYXVsdF9wb3dlcnVwcygpOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gMAogICAgICAgIGVsaWYgY29uY2VwdCA9PSAnT25seSBCb21icyc6CiAgICAgICAgICAgIGZvciBwb3dlciwgZGVmbHQgaW4gZGVmYXVsdF9wb3dlcnVwcygpLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiAnQm9tYnMnIG5vdCBpbiBwb3dlcjoKICAgICAgICAgICAgICAgICAgICBwb3dlcnVwc1twb3dlcl0gPSAwCiAgICAgICAgICAgICAgICBlbHNlOiBwb3dlcnVwc1twb3dlcl0gPSAzCiAgICAgICAgZWxpZiBjb25jZXB0ID09ICdPbmx5IEl0ZW1zJzoKICAgICAgICAgICAgZm9yIHBvd2VyLCBkZWZsdCBpbiBkZWZhdWx0X3Bvd2VydXBzKCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmICdCb21icycgaW4gcG93ZXI6CiAgICAgICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gMAogICAgICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJdID0gZGVmbHQKICAgICAgICBlbGlmIGNvbmNlcHQgPT0gJ05ldyc6CiAgICAgICAgICAgIGRlZmF1bHRfcG93ZXIgPSBkZWZhdWx0X3Bvd2VydXBzKCkKICAgICAgICAgICAgbmV3X3Bvd2VydXBzID0gbGlzdChkZWZhdWx0X3Bvd2VyKVs5Ol0KICAgICAgICAgICAgZm9yIHBvd2VyLCBkZWZsdCBpbiBkZWZhdWx0X3Bvd2VyLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBwb3dlciBub3QgaW4gbmV3X3Bvd2VydXBzOgogICAgICAgICAgICAgICAgICAgIHBvd2VydXBzW3Bvd2VyXSA9IDAKICAgICAgICAgICAgICAgIGVsc2U6IHBvd2VydXBzW3Bvd2VyXSA9IGRlZmx0CgogICAgICAgIGlmIG5vdCBTVE9SRVsnQnV5IEZpcmVib21icyddOgogICAgICAgICAgICBwb3dlcnVwc1snRmlyZSBCb21icyddID0gMAogICAgICAgICAgICAKICAgICAgICBzZWxmLl9zZXRfdGFiKCdBY3Rpb24gMScpCgogICAgZGVmIHRhbmtfc2hpZWxkX3BlcmNlbnRhZ2Uoc2VsZiwgdGFnKToKICAgICAgICBtYXggPSA5NgogICAgICAgIG1pbiA9IDQwCiAgICAgICAgaWYgdGFnID09ICdJbmNyZW1lbnQnOgogICAgICAgICAgICBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddICs9IDEKICAgICAgICAgICAgaWYgY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXSA+IG1heDoKICAgICAgICAgICAgICAgIGNvbmZpZ1snVGFuayBTaGllbGQgUFRHJ10gPSBtaW4KICAgICAgICBlbGlmIHRhZyA9PSAnRGVjcmVtZW50JzoKICAgICAgICAgICAgY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXSAtPSAxCiAgICAgICAgICAgIGlmIGNvbmZpZ1snVGFuayBTaGllbGQgUFRHJ10gPCBtaW46CiAgICAgICAgICAgICAgICBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddID0gbWF4CiAgICAgICAgICAgICAgICAKICAgICAgICBwb3JjZW50YWplID0gY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXQogICAgICAgIGlmIHBvcmNlbnRhamUgPiA1OTogY29sb3IgPSAoMCwxLDApCiAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgIGVsc2U6IGNvbG9yID0gKDAsMSwwLjgpCiAgICAgICAgYmEudGV4dHdpZGdldChlZGl0PXNlbGYudGFua190ZXh0LAogICAgICAgICAgICB0ZXh0PXN0cihwb3JjZW50YWplKSsnJScsY29sb3I9Y29sb3IpCgogICAgZGVmIGhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZShzZWxmLCB0YWcpOgogICAgICAgIG1heCA9IDgwCiAgICAgICAgbWluID0gMzUKICAgICAgICBpZiB0YWcgPT0gJ0luY3JlbWVudCc6CiAgICAgICAgICAgIGNvbmZpZ1snSGVhbGluZyBEYW1hZ2UgUFRHJ10gKz0gMQogICAgICAgICAgICBpZiBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddID4gbWF4OgogICAgICAgICAgICAgICAgY29uZmlnWydIZWFsaW5nIERhbWFnZSBQVEcnXSA9IG1pbgogICAgICAgIGVsaWYgdGFnID09ICdEZWNyZW1lbnQnOgogICAgICAgICAgICBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddIC09IDEKICAgICAgICAgICAgaWYgY29uZmlnWydIZWFsaW5nIERhbWFnZSBQVEcnXSA8IG1pbjoKICAgICAgICAgICAgICAgIGNvbmZpZ1snSGVhbGluZyBEYW1hZ2UgUFRHJ10gPSBtYXgKICAgICAgICAgICAgICAgIAogICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddCiAgICAgICAgaWYgcG9yY2VudGFqZSA+IDU5OiBjb2xvciA9ICgwLDEsMCkKICAgICAgICBlbGlmIHBvcmNlbnRhamUgPCA0MDogY29sb3IgPSAoMSwxLDApCiAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi5obGdfdGV4dCwKICAgICAgICAgICAgdGV4dD1zdHIocG9yY2VudGFqZSkrJyUnLGNvbG9yPWNvbG9yKQoKICAgIGRlZiBhcHBlcmFuY2VfcG93ZXJ1cHMoc2VsZiwgcG93ZXJ1cDogc3RyLCBJRDogc3RyKToKICAgICAgICBtYXggPSA3CiAgICAgICAgaWYgSUQgPT0gIi0iOgogICAgICAgICAgICBpZiBwb3dlcnVwc1twb3dlcnVwXSA9PSAwOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJ1cF0gPSBtYXgKICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJ1cF0gLT0gMQogICAgICAgIGVsaWYgSUQgPT0gIisiOgogICAgICAgICAgICBpZiBwb3dlcnVwc1twb3dlcnVwXSA9PSBtYXg6CiAgICAgICAgICAgICAgICBwb3dlcnVwc1twb3dlcnVwXSA9IDAKICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJ1cF0gKz0gMQogICAgICAgIGVudW0gPSBwb3dlcnVwc1twb3dlcnVwXQogICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLmxpc3Rwb3dlcltwb3dlcnVwXSwKICAgICAgICAgICAgICAgICAgICAgIHRleHQ9c3RyKHBvd2VydXBzW3Bvd2VydXBdKSwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPWNsc19wb3dfY29sb3IoKVtlbnVtXSkKICAgICAgICAgICAKICAgIGRlZiBfcG93ZXJ1cHNfc2NhbGUoc2VsZiwgSUQ6IHN0cik6CiAgICAgICAgbWF4ID0gMS41CiAgICAgICAgbWluID0gMC41CiAgICAgICAgc2MgPSAwLjEKICAgICAgICBpZiBJRCA9PSAiLSI6CiAgICAgICAgICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddIDwgKG1pbiswLjEpOgogICAgICAgICAgICAgICAgY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gPSBtYXgKICAgICAgICAgICAgZWxzZTogY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gLT0gc2MKICAgICAgICBlbGlmIElEID09ICIrIjoKICAgICAgICAgICAgaWYgY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gPiAobWF4LTAuMSk6CiAgICAgICAgICAgICAgICBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSA9IG1pbgogICAgICAgICAgICBlbHNlOiBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSArPSBzYwogICAgICAgIGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddID0gcm91bmQoY29uZmlnWydQb3dlcnVwIFNjYWxlJ10sMSkKICAgICAgICBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi50eHRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXN0cihjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSkpCiAgICAgICAgICAgCiAgICBkZWYgdG90YWxfcGVyY2VudGFnZShzZWxmLCBwb3dlcik6CiAgICAgICAgdG90YWwgPSAwCiAgICAgICAgcHcgPSBwb3dlcnVwc1twb3dlcl0KICAgICAgICBmb3IgaSxpMiBpbiBwb3dlcnVwcy5pdGVtcygpOgogICAgICAgICAgICB0b3RhbCArPSBpMgogICAgICAgIGlmIHRvdGFsID09IDA6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCh0b3RhbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwdGcgPSAoMTAwKnB3L3RvdGFsKQogICAgICAgICAgICByZXN1bHQgPSByb3VuZChwdGcsMikKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgICAgIAogICAgZGVmIHN0b3JlX3JlZnJlc2goc2VsZiwgdGFnOiBzdHIpOgogICAgICAgIGlmIHRhZyA9PSAnQnV5IEZpcmVib21icyc6CiAgICAgICAgICAgIHBvd2VydXBzWydGaXJlIEJvbWJzJ10gPSAzCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0LmFwcGVuZCgnRmlyZSBCb21icycpCiAgICAgICAgc2VsZi5fc2V0X3RhYignQWN0aW9uIDQnKQogICAgICAgICAgIAogICAgZGVmIF9idXlfb2JqZWN0KHNlbGYsIHRhZzogc3RyLCBwcmljZTogaW50KToKICAgICAgICBzdG9yZSA9IEJlYXJTdG9yZSh2YWx1ZT10YWcsIHByaWNlPXByaWNlLAogICAgICAgICAgICAgICAgY2FsbGJhY2s9YmEuQ2FsbChzZWxmLnN0b3JlX3JlZnJlc2gsdGFnKSkKICAgICAgICBzdG9yZS5idXkoKQogICAgICAgICAgIAogICAgZGVmIF9wcm9tb2NvZGUoc2VsZik6CiAgICAgICAgY29kZSA9IGJhLnRleHR3aWRnZXQocXVlcnk9c2VsZi5wcm9tb2NvZGVfdGV4dCkKICAgICAgICBwcm9tbyA9IFByb21vQ29kZShjb2RlPWNvZGUpCiAgICAgICAgcHJvbW8uY29kZV9jb25maXJtYXRpb24oKQogICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnByb21vY29kZV90ZXh0LHRleHQ9IiIpCiAgICAgICAgICAgCiAgICBkZWYgX3N3aXRjaGVzKHNlbGYsdGFnLG0pOgogICAgICAgIGNvbmZpZ1t0YWddID0gRmFsc2UgaWYgbT09MCBlbHNlIFRydWUKICAgICAgICBhcGcuYXBwbHlfYW5kX2NvbW1pdCgpCiAgICAgICAgICAgCiAgICBkZWYgX3BlcmNlbnRhZ2Vfd2luZG93KHNlbGYpOgogICAgICAgIHNlbGYuX3NldF90YWIoJ1BlcmNlbnRhZ2UnKQogICAgICAgICAgIAogICAgZGVmIF9iYWNrKHNlbGYpOgogICAgICAgIGJhLmNvbnRhaW5lcndpZGdldChlZGl0PXNlbGYuX3Jvb3Rfd2lkZ2V0LHRyYW5zaXRpb249J291dF9sZWZ0JykKICAgICAgICBicm93c2VyLlByb2ZpbGVCcm93c2VyV2luZG93KCk=").decode("utf-8"))
|
|
|
|
|
|
def enable():
|
|
|
|
#browser.ProfileBrowserWindow = NewProfileBrowserWindow
|
|
pupbox.PowerupBoxFactory = NewPowerupBoxFactory
|
|
pupbox.PowerupBox.__init__ = _pbx_
|
|
Bomb.__init__ = _bomb_init
|
|
SpazBot.handlemessage = bot_handlemessage
|
|
Blast.handlemessage = bomb_handlemessage
|
|
Spaz.handlemessage = new_handlemessage
|
|
Spaz.__init__ = _init_spaz_
|
|
Spaz._get_bomb_type_tex = new_get_bomb_type_tex
|
|
Spaz.on_punch_press = spaz_on_punch_press
|
|
Spaz.on_punch_release = spaz_on_punch_release
|
|
MainMenuActivity.on_transition_in = new_on_transition_in
|
|
)
|
|
|
|
|
|
def enable():
|
|
|
|
#browser.ProfileBrowserWindow = NewProfileBrowserWindow
|
|
pupbox.PowerupBoxFactory = NewPowerupBoxFactory
|
|
pupbox.PowerupBox.__init__ = _pbx_
|
|
Bomb.__init__ = _bomb_init
|
|
SpazBot.handlemessage = bot_handlemessage
|
|
Blast.handlemessage = bomb_handlemessage
|
|
Spaz.handlemessage = new_handlemessage
|
|
Spaz.__init__ = _init_spaz_
|
|
Spaz._get_bomb_type_tex = new_get_bomb_type_tex
|
|
Spaz.on_punch_press = spaz_on_punch_press
|
|
Spaz.on_punch_release = spaz_on_punch_release
|
|
MainMenuActivity.on_transition_in = new_on_transition_in
|