Bombsquad-Ballistica-Modded.../dist/ba_root/mods/plugins/elPatronPowerups.py
2022-06-30 00:37:05 +05:30

23 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("CmltcG9ydCBiYSxfYmEscmFuZG9tLHRpbWUsZGF0ZXRpbWUsd2Vha3JlZixqc29uLG9zCmZyb20gYmFzdGQudWkucHJvZmlsZSBpbXBvcnQgYnJvd3Nlcgpmcm9tIGJhc3RkLmFjdG9yIGltcG9ydCBib21iCmZyb20gYmFzdGQuYWN0b3IgaW1wb3J0IHBvd2VydXBib3ggIGFzIHB1cGJveApmcm9tIGJhc3RkLmFjdG9yLnNwYXpib3QgaW1wb3J0IFNwYXpCb3QKZnJvbSBiYXN0ZC5hY3Rvci5ib21iIGltcG9ydCAoQm9tYixCbGFzdCkKZnJvbSBiYXN0ZC51aS5wb3B1cCBpbXBvcnQgKFBvcHVwV2luZG93LFBvcHVwTWVudVdpbmRvdyxQb3B1cE1lbnUpCmZyb20gYmFzdGQuYWN0b3Iuc3BheiBpbXBvcnQgKFNwYXosU3BhekZhY3RvcnksUGlja3VwTWVzc2FnZSwgUHVuY2hIaXRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJzZUV4cGxvZGVNZXNzYWdlLCBCb21iRGllZE1lc3NhZ2UpCmZyb20gYmFzdGQubWFpbm1lbnUgaW1wb3J0IChNYWluTWVudUFjdGl2aXR5LE1haW5NZW51U2Vzc2lvbikKZnJvbSBiYXN0ZC5nYW1ldXRpbHMgaW1wb3J0IFNoYXJlZE9iamVjdHMKZnJvbSBiYXN0ZC5hY3Rvci5wb3dlcnVwYm94IGltcG9ydCBQb3dlcnVwQm94RmFjdG9yeQpmcm9tIGJhc3RkLmFjdG9yLnBvcHVwdGV4dCBpbXBvcnQgUG9wdXBUZXh0CmZyb20gYmFzdGQudWkuY29uZmlybSBpbXBvcnQgQ29uZmlybVdpbmRvdwpmcm9tIGJhc3RkLmFjdG9yLnNwYXogaW1wb3J0ICoKCmlmIFRZUEVfQ0hFQ0tJTkc6CiAgICBwYXNzCgojID09PSBNb2QgbWFkZSBieSBAUGF0cm9uX01vZHogPT09CgpkZWYgZ2V0bGFuZ3VhZ2UodGV4dCwgc3Viczogc3RyID0gTm9uZSwgYWxtYWNlbjogbGlzdCA9IFtdKToKICAgIGlmIGFsbWFjZW4gPT0gW106IGFsbWFjZW4gPSBsaXN0KHJhbmdlKDEwMDApKQogICAgbGFuZyA9IF9iYS5hcHAubGFuZy5sYW5ndWFnZQogICAgdHJhbnNsYXRlID0geyJSZXNldCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiUmVpbmljaWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJSZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiUmVpbmljaWFyIn0sCiAgICAgICAgICAgICAgICAgIk5vdGhpbmciOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlNpbiBwb3RlbmNpYWRvcmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJObyBwb3dlcnVwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiU2VtIHBvd2VydXBzIn0sCiAgICAgICAgICAgICAgICAgIkFjdGlvbiAxIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJQb3RlbmNpYWRvcmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJQb3dlcnVwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiUG93ZXJ1cHMifSwKICAgICAgICAgICAgICAgICAiQWN0aW9uIDIiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkNvbmZpZ3VyYWNpw4PCs24iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlNldHRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJEZWZpbmnDg8Knw4PCtWVzIn0sCiAgICAgICAgICAgICAgICAgIkFjdGlvbiAzIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJFeHRyYXMiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkV4dHJhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiRXh0cmFzIn0sCiAgICAgICAgICAgICAgICAgIkFjdGlvbiA0IjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJUaWVuZGEiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlN0b3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJMb2phIn0sCiAgICAgICAgICAgICAgICAgIkFjdGlvbiA1IjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJDYW5qZWFyIGPDg8KzZGlnbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiRW50ZXIgQ29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQ8ODwrNkaWdvIHByb21vY2lvbmFsIn0sCiAgICAgICAgICAgICAgICAgIkN1c3RvbSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJDdXN0b21pemUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkN1c3RvbWl6YXIifSwKICAgICAgICAgICAgICAgICAiSW1wYWlybWVudCBCb21icyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQm9tYmFzIG1lbm9zY2FibyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiSHlwZXJhY3RpdmUgYm9tYnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkJvbWJhcyBoaXBlcmF0aXZhcyJ9LAogICAgICAgICAgICAgICAgICJTcGVlZCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiVmVsb2NpZGFkIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTcGVlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiVmVsb2NpZGFkZSJ9LAogICAgICAgICAgICAgICAgICJGaXJlIEJvbWJzIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJCb21iYXMgZGUgZnVlZ28iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkZpcmUgQm9tYnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkJvbWJhcyBkZSBmb2dvIn0sCiAgICAgICAgICAgICAgICAgIkljZSBNYW4iOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkhvbWJyZSBkZSBoaWVsbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiSWNlIG1hbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiSG9tZW0gZGUgZ2VsbyJ9LAogICAgICAgICAgICAgICAgICJGbHkgQm9tYnMiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkJvbWJhcyBleHBhbnNpdmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJFeHBhbnNpdmUgYm9tYnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkJvbWJhcyBleHBhbnNpdmFzIn0sCiAgICAgICAgICAgICAgICAgIkdvb2RieWUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIsOCwqFIYXN0YSBsdWVnbyEiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkdvb2RieWUhIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJBZGV1cyEifSwKICAgICAgICAgICAgICAgICAiSGVhbGluZyBEYW1hZ2UiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkF1dG8tY3VyYWNpw4PCs24iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkhlYWxpbmcgRGFtYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJBdXRvLWN1cmEifSwKICAgICAgICAgICAgICAgICAiVGFuayBTaGllbGQiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlPDg8K6cGVyIGJsaW5kYWplIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJSZWluZm9yY2VkIHNoaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiRXNjdWRvIHJlZm9yw4PCp2FkbyJ9LAogICAgICAgICAgICAgICAgICJUYW5rIFNoaWVsZCBQVEciOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlBvcmNlbnRhamUgZGUgZGlzbWludWNpw4PCs24iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlBlcmNlbnRhZ2UgZGVjcmVhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJQZXJjZW50dWFsIHJlZHV6aWRvIn0sCiAgICAgICAgICAgICAgICAgIkhlYWxpbmcgRGFtYWdlIFBURyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiUG9yY2VudGFqZSBkZSByZWN1cGVyYWNpw4PCs24gZGUgc2FsdWQiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlBlcmNlbnRhZ2Ugb2YgaGVhbHRoIHJlY292ZXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiUG9yY2VudGFnZW0gZGUgcmVjdXBlcmHDg8Knw4PCo28gZGUgc2HDg8K6ZGUifSwKICAgICAgICAgICAgICAgICAiU1k6IEJBTEwiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkVzZmVyYSIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiU3BoZXJlIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJFc2ZlcmEifSwKICAgICAgICAgICAgICAgICAiU1k6IEltcGFjdCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiRXNwZWNpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlNwZWNpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkVzcGVjaWFsIn0sCiAgICAgICAgICAgICAgICAgIlNZOiBFZ2ciOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIkh1ZXZpdG8iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkVnZyBzaGFwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiT3ZvIn0sCiAgICAgICAgICAgICAgICAgIlBvd2VydXAgU2NhbGUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIlRhbWHDg8KxbyBkZWwgcG90ZW5jaWFkb3IiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlBvd2VydXBzIHNpemUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIlRhbWFuaG8gZGUgcG93ZXJ1cHMifSwKICAgICAgICAgICAgICAgICAiUG93ZXJ1cCBXaXRoIFNoaWVsZCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiUG90ZW5jaWFkb3JlcyBjb24gZXNjdWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJQb3dlcnVwcyB3aXRoIHNoaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiUG93ZXJ1cHMgY29tIGVzY3VkbyJ9LAogICAgICAgICAgICAgICAgICJQb3dlcnVwIFRpbWUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIk1vc3RyYXIgVGVtcG9yaXphZG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTaG93IGVuZCB0aW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJNb3N0cmFyIGNyb27Dg8K0bWV0cm8ifSwKICAgICAgICAgICAgICAgICAiUG93ZXJ1cCBTdHlsZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiRm9ybWEgZGUgbG9zIHBvdGVuY2lhZG9yZXMiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlNoYXBlIG9mIHBvd2VydXAiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkZvcm1hIGRlIHBvd2VydXAifSwKICAgICAgICAgICAgICAgICAiUG93ZXJ1cCBOYW1lIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJNb3N0cmFyIG5vbWJyZSBlbiBsb3MgcG90ZW5jaWFkb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiU2hvdyBuYW1lIG9uIHBvd2VydXBzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJNb3N0cmFyIG5vbWUgZW0gcG93ZXJ1cHMifSwKICAgICAgICAgICAgICAgICAiUGVyY2VudGFnZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiUHJvYmFiaWxpZGFkIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJTaG93IHBlcmNlbnRhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIk1vc3RyYXIgcG9yY2VudGFnZW0ifSwKICAgICAgICAgICAgICAgICAiT25seSBJdGVtcyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiU8ODwrNsbyBBY2Nlc29yaW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJPbmx5IHV0ZW5zaWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJBcGVuYXMgdXRlbnNpbGlvcyJ9LAogICAgICAgICAgICAgICAgICJOZXciOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIk51ZXZvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJOZXciLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIk5vdm8ifSwKICAgICAgICAgICAgICAgICAiT25seSBCb21icyI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiU8ODwrNsbyBCb21iYXMiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIk9ubHkgYm9tYnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkFwZW5hcyBib21iYXMifSwKICAgICAgICAgICAgICAgICAiQ29pbnMgMCI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiTW9uZWRhcyBJbnN1ZmljaWVudGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJJbnN1ZmZpY2llbnQgY29pbnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIk1vZWRhcyBpbnN1ZmljaWVudGVzIn0sCiAgICAgICAgICAgICAgICAgIlB1cmNoYXNlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJDb21wcmEgcmVhbGl6YWRhIGNvcnJlY3RhbWVudGUiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlN1Y2Nlc3NmdWwgcHVyY2hhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkNvbXByYSBCZW0gU3VjZWRpZGEifSwKICAgICAgICAgICAgICAgICAiRG91YmxlIFByb2R1Y3QiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogIllhIGhhcyBjb21wcmFkbyBlc3RlIGFydMODwq1jdWxvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJZb3UndmUgYWxyZWFkeSBib3VnaHQgdGhpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiVm9jZSBqYSBjb21wcm91IGlzdG8ifSwKICAgICAgICAgICAgICAgICAiQm91Z2h0IjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJDb21wcmFkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAiQm91Z2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJDb21wcm91In0sCiAgICAgICAgICAgICAgICAgIkNvbmZpcm0gUHVyY2hhc2UiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogZidUaWVuZXMge3N1YnN9IG1vbmVkYXMuIHtfc3BffSDDgsK/RGVzZWFzIGNvbXByYXIgZXN0bz8nLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogZidZb3UgaGF2ZSB7c3Vic30gY29pbnMuIHtfc3BffSBEbyB5b3Ugd2FudCB0byBidXkgdGhpcz8nLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogZidWb2PDg8KqIHRlbSB7c3Vic30gbW9lZGFzLiB7X3NwX30gRGVzZWphIGNvbXByYXIgaXN0bz8nfSwKICAgICAgICAgICAgICAgICAiRmlyZUJvbWJzIFN0b3JlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICdCb21iYXMgZGUgZnVlZ28nLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogJ0ZpcmUgYm9tYnMnLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogJ0JvbWJhcyBkZSBpbmPDg8KqbmRpbyd9LAogICAgICAgICAgICAgICAgICJUaW1lciBTdG9yZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAnVGVtcG9yaXphZG9yJywKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICdUaW1lcicsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAnVGltZXInfSwKICAgICAgICAgICAgICAgICAiUGVyY2VudGFnZXMgU3RvcmUiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogJ0V4dHJhcycsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiAnRXh0cmFzJywKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICdFeHRyYXMnfSwKICAgICAgICAgICAgICAgICAiQmxvY2sgT3B0aW9uIFN0b3JlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6IGYiVXV1cHMuLntfc3BffUVzdGEgb3BjacODwrNuIGVzdMODwqEgYmxvcXVlYWRhLntfc3BffSBQYXJhIGFjY2VkZXIgYSBlbGxhIHB1ZWRlcyB7X3NwX30gY29tcHJhcmxhIGVuIGxhIHRpZW5kYS57X3NwX30gR3JhY2lhcy4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiBmIk9vb29wcy4uLntfc3BffVRoaXMgb3B0aW9uIGlzIGJsb2NrZWQuIHtfc3BffSBUbyBhY2Nlc3MgaXQgeW91IGNhbiBidXkge19zcF99IGl0IGluIHRoZSBzdG9yZS57X3NwX30gVGhhbmsgeW91Li4uIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6IGYiT29vcHMuLi57X3NwX31Fc3RhIG9ww4PCp8ODwqNvIGVzdMODwqEgYmxvcXVlYWRhLiB7X3NwX30gUGFyYSBhY2Vzc8ODwqEtbG8sIHZvY8ODwqogcG9kZSB7X3NwX30gY29tcHLDg8KhLWxvIG5hIGxvamEue19zcF99IE9icmlnYWRvLi4uIn0sCiAgICAgICAgICAgICAgICAgIlRydWUgQ29kZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiw4LCoUPDg8KzZGlnbyBjYW5qZWFkbyEiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIlN1Y2Nlc3NmdWwgY29kZSEiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIsOCwqFDw4PCs2RpZ28gdsODwqFsaWRvISJ9LAogICAgICAgICAgICAgICAgICJGYWxzZSBDb2RlIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6ICJDw4PCs2RpZ28geWEgY2FuamVhZG8iLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIkV4cGlyZWQgY29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiAiQ8ODwrNkaWdvIGV4cGlyYWRvIn0sCiAgICAgICAgICAgICAgICAgIkludmFsaWQgQ29kZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiQ8ODwrNkaWdvIGludsODwqFsaWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6ICJJbnZhbGlkIGNvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogIkPDg8KzZGlnbyBpbnbDg8KhbGlkbyJ9LAogICAgICAgICAgICAgICAgICJSZXdhcmQgQ29kZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiBmIsOCwqFGZWxpY2l0YWNpb25lcyEgw4LCoUdhbmFzdGUge3N1YnN9IG1vbmVkYXMhIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6IGYiQ29uZ3JhdHVsYXRpb25zISBZb3UndmUge3N1YnN9IGNvaW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6IGYiUGFyYWLDg8KpbnMhIFZvY8ODwqogdGVtIHtzdWJzfSBtb2VkYXMifSwKICAgICAgICAgICAgICAgICAiQ3JlYXRvciI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiAiTW9kIGNyZWFkbyBwb3IgQFBhdHLDg8Kzbk1vZHoiLAogICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIjogIk1vZCBjcmVhdGVkIGJ5IEBQYXRyw4PCs25Nb2R6IiwKICAgICAgICAgICAgICAgICAgICAgICAiUG9ydHVndWVzZSI6ICJNb2QgY3JlYWRvIGJ5IEBQYXRyw4PCs25Nb2R6In0sCiAgICAgICAgICAgICAgICAgIk1vZCBJbmZvIjoKICAgICAgICAgICAgICAgICAgICAgIHsiU3BhbmlzaCI6IGYiVW4gbW9kIGdlbmlhbCBxdWUgdGUgcGVybWl0ZSBnZXN0aW9uYXIge19zcF99IGxvcyBwb3RlbmNpYWRvcmVzIGEgdHUgYW50b2pvLiB7X3NwX30gdGFtYmnDg8KpbiBpbmNsdXllIDggcG90ZW5jaWFkb3JlcyBleHRyYXtfc3BffSBkZWphbmRvIDE3IGVuIHRvdGFsLi4uIMOCwqFHdWF5ISIsCiAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2giOiBmIkEgY29vbCBtb2QgdGhhdCBhbGxvd3MgeW91IHRvIG1hbmFnZSB7X3NwX30gcG93ZXJ1cHMgYXQgeW91ciB3aGltcy4ge19zcF99IGFsc28gaW5jbHVkZXMgOCBleHRyYSBwb3dlcnVwc3tfc3BffSBsZWF2aW5nIDE3IGluIHRvdGFsLi4uIFdvdyEiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogZiJVbSBtb2QgbGVnYWwgcXVlIHBlcm1pdGUgcXVlIHZvY8ODwqogZ2VyZW5jaWUgb3N7X3NwX30gcG93ZXJ1cHMgZGUgZGUgYWNvcmRvIGNvbSBzZXVzIGNhcHJpY2hvcy4ge19zcF99IHRhbWLDg8KpbSBpbmNsdWkgOCBwb3dlcnVwcyBleHRyYXMse19zcF99IGRlaXhhbmRvIDE3IG5vIHRvdGFsLi4uIFVhdSEifSwKICAgICAgICAgICAgICAgICAiQ29pbnMgTWVzc2FnZSI6CiAgICAgICAgICAgICAgICAgICAgICB7IlNwYW5pc2giOiBmIlJlY29tcGVuc2E6IHtzdWJzfSBNb25lZGFzIiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6IGYiUmV3YXJkOiB7c3Vic30gQ29pbnMiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3J0dWd1ZXNlIjogZiJSZWNvbXBlbnNhOiB7c3Vic30gTW9lZGFzIn0sCiAgICAgICAgICAgICAgICAgIkNvaW5zIExpbWl0IE1lc3NhZ2UiOgogICAgICAgICAgICAgICAgICAgICAgeyJTcGFuaXNoIjogZiJHYW5hc3RlIHthbG1hY2VuWzBdfSBNb25lZGFzLntfc3BffSBQZXJvIGhhcyBzdXBlcmFkbyBlbCBsw4PCrW1pdGUgZGUge2FsbWFjZW5bMV19IiwKICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCI6IGYiWW91IHdvbiB7YWxtYWNlblswXX0gQ29pbnMuIHtfc3BffSBCdXQgeW91IGhhdmUgZXhjZWVkZWQgdGhlIGxpbWl0IG9mIHthbG1hY2VuWzFdfSIsCiAgICAgICAgICAgICAgICAgICAgICAgIlBvcnR1Z3Vlc2UiOiBmIlZvY8ODwqogZ2FuaG91IHthbG1hY2VuWzBdfSBNb2VkYXMuIHtfc3BffSBNYXMgdm9jw4PCqiBleGNlZGV1IG8gbGltaXRlIGRlIHthbG1hY2VuWzFdfSJ9LAogICAgICAgICAgICAgICAgIH0KICAgIGxhbmd1YWdlcyA9IFsnU3BhbmlzaCcsJ1BvcnR1Z3Vlc2UnLCdFbmdsaXNoJ10KICAgIGlmIGxhbmcgbm90IGluIGxhbmd1YWdlczogbGFuZyA9ICdFbmdsaXNoJwoKICAgIGlmIHRleHQgbm90IGluIHRyYW5zbGF0ZToKICAgICAgICByZXR1cm4gdGV4dAogICAgCiAgICByZXR1cm4gdHJhbnNsYXRlW3RleHRdW2xhbmddCgppbXBvcnQgc2V0dGluZwpzZXR0aW5ncz1zZXR0aW5nLmdldF9zZXR0aW5nc19kYXRhKCkKCmRlZiBzZXR0aW5nc19kaXN0cmlidXRpb24oKToKICAgIHJldHVybiBzZXR0aW5nc1siZWxQYXRyb25Qb3dlcnVwcyJdWyJzZXR0aW5ncyJdCgoKCmFwZyA9IGJhLmFwcC5jb25maWcKCmFwZ1snUFBNIFNldHRpbmdzJ10gPSBzZXR0aW5nc19kaXN0cmlidXRpb24oKQoKCmNvbmZpZyA9IGFwZ1snUFBNIFNldHRpbmdzJ10KCmRlZiBkZWZhdWx0X3Bvd2VydXBzKCk6CiAgICByZXR1cm4gc2V0dGluZ3NbImVsUGF0cm9uUG93ZXJ1cHMiXVsiUXVhbnRpdHkiXQoKCmNvbmZpZ1snUG93ZXJ1cHMnXSA9IGRlZmF1bHRfcG93ZXJ1cHMoKQoKCnBvd2VydXBzID0gY29uZmlnWydQb3dlcnVwcyddCgojID09PSBFWFRSQVMgPT09CgpHTE9CQUwgPSB7IlRhYiI6ICdBY3Rpb24gMScsCiAgICAgICAgICAiQ2xzIFBvd2VydXAiOiAwLAogICAgICAgICAgIkNvaW5zIE1lc3NhZ2UiOiBbXX0KCiMgPT09IFNUT1JFID09PQpkZWYgcHJvbW9fY29kZXMoKToKICAgIHJldHVybiB7IkctQW01NGlnTzQyT3MiOiBbVHJ1ZSwxMTAwXSwKICAgICAgICAgICAgIlAtdFJvOG5NOGRaIjogW1RydWUsMjgwMF0sCiAgICAgICAgICAgICJZLXRVMkIzUyI6IFtUcnVlLDUwMF0sCiAgICAgICAgICAgICJCLTBtQjNSWVQyeiI6IFtUcnVlLDkxMF0sCiAgICAgICAgICAgICJCLUFzZDE0bU9OOUcwRCI6IFtUcnVlLDkxMF0sCiAgICAgICAgICAgICJELXJBY0swY0oyMyI6IFtUcnVlLDkxMF0sCiAgICAgICAgICAgICJFLWEyN1pPNmYzWSI6IFtUcnVlLDYwMF0sCiAgICAgICAgICAgICJFLUFtNTRpZ080Mk9zIjogW1RydWUsNjAwXSwKICAgICAgICAgICAgIkUtTTR1TjNLMzRYQiI6IFtUcnVlLDg0MF0sCiAgICAgICAgICAgICJQTS03MzFDbGNBRiI6IFtUcnVlLDUwMDAwXX0KICAgICAgICAgICAgCmRlZiBzdG9yZV9pdGVtcygpOgogICAgcmV0dXJuIHsiQnV5IEZpcmVib21icyI6IEZhbHNlLAogICAgICAgICAgICAiQnV5IE9wdGlvbiI6IEZhbHNlLAogICAgICAgICAgICAiQnV5IFBlcmNlbnRhZ2UiOiBGYWxzZX0KCmlmIGFwZy5nZXQoJ0JlYXIgQ29pbicpIGlzIE5vbmU6CiAgICBhcGdbJ0JlYXIgQ29pbiddID0gMAogICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQogICAgCmlmIGFwZy5nZXQoJ0JlYXIgQ29pbicpIGlzIG5vdCBOb25lOgogICAgaWYgYXBnWydCZWFyIENvaW4nXSA8PSAwOgogICAgICAgIGFwZ1snQmVhciBDb2luJ10gPSAwCiAgICBhcGdbJ0JlYXIgQ29pbiddID0gaW50KGFwZ1snQmVhciBDb2luJ10pCgppZiBhcGcuZ2V0KCdCZWFyIFN0b3JlJykgaXMgTm9uZToKICAgIGFwZ1snQmVhciBTdG9yZSddID0ge30KICAgIApmb3IgaSxqIGluIHN0b3JlX2l0ZW1zKCkuaXRlbXMoKToKICAgIHN0b3JlICA9IGFwZ1snQmVhciBTdG9yZSddCiAgICBpZiBpIG5vdCBpbiBzdG9yZToKICAgICAgICBpZiBzdG9yZS5nZXQoaSkgaXMgTm9uZToKICAgICAgICAgICAgc3RvcmVbaV0gPSBqCiAgICBhcGcuYXBwbHlfYW5kX2NvbW1pdCgpCgpTVE9SRSA9IGFwZ1snQmVhciBTdG9yZSddCgppZiBTVE9SRS5nZXQoJ1Byb21vIENvZGUnKSBpcyBOb25lOgogICAgU1RPUkVbJ1Byb21vIENvZGUnXSA9IHByb21vX2NvZGVzKCkKCmZvciBpLHggaW4gcHJvbW9fY29kZXMoKS5pdGVtcygpOgogICAgcG1jb2RlID0gU1RPUkVbJ1Byb21vIENvZGUnXQogICAgaWYgaSBub3QgaW4gcG1jb2RlOgogICAgICAgIGlmIHBtY29kZS5nZXQoaSkgaXMgTm9uZToKICAgICAgICAgICAgcG1jb2RlW2ldID0geAoKYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKY2xhc3MgQmVhclN0b3JlOgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgcHJpY2U6IGludCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgdmFsdWU6IHN0ciA9ICcnLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsID0gTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHNlbGYucHJpY2UgPSBwcmljZQogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQogICAgICAgIHNlbGYuc3RvcmUgPSBTVE9SRVt2YWx1ZV0KICAgICAgICBzZWxmLmNvaW5zID0gYXBnWydCZWFyIENvaW4nXQogICAgICAgIHNlbGYuY2FsbGJhY2sgPSBjYWxsYmFjawogICAgICAgICAgICAgICAgIAogICAgZGVmIGJ1eShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5zdG9yZToKICAgICAgICAgICAgaWYgc2VsZi5jb2lucyA+PSAoc2VsZi5wcmljZSk6CiAgICAgICAgICAgICAgICBkZWYgY29uZmlybSgpOgogICAgICAgICAgICAgICAgICAgIFNUT1JFW3NlbGYudmFsdWVdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGFwZ1snQmVhciBDb2luJ10gLT0gaW50KHNlbGYucHJpY2UpCiAgICAgICAgICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnUHVyY2hhc2UnKSwoMCwxLDApKQogICAgICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2FzaFJlZ2lzdGVyJykpCiAgICAgICAgICAgICAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2soKQogICAgICAgICAgICAgICAgQ29uZmlybVdpbmRvdyhnZXRsYW5ndWFnZSgnQ29uZmlybSBQdXJjaGFzZScsc3Vicz1zZWxmLmNvaW5zKSwKICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTQwMCwgaGVpZ2h0PTEyMCwgYWN0aW9uPWNvbmZpcm0sIG9rX3RleHQ9YmEuTHN0cihyZXNvdXJjZT0nb2tUZXh0JykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKGdldGxhbmd1YWdlKCdDb2lucyAwJyksKDEsMCwwKSkKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnZXJyb3InKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYS5zY3JlZW5tZXNzYWdlKGdldGxhbmd1YWdlKCdEb3VibGUgUHJvZHVjdCcpLCgxLDAsMCkpCiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnZXJyb3InKSkKCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICBhcGdbJ0JlYXIgQ29pbiddID0gaW50KGFwZ1snQmVhciBDb2luJ10pCiAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKY2xhc3MgUHJvbW9Db2RlOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGU6IHN0ciA9ICcnKToKICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCiAgICAgICAgc2VsZi5jb2Rlc19zdG9yZSA9IFNUT1JFWydQcm9tbyBDb2RlJ10KICAgICAgICBpZiBzZWxmLmNvZGUgaW4gc2VsZi5jb2Rlc19zdG9yZToKICAgICAgICAgICAgc2VsZi5jb2RlX3R5cGUgPSBTVE9SRVsnUHJvbW8gQ29kZSddW2NvZGVdCiAgICAgICAgICAgIHNlbGYucHJvbW9fY29kZV9leHBpcmUgPSBzZWxmLmNvZGVfdHlwZVswXQogICAgICAgICAgICBzZWxmLnByb21vX2NvZGVfYW1vdW50ID0gc2VsZi5jb2RlX3R5cGVbMV0KCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICBhcGdbJ0JlYXIgQ29pbiddID0gaW50KGFwZ1snQmVhciBDb2luJ10pCiAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKICAgIGRlZiBjb2RlX2NvbmZpcm1hdGlvbihzZWxmKToKICAgICAgICBpZiBzZWxmLmNvZGUgIT0gIiI6CiAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoCiAgICAgICAgICAgICAgICBiYS5Mc3RyKHJlc291cmNlPSdzdWJtaXR0aW5nUHJvbW9Db2RlVGV4dCcpLCgwLDEsMCkpCiAgICAgICAgICAgIGJhLnRpbWVyKDIsYmEuQ2FsbChzZWxmLnZhbGlkYXRlX2NvZGUpKQoKICAgIGRlZiB2YWxpZGF0ZV9jb2RlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuY29kZSBpbiBzZWxmLmNvZGVzX3N0b3JlOgogICAgICAgICAgICBpZiBzZWxmLnByb21vX2NvZGVfZXhwaXJlOgogICAgICAgICAgICAgICAgYmEudGltZXIoMS41LGJhLkNhbGwoc2VsZi5zdWNjZXNzZnVsX2NvZGUpKQogICAgICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnVHJ1ZSBDb2RlJyksKDAsMSwwKSkKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2hlZXInKSkKICAgICAgICAgICAgICAgIHNlbGYuY29kZV90eXBlWzBdID0gRmFsc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ0ZhbHNlIENvZGUnKSwoMSwwLDApKQogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKGJhLmdldHNvdW5kKCdlcnJvcicpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ0ludmFsaWQgQ29kZScpLCgxLDAsMCkpCiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnZXJyb3InKSkKCiAgICBkZWYgc3VjY2Vzc2Z1bF9jb2RlKHNlbGYpOgogICAgICAgIGFwZ1snQmVhciBDb2luJ10gKz0gc2VsZi5wcm9tb19jb2RlX2Ftb3VudAogICAgICAgIGJhLnNjcmVlbm1lc3NhZ2UoZ2V0bGFuZ3VhZ2UoJ1Jld2FyZCBDb2RlJywKICAgICAgICAgICAgc3Vicz1zZWxmLnByb21vX2NvZGVfYW1vdW50KSwoMCwxLDApKQogICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2FzaFJlZ2lzdGVyMicpKQoKTWFpbk1lbnVBY3Rpdml0eS5zdXBlcl90cmFuc2l0aW9uX2luID0gTWFpbk1lbnVBY3Rpdml0eS5vbl90cmFuc2l0aW9uX2luCmRlZiBuZXdfb25fdHJhbnNpdGlvbl9pbihzZWxmKToKICAgIHNlbGYuc3VwZXJfdHJhbnNpdGlvbl9pbigpCiAgICBsaW1pdCA9IDg0MDAKICAgIGJlYXJfY29pbiA9IGFwZ1snQmVhciBDb2luJ10KICAgIGNvaW5zX21lc3NhZ2UgPSBHTE9CQUxbJ0NvaW5zIE1lc3NhZ2UnXQogICAgdHJ5OgogICAgICAgIGlmIG5vdCAoU1RPUkVbJ0J1eSBGaXJlYm9tYnMnXSBhbmQKICAgICAgICAgICAgICAgIFNUT1JFWydCdXkgT3B0aW9uJ10gYW5kCiAgICAgICAgICAgICAgICBTVE9SRVsnQnV5IFBlcmNlbnRhZ2UnXSk6CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIGNvaW5zX21lc3NhZ2UgIT0gW106CiAgICAgICAgICAgICAgICByZXN1bHQgPSAwCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBjb2luc19tZXNzYWdlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpCgogICAgICAgICAgICAgICAgaWYgbm90IGJlYXJfY29pbiA+PSAobGltaXQtMSk6CiAgICAgICAgICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnQ29pbnMgTWVzc2FnZScsc3Vicz1yZXN1bHQpLCgwLDEsMCkpCiAgICAgICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKGJhLmdldHNvdW5kKCdjYXNoUmVnaXN0ZXInKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYmEuc2NyZWVubWVzc2FnZShnZXRsYW5ndWFnZSgnQ29pbnMgTGltaXQgTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbWFjZW49W3Jlc3VsdCxsaW1pdF0pLCgxLDAsMCkpCiAgICAgICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKGJhLmdldHNvdW5kKCdlcnJvcicpKQogICAgICAgICAgICAgICAgc2VsZi5iZWFyX2NvaW5fbWVzc2FnZSA9IFRydWUKICAgICAgICAgICAgICAgIEdMT0JBTFsnQ29pbnMgTWVzc2FnZSddID0gW10KICAgIGV4Y2VwdDogcGFzcwoKU3BhekJvdC5zdXBlcl9oYW5kbGVtZXNzYWdlID0gU3BhekJvdC5oYW5kbGVtZXNzYWdlCmRlZiBib3RfaGFuZGxlbWVzc2FnZShzZWxmLCBtc2c6IEFueSk6CiAgICBzZWxmLnN1cGVyX2hhbmRsZW1lc3NhZ2UobXNnKQogICAgaWYgaXNpbnN0YW5jZShtc2csIGJhLkRpZU1lc3NhZ2UpOgogICAgICAgIGlmIG5vdCBzZWxmLmRpZToKICAgICAgICAgICAgc2VsZi5kaWUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYubGltaXQgPSA4NDAwCiAgICAgICAgICAgIHNlbGYuZnJlZV9jb2lucyA9IHJhbmRvbS5yYW5kaW50KDEsMjUpCiAgICAgICAgICAgIHNlbGYuYmVhcl9jb2lucyA9IGFwZ1snQmVhciBDb2luJ10KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJlYXJfY29pbnMgPj0gKHNlbGYubGltaXQpOgogICAgICAgICAgICAgICAgc2VsZi5iZWFyX2NvaW5zICs9IHNlbGYuZnJlZV9jb2lucwogICAgICAgICAgICAgICAgR0xPQkFMWydDb2lucyBNZXNzYWdlJ10uYXBwZW5kKHNlbGYuZnJlZV9jb2lucykKCiAgICAgICAgICAgICAgICBpZiBzZWxmLmJlYXJfY29pbnMgPj0gKHNlbGYubGltaXQpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYmVhcl9jb2lucyA9IHNlbGYubGltaXQKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGFwZ1snQmVhciBDb2luJ10gPSBpbnQoc2VsZi5iZWFyX2NvaW5zKQogICAgICAgICAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGVsc2U6IEdMT0JBTFsnQ29pbnMgTWVzc2FnZSddLmFwcGVuZChzZWxmLmZyZWVfY29pbnMpCgpkZWYgY2xzX3Bvd19jb2xvcigpOgogICAgcmV0dXJuIFsoMSwwLjEsMC4xKSwoMC4xLDAuNSwwLjkpLCgwLjEsMC45LDAuOSksCiAgICAgICAgICAgICgwLjEsMC45LDAuMSksKDAuMSwxLDAuNSksKDEsMSwwLjIpLCgyLDAuNSwwLjUpLCgxLDAsNildCgpkZWYgcmFuZG9tX2NvbG9yKCk6CiAgICBhID0gcmFuZG9tLnJhbmRvbSgpKjMKICAgIGIgPSByYW5kb20ucmFuZG9tKCkqMwogICAgYyA9IHJhbmRvbS5yYW5kb20oKSozCiAgICByZXR1cm4gKGEsYixjKQoKZGVmIHBvd2VydXBfZGlzdCgpOgogICAgcmV0dXJuICgoJ3RyaXBsZV9ib21icycsIHBvd2VydXBzWydUcmlwbGUnXSksCiAgICAgICAgICAgICgnaWNlX2JvbWJzJywgcG93ZXJ1cHNbJ0ljZSBCb21icyddKSwKICAgICAgICAgICAgKCdwdW5jaCcsIHBvd2VydXBzWydQdW5jaCddKSwKICAgICAgICAgICAgKCdpbXBhY3RfYm9tYnMnLCBwb3dlcnVwc1snSW1wYWN0IEJvbWJzJ10pLAogICAgICAgICAgICAoJ2xhbmRfbWluZXMnLCBwb3dlcnVwc1snTWluZSBCb21icyddKSwKICAgICAgICAgICAgKCdzdGlja3lfYm9tYnMnLCBwb3dlcnVwc1snU3RpY2t5IEJvbWJzJ10pLAogICAgICAgICAgICAoJ3NoaWVsZCcsIHBvd2VydXBzWydTaGllbGQnXSksCiAgICAgICAgICAgICgnaGVhbHRoJywgcG93ZXJ1cHNbJ0hlYWx0aCddKSwKICAgICAgICAgICAgKCdjdXJzZScsIHBvd2VydXBzWydDdXJzZSddKSwKICAgICAgICAgICAgKCdzcGVlZCcscG93ZXJ1cHNbJ1NwZWVkJ10pLAogICAgICAgICAgICAoJ2hlYWx0aF9kYW1hZ2UnLCBwb3dlcnVwc1snSGVhbGluZyBEYW1hZ2UnXSksCiAgICAgICAgICAgICgnZ29vZGJ5ZScscG93ZXJ1cHNbJ0dvb2RieWUnXSksCiAgICAgICAgICAgICgnaWNlX21hbicscG93ZXJ1cHNbJ0ljZSBNYW4nXSksCiAgICAgICAgICAgICgndGFua19zaGllbGQnLHBvd2VydXBzWydUYW5rIFNoaWVsZCddKSwKICAgICAgICAgICAgKCdpbXBhaXJtZW50X2JvbWJzJyxwb3dlcnVwc1snSW1wYWlybWVudCBCb21icyddKSwKICAgICAgICAgICAgKCdmaXJlX2JvbWJzJyxwb3dlcnVwc1snRmlyZSBCb21icyddKSwKICAgICAgICAgICAgKCdmbHlfYm9tYnMnLHBvd2VydXBzWydGbHkgQm9tYnMnXSkpCgpkZWYgcGVyY2VudGFnZV90YW5rX3NoaWVsZCgpOgogICAgcGVyY2VudGFnZSA9IGNvbmZpZ1snVGFuayBTaGllbGQgUFRHJ10KICAgIHBlcmNlbnRhZ2VfdGV4dCA9ICgnMC4nKSArIHN0cihwZXJjZW50YWdlKQogICAgcmV0dXJuIGZsb2F0KHBlcmNlbnRhZ2VfdGV4dCkKICAgIApkZWYgcGVyY2VudGFnZV9oZWFsdGhfZGFtYWdlKCk6CiAgICBwZXJjZW50YWdlID0gY29uZmlnWydIZWFsaW5nIERhbWFnZSBQVEcnXQogICAgcGVyY2VudGFnZV90ZXh0ID0gKCcwLicpICsgc3RyKHBlcmNlbnRhZ2UpCiAgICByZXR1cm4gZmxvYXQocGVyY2VudGFnZV90ZXh0KQoKIyA9PT0gTW9kaWZ5IGNsYXNzID09PQoKY2xhc3MgTmV3UHJvZmlsZUJyb3dzZXJXaW5kb3coYnJvd3Nlci5Qcm9maWxlQnJvd3NlcldpbmRvdyk6CiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBzdHIgPSAnaW5fcmlnaHQnLAogICAgICAgICAgICAgICAgIGluX21haW5fbWVudTogYm9vbCA9IFRydWUsCiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfcHJvZmlsZTogc3RyID0gTm9uZSwKICAgICAgICAgICAgICAgICBvcmlnaW5fd2lkZ2V0OiBiYS5XaWRnZXQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKHRyYW5zaXRpb24saW5fbWFpbl9tZW51LHNlbGVjdGVkX3Byb2ZpbGUsb3JpZ2luX3dpZGdldCkKICAgICAgIAogICAgICAgIHNlbGYuc2Vzc2lvbiA9IF9iYS5nZXRfZm9yZWdyb3VuZF9ob3N0X3Nlc3Npb24oKQogICAgICAgIHVpc2NhbGUgPSBiYS5hcHAudWkudWlzY2FsZQogICAgICAgIHdpZHRoID0gKDEwMCBpZiB1aXNjYWxlIGlzCiAgICAgICAgICAgICAgICAgYmEuVUlTY2FsZS5TTUFMTCBlbHNlIC0xNCkKICAgICAgICBzaXplID0gNTAKICAgICAgICBwb3NpdGlvbiA9ICh3aWR0aCoxLjY1LDMwMCkKIAogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5zZXNzaW9uLE1haW5NZW51U2Vzc2lvbik6CiAgICAgICAgICAgIHNlbGYuYnV0dG9uID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvc2VsZWN0PVRydWUscG9zaXRpb249cG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oc2l6ZSxzaXplKSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0nJyxvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi5wb3dlcnVwbWFuYWdlcl93aW5kb3cpKQogICAgICAgICAgICAKICAgICAgICAgICAgc2l6ZSA9IHNpemUqMC42MAogICAgICAgICAgICBzZWxmLmltYWdlID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KHNpemUsc2l6ZSksZHJhd19jb250cm9sbGVyPXNlbGYuYnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsxMC41LHBvc2l0aW9uWzFdKzE3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlPWJhLmdldHRleHR1cmUoJ3Bvd2VydXBTcGVlZCcpKQogICAgCiAgICAgICAgICAgIHNlbGYudGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsyNSxwb3NpdGlvblsxXSsxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oMCwgMCksc2NhbGU9MC40NSxjb2xvcj0oMC43LDAuOSwwLjcsMS4wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2NvbnRyb2xsZXI9c2VsZi5idXR0b24sbWF4d2lkdGg9NjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0oZiJVbHRpbWF0ZSBQb3dlcnVwIHtfc3BffU1hbmFnZXIiKSxoX2FsaWduPSdjZW50ZXInLHZfYWxpZ249J2NlbnRlcicpCgogICAgZGVmIHBvd2VydXBtYW5hZ2VyX3dpbmRvdyhzZWxmKToKICAgICAgICBiYS5jb250YWluZXJ3aWRnZXQoZWRpdD1zZWxmLl9yb290X3dpZGdldCx0cmFuc2l0aW9uPSdvdXRfbGVmdCcpCiAgICAgICAgUG93ZXJ1cE1hbmFnZXJXaW5kb3coKQoKY2xhc3MgTmV3UG93ZXJ1cEJveEZhY3RvcnkocHVwYm94LlBvd2VydXBCb3hGYWN0b3J5KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudGV4X3NwZWVkID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFNwZWVkJykKICAgICAgICBzZWxmLnRleF9oZWFsdGhfZGFtYWdlID0gYmEuZ2V0dGV4dHVyZSgnaGVhcnQnKQogICAgICAgIHNlbGYudGV4X2dvb2RieWUgPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudE9uc2xhdWdodCcpCiAgICAgICAgc2VsZi50ZXhfaWNlX21hbiA9IGJhLmdldHRleHR1cmUoJ291eWFVQnV0dG9uJykKICAgICAgICBzZWxmLnRleF90YW5rX3NoaWVsZCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50U3VwZXJQdW5jaCcpCiAgICAgICAgc2VsZi50ZXhfaW1wYWlybWVudF9ib21icyA9IGJhLmdldHRleHR1cmUoJ2xldmVsSWNvbicpCiAgICAgICAgc2VsZi50ZXhfZmlyZV9ib21icyA9IGJhLmdldHRleHR1cmUoJ291eWFPQnV0dG9uJykKICAgICAgICBzZWxmLnRleF9mbHlfYm9tYnMgPSBiYS5nZXR0ZXh0dXJlKCdzdGFyJykKICAgICAgICAKICAgICAgICBzZWxmLl9wb3dlcnVwZGlzdCA9IFtdCiAgICAgICAgZm9yIHBvd2VydXAsIGZyZXEgaW4gcG93ZXJ1cF9kaXN0KCk6CiAgICAgICAgICAgIGZvciBfaSBpbiByYW5nZShpbnQoZnJlcSkpOgogICAgICAgICAgICAgICAgc2VsZi5fcG93ZXJ1cGRpc3QuYXBwZW5kKHBvd2VydXApCgogICAgZGVmIGdldF9yYW5kb21fcG93ZXJ1cF90eXBlKHNlbGYsZm9yY2V0eXBlID0gTm9uZSwgZXhjbHVkZXR5cGVzID0gTm9uZSk6CiAgICAgICAgCiAgICAgICAgdHJ5OiBzZWxmLm1hcGEgPSBiYS5nZXRhY3Rpdml0eSgpLl9tYXAuZ2V0bmFtZSgpCiAgICAgICAgZXhjZXB0OiBzZWxmLm1hcGEgPSBOb25lCiAgICAgIAogICAgICAgIHNwZWVkX2Jhbm5lZF9tYXBzID0gWydIb2NrZXkgU3RhZGl1bScsJ0xha2UgRnJpZ2lkJywnSGFwcHkgVGhvdWdodHMnXQogICAgICAKICAgICAgICBpZiBzZWxmLm1hcGEgaW4gc3BlZWRfYmFubmVkX21hcHM6CiAgICAgICAgICAgIHBvd2VydXBfZGlzYWJsZSA9IFsnc3BlZWQnXQogICAgICAgIGVsc2U6IHBvd2VydXBfZGlzYWJsZSA9IFtdCiAgICAgIAogICAgICAgIGlmIGV4Y2x1ZGV0eXBlcyBpcyBOb25lOgogICAgICAgICAgICBleGNsdWRldHlwZXMgPSBbXQogICAgICAgIGlmIGZvcmNldHlwZToKICAgICAgICAgICAgcHR5cGUgPSBmb3JjZXR5cGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9sYXN0cG93ZXJ1cHR5cGUgPT0gJ2N1cnNlJzoKICAgICAgICAgICAgICAgIHB0eXBlID0gJ2hlYWx0aCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBzZWxmLl9wb3dlcnVwZGlzdFtyYW5kb20ucmFuZGludCgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNlbGYuX3Bvd2VydXBkaXN0KSAtIDEpXQogICAgICAgICAgICAgICAgICAgIGlmIHB0eXBlIG5vdCBpbiBleGNsdWRldHlwZXMgYW5kIHB0eXBlIG5vdCBpbiBwb3dlcnVwX2Rpc2FibGU6IGJyZWFrCiAgICAgICAgc2VsZi5fbGFzdHBvd2VydXB0eXBlID0gcHR5cGUKICAgICAgICByZXR1cm4gcHR5cGUKCmRlZiBmaXJlX2VmZmVjdChzZWxmKToKICAgIGlmIHNlbGYubm9kZS5leGlzdHMoKToKICAgICAgICBiYS5lbWl0ZngocG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uLAogICAgICAgIHNjYWxlPTMsY291bnQ9NTAqMixzcHJlYWQ9MC4zLAogICAgICAgIGNodW5rX3R5cGU9J3N3ZWF0JykKICAgIGVsc2U6IHNlbGYuZmlyZV9lZmZlY3RfdGltZSA9IE5vbmUKCiMjIyMjIyMjIyMjQk9NQlMKQm9tYi5fcG1fb2xkX2JvbWIgPSBCb21iLl9faW5pdF9fCmRlZiBfYm9tYl9pbml0KHNlbGYsCiAgICAgICAgICAgICAgIHBvc2l0aW9uOiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAxLjAsIDAuMCksCiAgICAgICAgICAgICAgIHZlbG9jaXR5OiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAwLjAsIDAuMCksCiAgICAgICAgICAgICAgIGJvbWJfdHlwZTogc3RyID0gJ25vcm1hbCcsCiAgICAgICAgICAgICAgIGJsYXN0X3JhZGl1czogZmxvYXQgPSAyLjAsCiAgICAgICAgICAgICAgIGJvbWJfc2NhbGU6IGZsb2F0ID0gMS4wLAogICAgICAgICAgICAgICBzb3VyY2VfcGxheWVyOiBiYS5QbGF5ZXIgPSBOb25lLAogICAgICAgICAgICAgICBvd25lcjogYmEuTm9kZSA9IE5vbmUpOgoKICAgIHNlbGYuYm1fdHlwZSA9IGJvbWJfdHlwZQogICAgbmV3X2JvbWJfdHlwZSA9IGJvbWJfdHlwZQogICAgYm9tYnMgPSBbJ2ljZV9idWJibGUnLCdpbXBhaXJtZW50JywnZmlyZScsJ2ZseSddCiAgICAKICAgIGlmIGJvbWJfdHlwZSBpbiBib21iczoKICAgICAgICBuZXdfYm9tYl90eXBlID0gJ2ljZScKICAgICAgICAgICAgICAgICAgIAogICAgc2VsZi5fcG1fb2xkX2JvbWIocG9zaXRpb24sdmVsb2NpdHksbmV3X2JvbWJfdHlwZSxibGFzdF9yYWRpdXMsCiAgICAgICAgICAgICAgICAgICAgICBib21iX3NjYWxlLHNvdXJjZV9wbGF5ZXIsb3duZXIpCiAgICAKICAgIHRleCA9IHNlbGYubm9kZS5jb2xvcl90ZXh0dXJlCiAgICAKICAgIGlmIHNlbGYuYm1fdHlwZSA9PSAnaWNlX2J1YmJsZSc6CiAgICAgICAgc2VsZi5ib21iX3R5cGUgPSBzZWxmLmJtX3R5cGUKICAgICAgICBzZWxmLm5vZGUubW9kZWwgPSBOb25lCiAgICAgICAgc2VsZi5zaGllbGRfaWNlID0gYmEubmV3bm9kZSgnc2hpZWxkJyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgIGF0dHJzPXsnY29sb3InOiAoMC41LCAxLjAsIDcuMCksJ3JhZGl1cyc6IDAuNn0pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIHNlbGYuc2hpZWxkX2ljZSwgJ3Bvc2l0aW9uJykKICAgIGVsaWYgc2VsZi5ibV90eXBlID09ICdmaXJlJzoKICAgICAgICBzZWxmLmJvbWJfdHlwZSA9IHNlbGYuYm1fdHlwZQogICAgICAgIHNlbGYubm9kZS5tb2RlbCA9IE5vbmUKICAgICAgICBzZWxmLnNoaWVsZF9maXJlID0gYmEubmV3bm9kZSgnc2hpZWxkJyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgIGF0dHJzPXsnY29sb3InOiAoNi41LCA2LjUsIDIuMCksJ3JhZGl1cyc6IDAuNn0pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIHNlbGYuc2hpZWxkX2ZpcmUsICdwb3NpdGlvbicpCiAgICAgICAgc2VsZi5maXJlX2VmZmVjdF90aW1lID0gYmEuVGltZXIoMC4xLGJhLkNhbGwoZmlyZV9lZmZlY3Qsc2VsZikscmVwZWF0PVRydWUpCiAgICBlbGlmIHNlbGYuYm1fdHlwZSA9PSAnaW1wYWlybWVudCc6CiAgICAgICAgc2VsZi5ib21iX3R5cGUgPSBzZWxmLmJtX3R5cGUKICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdlZ2dUZXgzJykKICAgIGVsaWYgc2VsZi5ibV90eXBlID09ICdmbHknOgogICAgICAgIHNlbGYuYm9tYl90eXBlID0gc2VsZi5ibV90eXBlCiAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnZWdnVGV4MScpCgogICAgc2VsZi5ub2RlLmNvbG9yX3RleHR1cmUgPSB0ZXgKICAgIHNlbGYuaGl0X3N1YnR5cGUgPSBzZWxmLmJvbWJfdHlwZQoKICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdpY2VfYnViYmxlJzoKICAgICAgICBzZWxmLmJsYXN0X3JhZGl1cyAqPSAxLjIKICAgIGVsaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ZseSc6CiAgICAgICAgc2VsZi5ibGFzdF9yYWRpdXMgKj0gMi4yCgpkZWYgYm9tYl9oYW5kbGVtZXNzYWdlKHNlbGYsIG1zZzogQW55KSAtPiBBbnk6CiAgICBhc3NlcnQgbm90IHNlbGYuZXhwaXJlZAoKICAgIGlmIGlzaW5zdGFuY2UobXNnLCBiYS5EaWVNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5kZWxldGUoKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJvbWIuRXhwbG9kZUhpdE1lc3NhZ2UpOgogICAgICAgIG5vZGUgPSBiYS5nZXRjb2xsaXNpb24oKS5vcHBvc2luZ25vZGUKICAgICAgICBhc3NlcnQgc2VsZi5ub2RlCiAgICAgICAgbm9kZXBvcyA9IHNlbGYubm9kZS5wb3NpdGlvbgogICAgICAgIG1hZyA9IDIwMDAuMAogICAgICAgIGlmIHNlbGYuYmxhc3RfdHlwZSBpbiAoJ2ljZScsJ2ljZV9idWJibGUnKToKICAgICAgICAgICAgbWFnICo9IDAuNQogICAgICAgIGVsaWYgc2VsZi5ibGFzdF90eXBlID09ICdsYW5kX21pbmUnOgogICAgICAgICAgICBtYWcgKj0gMi41CiAgICAgICAgZWxpZiBzZWxmLmJsYXN0X3R5cGUgPT0gJ3RudCc6CiAgICAgICAgICAgIG1hZyAqPSAyLjAKICAgICAgICBlbGlmIHNlbGYuYmxhc3RfdHlwZSA9PSAnZmlyZSc6CiAgICAgICAgICAgIG1hZyAqPSAwLjYKICAgICAgICBlbGlmIHNlbGYuYmxhc3RfdHlwZSA9PSAnZmx5JzoKICAgICAgICAgICAgbWFnICo9IDUuNQoKICAgICAgICBub2RlLmhhbmRsZW1lc3NhZ2UoCiAgICAgICAgICAgIGJhLkhpdE1lc3NhZ2UocG9zPW5vZGVwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ25pdHVkZT1tYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0X3R5cGU9c2VsZi5oaXRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoaXRfc3VidHlwZT1zZWxmLmhpdF9zdWJ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cz1zZWxmLnJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcGxheWVyPWJhLmV4aXN0aW5nKHNlbGYuX3NvdXJjZV9wbGF5ZXIpKSkKICAgICAgICBpZiBzZWxmLmJsYXN0X3R5cGUgaW4gKCdpY2UnLCdpY2VfYnViYmxlJyk6CiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChib21iLkJvbWJGYWN0b3J5LmdldCgpLmZyZWV6ZV9zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249bm9kZXBvcykKICAgICAgICAgICAgbm9kZS5oYW5kbGVtZXNzYWdlKGJhLkZyZWV6ZU1lc3NhZ2UoKSkKCiAgICByZXR1cm4gTm9uZQoKZGVmIHBvd2VydXBfdHJhbnNsYXRlZChzZWxmLCB0eXBlOiBzdHIpOgogICAgcG93ZXJ1cHNfbmFtZXMgPSB7J3RyaXBsZV9ib21icyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEJvbWJOYW1lVGV4dCcpLAogICAgICAgICAgICAgICAgJ2ljZV9ib21icyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEljZUJvbWJzTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdwdW5jaCc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cFB1bmNoTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdpbXBhY3RfYm9tYnMnOiBiYS5Mc3RyKHJlc291cmNlPSdoZWxwV2luZG93LicrJ3Bvd2VydXBJbXBhY3RCb21ic05hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnbGFuZF9taW5lcyc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cExhbmRNaW5lc05hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnc3RpY2t5X2JvbWJzJzogYmEuTHN0cihyZXNvdXJjZT0naGVscFdpbmRvdy4nKydwb3dlcnVwU3RpY2t5Qm9tYnNOYW1lVGV4dCcpLAogICAgICAgICAgICAgICAgJ3NoaWVsZCc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cFNoaWVsZE5hbWVUZXh0JyksCiAgICAgICAgICAgICAgICAnaGVhbHRoJzogYmEuTHN0cihyZXNvdXJjZT0naGVscFdpbmRvdy4nKydwb3dlcnVwSGVhbHRoTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdjdXJzZSc6IGJhLkxzdHIocmVzb3VyY2U9J2hlbHBXaW5kb3cuJysncG93ZXJ1cEN1cnNlTmFtZVRleHQnKSwKICAgICAgICAgICAgICAgICdzcGVlZCc6IGdldGxhbmd1YWdlKCdTcGVlZCcpLAogICAgICAgICAgICAgICAgJ2hlYWx0aF9kYW1hZ2UnOiBnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UnKSwKICAgICAgICAgICAgICAgICdnb29kYnllJzogZ2V0bGFuZ3VhZ2UoJ0dvb2RieWUnKSwKICAgICAgICAgICAgICAgICdpY2VfbWFuJzogZ2V0bGFuZ3VhZ2UoJ0ljZSBNYW4nKSwKICAgICAgICAgICAgICAgICd0YW5rX3NoaWVsZCc6IGdldGxhbmd1YWdlKCdUYW5rIFNoaWVsZCcpLAogICAgICAgICAgICAgICAgJ2ltcGFpcm1lbnRfYm9tYnMnOiBnZXRsYW5ndWFnZSgnSW1wYWlybWVudCBCb21icycpLAogICAgICAgICAgICAgICAgJ2ZpcmVfYm9tYnMnOiBnZXRsYW5ndWFnZSgnRmlyZSBCb21icycpLAogICAgICAgICAgICAgICAgJ2ZseV9ib21icyc6IGdldGxhbmd1YWdlKCdGbHkgQm9tYnMnKX0KICAgIHNlbGYudGV4dHNbJ05hbWUnXS50ZXh0ID0gcG93ZXJ1cHNfbmFtZXNbdHlwZV0KICAgICAgICAgICAgICAgIAojIyMjIyMjIyMjI1BPV0VSVVAKcHVwYm94LlBvd2VydXBCb3guX29sZF9wYnhfID0gcHVwYm94LlBvd2VydXBCb3guX19pbml0X18KZGVmIF9wYnhfKHNlbGYsIHBvc2l0aW9uOiBTZXF1ZW5jZVtmbG9hdF0gPSAoMC4wLCAxLjAsIDAuMCksCiAgICAgICAgICBwb3dlcnVwdHlwZTogc3RyID0gJ3RyaXBsZV9ib21icycsCiAgICAgICAgICBleHBpcmU6IGJvb2wgPSBUcnVlKToKICAgIAogICAgc2VsZi5uZXdzOiBsaXN0ID0gW10KICAgIGZvciB4LGkgaW4gcG93ZXJ1cF9kaXN0KCk6IHNlbGYubmV3cy5hcHBlbmQoeCkKICAgIAogICAgc2VsZi5ib3g6IGxpc3QgPSBbXQogICAgc2VsZi50ZXh0cyA9IHt9CiAgICBzZWxmLm5ld3MgPSBzZWxmLm5ld3NbOTpdCiAgICBzZWxmLmJveC5hcHBlbmQocG93ZXJ1cHR5cGUpCiAgICBzZWxmLm5wb3dlcnVwID0gc2VsZi5ib3hbMF0KICAgIGZhY3RvcnkgPSBOZXdQb3dlcnVwQm94RmFjdG9yeS5nZXQoKQogICAgCiAgICBpZiBzZWxmLm5wb3dlcnVwIGluIHNlbGYubmV3czogbmV3X3Bvd2VydXB0eXBlID0gJ3NoaWVsZCcKICAgIGVsc2U6IG5ld19wb3dlcnVwdHlwZSA9IHBvd2VydXB0eXBlCiAgICBzZWxmLl9vbGRfcGJ4Xyhwb3NpdGlvbixuZXdfcG93ZXJ1cHR5cGUsZXhwaXJlKQogICAgCiAgICB0eXBlID0gbmV3X3Bvd2VydXB0eXBlCiAgICB0ZXggPSBzZWxmLm5vZGUuY29sb3JfdGV4dHVyZQogICAgbW9kZWwgPSBzZWxmLm5vZGUubW9kZWwKICAgIAogICAgaWYgc2VsZi5ucG93ZXJ1cCA9PSAnc3BlZWQnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfc3BlZWQKICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAnaGVhbHRoX2RhbWFnZSc6CiAgICAgICAgdHlwZSA9IHNlbGYubnBvd2VydXAKICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9oZWFsdGhfZGFtYWdlCiAgICBlbGlmIHNlbGYubnBvd2VydXAgPT0gJ2dvb2RieWUnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZ29vZGJ5ZQogICAgZWxpZiBzZWxmLm5wb3dlcnVwID09ICdpY2VfbWFuJzoKICAgICAgICB0eXBlID0gc2VsZi5ucG93ZXJ1cAogICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2ljZV9tYW4KICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAndGFua19zaGllbGQnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfdGFua19zaGllbGQKICAgIGVsaWYgc2VsZi5ucG93ZXJ1cCA9PSAnaW1wYWlybWVudF9ib21icyc6CiAgICAgICAgdHlwZSA9IHNlbGYubnBvd2VydXAKICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9pbXBhaXJtZW50X2JvbWJzCiAgICBlbGlmIHNlbGYubnBvd2VydXAgPT0gJ2ZpcmVfYm9tYnMnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZmlyZV9ib21icwogICAgZWxpZiBzZWxmLm5wb3dlcnVwID09ICdmbHlfYm9tYnMnOgogICAgICAgIHR5cGUgPSBzZWxmLm5wb3dlcnVwCiAgICAgICAgdGV4ID0gZmFjdG9yeS50ZXhfZmx5X2JvbWJzCgogICAgc2VsZi5wb3dlcnVwdHlwZSA9IHR5cGUKICAgIHNlbGYubm9kZS5tb2RlbCA9IG1vZGVsCiAgICBzZWxmLm5vZGUuY29sb3JfdGV4dHVyZSA9IHRleAogICAgbl9zY2FsZSA9IGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddCiAgICBzdHlsZSA9IGNvbmZpZ1snUG93ZXJ1cCBTdHlsZSddCgogICAgY3VydmUgPSBiYS5hbmltYXRlKHNlbGYubm9kZSwgJ21vZGVsX3NjYWxlJywgezA6IDAsIDAuMTQ6IDEuNiwgMC4yOiBuX3NjYWxlfSkKICAgIGJhLnRpbWVyKDAuMiwgY3VydmUuZGVsZXRlKQogICAgICAgIAogICAgZGVmIHV0aWxfdGV4dCh0eXBlOiBzdHIsIHRleHQ6IHN0ciwgc2NhbGU6IGZsb2F0ID0gMSwgY29sb3I6IGxpc3QgPSBbMSwxLDFdLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbGlzdCA9IFswLCAwLjcsIDBdLCBjb2xvcnNfbmFtZTogYm9vbCA9IEZhbHNlKToKICAgICAgICBtID0gYmEubmV3bm9kZSgnbWF0aCcsb3duZXI9c2VsZi5ub2RlLGF0dHJzPXsnaW5wdXQxJzoKICAgICAgICAgICAgKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0pLCdvcGVyYXRpb24nOiAnYWRkJ30pCiAgICAgICAgc2VsZi5ub2RlLmNvbm5lY3RhdHRyKCdwb3NpdGlvbicsIG0sICdpbnB1dDInKQogICAgICAgIHNlbGYudGV4dHNbdHlwZV0gPSBiYS5uZXdub2RlKCd0ZXh0Jyxvd25lcj1zZWxmLm5vZGUsCiAgICAgICAgICAgICAgICBhdHRycz17J3RleHQnOiBzdHIodGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAnaW5fd29ybGQnOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgJ3NjYWxlJzogMC4wMiwKICAgICAgICAgICAgICAgICAgICAgICdzaGFkb3cnOiAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAnZmxhdG5lc3MnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiAoY29sb3JbMF0sY29sb3JbMV0sY29sb3JbMl0pLAogICAgICAgICAgICAgICAgICAgICAgJ2hfYWxpZ24nOiAnY2VudGVyJ30pIAogICAgICAgIG0uY29ubmVjdGF0dHIoJ291dHB1dCcsIHNlbGYudGV4dHNbdHlwZV0sICdwb3NpdGlvbicpCiAgICAgICAgYmEuYW5pbWF0ZShzZWxmLnRleHRzW3R5cGVdLCAnc2NhbGUnLCB7MDogMC4wMTcsMC40OiAwLjAxNywgMC41OiAwLjAxKnNjYWxlfSkKICAgIAogICAgICAgIGlmIGNvbG9yc19uYW1lOgogICAgICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYudGV4dHNbdHlwZV0sICdjb2xvcicsIDMsCiAgICAgICAgICAgICAgICB7MDooMSwwLDApLAogICAgICAgICAgICAgICAgIDAuMjooMSwwLjUsMCksCiAgICAgICAgICAgICAgICAgMC40OigxLDEsMCksCiAgICAgICAgICAgICAgICAgMC42OigwLDEsMCksCiAgICAgICAgICAgICAgICAgMC44OigwLDEsMSksCiAgICAgICAgICAgICAgICAgMS4wOigxLDAsMSksCiAgICAgICAgICAgICAgICAgMS4yOigxLDAsMCl9LFRydWUpCiAgICAKICAgIGRlZiB1cGRhdGVfdGltZSh0aW1lKToKICAgICAgICBpZiBzZWxmLnRleHRzWydUaW1lJ10uZXhpc3RzKCk6CiAgICAgICAgICAgIHNlbGYudGV4dHNbJ1RpbWUnXS50ZXh0ID0gc3RyKHRpbWUpCiAgICAgICAgCiAgICBpZiBjb25maWdbJ1Bvd2VydXAgVGltZSddOgogICAgICAgIGludGVydmFsID0gaW50KHB1cGJveC5ERUZBVUxUX1BPV0VSVVBfSU5URVJWQUwpCiAgICAgICAgdGltZTIgPSAoaW50ZXJ2YWwtMSkKICAgICAgICB0aW1lID0gMQogICAgICAgIAogICAgICAgIHV0aWxfdGV4dCgnVGltZScsIHRpbWUyLCBzY2FsZT0xLjUsY29sb3I9KDIsMiwyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249WzAsMC45LDBdLCBjb2xvcnNfbmFtZT1GYWxzZSkKICAgICAgICAKICAgICAgICB3aGlsZShpbnRlcnZhbCszKToKICAgICAgICAgICAgYmEudGltZXIodGltZS0xLGJhLkNhbGwodXBkYXRlX3RpbWUsZid7dGltZTJ9cycpKQogICAgCiAgICAgICAgICAgIGlmIHRpbWUyID09IDA6CiAgICAgICAgICAgICAgICBicmVhawogICAgCiAgICAgICAgICAgIHRpbWUgKz0gMQogICAgICAgICAgICB0aW1lMiAtPSAxCiAgICAKICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBXaXRoIFNoaWVsZCddOgogICAgICAgIHNjYWxlID0gY29uZmlnWydQb3dlcnVwIFNjYWxlJ10KICAgICAgICBzZWxmLnNoaWVsZCA9IGJhLm5ld25vZGUoJ3NoaWVsZCcsb3duZXI9c2VsZi5ub2RlLGF0dHJzPXsnY29sb3InOiAoMSwxLDApLCdyYWRpdXMnOiAxLjMqc2NhbGV9KQogICAgICAgIHNlbGYubm9kZS5jb25uZWN0YXR0cigncG9zaXRpb24nLCBzZWxmLnNoaWVsZCwgJ3Bvc2l0aW9uJykKICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYuc2hpZWxkLCdjb2xvcicsMyx7MDogKDIsMCwwKSwgMC41OiAoMCwyLDApLCAxOiAoMCwxLDYpLCAxLjU6ICgyLDAsMCl9LFRydWUpCiAgICAKICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBOYW1lJ106ICAgIAogICAgICAgIHV0aWxfdGV4dCgnTmFtZScsc2VsZi5wb3dlcnVwdHlwZSxzY2FsZT0xLjIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVswLDAuNCwwXSxjb2xvcnNfbmFtZT1UcnVlKQogICAgICAgIHBvd2VydXBfdHJhbnNsYXRlZChzZWxmLHNlbGYucG93ZXJ1cHR5cGUpCiAgICAgICAgCiAgICBpZiBzdHlsZSA9PSAnU1k6IEJBTEwnOgogICAgICAgIHNlbGYubm9kZS5tb2RlbCA9IGJhLmdldG1vZGVsKCdmcm9zdHlQZWx2aXMnKQogICAgZWxpZiBzdHlsZSA9PSAnU1k6IEltcGFjdCc6CiAgICAgICAgc2VsZi5ub2RlLm1vZGVsID0gYmEuZ2V0bW9kZWwoJ2ltcGFjdEJvbWInKQogICAgZWxpZiBzdHlsZSA9PSAnU1k6IEVnZyc6CiAgICAgICAgc2VsZi5ub2RlLm1vZGVsID0gYmEuZ2V0bW9kZWwoJ2VnZycpCiAgICAgICAgCiMjIyMjIyMjIyMjU1BBWgpkZWYgX3NwZWVkX29mZl9mbGFzaChzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX3RleHR1cmUgPSBmYWN0b3J5LnRleF9zcGVlZAogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfb3BhY2l0eSA9IDEuMAogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfY3Jvc3Nfb3V0ID0gVHJ1ZQogICAgICAgIApkZWYgX3NwZWVkX3dlYXJfb2ZmKHNlbGYpOgogICAgaWYgc2VsZi5ub2RlOgogICAgICAgIHNlbGYubm9kZS5ob2NrZXkgPSBGYWxzZQogICAgICAgIHNlbGYubm9kZS5iaWxsYm9hcmRfb3BhY2l0eSA9IDAuMAogICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgncG93ZXJkb3duMDEnKSkKICAgICAgICAKZGVmIF9pY2VfbWFuX29mZl9mbGFzaChzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX3RleHR1cmUgPSBmYWN0b3J5LnRleF9pY2VfbWFuCiAgICAgICAgc2VsZi5ub2RlLmJpbGxib2FyZF9vcGFjaXR5ID0gMS4wCiAgICAgICAgc2VsZi5ub2RlLmJpbGxib2FyZF9jcm9zc19vdXQgPSBUcnVlCiAgICAgICAgCmRlZiBfaWNlX21hbl93ZWFyX29mZihzZWxmKToKICAgIGlmIHNlbGYubm9kZToKICAgICAgICBmID0gc2VsZi5jb2xvclswXQogICAgICAgIGkgPSAoMCwxLDQpCiAgICAgICAgCiAgICAgICAgYm9tYiA9IHNlbGYuYm1iX2NvbG9yWzBdICAgICAgICAKICAgICAgICBpZiBib21iICE9ICdpY2VfYnViYmxlJzogc2VsZi5ib21iX3R5cGUgPSBib21iCiAgICAgICAgZWxzZTogc2VsZi5ib21iX3R5cGUgPSAnbm9ybWFsJwogICAgICAgIAogICAgICAgIHNlbGYuZnJlZXplX3B1bmNoID0gRmFsc2UKICAgICAgICBzZWxmLm5vZGUuYmlsbGJvYXJkX29wYWNpdHkgPSAwLjAKICAgICAgICBiYS5hbmltYXRlX2FycmF5KHNlbGYubm9kZSwnY29sb3InLDMsezA6IGYsIDAuMzogaSwgMC42OiBmfSkKICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ3Bvd2VyZG93bjAxJykpCiAgICAgICAgClNwYXouX3BtMl9zcHpfb2xkID0gU3Bhei5fX2luaXRfXwpkZWYgX2luaXRfc3Bhel8oc2VsZiwqYXJncywgKiprd2FyZ3MpOgogICAgc2VsZi5fcG0yX3Nwel9vbGQoKmFyZ3MsICoqa3dhcmdzKQogICAgc2VsZi5lZGdfZWZmID0gRmFsc2UKICAgIHNlbGYua2lsbF9lZmYgPSBGYWxzZQogICAgc2VsZi5mcmVlemVfcHVuY2ggPSBGYWxzZQogICAgc2VsZi5kaWUgPSBGYWxzZQogICAgc2VsZi5jb2xvcjogbGlzdCA9IFtdCiAgICBzZWxmLmNvbG9yLmFwcGVuZChzZWxmLm5vZGUuY29sb3IpCiAgICAKICAgIHNlbGYudGFua3NoaWVsZCA9IHsiVGFuayI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICJSZWR1Y3Rpb24iOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAiU2hpZWxkIjogTm9uZX0KClNwYXouX3N1cGVyX29uX3B1bmNoX3ByZXNzID0gU3Bhei5vbl9wdW5jaF9wcmVzcwpkZWYgc3Bhel9vbl9wdW5jaF9wcmVzcyhzZWxmKSAtPiBOb25lOgogICAgc2VsZi5fc3VwZXJfb25fcHVuY2hfcHJlc3MoKQoKICAgIGlmIHNlbGYudGFua3NoaWVsZFsnVGFuayddOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXSA9IFRydWUKICAgICAgICAgICAgCiAgICAgICAgICAgIHNoaWVsZCA9IGJhLm5ld25vZGUoJ3NoaWVsZCcsb3duZXI9c2VsZi5ub2RlLAogICAgICAgICAgICAgICAgYXR0cnM9eydjb2xvcic6ICg0LDEsNCksJ3JhZGl1cyc6IDEuM30pCiAgICAgICAgICAgIHNlbGYubm9kZS5jb25uZWN0YXR0cigncG9zaXRpb25fY2VudGVyJywgc2hpZWxkLCAncG9zaXRpb24nKQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi50YW5rc2hpZWxkWydTaGllbGQnXSA9IHNoaWVsZAogICAgICAgIGV4Y2VwdDogcGFzcwoKU3Bhei5fc3VwZXJfb25fcHVuY2hfcmVsZWFzZSA9IFNwYXoub25fcHVuY2hfcmVsZWFzZQpkZWYgc3Bhel9vbl9wdW5jaF9yZWxlYXNlKHNlbGYpIC0+IE5vbmU6CiAgICBzZWxmLl9zdXBlcl9vbl9wdW5jaF9yZWxlYXNlKCkKICAgIHRyeToKICAgICAgICBzZWxmLnRhbmtzaGllbGRbJ1NoaWVsZCddLmRlbGV0ZSgpCiAgICAgICAgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXSA9IEZhbHNlCiAgICBleGNlcHQ6IHBhc3MKCmRlZiBuZXdfZ2V0X2JvbWJfdHlwZV90ZXgoc2VsZikgLT4gYmEuVGV4dHVyZToKICAgICAgICBmYWN0b3J5ID0gTmV3UG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkKICAgICAgICBpZiBzZWxmLmJvbWJfdHlwZSA9PSAnc3RpY2t5JzoKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkudGV4X3N0aWNreV9ib21icwogICAgICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdpY2UnOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfaWNlX2JvbWJzCiAgICAgICAgaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ltcGFjdCc6CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRleF9pbXBhY3RfYm9tYnMKICAgICAgICBpZiBzZWxmLmJvbWJfdHlwZSA9PSAnaW1wYWlybWVudCc6CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRleF9pbXBhaXJtZW50X2JvbWJzCiAgICAgICAgaWYgc2VsZi5ib21iX3R5cGUgPT0gJ2ZpcmUnOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfZmlyZV9ib21icwogICAgICAgIGlmIHNlbGYuYm9tYl90eXBlID09ICdmbHknOgogICAgICAgICAgICByZXR1cm4gZmFjdG9yeS50ZXhfZmx5X2JvbWJzCiAgICAgICAgcmV0dXJuIGZhY3RvcnkudGV4X2ltcGFjdF9ib21icwogICAgICAgICMgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCBib21iIHR5cGUnKQoKZGVmIG5ld19oYW5kbGVtZXNzYWdlKHNlbGYsIG1zZzogQW55KSAtPiBBbnk6CiAgICBhc3NlcnQgbm90IHNlbGYuZXhwaXJlZAogICAgCiAgICBpZiBpc2luc3RhbmNlKG1zZywgYmEuUGlja2VkVXBNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdodXJ0X3NvdW5kJykKICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoJ3BpY2tlZF91cCcpCgogICAgICAgIHNlbGYuX251bV90aW1lc19oaXQgKz0gMQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLlNob3VsZFNoYXR0ZXJNZXNzYWdlKToKICAgICAgICBiYS50aW1lcigwLjAwMSwgYmEuQ2FsbChzZWxmLnNoYXR0ZXIpKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLkltcGFjdERhbWFnZU1lc3NhZ2UpOgogICAgICAgIGJhLnRpbWVyKDAuMDAxLCBiYS5DYWxsKHNlbGYuX2hpdF9zZWxmLCBtc2cuaW50ZW5zaXR5KSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5Qb3dlcnVwTWVzc2FnZSk6CiAgICAgICAgZmFjdG9yeSA9IE5ld1Bvd2VydXBCb3hGYWN0b3J5LmdldCgpCiAgICAgICAgaWYgc2VsZi5fZGVhZCBvciBub3Qgc2VsZi5ub2RlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIHNlbGYucGlja191cF9wb3dlcnVwX2NhbGxiYWNrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnBpY2tfdXBfcG93ZXJ1cF9jYWxsYmFjayhzZWxmKQogICAgICAgIGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAndHJpcGxlX2JvbWJzJzoKICAgICAgICAgICAgdGV4ID0gUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X2JvbWIKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgc2VsZi5zZXRfYm9tYl9jb3VudCgzKQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8xX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMV9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzFfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX211bHRpX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgKFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDApLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5fbXVsdGlfYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9tdWx0aV9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5DYWxsKHNlbGYuX211bHRpX2JvbWJfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdsYW5kX21pbmVzJzoKICAgICAgICAgICAgc2VsZi5zZXRfbGFuZF9taW5lX2NvdW50KG1pbihzZWxmLmxhbmRfbWluZV9jb3VudCArIDMsIDMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpbXBhY3RfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdpbXBhY3QnCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5fYm9tYl93ZWFyX29mZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ3N0aWNreV9ib21icyc6CiAgICAgICAgICAgIHNlbGYuYm9tYl90eXBlID0gJ3N0aWNreScKICAgICAgICAgICAgdGV4ID0gc2VsZi5fZ2V0X2JvbWJfdHlwZV90ZXgoKQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FIC0gMjAwMCwKICAgICAgICAgICAgICAgICAgICBiYS5DYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2gpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAncHVuY2gnOgogICAgICAgICAgICBzZWxmLl9oYXNfYm94aW5nX2dsb3ZlcyA9IFRydWUKICAgICAgICAgICAgdGV4ID0gUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X3B1bmNoCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIHNlbGYuZXF1aXBfYm94aW5nX2dsb3ZlcygpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmJveGluZ19nbG92ZXNfZmxhc2hpbmcgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzNfdGV4dHVyZSA9IHRleAogICAgICAgICAgICAgICAgdF9tcyA9IGJhLnRpbWUodGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRfbXMsIGludCkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8zX3N0YXJ0X3RpbWUgPSB0X21zCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfM19lbmRfdGltZSA9ICgKICAgICAgICAgICAgICAgICAgICB0X21zICsgUE9XRVJVUF9XRUFSX09GRl9USU1FKQogICAgICAgICAgICAgICAgc2VsZi5fYm94aW5nX2dsb3Zlc193ZWFyX29mZl9mbGFzaF90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUgLSAyMDAwLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2dsb3Zlc193ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib3hpbmdfZ2xvdmVzX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9nbG92ZXNfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdzaGllbGQnOgogICAgICAgICAgICBmYWN0b3J5ID0gU3BhekZhY3RvcnkuZ2V0KCkKICAgICAgICAgICAgc2VsZi5lcXVpcF9zaGllbGRzKGRlY2F5PWZhY3Rvcnkuc2hpZWxkX2RlY2F5X3JhdGUgPiAwKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdjdXJzZSc6CiAgICAgICAgICAgIHNlbGYuY3Vyc2UoKQogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpY2VfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdpY2UnCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaGVhbHRoJzoKICAgICAgICAgICAgaWYgc2VsZi5lZGdfZWZmOgogICAgICAgICAgICAgICAgZiA9IHNlbGYuY29sb3JbMF0KICAgICAgICAgICAgICAgIHIgPSAoMiwwLDApCiAgICAgICAgICAgICAgICBnID0gKDAsMiwwKQogICAgICAgICAgICAgICAgYmEuYW5pbWF0ZV9hcnJheShzZWxmLm5vZGUsJ2NvbG9yJywzLHswOiByLCAwLjY6IGcsIDEuMDogZn0pCiAgICAgICAgICAgICAgICBzZWxmLmVkZ19lZmYgPSBGYWxzZQogICAgICAgICAgICBpZiBzZWxmLl9jdXJzZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jdXJzZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgZmFjdG9yeSA9IFNwYXpGYWN0b3J5LmdldCgpCiAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiBbJ21hdGVyaWFscycsICdyb2xsZXJfbWF0ZXJpYWxzJ106CiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxzID0gZ2V0YXR0cihzZWxmLm5vZGUsIGF0dHIpCiAgICAgICAgICAgICAgICAgICAgaWYgZmFjdG9yeS5jdXJzZV9tYXRlcmlhbCBpbiBtYXRlcmlhbHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vZGUsIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZShtIGZvciBtIGluIG1hdGVyaWFscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbSAhPSBmYWN0b3J5LmN1cnNlX21hdGVyaWFsKSkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5jdXJzZV9kZWF0aF90aW1lID0gMAogICAgICAgICAgICBzZWxmLmhpdHBvaW50cyA9IHNlbGYuaGl0cG9pbnRzX21heAogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQoUG93ZXJ1cEJveEZhY3RvcnkuZ2V0KCkudGV4X2hlYWx0aCkKICAgICAgICAgICAgc2VsZi5ub2RlLmh1cnQgPSAwCiAgICAgICAgICAgIHNlbGYuX2xhc3RfaGl0X3RpbWUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX251bV90aW1lc19oaXQgPSAwCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICd0YW5rX3NoaWVsZCc6CiAgICAgICAgICAgIHNlbGYudGFua3NoaWVsZFsnVGFuayddID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmVkZ19lZmYgPSBGYWxzZQogICAgICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF90YW5rX3NoaWVsZAogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQoKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaGVhbHRoX2RhbWFnZSc6CiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2hlYWx0aF9kYW1hZ2UKICAgICAgICAgICAgc2VsZi5lZGdfZWZmID0gVHJ1ZQogICAgICAgICAgICBmID0gc2VsZi5jb2xvclswXQogICAgICAgICAgICBpID0gKDIsMC41LDIpCiAgICAgICAgICAgIGJhLmFuaW1hdGVfYXJyYXkoc2VsZi5ub2RlLCdjb2xvcicsMyx7MDogaSwgMC41OiBpLCAwLjY6IGZ9KQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBzZWxmLnRhbmtzaGllbGRbJ1RhbmsnXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuZnJlZXplX3B1bmNoID0gRmFsc2UKCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ2dvb2RieWUnOgogICAgICAgICAgICB0ZXggPSBmYWN0b3J5LnRleF9nb29kYnllCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIHNlbGYua2lsbF9lZmYgPSBUcnVlCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdmbHlfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdmbHknCiAgICAgICAgICAgIHRleCA9IHNlbGYuX2dldF9ib21iX3R5cGVfdGV4KCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgaWYgc2VsZi5wb3dlcnVwc19leHBpcmU6CiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl90ZXh0dXJlID0gdGV4CiAgICAgICAgICAgICAgICB0X21zID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodF9tcywgaW50KQogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfc3RhcnRfdGltZSA9IHRfbXMKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX2VuZF90aW1lID0gKAogICAgICAgICAgICAgICAgICAgIHRfbXMgKyBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaCksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICBzZWxmLl9ib21iX3dlYXJfb2ZmX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIFBPV0VSVVBfV0VBUl9PRkZfVElNRSwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKCiAgICAgICAgZWxpZiBtc2cucG93ZXJ1cHR5cGUgPT0gJ2ZpcmVfYm9tYnMnOgogICAgICAgICAgICBzZWxmLmJvbWJfdHlwZSA9ICdmaXJlJwogICAgICAgICAgICB0ZXggPSBzZWxmLl9nZXRfYm9tYl90eXBlX3RleCgpCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfdGV4dHVyZSA9IHRleAogICAgICAgICAgICAgICAgdF9tcyA9IGJhLnRpbWUodGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRfbXMsIGludCkKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3N0YXJ0X3RpbWUgPSB0X21zCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9lbmRfdGltZSA9ICgKICAgICAgICAgICAgICAgICAgICB0X21zICsgUE9XRVJVUF9XRUFSX09GRl9USU1FKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl9mbGFzaF90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUgLSAyMDAwLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2gpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgc2VsZi5fYm9tYl93ZWFyX29mZl90aW1lciA9IChiYS5UaW1lcigKICAgICAgICAgICAgICAgICAgICBQT1dFUlVQX1dFQVJfT0ZGX1RJTUUsCiAgICAgICAgICAgICAgICAgICAgYmEuV2Vha0NhbGwoc2VsZi5fYm9tYl93ZWFyX29mZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdpbXBhaXJtZW50X2JvbWJzJzoKICAgICAgICAgICAgc2VsZi5ib21iX3R5cGUgPSAnaW1wYWlybWVudCcKICAgICAgICAgICAgdGV4ID0gc2VsZi5fZ2V0X2JvbWJfdHlwZV90ZXgoKQogICAgICAgICAgICBzZWxmLl9mbGFzaF9iaWxsYm9hcmQodGV4KQogICAgICAgICAgICBpZiBzZWxmLnBvd2VydXBzX2V4cGlyZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAoCiAgICAgICAgICAgICAgICAgICAgdF9tcyArIFBPV0VSVVBfV0VBUl9PRkZfVElNRSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FIC0gMjAwMCwKICAgICAgICAgICAgICAgICAgICBiYS5XZWFrQ2FsbChzZWxmLl9ib21iX3dlYXJfb2ZmX2ZsYXNoKSwKICAgICAgICAgICAgICAgICAgICB0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKSkKICAgICAgICAgICAgICAgIHNlbGYuX2JvbWJfd2Vhcl9vZmZfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgUE9XRVJVUF9XRUFSX09GRl9USU1FLAogICAgICAgICAgICAgICAgICAgIGJhLldlYWtDYWxsKHNlbGYuX2JvbWJfd2Vhcl9vZmYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQoKICAgICAgICBlbGlmIG1zZy5wb3dlcnVwdHlwZSA9PSAnaWNlX21hbic6CiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X2ljZV9tYW4KICAgICAgICAgICAgc2VsZi5ib21iX3R5cGUgPSAnaWNlX2J1YmJsZScKICAgICAgICAgICAgc2VsZi5mcmVlemVfcHVuY2ggPSBUcnVlCiAgICAgICAgICAgIHNlbGYuZWRnX2VmZiA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYubm9kZS5jb2xvciA9ICgwLDEsNCkKICAgICAgICAgICAgc2VsZi5fZmxhc2hfYmlsbGJvYXJkKHRleCkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgaWNlX21hbl90aW1lID0gMTcwMDAKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAodF9tcyArIGljZV9tYW5fdGltZSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5pY2VfbWFuX2ZsYXNoX3RpbWVyID0gKGJhLlRpbWVyKAogICAgICAgICAgICAgICAgICAgIGljZV9tYW5fdGltZSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChfaWNlX21hbl9vZmZfZmxhc2gsc2VsZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLmljZV9tYW5fdGltZXIgPSAoYmEuVGltZXIoaWNlX21hbl90aW1lLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoX2ljZV9tYW5fd2Vhcl9vZmYsc2VsZiksCiAgICAgICAgICAgICAgICAgICAgdGltZWZvcm1hdD1iYS5UaW1lRm9ybWF0Lk1JTExJU0VDT05EUykpCgogICAgICAgIGVsaWYgbXNnLnBvd2VydXB0eXBlID09ICdzcGVlZCc6CiAgICAgICAgICAgIHNlbGYubm9kZS5ob2NrZXkgPSBUcnVlCiAgICAgICAgICAgIHRleCA9IGZhY3RvcnkudGV4X3NwZWVkCiAgICAgICAgICAgIHNlbGYuX2ZsYXNoX2JpbGxib2FyZCh0ZXgpCiAgICAgICAgICAgIGlmIHNlbGYucG93ZXJ1cHNfZXhwaXJlOgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzcGVlZF90aW1lID0gMTUwMDAKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5taW5pX2JpbGxib2FyZF8yX3RleHR1cmUgPSB0ZXgKICAgICAgICAgICAgICAgIHRfbXMgPSBiYS50aW1lKHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0X21zLCBpbnQpCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUubWluaV9iaWxsYm9hcmRfMl9zdGFydF90aW1lID0gdF9tcwogICAgICAgICAgICAgICAgc2VsZi5ub2RlLm1pbmlfYmlsbGJvYXJkXzJfZW5kX3RpbWUgPSAodF9tcyArIHNwZWVkX3RpbWUpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYuc3BlZWRfZmxhc2hfdGltZXIgPSAoYmEuVGltZXIoCiAgICAgICAgICAgICAgICAgICAgc3BlZWRfdGltZSAtIDIwMDAsCiAgICAgICAgICAgICAgICAgICAgYmEuQ2FsbChfc3BlZWRfb2ZmX2ZsYXNoLHNlbGYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5zcGVlZF90aW1lciA9IChiYS5UaW1lcihzcGVlZF90aW1lLAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoX3NwZWVkX3dlYXJfb2ZmLHNlbGYpLAogICAgICAgICAgICAgICAgICAgIHRpbWVmb3JtYXQ9YmEuVGltZUZvcm1hdC5NSUxMSVNFQ09ORFMpKQogICAgICAgIAogICAgICAgIHNlbGYuYm1iX2NvbG9yOiBsaXN0ID0gW10gICAgCiAgICAgICAgc2VsZi5ibWJfY29sb3IuYXBwZW5kKHNlbGYuYm9tYl90eXBlKQoKICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnZmxhc2gnKQogICAgICAgIGlmIG1zZy5zb3VyY2Vub2RlOgogICAgICAgICAgICBtc2cuc291cmNlbm9kZS5oYW5kbGVtZXNzYWdlKGJhLlBvd2VydXBBY2NlcHRNZXNzYWdlKCkpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5GcmVlemVNZXNzYWdlKToKICAgICAgICBpZiBub3Qgc2VsZi5ub2RlOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIHNlbGYubm9kZS5pbnZpbmNpYmxlOgogICAgICAgICAgICBiYS5wbGF5c291bmQoU3BhekZhY3RvcnkuZ2V0KCkuYmxvY2tfc291bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgc2VsZi5zaGllbGQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuZnJvemVuOgogICAgICAgICAgICBzZWxmLmZyb3plbiA9IFRydWUKICAgICAgICAgICAgc2VsZi5ub2RlLmZyb3plbiA9IFRydWUKICAgICAgICAgICAgYmEudGltZXIoNS4wLCBiYS5DYWxsKHNlbGYuaGFuZGxlbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYS5UaGF3TWVzc2FnZSgpKSkKICAgICAgICAgICAgaWYgc2VsZi5oaXRwb2ludHMgPD0gMDoKICAgICAgICAgICAgICAgIHNlbGYuc2hhdHRlcigpCiAgICAgICAgaWYgc2VsZi5mcmVlemVfcHVuY2g6CiAgICAgICAgICAgIHNlbGYuaGFuZGxlbWVzc2FnZShiYS5UaGF3TWVzc2FnZSgpKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLlRoYXdNZXNzYWdlKToKICAgICAgICBpZiBzZWxmLmZyb3plbiBhbmQgbm90IHNlbGYuc2hhdHRlcmVkIGFuZCBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYuZnJvemVuID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5ub2RlLmZyb3plbiA9IEZhbHNlCgogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuSGl0TWVzc2FnZSk6CiAgICAgICAgaWYgbm90IHNlbGYubm9kZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBzZWxmLm5vZGUuaW52aW5jaWJsZToKICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLmJsb2NrX3NvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBsb2NhbF90aW1lID0gYmEudGltZSh0aW1lZm9ybWF0PWJhLlRpbWVGb3JtYXQuTUlMTElTRUNPTkRTKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGxvY2FsX3RpbWUsIGludCkKICAgICAgICBpZiAoc2VsZi5fbGFzdF9oaXRfdGltZSBpcyBOb25lCiAgICAgICAgICAgICAgICBvciBsb2NhbF90aW1lIC0gc2VsZi5fbGFzdF9oaXRfdGltZSA+IDEwMDApOgogICAgICAgICAgICBzZWxmLl9udW1fdGltZXNfaGl0ICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9oaXRfdGltZSA9IGxvY2FsX3RpbWUKCiAgICAgICAgbWFnID0gbXNnLm1hZ25pdHVkZSAqIHNlbGYuaW1wYWN0X3NjYWxlCiAgICAgICAgdmVsb2NpdHlfbWFnID0gbXNnLnZlbG9jaXR5X21hZ25pdHVkZSAqIHNlbGYuaW1wYWN0X3NjYWxlICAgICAgIAogICAgICAgIGRhbWFnZV9zY2FsZSA9IDAuMjIKICAgICAgICAKICAgICAgICBkZWYgZmlyZV9lZmZlY3QoKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hpZWxkOgogICAgICAgICAgICAgICAgaWYgc2VsZi5ub2RlLmV4aXN0cygpOgogICAgICAgICAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9Myxjb3VudD01MCoyLHNwcmVhZD0wLjMsCiAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3dlYXQnKQogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdjZWxlYnJhdGUnLCA1NjApCiAgICAgICAgICAgICAgICBlbHNlOiBzZWxmLl9maXJlX3RpbWUgPSBOb25lCiAgICAgICAgICAgIGVsc2U6IHNlbGYuX2ZpcmVfdGltZSA9IE5vbmUKICAgICAgICAKICAgICAgICBkZWYgZmlyZSh0aW1lLCBkYW1hZ2UpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zaGllbGQgYW5kIG5vdCBzZWxmLl9kZWFkOgogICAgICAgICAgICAgICAgc2VsZi5oaXRwb2ludHMgLT0gZGFtYWdlCiAgICAgICAgICAgICAgICBiYS5zaG93X2RhbWFnZV9jb3VudChmJy17ZGFtYWdlfUhQJywKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vZGUucG9zaXRpb24sIG1zZy5mb3JjZV9kaXJlY3Rpb24pCiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2Z1c2UwMScpKQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgZHVyYXRpb24gIT0gdGltZToKICAgICAgICAgICAgICAgIHNlbGYuX2ZpcmVfdGltZSA9IGJhLlRpbWVyKDAuMSxiYS5DYWxsKGZpcmVfZWZmZWN0KSxyZXBlYXQ9VHJ1ZSkKICAgICAgICAgICAgZWxzZTogc2VsZi5fZmlyZV90aW1lID0gTm9uZQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgc2VsZi5oaXRwb2ludHMgPCAwOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoYmEuRGllTWVzc2FnZSgpKQogICAgICAgIAogICAgICAgIGlmIG1zZy5oaXRfc3VidHlwZSA9PSAnZmx5JzoKICAgICAgICAgICAgZGFtYWdlX3NjYWxlID0gMC4wCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkX2hpdHBvaW50cyAtPSAzMDAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDwgMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoaWVsZC5kZWxldGUoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaGllbGRfZG93bl9zb3VuZCwxLjAscG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgIGVsaWYgbXNnLmhpdF9zdWJ0eXBlID09ICdmaXJlJzoKICAgICAgICAgICAgaW5kZXggPSAxCiAgICAgICAgICAgIGR1cmF0aW9uID0gNQogICAgICAgICAgICBkYW1hZ2UgPSAxMDMKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hpZWxkOgogICAgICAgICAgICAgICAgZm9yIGZpcmV4IGluIHJhbmdlKGR1cmF0aW9uKToKICAgICAgICAgICAgICAgICAgICBiYS50aW1lcihpbmRleCxiYS5DYWxsKGZpcmUsaW5kZXgsZGFtYWdlKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maXJlX3RpbWUgPSBiYS5UaW1lcigwLjEsYmEuQ2FsbChmaXJlX2VmZmVjdCkscmVwZWF0PVRydWUpCiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zaGllbGRfaGl0cG9pbnRzIC09IDgwCiAgICAgICAgICAgICAgICBpZiBzZWxmLnNoaWVsZF9oaXRwb2ludHMgPCAxOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkLmRlbGV0ZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGllbGQgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnNoaWVsZF9kb3duX3NvdW5kLDEuMCxwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgZWxpZiBtc2cuaGl0X3N1YnR5cGUgPT0gJ2ltcGFpcm1lbnQnOgogICAgICAgICAgICBkYW1hZ2Vfc2NhbGUgPSAwCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkLmRlbGV0ZSgpCiAgICAgICAgICAgICAgICBzZWxmLnNoaWVsZCA9IE5vbmUKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaGllbGRfZG93bl9zb3VuZCwxLjAscG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGl0cG9pbnRzID0gaW50KHNlbGYuaGl0cG9pbnRzKjAuODApCiAgICAgICAgICAgICAgICBzZWxmLmhpdHBvaW50cyAtPSBpbnQoaGl0cG9pbnRzKQogICAgICAgICAgICAgICAgYmEuc2hvd19kYW1hZ2VfY291bnQoKGYnLXtpbnQoaGl0cG9pbnRzLzEwKX0lJyksCiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2RlLnBvc2l0aW9uLCBtc2cuZm9yY2VfZGlyZWN0aW9uKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBzZWxmLmhpdHBvaW50cyA8IDAgb3IgaGl0cG9pbnRzIDwgOTU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoYmEuRGllTWVzc2FnZSgpKQoKICAgICAgICBpZiBzZWxmLnNoaWVsZDoKICAgICAgICAgICAgaWYgbXNnLmZsYXRfZGFtYWdlOgogICAgICAgICAgICAgICAgZGFtYWdlID0gbXNnLmZsYXRfZGFtYWdlICogc2VsZi5pbXBhY3Rfc2NhbGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBtc2cuZm9yY2VfZGlyZWN0aW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICAnaW1wdWxzZScsIG1zZy5wb3NbMF0sIG1zZy5wb3NbMV0sIG1zZy5wb3NbMl0sCiAgICAgICAgICAgICAgICAgICAgbXNnLnZlbG9jaXR5WzBdLCBtc2cudmVsb2NpdHlbMV0sIG1zZy52ZWxvY2l0eVsyXSwgbWFnLAogICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZywgbXNnLnJhZGl1cywgMSwgbXNnLmZvcmNlX2RpcmVjdGlvblswXSwKICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzFdLCBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdKQogICAgICAgICAgICAgICAgZGFtYWdlID0gZGFtYWdlX3NjYWxlICogc2VsZi5ub2RlLmRhbWFnZQoKICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2hpZWxkX2hpdHBvaW50cyBpcyBub3QgTm9uZQogICAgICAgICAgICBzZWxmLnNoaWVsZF9oaXRwb2ludHMgLT0gaW50KGRhbWFnZSkKICAgICAgICAgICAgc2VsZi5zaGllbGQuaHVydCA9ICgKICAgICAgICAgICAgICAgIDEuMCAtCiAgICAgICAgICAgICAgICBmbG9hdChzZWxmLnNoaWVsZF9oaXRwb2ludHMpIC8gc2VsZi5zaGllbGRfaGl0cG9pbnRzX21heCkKCiAgICAgICAgICAgIG1heF9zcGlsbG92ZXIgPSBTcGF6RmFjdG9yeS5nZXQoKS5tYXhfc2hpZWxkX3NwaWxsb3Zlcl9kYW1hZ2UKICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDw9IDA6CgogICAgICAgICAgICAgICAgc2VsZi5zaGllbGQuZGVsZXRlKCkKICAgICAgICAgICAgICAgIHNlbGYuc2hpZWxkID0gTm9uZQogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnNoaWVsZF9kb3duX3NvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCgogICAgICAgICAgICAgICAgbnBvcyA9IHNlbGYubm9kZS5wb3NpdGlvbgogICAgICAgICAgICAgICAgYmEuZW1pdGZ4KHBvc2l0aW9uPShucG9zWzBdLCBucG9zWzFdICsgMC45LCBucG9zWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT1zZWxmLm5vZGUudmVsb2NpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9cmFuZG9tLnJhbmRyYW5nZSgyMCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC42LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGU9J3NwYXJrJykKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoU3BhekZhY3RvcnkuZ2V0KCkuc2hpZWxkX2hpdF9zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249c2VsZi5ub2RlLnBvc2l0aW9uKQoKICAgICAgICAgICAgYXNzZXJ0IG1zZy5mb3JjZV9kaXJlY3Rpb24gaXMgbm90IE5vbmUKICAgICAgICAgICAgYmEuZW1pdGZ4KHBvc2l0aW9uPW1zZy5wb3MsCiAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT0obXNnLmZvcmNlX2RpcmVjdGlvblswXSAqIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzFdICogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMl0gKiAxLjApLAogICAgICAgICAgICAgICAgICAgICAgY291bnQ9bWluKDMwLCA1ICsgaW50KGRhbWFnZSAqIDAuMDA1KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjUsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4zLAogICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3BhcmsnKQoKICAgICAgICAgICAgaWYgc2VsZi5zaGllbGRfaGl0cG9pbnRzIDw9IC1tYXhfc3BpbGxvdmVyOgogICAgICAgICAgICAgICAgbGVmdG92ZXJfZGFtYWdlID0gLW1heF9zcGlsbG92ZXIgLSBzZWxmLnNoaWVsZF9oaXRwb2ludHMKICAgICAgICAgICAgICAgIHNoaWVsZF9sZWZ0b3Zlcl9yYXRpbyA9IGxlZnRvdmVyX2RhbWFnZSAvIGRhbWFnZQoKICAgICAgICAgICAgICAgIG1hZyAqPSBzaGllbGRfbGVmdG92ZXJfcmF0aW8KICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZyAqPSBzaGllbGRfbGVmdG92ZXJfcmF0aW8KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2hpZWxkX2xlZnRvdmVyX3JhdGlvID0gMS4wCgogICAgICAgIGlmIG1zZy5mbGF0X2RhbWFnZToKICAgICAgICAgICAgZGFtYWdlID0gaW50KG1zZy5mbGF0X2RhbWFnZSAqIHNlbGYuaW1wYWN0X3NjYWxlICoKICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWVsZF9sZWZ0b3Zlcl9yYXRpbykKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgKICAgICAgICAgICAgICAgICdpbXB1bHNlJywgbXNnLnBvc1swXSwgbXNnLnBvc1sxXSwgbXNnLnBvc1syXSwKICAgICAgICAgICAgICAgIG1zZy52ZWxvY2l0eVswXSwgbXNnLnZlbG9jaXR5WzFdLCBtc2cudmVsb2NpdHlbMl0sIG1hZywKICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZywgbXNnLnJhZGl1cywgMCwgbXNnLmZvcmNlX2RpcmVjdGlvblswXSwKICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0sIG1zZy5mb3JjZV9kaXJlY3Rpb25bMl0pCgogICAgICAgICAgICBkYW1hZ2UgPSBpbnQoZGFtYWdlX3NjYWxlICogc2VsZi5ub2RlLmRhbWFnZSkKICAgICAgICAgICAgCiAgICAgICAgaWYgc2VsZi50YW5rc2hpZWxkWydSZWR1Y3Rpb24nXToKICAgICAgICAgICAgcG9yY2VudGFqZSA9IHBlcmNlbnRhZ2VfdGFua19zaGllbGQoKQogICAgICAgICAgICBkaXNtID0gaW50KGRhbWFnZSpwb3JjZW50YWplKQogICAgICAgICAgICBkYW1hZ2UgPSBpbnQoZGFtYWdlLWRpc20pCiAgICAgICAgICAgIAogICAgICAgICAgICBiYS5zaG93X2RhbWFnZV9jb3VudCgnLScgKyBzdHIoaW50KGRhbWFnZSAvIDEwKSkgKyAnJScsCiAgICAgICAgICAgICAgICBtc2cucG9zLCBtc2cuZm9yY2VfZGlyZWN0aW9uKQoKICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnaHVydF9zb3VuZCcpCgogICAgICAgIGlmIHNlbGYuZWRnX2VmZjoKICAgICAgICAgICAgcG9yY2VudGFqZSA9IHBlcmNlbnRhZ2VfaGVhbHRoX2RhbWFnZSgpCiAgICAgICAgICAgIGRtZ19kaXNtID0gaW50KGRhbWFnZSpwb3JjZW50YWplKQogICAgICAgICAgICBzZWxmLmhpdHBvaW50cyArPSBkbWdfZGlzbQoKICAgICAgICAgICAgUG9wdXBUZXh0KHRleHQ9Zicre2ludChkbWdfZGlzbS8xMCl9JScsc2NhbGU9MS41LAogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24sY29sb3I9KDAsMSwwKSkuYXV0b3JldGFpbigpCiAgICAgICAgICAgIGJhLmFuaW1hdGVfYXJyYXkoc2VsZi5ub2RlLCdjb2xvcicsMyx7MDogKDAsMSwwKSwgMC4zOTogKDAsMiwwKSwgMC40OiBzZWxmLmNvbG9yWzBdfSkKICAgICAgICAgICAgYmEucGxheXNvdW5kKGJhLmdldHNvdW5kKCdoZWFsdGhQb3dlcnVwJykpCgogICAgICAgIGlmIG1zZy5oaXRfdHlwZSA9PSAncHVuY2gnOgogICAgICAgICAgICBzZWxmLm9uX3B1bmNoZWQoZGFtYWdlKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbXNnLmdldF9zb3VyY2VfcGxheWVyKGJhLlBsYXllcikuYWN0b3IuZnJlZXplX3B1bmNoOgogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5jb2xvciA9ICgwLDEsNCkKICAgICAgICAgICAgICAgICAgICBiYS5wbGF5c291bmQoYmEuZ2V0c291bmQoJ2ZyZWV6ZScpKQogICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKGJhLkZyZWV6ZU1lc3NhZ2UoKSkKICAgICAgICAgICAgZXhjZXB0OiBwYXNzCgogICAgICAgICAgICBpZiBkYW1hZ2UgPiAzNTA6CiAgICAgICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgYmEuc2hvd19kYW1hZ2VfY291bnQoJy0nICsgc3RyKGludChkYW1hZ2UgLyAxMCkpICsgJyUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvcywgbXNnLmZvcmNlX2RpcmVjdGlvbikKCiAgICAgICAgICAgIGlmIG1zZy5oaXRfc3VidHlwZSA9PSAnc3VwZXJfcHVuY2gnOgogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kX3N0cm9uZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCiAgICAgICAgICAgIGlmIGRhbWFnZSA+IDUwMDoKICAgICAgICAgICAgICAgIHNvdW5kcyA9IFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kX3N0cm9uZwogICAgICAgICAgICAgICAgc291bmQgPSBzb3VuZHNbcmFuZG9tLnJhbmRyYW5nZShsZW4oc291bmRzKSldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzb3VuZCA9IFNwYXpGYWN0b3J5LmdldCgpLnB1bmNoX3NvdW5kCiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChzb3VuZCwgMS4wLCBwb3NpdGlvbj1zZWxmLm5vZGUucG9zaXRpb24pCgogICAgICAgICAgICBhc3NlcnQgbXNnLmZvcmNlX2RpcmVjdGlvbiBpcyBub3QgTm9uZQogICAgICAgICAgICBiYS5lbWl0ZngocG9zaXRpb249bXNnLnBvcywKICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5PShtc2cuZm9yY2VfZGlyZWN0aW9uWzBdICogMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0gKiAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsyXSAqIDAuNSksCiAgICAgICAgICAgICAgICAgICAgICBjb3VudD1taW4oMTAsIDEgKyBpbnQoZGFtYWdlICogMC4wMDI1KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjMsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4wMykKCiAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1tc2cucG9zLAogICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZT0nc3dlYXQnLAogICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KG1zZy5mb3JjZV9kaXJlY3Rpb25bMF0gKiAxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsxXSAqIDEuMyArIDUuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdICogMS4zKSwKICAgICAgICAgICAgICAgICAgICAgIGNvdW50PW1pbigzMCwgMSArIGludChkYW1hZ2UgKiAwLjA0KSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjksCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4yOCkKCiAgICAgICAgICAgIGh1cnRpbmVzcyA9IGRhbWFnZSAqIDAuMDAzCiAgICAgICAgICAgIHB1bmNocG9zID0gKG1zZy5wb3NbMF0gKyBtc2cuZm9yY2VfZGlyZWN0aW9uWzBdICogMC4wMiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvc1sxXSArIG1zZy5mb3JjZV9kaXJlY3Rpb25bMV0gKiAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgICBtc2cucG9zWzJdICsgbXNnLmZvcmNlX2RpcmVjdGlvblsyXSAqIDAuMDIpCiAgICAgICAgICAgIGZsYXNoX2NvbG9yID0gKDEuMCwgMC44LCAwLjQpCiAgICAgICAgICAgIGxpZ2h0ID0gYmEubmV3bm9kZSgKICAgICAgICAgICAgICAgICdsaWdodCcsCiAgICAgICAgICAgICAgICBhdHRycz17CiAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJzogcHVuY2hwb3MsCiAgICAgICAgICAgICAgICAgICAgJ3JhZGl1cyc6IDAuMTIgKyBodXJ0aW5lc3MgKiAwLjEyLAogICAgICAgICAgICAgICAgICAgICdpbnRlbnNpdHknOiAwLjMgKiAoMS4wICsgMS4wICogaHVydGluZXNzKSwKICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0X2F0dGVudWF0ZWQnOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAnY29sb3InOiBmbGFzaF9jb2xvcgogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgYmEudGltZXIoMC4wNiwgbGlnaHQuZGVsZXRlKQoKICAgICAgICAgICAgZmxhc2ggPSBiYS5uZXdub2RlKCdmbGFzaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycz17CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJzogcHVuY2hwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnOiAwLjE3ICsgMC4xNyAqIGh1cnRpbmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiBmbGFzaF9jb2xvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgYmEudGltZXIoMC4wNiwgZmxhc2guZGVsZXRlKQoKICAgICAgICBpZiBtc2cuaGl0X3R5cGUgPT0gJ2ltcGFjdCc6CiAgICAgICAgICAgIGFzc2VydCBtc2cuZm9yY2VfZGlyZWN0aW9uIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGJhLmVtaXRmeChwb3NpdGlvbj1tc2cucG9zLAogICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk9KG1zZy5mb3JjZV9kaXJlY3Rpb25bMF0gKiAyLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZvcmNlX2RpcmVjdGlvblsxXSAqIDIuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZm9yY2VfZGlyZWN0aW9uWzJdICogMi4wKSwKICAgICAgICAgICAgICAgICAgICAgIGNvdW50PW1pbigxMCwgMSArIGludChkYW1hZ2UgKiAwLjAxKSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjQsCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQ9MC4xKQogICAgICAgIGlmIHNlbGYuaGl0cG9pbnRzID4gMDoKICAgICAgICAgICAgaWYgbXNnLmhpdF90eXBlID09ICdpbXBhY3QnIGFuZCBkYW1hZ2UgPiBzZWxmLmhpdHBvaW50czoKICAgICAgICAgICAgICAgIG5ld2RhbWFnZSA9IG1heChkYW1hZ2UgLSAyMDAsIHNlbGYuaGl0cG9pbnRzIC0gMTApCiAgICAgICAgICAgICAgICBkYW1hZ2UgPSBuZXdkYW1hZ2UKICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoJ2ZsYXNoJykKCiAgICAgICAgICAgIGlmIGRhbWFnZSA+IDAuMCBhbmQgc2VsZi5ub2RlLmhvbGRfbm9kZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5ob2xkX25vZGUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuaGl0cG9pbnRzIC09IGRhbWFnZQogICAgICAgICAgICBzZWxmLm5vZGUuaHVydCA9IDEuMCAtIGZsb2F0KAogICAgICAgICAgICAgICAgc2VsZi5oaXRwb2ludHMpIC8gc2VsZi5oaXRwb2ludHNfbWF4CgogICAgICAgICAgICBpZiBzZWxmLl9jdXJzZWQgYW5kIGRhbWFnZSA+IDA6CiAgICAgICAgICAgICAgICBiYS50aW1lcigKICAgICAgICAgICAgICAgICAgICAwLjA1LAogICAgICAgICAgICAgICAgICAgIGJhLkNhbGwoc2VsZi5jdXJzZV9leHBsb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRfc291cmNlX3BsYXllcihiYS5QbGF5ZXIpKSkKCiAgICAgICAgICAgIGlmIHNlbGYuZnJvemVuIGFuZCAoZGFtYWdlID4gMjAwIG9yIHNlbGYuaGl0cG9pbnRzIDw9IDApOgogICAgICAgICAgICAgICAgc2VsZi5zaGF0dGVyKCkKICAgICAgICAgICAgZWxpZiBzZWxmLmhpdHBvaW50cyA8PSAwOgogICAgICAgICAgICAgICAgc2VsZi5ub2RlLmhhbmRsZW1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgYmEuRGllTWVzc2FnZShob3c9YmEuRGVhdGhUeXBlLklNUEFDVCkpCgogICAgICAgIGlmIHNlbGYuaGl0cG9pbnRzIDw9IDA6CiAgICAgICAgICAgIGRhbWFnZV9hdmcgPSBzZWxmLm5vZGUuZGFtYWdlX3Ntb290aGVkICogZGFtYWdlX3NjYWxlCiAgICAgICAgICAgIGlmIGRhbWFnZV9hdmcgPiAxMDAwOgogICAgICAgICAgICAgICAgc2VsZi5zaGF0dGVyKCkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBCb21iRGllZE1lc3NhZ2UpOgogICAgICAgIHNlbGYuYm9tYl9jb3VudCArPSAxCgogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuRGllTWVzc2FnZSk6CiAgICAgICAgZGVmIGRyb3BfYm9tYigpOgogICAgICAgICAgICBmb3IgeGJvbWIgaW4gcmFuZ2UoMyk6CiAgICAgICAgICAgICAgICBwID0gc2VsZi5ub2RlLnBvc2l0aW9uCiAgICAgICAgICAgICAgICBwb3MgPSAocFswXSt4Ym9tYixwWzFdKzUscFsyXS14Ym9tYikKICAgICAgICAgICAgICAgIGJhbGwgPSBib21iLkJvbWIocG9zaXRpb249cG9zLGJvbWJfdHlwZT0naW1wYWN0JykuYXV0b3JldGFpbigpCiAgICAgICAgICAgICAgICBiYWxsLm5vZGUubW9kZWxfc2NhbGUgPSAwLjYKICAgICAgICAgICAgICAgIGJhbGwubm9kZS5tb2RlbCA9IGJhLmdldG1vZGVsKCdlZ2cnKQogICAgICAgICAgICAgICAgYmFsbC5ub2RlLmdyYXZpdHlfc2NhbGUgPSAyCgogICAgICAgIGlmIHNlbGYuZWRnX2VmZjoKICAgICAgICAgICAgc2VsZi5lZGdfZWZmID0gRmFsc2UKCiAgICAgICAgd2FzZGVhZCA9IHNlbGYuX2RlYWQKICAgICAgICBzZWxmLl9kZWFkID0gVHJ1ZQogICAgICAgIHNlbGYuaGl0cG9pbnRzID0gMAogICAgICAgIGlmIG1zZy5pbW1lZGlhdGU6CiAgICAgICAgICAgIGlmIHNlbGYubm9kZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5kZWxldGUoKQogICAgICAgIGVsaWYgc2VsZi5ub2RlOgogICAgICAgICAgICBzZWxmLm5vZGUuaHVydCA9IDEuMAogICAgICAgICAgICBpZiBzZWxmLnBsYXlfYmlnX2RlYXRoX3NvdW5kIGFuZCBub3Qgd2FzZGVhZDoKICAgICAgICAgICAgICAgIGJhLnBsYXlzb3VuZChTcGF6RmFjdG9yeS5nZXQoKS5zaW5nbGVfcGxheWVyX2RlYXRoX3NvdW5kKQogICAgICAgICAgICBzZWxmLm5vZGUuZGVhZCA9IFRydWUKICAgICAgICAgICAgYmEudGltZXIoMi4wLCBzZWxmLm5vZGUuZGVsZXRlKQoKICAgICAgICAgICAgdCA9IDAKICAgICAgICAgICAgaWYgc2VsZi5raWxsX2VmZjoKICAgICAgICAgICAgICAgIGZvciBib21icyBpbiByYW5nZSgzKToKICAgICAgICAgICAgICAgICAgICBiYS50aW1lcih0LGJhLkNhbGwoZHJvcF9ib21iKSkKICAgICAgICAgICAgICAgICAgICB0ICs9IDAuMTUKICAgICAgICAgICAgICAgIHNlbGYua2lsbF9lZmYgPSBGYWxzZQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIGJhLk91dE9mQm91bmRzTWVzc2FnZSk6CiAgICAgICAgc2VsZi5oYW5kbGVtZXNzYWdlKGJhLkRpZU1lc3NhZ2UoaG93PWJhLkRlYXRoVHlwZS5GQUxMKSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBiYS5TdGFuZE1lc3NhZ2UpOgogICAgICAgIHNlbGYuX2xhc3Rfc3RhbmRfcG9zID0gKG1zZy5wb3NpdGlvblswXSwgbXNnLnBvc2l0aW9uWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5wb3NpdGlvblsyXSkKICAgICAgICBpZiBzZWxmLm5vZGU6CiAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdzdGFuZCcsIG1zZy5wb3NpdGlvblswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnBvc2l0aW9uWzFdLCBtc2cucG9zaXRpb25bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hbmdsZSkKCiAgICBlbGlmIGlzaW5zdGFuY2UobXNnLCBDdXJzZUV4cGxvZGVNZXNzYWdlKToKICAgICAgICBzZWxmLmN1cnNlX2V4cGxvZGUoKQoKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIFB1bmNoSGl0TWVzc2FnZSk6CiAgICAgICAgaWYgbm90IHNlbGYubm9kZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBub2RlID0gYmEuZ2V0Y29sbGlzaW9uKCkub3Bwb3Npbmdub2RlCgogICAgICAgIGlmIG5vZGUgYW5kIChub2RlIG5vdCBpbiBzZWxmLl9wdW5jaGVkX25vZGVzKToKCiAgICAgICAgICAgIHB1bmNoX21vbWVudHVtX2FuZ3VsYXIgPSAoc2VsZi5ub2RlLnB1bmNoX21vbWVudHVtX2FuZ3VsYXIgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3B1bmNoX3Bvd2VyX3NjYWxlKQogICAgICAgICAgICBwdW5jaF9wb3dlciA9IHNlbGYubm9kZS5wdW5jaF9wb3dlciAqIHNlbGYuX3B1bmNoX3Bvd2VyX3NjYWxlCgogICAgICAgICAgICBpZiBub2RlLmdldG5vZGV0eXBlKCkgIT0gJ3NwYXonOgogICAgICAgICAgICAgICAgc291bmRzID0gU3BhekZhY3RvcnkuZ2V0KCkuaW1wYWN0X3NvdW5kc19tZWRpdW0KICAgICAgICAgICAgICAgIHNvdW5kID0gc291bmRzW3JhbmRvbS5yYW5kcmFuZ2UobGVuKHNvdW5kcykpXQogICAgICAgICAgICAgICAgYmEucGxheXNvdW5kKHNvdW5kLCAxLjAsIHBvc2l0aW9uPXNlbGYubm9kZS5wb3NpdGlvbikKCiAgICAgICAgICAgIHBwb3MgPSBzZWxmLm5vZGUucHVuY2hfcG9zaXRpb24KICAgICAgICAgICAgcHVuY2hkaXIgPSBzZWxmLm5vZGUucHVuY2hfdmVsb2NpdHkKICAgICAgICAgICAgdmVsID0gc2VsZi5ub2RlLnB1bmNoX21vbWVudHVtX2xpbmVhcgoKICAgICAgICAgICAgc2VsZi5fcHVuY2hlZF9ub2Rlcy5hZGQobm9kZSkKICAgICAgICAgICAgbm9kZS5oYW5kbGVtZXNzYWdlKAogICAgICAgICAgICAgICAgYmEuSGl0TWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICBwb3M9cHBvcywKICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eT12ZWwsCiAgICAgICAgICAgICAgICAgICAgbWFnbml0dWRlPXB1bmNoX3Bvd2VyICogcHVuY2hfbW9tZW50dW1fYW5ndWxhciAqIDExMC4wLAogICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5X21hZ25pdHVkZT1wdW5jaF9wb3dlciAqIDQwLAogICAgICAgICAgICAgICAgICAgIHJhZGl1cz0wLAogICAgICAgICAgICAgICAgICAgIHNyY25vZGU9c2VsZi5ub2RlLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wbGF5ZXI9c2VsZi5zb3VyY2VfcGxheWVyLAogICAgICAgICAgICAgICAgICAgIGZvcmNlX2RpcmVjdGlvbj1wdW5jaGRpciwKICAgICAgICAgICAgICAgICAgICBoaXRfdHlwZT0ncHVuY2gnLAogICAgICAgICAgICAgICAgICAgIGhpdF9zdWJ0eXBlPSgnc3VwZXJfcHVuY2gnIGlmIHNlbGYuX2hhc19ib3hpbmdfZ2xvdmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJ2RlZmF1bHQnKSkpCgogICAgICAgICAgICBtYWcgPSAtNDAwLjAKICAgICAgICAgICAgaWYgc2VsZi5faG9ja2V5OgogICAgICAgICAgICAgICAgbWFnICo9IDAuNQogICAgICAgICAgICBpZiBsZW4oc2VsZi5fcHVuY2hlZF9ub2RlcykgPT0gMToKICAgICAgICAgICAgICAgIHNlbGYubm9kZS5oYW5kbGVtZXNzYWdlKCdraWNrX2JhY2snLCBwcG9zWzBdLCBwcG9zWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBvc1syXSwgcHVuY2hkaXJbMF0sIHB1bmNoZGlyWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVuY2hkaXJbMl0sIG1hZykKICAgIGVsaWYgaXNpbnN0YW5jZShtc2csIFBpY2t1cE1lc3NhZ2UpOgogICAgICAgIGlmIG5vdCBzZWxmLm5vZGU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29sbGlzaW9uID0gYmEuZ2V0Y29sbGlzaW9uKCkKICAgICAgICAgICAgb3Bwb3Npbmdub2RlID0gY29sbGlzaW9uLm9wcG9zaW5nbm9kZQogICAgICAgICAgICBvcHBvc2luZ2JvZHkgPSBjb2xsaXNpb24ub3Bwb3Npbmdib2R5CiAgICAgICAgZXhjZXB0IGJhLk5vdEZvdW5kRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb3Bwb3Npbmdub2RlLmludmluY2libGU6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgKG9wcG9zaW5nbm9kZS5nZXRub2RldHlwZSgpID09ICdzcGF6JwogICAgICAgICAgICAgICAgYW5kIG5vdCBvcHBvc2luZ25vZGUuc2hhdHRlcmVkIGFuZCBvcHBvc2luZ2JvZHkgPT0gNCk6CiAgICAgICAgICAgIG9wcG9zaW5nYm9keSA9IDEKCiAgICAgICAgaGVsZCA9IHNlbGYubm9kZS5ob2xkX25vZGUKICAgICAgICBpZiBoZWxkIGFuZCBoZWxkLmdldG5vZGV0eXBlKCkgPT0gJ2ZsYWcnOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBzZWxmLm5vZGUuaG9sZF9ib2R5ID0gb3Bwb3Npbmdib2R5CiAgICAgICAgc2VsZi5ub2RlLmhvbGRfbm9kZSA9IG9wcG9zaW5nbm9kZQogICAgZWxpZiBpc2luc3RhbmNlKG1zZywgYmEuQ2VsZWJyYXRlTWVzc2FnZSk6CiAgICAgICAgaWYgc2VsZi5ub2RlOgogICAgICAgICAgICBzZWxmLm5vZGUuaGFuZGxlbWVzc2FnZSgnY2VsZWJyYXRlJywgaW50KG1zZy5kdXJhdGlvbiAqIDEwMDApKQoKICAgIHJldHVybiBOb25lCiAgICAgICAgCmNsYXNzIFBvd2VydXBNYW5hZ2VyV2luZG93KFBvcHVwV2luZG93KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc2l0aW9uPSAnaW5fcmlnaHQnKToKICAgICAgICBjb2x1bW5zID0gMgogICAgICAgIHNlbGYuX3dpZHRoID0gd2lkdGggPSA4MDAKICAgICAgICBzZWxmLl9oZWlnaHQgPSBoZWlnaHQgPSA1MDAKICAgICAgICBzZWxmLl9zdWJfaGVpZ2h0ID0gMjAwCiAgICAgICAgc2VsZi5fc2Nyb2xsX3dpZHRoID0gc2VsZi5fd2lkdGgqMC45MAogICAgICAgIHNlbGYuX3Njcm9sbF9oZWlnaHQgPSBzZWxmLl9oZWlnaHQgLSAxODAKICAgICAgICBzZWxmLl9zdWJfd2lkdGggPSBzZWxmLl9zY3JvbGxfd2lkdGgqMC45NTsKICAgICAgICBzZWxmLnRhYl9idXR0b25zOiBzZXQgPSB7fQogICAgICAgIHNlbGYubGlzdF9jbHNfcG93ZXI6IGxpc3QgPSBbXQogICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcnVwcyA9IGRlZmF1bHRfcG93ZXJ1cHMoKQogICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0ID0gbGlzdChzZWxmLmRlZmF1bHRfcG93ZXJ1cHMpCiAgICAgICAgc2VsZi5jb2lucyA9IGFwZ1snQmVhciBDb2luJ10KICAgICAgICBzZWxmLnBvcHVwX2Nsc19wb3dlciA9IE5vbmUKCiAgICAgICAgaWYgbm90IFNUT1JFWydCdXkgRmlyZWJvbWJzJ106CiAgICAgICAgICAgIHBvd2VydXBzWydGaXJlIEJvbWJzJ10gPSAwCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0LnJlbW92ZSgnRmlyZSBCb21icycpCgogICAgICAgIHNlbGYuY2hhcnN0ciA9IFtiYS5jaGFyc3RyKGJhLlNwZWNpYWxDaGFyLkxFRlRfQVJST1cpLAogICAgICAgICAgICAgICAgICAgICAgICBiYS5jaGFyc3RyKGJhLlNwZWNpYWxDaGFyLlJJR0hUX0FSUk9XKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmEuY2hhcnN0cihiYS5TcGVjaWFsQ2hhci5VUF9BUlJPVyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhLmNoYXJzdHIoYmEuU3BlY2lhbENoYXIuRE9XTl9BUlJPVyldCgogICAgICAgIHNlbGYudGFiZGVmcyA9IHsiQWN0aW9uIDEiOiBbJ3Bvd2VydXBJY2VCb21icycsKDEsMSwxKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb24gMiI6IFsnc2V0dGluZ3NJY29uJywoMCwxLDApXSwKICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAzIjogWydpbnZlbnRvcnlJY29uJywoMSwxLDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiA0IjogWydzdG9yZUljb24nLCgxLDEsMSldLAogICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uIDUiOiBbJ2FkdmFuY2VkSWNvbicsKDEsMSwxKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICJBYm91dCI6IFsnaGVhcnQnLCgxLjUsMC4zLDAuMyldfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZiAoU1RPUkVbJ0J1eSBGaXJlYm9tYnMnXSBhbmQKICAgICAgICAgICAgU1RPUkVbJ0J1eSBPcHRpb24nXSBhbmQKICAgICAgICAgICAgU1RPUkVbJ0J1eSBQZXJjZW50YWdlJ10pOgogICAgICAgICAgICBzZWxmLnRhYmRlZnMgPSB7IkFjdGlvbiAxIjogWydwb3dlcnVwSWNlQm9tYnMnLCgxLDEsMSldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAyIjogWydzZXR0aW5nc0ljb24nLCgwLDEsMCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiAzIjogWydpbnZlbnRvcnlJY29uJywoMSwxLDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYm91dCI6IFsnaGVhcnQnLCgxLjUsMC4zLDAuMyldfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBzZWxmLmxpc3RkZWYgPSBsaXN0KHNlbGYudGFiZGVmcykKICAgICAgICAKICAgICAgICBzZWxmLmNvdW50ID0gbGVuKHNlbGYudGFiZGVmcykKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgc2VsZi5fY3VycmVudF90YWIgPSBHTE9CQUxbJ1RhYiddCgogICAgICAgIGFwcCA9IGJhLmFwcC51aQogICAgICAgIHVpc2NhbGUgPSBhcHAudWlzY2FsZQoKICAgICAgICBzZWxmLl9yb290X3dpZGdldCA9IGJhLmNvbnRhaW5lcndpZGdldChzaXplPSh3aWR0aCs5MCxoZWlnaHQrODApLHRyYW5zaXRpb249dHJhbnNpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MS41IGlmIHVpc2NhbGUgaXMgYmEuVUlTY2FsZS5TTUFMTCBlbHNlIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfb2Zmc2V0PSgwLC0zMCkgaWYgdWlzY2FsZSBpcyBiYS5VSVNjYWxlLlNNQUxMIGVsc2UgICgwLDApKQogICAgICAgIAogICAgICAgIHNlbGYuX2JhY2tCdXR0b24gPSBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCxhdXRvc2VsZWN0PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KDYwLHNlbGYuX2hlaWdodC0xNSksc2l6ZT0oMTMwLDYwKSwKICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjgsdGV4dF9zY2FsZT0xLjIsbGFiZWw9YmEuTHN0cihyZXNvdXJjZT0nYmFja1RleHQnKSwKICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fdHlwZT0nYmFjaycsb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2JhY2spKQogICAgICAgIGJhLmJ1dHRvbndpZGdldChlZGl0PXNlbGYuX2JhY2tCdXR0b24sIGJ1dHRvbl90eXBlPSdiYWNrU21hbGwnLHNpemU9KDYwLCA2MCksbGFiZWw9YmEuY2hhcnN0cihiYS5TcGVjaWFsQ2hhci5CQUNLKSkKICAgICAgICBiYS5jb250YWluZXJ3aWRnZXQoZWRpdD1zZWxmLl9yb290X3dpZGdldCxjYW5jZWxfYnV0dG9uPWIpCgogICAgICAgIHNlbGYudGl0bGV0ZXh0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQscG9zaXRpb249KDAsIGhlaWdodC0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLCB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAKICAgICAgICBpbmRleCA9IDAKICAgICAgICBmb3IgdGFiIGluIHJhbmdlKHNlbGYuY291bnQpOgogICAgICAgICAgICBmb3IgdGFiMiBpbiByYW5nZShjb2x1bW5zKToKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGFnID0gc2VsZi5saXN0ZGVmW2luZGV4XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICg2MjArKHRhYjIqMTIwKSxzZWxmLl9oZWlnaHQtNTAqMi41LSh0YWIqMTIwKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgdGFnID09ICdBYm91dCc6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJhLkxzdHIocmVzb3VyY2U9J2dhdGhlcldpbmRvdy5hYm91dFRleHQnKQogICAgICAgICAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiA0JzoKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYmEuTHN0cihyZXNvdXJjZT0nc3RvcmVUZXh0JykKICAgICAgICAgICAgICAgIGVsc2U6IHRleHQgPSBnZXRsYW5ndWFnZSh0YWcpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYudGFiX2J1dHRvbnNbdGFnXSA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQsYXV0b3NlbGVjdD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb24sc2l6ZT0oMTEwLDExMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLGxhYmVsPScnLGVuYWJsZV9zb3VuZD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90eXBlPSdzcXVhcmUnLG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLl9zZXRfdGFiLHRhZyxzb3VuZD1UcnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLnRleHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSs1NSxwb3NpdGlvblsxXSszMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPSgwLCAwKSxzY2FsZT0xLGNvbG9yPWJhLmFwcC51aS50aXRsZV9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfY29udHJvbGxlcj1zZWxmLnRhYl9idXR0b25zW3RhZ10sbWF4d2lkdGg9MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD10ZXh0LGhfYWxpZ249J2NlbnRlcicsdl9hbGlnbj0nY2VudGVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLmltYWdlID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KDYwLDYwKSxjb2xvcj1zZWxmLnRhYmRlZnNbdGFnXVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2NvbnRyb2xsZXI9c2VsZi50YWJfYnV0dG9uc1t0YWddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSsyNSxwb3NpdGlvblsxXSs0MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZT1iYS5nZXR0ZXh0dXJlKHNlbGYudGFiZGVmc1t0YWddWzBdKSkKCiAgICAgICAgICAgICAgICBpbmRleCArPSAxCiAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID09IGluZGV4OgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAKICAgICAgICAgICAgaWYgc2VsZi5jb3VudCA9PSBpbmRleDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgCiAgICAgICAgc2VsZi5fc2Nyb2xsd2lkZ2V0ID0gTm9uZQogICAgICAgIHNlbGYuX3RhYl9jb250YWluZXIgPSBOb25lCiAgICAgICAgc2VsZi5fc2V0X3RhYihzZWxmLl9jdXJyZW50X3RhYikKCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICBhcGcuYXBwbHlfYW5kX2NvbW1pdCgpCgogICAgZGVmIF9zZXRfdGFiKHNlbGYsIHRhYiwgc291bmQ6IGJvb2wgPSBGYWxzZSk6CiAgICAgICAgc2VsZi5zb3VuZCA9IHNvdW5kCiAgICAgICAgR0xPQkFMWydUYWInXSA9IHRhYgogICAgICAgIGFwZy5hcHBseV9hbmRfY29tbWl0KCkKICAgICAgICAKICAgICAgICBpZiBzZWxmLl90YWJfY29udGFpbmVyIGlzIG5vdCBOb25lIGFuZCBzZWxmLl90YWJfY29udGFpbmVyLmV4aXN0cygpOgogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyLmRlbGV0ZSgpCgogICAgICAgIGlmIHNlbGYuc291bmQ6CiAgICAgICAgICAgIGJhLnBsYXlzb3VuZChiYS5nZXRzb3VuZCgnY2xpY2swMScpKQoKICAgICAgICBpZiBzZWxmLl9zY3JvbGx3aWRnZXQ6CiAgICAgICAgICAgIHNlbGYuX3Njcm9sbHdpZGdldC5kZWxldGUoKQoKICAgICAgICBzZWxmLl9zY3JvbGx3aWRnZXQgPSBiYS5zY3JvbGx3aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICBwb3NpdGlvbj0oc2VsZi5fd2lkdGgqMC4wOCw1MSoxLjgpLHNpemU9KHNlbGYuX3N1Yl93aWR0aCAtMTQwLHNlbGYuX3Njcm9sbF9oZWlnaHQgKzYwKjEuMikpCgogICAgICAgIGlmIHRhYiA9PSAnQWN0aW9uIDQnOgogICAgICAgICAgICBpZiBzZWxmLl9zY3JvbGx3aWRnZXQ6CiAgICAgICAgICAgICAgICBzZWxmLl9zY3JvbGx3aWRnZXQuZGVsZXRlKCkKICAgICAgICAgICAgc2VsZi5fc2Nyb2xsd2lkZ2V0ID0gYmEuaHNjcm9sbHdpZGdldChwYXJlbnQ9c2VsZi5fcm9vdF93aWRnZXQsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj0oc2VsZi5fd2lkdGgqMC4wOCw1MSoxLjgpLHNpemU9KHNlbGYuX3N1Yl93aWR0aCAtMTQwLHNlbGYuX3Njcm9sbF9oZWlnaHQgKzYwKjEuMiksCiAgICAgICAgICAgICAgICBjYXB0dXJlX2Fycm93cz1UcnVlLGNsYWltc19sZWZ0X3JpZ2h0PVRydWUpCiAgICAgICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnRpdGxldGV4dCx0ZXh0PWJhLkxzdHIocmVzb3VyY2U9J3N0b3JlVGV4dCcpKQogICAgICAgIGVsaWYgdGFiID09ICdBYm91dCc6CiAgICAgICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnRpdGxldGV4dCx0ZXh0PWJhLkxzdHIocmVzb3VyY2U9J2dhdGhlcldpbmRvdy5hYm91dFRleHQnKSkKICAgICAgICBlbHNlOiBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi50aXRsZXRleHQsdGV4dD1nZXRsYW5ndWFnZSh0YWIpKQoKICAgICAgICBjaG9pY2VzID0gWydSZXNldCcsJ09ubHkgQm9tYnMnLCdPbmx5IEl0ZW1zJywnTmV3JywnTm90aGluZyddCiAgICAgICAgY19kaXNwbGF5ID0gW10KICAgICAgICAKICAgICAgICBmb3IgZGlzcGxheSBpbiBjaG9pY2VzOgogICAgICAgICAgICBjaG9pY2VzX2Rpc3BsYXkgPSBiYS5Mc3RyKHRyYW5zbGF0ZT0oIiIsZ2V0bGFuZ3VhZ2UoZGlzcGxheSkpKQogICAgICAgICAgICBjX2Rpc3BsYXkuYXBwZW5kKGNob2ljZXNfZGlzcGxheSkKICAgIAogICAgICAgIGlmIHRhYiA9PSAnQWN0aW9uIDEnOgogICAgICAgICAgICBzZWxmLnBvcHVwX2Nsc19wb3dlciA9IFBvcHVwTWVudSgKICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICBwb3NpdGlvbj0oMTMwLHNlbGYuX3dpZHRoKjAuNjEpLAogICAgICAgICAgICAgICAgICBidXR0b25fc2l6ZT0oMTUwLDUwKSxzY2FsZT0yLjUsCiAgICAgICAgICAgICAgICAgIGNob2ljZXM9Y2hvaWNlcyx3aWR0aD0xNTAsCiAgICAgICAgICAgICAgICAgIGNob2ljZXNfZGlzcGxheT1jX2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY2hvaWNlPUdMT0JBTFsnQ2xzIFBvd2VydXAnXSwKICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9c2VsZi5fc2V0X2NvbmNlcHQpCiAgICAgICAgICAgIHNlbGYubGlzdF9jbHNfcG93ZXIuYXBwZW5kKHNlbGYucG9wdXBfY2xzX3Bvd2VyLl9idXR0b24pCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLmJ1dHRvbl9jbHNfcG93ZXIgPSBiYS5idXR0b253aWRnZXQocGFyZW50PXNlbGYuX3Jvb3Rfd2lkZ2V0LAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSg1MDAsc2VsZi5fd2lkdGgqMC42MSksc2l6ZT0oNTAsNTApLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLGxhYmVsPSgnJScpLHRleHRfc2NhbGU9MSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPXNlbGYuX3BlcmNlbnRhZ2Vfd2luZG93KSAKICAgICAgICAgICAgc2VsZi5saXN0X2Nsc19wb3dlci5hcHBlbmQoc2VsZi5idXR0b25fY2xzX3Bvd2VyKQogICAgICAgICAgICAKICAgICAgICAgICAgcmV3aW5kb3cgPSBbc2VsZi5wb3B1cF9jbHNfcG93ZXIuX2J1dHRvbixzZWxmLmJ1dHRvbl9jbHNfcG93ZXJdCiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgY2xzIGluIHNlbGYubGlzdF9jbHNfcG93ZXI6ICMgdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBzbyB0aGF0IHB1cHVwcyBkb24ndCBhY2N1bXVsYXRlCiAgICAgICAgICAgICAgICBpZiBjbHMgbm90IGluIHJld2luZG93OgogICAgICAgICAgICAgICAgICAgIGNscy5kZWxldGUoKQogICAgICAgICAgICAKICAgICAgICBlbGlmIHRhYiA9PSAnQWN0aW9uIDQnOgogICAgICAgICAgICBzZWxmLmJ1dHRvbl9jb2luID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1zZWxmLl9yb290X3dpZGdldCxpY29uPWJhLmdldHRleHR1cmUoJ2NvaW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0oNTUwLHNlbGYuX3dpZHRoKjAuNjE0KSxzaXplPSgxNjAsNDApLHRleHRjb2xvcj0oMCwxLDApLGNvbG9yPSgwLDEsNiksCiAgICAgICAgICAgICAgICAgICAgc2NhbGU9MSxsYWJlbD1zdHIoYXBnWydCZWFyIENvaW4nXSksdGV4dF9zY2FsZT0xLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPU5vbmUpICNzZWxmLl9wZXJjZW50YWdlX3dpbmRvdykKICAgICAgICAgICAgc2VsZi5saXN0X2Nsc19wb3dlci5hcHBlbmQoc2VsZi5idXR0b25fY29pbikKICAgICAgICAgICAgCiAgICAgICAgICAgIHRyeTogcmV3aW5kb3cuYXBwZW5kKHNlbGYuYnV0dG9uX2NvaW4pCiAgICAgICAgICAgIGV4Y2VwdDogcmV3aW5kb3cgPSBbc2VsZi5idXR0b25fY29pbl0KICAgICAgICAgICAgZm9yIGNscyBpbiBzZWxmLmxpc3RfY2xzX3Bvd2VyOiAjIHRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgc28gdGhhdCBwdXB1cHMgZG9uJ3QgYWNjdW11bGF0ZQogICAgICAgICAgICAgICAgaWYgY2xzIG5vdCBpbiByZXdpbmRvdzoKICAgICAgICAgICAgICAgICAgICBjbHMuZGVsZXRlKCkKICAgICAgICAgICAgCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIGNscyBpbiBzZWxmLmxpc3RfY2xzX3Bvd2VyOgogICAgICAgICAgICAgICAgICAgIGNscy5kZWxldGUoKQogICAgICAgICAgICBleGNlcHQ6IHBhc3MKCiAgICAgICAgaWYgdGFiID09ICdBY3Rpb24gMSc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSBsZW4oc2VsZi5kZWZhdWx0X3Bvd2VyX2xpc3QpICogOTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICBwb3NpID0gMAogICAgICAgICAgICBpZF9wb3dlciA9IGxpc3Qoc2VsZi5kZWZhdWx0X3Bvd2VydXBzKQogICAgICAgICAgICBuZXdfcG93ZXJ1cHMgPSBpZF9wb3dlcls5Ol0KICAgICAgICAgICAgc2VsZi5saXN0cG93ZXIgPSB7fQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQoKICAgICAgICAgICAgZm9yIHBvd2VyIGluIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0OgogICAgICAgICAgICAgICAgaWYgcG93ZXIgPT0gaWRfcG93ZXJbMF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBTaGllbGROYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwU2hpZWxkJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBQdW5jaE5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBQdW5jaCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzJdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwTGFuZE1pbmVzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cExhbmRNaW5lcycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzNdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwSW1wYWN0Qm9tYnNOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwSW1wYWN0Qm9tYnMnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls0XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEljZUJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEljZUJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBCb21iTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEJvbWInKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls2XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cFN0aWNreUJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFN0aWNreUJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbN106CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBDdXJzZU5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBDdXJzZScpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzhdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwSGVhbHRoTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEhlYWx0aCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzldOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBTcGVlZCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEwXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdoZWFydCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzExXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIkdvb2RieWUhIgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50T25zbGF1Z2h0JykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTJdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ291eWFVQnV0dG9uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTNdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ2FjaGlldmVtZW50U3VwZXJQdW5jaCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzE0XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdsZXZlbEljb24nKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnb3V5YU9CdXR0b24nKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNl06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnc3RhcicpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiBwb3dlciBpbiBuZXdfcG93ZXJ1cHM6IGxhYmVsID0gZ2V0bGFuZ3VhZ2UocG93ZXIpCiAgICAgICAgICAgICAgICBlbHNlOiBsYWJlbCA9IGJhLkxzdHIocmVzb3VyY2U9dGV4dCkKCiAgICAgICAgICAgICAgICBhcHBlcmFuY2UgPSBwb3dlcnVwc1twb3dlcl0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gKDkwLHYtcG9zaSkKCiAgICAgICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0tMzAscG9zaXRpb25bMV0tMTUpLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLGNvbG9yPShiYS5hcHAudWkudGl0bGVfY29sb3IpLCB0ZXh0PWxhYmVsLCB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxmLnBvd3ByZXYgPSBiYS5pbWFnZXdpZGdldChwYXJlbnQ9YywKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0tNzAscG9zaXRpb25bMV0tMTApLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDUwLDUwKSx0ZXh0dXJlPXRleCkKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkaXBvcyA9IDAKICAgICAgICAgICAgICAgIGZvciBkaXJlYyBpbiBbJy0nLCcrJ106CiAgICAgICAgICAgICAgICAgICAgYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjcwK2RpcG9zLHBvc2l0aW9uWzFdLTEwKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0wLjQsbGFiZWw9ZGlyZWMsYnV0dG9uX3R5cGU9J3NxdWFyZScsdGV4dF9zY2FsZT00LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmFwcGVyYW5jZV9wb3dlcnVwcyxwb3dlcixkaXJlYykpCiAgICAgICAgICAgICAgICAgICAgZGlwb3MgKz0gMTAwCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGV4dHdpZGdldCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzE5MCxwb3NpdGlvblsxXS0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9Y2xzX3Bvd19jb2xvcigpW2FwcGVyYW5jZV0sdGV4dD1zdHIoYXBwZXJhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMykKICAgICAgICAgICAgICAgIHNlbGYubGlzdHBvd2VyW3Bvd2VyXSA9IHRleHR3aWRnZXQKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwb3NpICs9IDkwCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGVsaWYgdGFiID09ICdBY3Rpb24gMic6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSAzNzAgaWYgbm90IFNUT1JFWydCdXkgT3B0aW9uJ10gZWxzZSA0NTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogICAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAoNDAsdi0yMCkKICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNfZGlzcGxheSA9IFtdCiAgICAgICAgICAgIGNob2ljZXMgPSBbJ0F1dG8nLCdTWTogQkFMTCcsJ1NZOiBJbXBhY3QnLCdTWTogRWdnJ10KICAgICAgICAgICAgZm9yIGRpc3BsYXkgaW4gY2hvaWNlczoKICAgICAgICAgICAgICAgIGNob2ljZXNfZGlzcGxheSA9IGJhLkxzdHIodHJhbnNsYXRlPSgiIixnZXRsYW5ndWFnZShkaXNwbGF5KSkpCiAgICAgICAgICAgICAgICBjX2Rpc3BsYXkuYXBwZW5kKGNob2ljZXNfZGlzcGxheSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwb3B1cCA9IFBvcHVwTWVudShwYXJlbnQ9YywKICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKzMwMCxwb3NpdGlvblsxXSksCiAgICAgICAgICAgICAgICAgIGJ1dHRvbl9zaXplPSgxNTAsNTApLHNjYWxlPTIuNSwKICAgICAgICAgICAgICAgICAgY2hvaWNlcz1jaG9pY2VzLHdpZHRoPTE1MCwKICAgICAgICAgICAgICAgICAgY2hvaWNlc19kaXNwbGF5PWNfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgY3VycmVudF9jaG9pY2U9Y29uZmlnWydQb3dlcnVwIFN0eWxlJ10sCiAgICAgICAgICAgICAgICAgIG9uX3ZhbHVlX2NoYW5nZV9jYWxsPWJhLkNhbGwoc2VsZi5fYWxsX3BvcHVwLCdQb3dlcnVwIFN0eWxlJykpCiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZXh0ID0gZ2V0bGFuZ3VhZ2UoJ1Bvd2VydXAgU3R5bGUnKQogICAgICAgICAgICB3dCA9IChsZW4odGV4dCkqMC44MCkKICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdLTYwK3d0LHBvc2l0aW9uWzFdKSxzaXplPSh3aWR0aCw1MCksbWF4d2lkdGg9d2lkdGgqMC45LAogICAgICAgICAgICAgICAgc2NhbGU9MS4xLGhfYWxpZ249ImNlbnRlciIsY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLHRleHQ9Z2V0bGFuZ3VhZ2UoJ1Bvd2VydXAgU3R5bGUnKSx2X2FsaWduPSJjZW50ZXIiKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRpcG9zID0gMAogICAgICAgICAgICBmb3IgZGlyZWMgaW4gWyctJywnKyddOgogICAgICAgICAgICAgICAgYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXSszMTArZGlwb3MscG9zaXRpb25bMV0tMTAwKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdD1UcnVlLHNjYWxlPTAuNCxsYWJlbD1kaXJlYyxidXR0b25fdHlwZT0nc3F1YXJlJyx0ZXh0X3NjYWxlPTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi5fcG93ZXJ1cHNfc2NhbGUsZGlyZWMpKQogICAgICAgICAgICAgICAgZGlwb3MgKz0gMTAwCgogICAgICAgICAgICB0eHRfc2NhbGUgPSBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXQogICAgICAgICAgICBzZWxmLnR4dF9zY2FsZSA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzIzMCxwb3NpdGlvblsxXS0xMDUpLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLjEsaF9hbGlnbj0iY2VudGVyIixjb2xvcj0oMCwxLDApLHRleHQ9c3RyKHR4dF9zY2FsZSksdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMpCiAgICAgICAgICAgICAKICAgICAgICAgICAgdGV4dCA9IGdldGxhbmd1YWdlKCdQb3dlcnVwIFNjYWxlJykKICAgICAgICAgICAgd3QgPSAobGVuKHRleHQpKjAuODApCiAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS02MCt3dCxwb3NpdGlvblsxXS0xMDApLHNpemU9KHdpZHRoLDUwKSxtYXh3aWR0aD13aWR0aCowLjksCiAgICAgICAgICAgICAgICBzY2FsZT0xLjEsaF9hbGlnbj0iY2VudGVyIixjb2xvcj1iYS5hcHAudWkudGl0bGVfY29sb3IsdGV4dD10ZXh0LHZfYWxpZ249ImNlbnRlciIpCiAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAocG9zaXRpb25bMF0tMjAscG9zaXRpb25bMV0rNDApCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5jaGVjayA9IGJhLmNoZWNrYm94d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXSszMCxwb3NpdGlvblsxXS0yMzApLHZhbHVlPWNvbmZpZ1snUG93ZXJ1cCBOYW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBOYW1lJyksbWF4d2lkdGg9c2VsZi5fc2Nyb2xsX3dpZHRoKjAuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWdldGxhbmd1YWdlKCdQb3dlcnVwIE5hbWUnKSxhdXRvc2VsZWN0PVRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYuY2hlY2sgPSBiYS5jaGVja2JveHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMzAscG9zaXRpb25bMV0tMjMwKjEuMyksdmFsdWU9Y29uZmlnWydQb3dlcnVwIFdpdGggU2hpZWxkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBXaXRoIFNoaWVsZCcpLG1heHdpZHRoPXNlbGYuX3Njcm9sbF93aWR0aCowLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1nZXRsYW5ndWFnZSgnUG93ZXJ1cCBXaXRoIFNoaWVsZCcpLGF1dG9zZWxlY3Q9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgU1RPUkVbJ0J1eSBPcHRpb24nXToKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2sgPSBiYS5jaGVja2JveHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMzAscG9zaXRpb25bMV0tMjMwKjEuNiksdmFsdWU9Y29uZmlnWydQb3dlcnVwIFRpbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdmFsdWVfY2hhbmdlX2NhbGw9YmEuQ2FsbChzZWxmLl9zd2l0Y2hlcywnUG93ZXJ1cCBUaW1lJyksbWF4d2lkdGg9c2VsZi5fc2Nyb2xsX3dpZHRoKjAuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1nZXRsYW5ndWFnZSgnUG93ZXJ1cCBUaW1lJyksYXV0b3NlbGVjdD1UcnVlKQogICAgICAgICAgICAgICAgCiAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiAzJzoKICAgICAgICAgICAgc3ViX2hlaWdodCA9IDMwMAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLAogICAgICAgICAgICAgICAgYmFja2dyb3VuZD1GYWxzZSxzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCgogICAgICAgICAgICB2IC09IDIwCiAgICAgICAgICAgIHBvc2l0aW9uID0gKDExMCx2LTQ1KjEuNzIpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBub3QgU1RPUkVbJ0J1eSBQZXJjZW50YWdlJ106CiAgICAgICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oOTAsdi0xMDApLHNpemU9KDMwK3dpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLHRleHQ9Z2V0bGFuZ3VhZ2UoJ0Jsb2NrIE9wdGlvbiBTdG9yZScpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yPWJhLmFwcC51aS50aXRsZV9jb2xvcix2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuNSxzY2FsZT0xLjUpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpID0gYmEuaW1hZ2V3aWRnZXQocGFyZW50PWMsCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKzEwMCxwb3NpdGlvblsxXS0yMDUpLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDgwLDgwKSx0ZXh0dXJlPWJhLmdldHRleHR1cmUoJ2xvY2snKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs3MCksc2l6ZT0oMzArd2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsdGV4dD1mIntnZXRsYW5ndWFnZSgnVGFuayBTaGllbGQgUFRHJyl9ICh7Z2V0bGFuZ3VhZ2UoJ1RhbmsgU2hpZWxkJyl9KSIsCiAgICAgICAgICAgICAgICAgICAgY29sb3I9YmEuYXBwLnVpLnRpdGxlX2NvbG9yLHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS41LHNjYWxlPTEuNSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscG9zaXRpb249cG9zaXRpb24sc2l6ZT0oMTAwLDEwMCkscmVwZWF0PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTAuNixsYWJlbD1zZWxmLmNoYXJzdHJbM10sYnV0dG9uX3R5cGU9J3NxdWFyZScsdGV4dF9zY2FsZT0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hY3RpdmF0ZV9jYWxsPWJhLkNhbGwoc2VsZi50YW5rX3NoaWVsZF9wZXJjZW50YWdlLCdEZWNyZW1lbnQnKSkKICAgIAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscmVwZWF0PVRydWUsdGV4dF9zY2FsZT0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0qMy4yLHBvc2l0aW9uWzFdKSxzaXplPSgxMDAsMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MC42LGxhYmVsPXNlbGYuY2hhcnN0clsyXSxidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYudGFua19zaGllbGRfcGVyY2VudGFnZSwnSW5jcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddCiAgICAgICAgICAgICAgICBpZiBwb3JjZW50YWplID4gNTk6IGNvbG9yID0gKDAsMSwwKQogICAgICAgICAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgICAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi50YW5rX3RleHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs1KSwKICAgICAgICAgICAgICAgICAgICBzaXplPSgzMCt3aWR0aCw1MCksaF9hbGlnbj0iY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICB0ZXh0PXN0cihwb3JjZW50YWplKSsnJScsY29sb3I9Y29sb3IsCiAgICAgICAgICAgICAgICAgICAgdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsc2NhbGU9MikKICAgIAogICAgICAgICAgICAgICAgIyAtLS0tLT4KICAgIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAoMTEwLHYtMTYwKjEuNikgICAgICAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0xNCxwb3NpdGlvblsxXSs3MCksc2l6ZT0oMzArd2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsdGV4dD1mIntnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UgUFRHJyl9e19zcF99KHtnZXRsYW5ndWFnZSgnSGVhbGluZyBEYW1hZ2UnKX0pIiwKICAgICAgICAgICAgICAgICAgICBjb2xvcj1iYS5hcHAudWkudGl0bGVfY29sb3Isdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsc2NhbGU9MS40KQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSxwb3NpdGlvbj1wb3NpdGlvbixzaXplPSgxMDAsMTAwKSxyZXBlYXQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MC42LGxhYmVsPXNlbGYuY2hhcnN0clszXSxidXR0b25fdHlwZT0nc3F1YXJlJyx0ZXh0X3NjYWxlPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZSwnRGVjcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIGIgPSBiYS5idXR0b253aWRnZXQocGFyZW50PWMsYXV0b3NlbGVjdD1UcnVlLHJlcGVhdD1UcnVlLHRleHRfc2NhbGU9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249KHBvc2l0aW9uWzBdKjMuMixwb3NpdGlvblsxXSksc2l6ZT0oMTAwLDEwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTAuNixsYWJlbD1zZWxmLmNoYXJzdHJbMl0sYnV0dG9uX3R5cGU9J3NxdWFyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjdGl2YXRlX2NhbGw9YmEuQ2FsbChzZWxmLmhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZSwnSW5jcmVtZW50JykpCiAgICAKICAgICAgICAgICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddCiAgICAgICAgICAgICAgICBpZiBwb3JjZW50YWplID4gNTk6IGNvbG9yID0gKDAsMSwwKQogICAgICAgICAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgICAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5obGdfdGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdLTE0LHBvc2l0aW9uWzFdKzUpLAogICAgICAgICAgICAgICAgICAgIHNpemU9KDMwK3dpZHRoLDUwKSxoX2FsaWduPSJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgIHRleHQ9c3RyKHBvcmNlbnRhamUpKyclJyxjb2xvcj1jb2xvciwKICAgICAgICAgICAgICAgICAgICB2X2FsaWduPSJjZW50ZXIiLG1heHdpZHRoPXdpZHRoKjEuMyxzY2FsZT0yKQoKICAgICAgICBlbGlmIHRhYiA9PSAnUGVyY2VudGFnZSc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSBsZW4oc2VsZi5kZWZhdWx0X3Bvd2VyX2xpc3QpICogOTAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB3aWR0aCA9IDMwMAogICAgICAgICAgICBwb3NpID0gMAogICAgICAgICAgICBpZF9wb3dlciA9IGxpc3Qoc2VsZi5kZWZhdWx0X3Bvd2VydXBzKQogICAgICAgICAgICBuZXdfcG93ZXJ1cHMgPSBpZF9wb3dlcls5Ol0KICAgICAgICAgICAgc2VsZi5saXN0cG93ZXIgPSB7fQogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHNlbGYuX3N1Yl93aWR0aCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogCiAgICAgICAgICAgIGZvciBwb3dlciBpbiBzZWxmLmRlZmF1bHRfcG93ZXJfbGlzdDoKICAgICAgICAgICAgICAgIGlmIHBvd2VyID09IGlkX3Bvd2VyWzBdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwU2hpZWxkTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cFNoaWVsZCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzFdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwUHVuY2hOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwUHVuY2gnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsyXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cExhbmRNaW5lc05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBMYW5kTWluZXMnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclszXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEltcGFjdEJvbWJzTmFtZVRleHQnCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgncG93ZXJ1cEltcGFjdEJvbWJzJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBJY2VCb21ic05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBJY2VCb21icycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwQm9tYk5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBCb21iJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbNl06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICdoZWxwV2luZG93LnBvd2VydXBTdGlja3lCb21ic05hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBTdGlja3lCb21icycpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzddOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnaGVscFdpbmRvdy5wb3dlcnVwQ3Vyc2VOYW1lVGV4dCcKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwQ3Vyc2UnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls4XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ2hlbHBXaW5kb3cucG93ZXJ1cEhlYWx0aE5hbWVUZXh0JwogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3Bvd2VydXBIZWFsdGgnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlcls5XToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdwb3dlcnVwU3BlZWQnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxMF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnaGVhcnQnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxMV06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJHb29kYnllISIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudE9uc2xhdWdodCcpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEyXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdvdXlhVUJ1dHRvbicpCiAgICAgICAgICAgICAgICBlbGlmIHBvd2VyID09IGlkX3Bvd2VyWzEzXToKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcG93ZXIKICAgICAgICAgICAgICAgICAgICB0ZXggPSBiYS5nZXR0ZXh0dXJlKCdhY2hpZXZlbWVudFN1cGVyUHVuY2gnKQogICAgICAgICAgICAgICAgZWxpZiBwb3dlciA9PSBpZF9wb3dlclsxNF06CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBvd2VyCiAgICAgICAgICAgICAgICAgICAgdGV4ID0gYmEuZ2V0dGV4dHVyZSgnbGV2ZWxJY29uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ291eWFPQnV0dG9uJykKICAgICAgICAgICAgICAgIGVsaWYgcG93ZXIgPT0gaWRfcG93ZXJbMTZdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBwb3dlcgogICAgICAgICAgICAgICAgICAgIHRleCA9IGJhLmdldHRleHR1cmUoJ3N0YXInKQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgcG93ZXIgaW4gbmV3X3Bvd2VydXBzOiBsYWJlbCA9IGdldGxhbmd1YWdlKHBvd2VyKQogICAgICAgICAgICAgICAgZWxzZTogbGFiZWwgPSBiYS5Mc3RyKHJlc291cmNlPXRleHQpCgogICAgICAgICAgICAgICAgYXBwZXJhbmNlID0gcG93ZXJ1cHNbcG93ZXJdCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICg5MCx2LXBvc2kpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXS0zMCxwb3NpdGlvblsxXS0xNSksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksIHRleHQ9bGFiZWwsIHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS4zKQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGYucG93cHJldiA9IGJhLmltYWdld2lkZ2V0KHBhcmVudD1jLAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPShwb3NpdGlvblswXS03MCxwb3NpdGlvblsxXS0xMCksCiAgICAgICAgICAgICAgICAgICAgc2l6ZT0oNTAsNTApLHRleHR1cmU9dGV4KQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHB0ZyA9IHN0cihzZWxmLnRvdGFsX3BlcmNlbnRhZ2UocG93ZXIpKQogICAgICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzE3MCxwb3NpdGlvblsxXS0xMCksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KDAsMSwwKSx0ZXh0PShmJ3twdGd9JScpLHZfYWxpZ249ImNlbnRlciIsbWF4d2lkdGg9d2lkdGgqMS4zKQogICAgICAgICAKICAgICAgICAgICAgICAgIHBvc2kgKz0gOTAKICAgICAgICAgICAgICAgIAogICAgICAgIGVsaWYgdGFiID09ICdBY3Rpb24gNCc6CiAgICAgICAgICAgIHN1Yl9oZWlnaHQgPSAzNzAKICAgICAgICAgICAgd2lkdGggPSAzMDAKICAgICAgICAgICAgdiA9IHN1Yl9oZWlnaHQgLSA1NQogICAgICAgICAgICB1ID0gd2lkdGggLSA2MAogICAgICAgICAgICAKICAgICAgICAgICAgc2VsZi5fdGFiX2NvbnRhaW5lciA9IGMgPSBiYS5jb250YWluZXJ3aWRnZXQocGFyZW50PXNlbGYuX3Njcm9sbHdpZGdldCwKICAgICAgICAgICAgICAgIHNpemU9KHdpZHRoKzUwMCxzdWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9RmFsc2Usc2VsZWN0aW9uX2xvb3BzX3RvX3BhcmVudD1UcnVlKQogICAgICAgICAgICAgICAKICAgICAgICAgICAgcG9zaXRpb24gPSAodSsxNTAsdi0yNTApCiAgICAgICAgICAgIG5fcG9zID0gMAogICAgICAgICAgICBwcmljZXMgPSBbNzU2MCwgNTE1MCwgMzM2MF0KICAgICAgICAgICAgc3RyX25hbWUgPSBbIkZpcmVCb21icyBTdG9yZSIsIlRpbWVyIFN0b3JlIiwiUGVyY2VudGFnZXMgU3RvcmUiXQogICAgICAgICAgICBpbWFnZXMgPSBbIm91eWFPQnV0dG9uIiwic2V0dGluZ3NJY29uIiwiaW52ZW50b3J5SWNvbiJdCiAgICAgICAgICAgIAogICAgICAgICAgICBpbmRleCA9IDAKICAgICAgICAgICAgZm9yIHN0b3JlIGluIHN0b3JlX2l0ZW1zKCk6CiAgICAgICAgICAgICAgICBwID0gcHJpY2VzW2luZGV4XQogICAgICAgICAgICAgICAgdHh0ID0gc3RyX25hbWVbaW5kZXhdCiAgICAgICAgICAgICAgICBsYWJlbCA9IGdldGxhbmd1YWdlKHR4dCkKICAgICAgICAgICAgICAgIHR4X3BvcyA9IGxlbihsYWJlbCkqMS44CiAgICAgICAgICAgICAgICBsYl9zY2FsZSA9IGxlbihsYWJlbCkqMC4yMAogICAgICAgICAgICAgICAgcHJldmlldyA9IGltYWdlc1tpbmRleF0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgU1RPUkVbc3RvcmVdOgogICAgICAgICAgICAgICAgICAgIHRleHQgPSBnZXRsYW5ndWFnZSgnQm91Z2h0JykKICAgICAgICAgICAgICAgICAgICBpY29uID0gYmEuZ2V0dGV4dHVyZSgnZ3JhcGhpY3NJY29uJykKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICgwLjUyLDAuNDgsMC42MykKICAgICAgICAgICAgICAgICAgICB0eHRfc2NhbGUgPSAxLjUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHN0cihwKQogICAgICAgICAgICAgICAgICAgIGljb24gPSBiYS5nZXR0ZXh0dXJlKCdjb2luJykKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICgwLjUsMC40LDAuOTMpCiAgICAgICAgICAgICAgICAgICAgdHh0X3NjYWxlID0gMgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBiID0gYmEuYnV0dG9ud2lkZ2V0KHBhcmVudD1jLGF1dG9zZWxlY3Q9VHJ1ZSxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjEwLW5fcG9zLHBvc2l0aW9uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0oMjUwLDgwKSxzY2FsZT0wLjcsbGFiZWw9dGV4dCx0ZXh0X3NjYWxlPXR4dF9zY2FsZSxpY29uPWljb24sY29sb3I9Y29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zY2FsZT0xLjcsb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2J1eV9vYmplY3Qsc3RvcmUscCkpCgogICAgICAgICAgICAgICAgcyA9IDE4MAogICAgICAgICAgICAgICAgYiA9IGJhLmJ1dHRvbndpZGdldChwYXJlbnQ9YyxhdXRvc2VsZWN0PVRydWUscG9zaXRpb249KHBvc2l0aW9uWzBdKzIxMC1uX3Bvcyxwb3NpdGlvblsxXSs1NSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9KHMscyszMCksc2NhbGU9MSxsYWJlbD0nJyxjb2xvcj1jb2xvcixidXR0b25fdHlwZT0nc3F1YXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1iYS5DYWxsKHNlbGYuX2J1eV9vYmplY3Qsc3RvcmUscCkpCiAgICAKICAgICAgICAgICAgICAgIHMgLT0gODAKICAgICAgICAgICAgICAgIGkgPSBiYS5pbWFnZXdpZGdldChwYXJlbnQ9YyxkcmF3X2NvbnRyb2xsZXI9YiwKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0ocG9zaXRpb25bMF0rMjUwLW5fcG9zLHBvc2l0aW9uWzFdKzE0MCksCiAgICAgICAgICAgICAgICAgICAgc2l6ZT0ocyxzKSx0ZXh0dXJlPWJhLmdldHRleHR1cmUocHJldmlldykpCiAgICAKICAgICAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPShwb3NpdGlvblswXSsyNzAtbl9wb3MscG9zaXRpb25bMV0rMTAxKSwKICAgICAgICAgICAgICAgICAgICBoX2FsaWduPSJjZW50ZXIiLGNvbG9yPShiYS5hcHAudWkudGl0bGVfY29sb3IpLHRleHQ9bGFiZWwsdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD0xMzApCiAgICAKICAgICAgICAgICAgICAgIG5fcG9zICs9IDI4MAogICAgICAgICAgICAgICAgaW5kZXggKz0gMQogICAgCiAgICAgICAgZWxpZiB0YWIgPT0gJ0FjdGlvbiA1JzoKICAgICAgICAgICAgc3ViX2hlaWdodCA9IDM3MAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLGJhY2tncm91bmQ9RmFsc2UsCiAgICAgICAgICAgICAgICBzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCiAgICAgICAgICAgICAgIAogICAgICAgICAgICBwb3NpdGlvbiA9ICgwLHYtMzApCiAgICAKICAgICAgICAgICAgdCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzgwLHBvc2l0aW9uWzFdLTMwKSxzaXplPSh3aWR0aCs2MCw1MCksc2NhbGU9MSwKICAgICAgICAgICAgICAgIGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksdGV4dD1iYS5Mc3RyKAogICAgICAgICAgICAgICAgcmVzb3VyY2U9J3NldHRpbmdzV2luZG93QWR2YW5jZWQuZW50ZXJQcm9tb0NvZGVUZXh0Jyksdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMpCiAgICAKICAgICAgICAgICAgc2VsZi5wcm9tb2NvZGVfdGV4dCA9IGJhLnRleHR3aWRnZXQocGFyZW50PWMscG9zaXRpb249KHBvc2l0aW9uWzBdKzgwLHBvc2l0aW9uWzFdLTEwMCksc2l6ZT0od2lkdGgrNjAsNTApLHNjYWxlPTEsCiAgICAgICAgICAgICAgICBlZGl0YWJsZT1UcnVlLGhfYWxpZ249ImNlbnRlciIsY29sb3I9KGJhLmFwcC51aS50aXRsZV9jb2xvciksdGV4dD0nJywgdl9hbGlnbj0iY2VudGVyIixtYXh3aWR0aD13aWR0aCoxLjMsCiAgICAgICAgICAgICAgICBtYXhfY2hhcnM9MzAsZGVzY3JpcHRpb249YmEuTHN0cihyZXNvdXJjZT0nc2V0dGluZ3NXaW5kb3dBZHZhbmNlZC5lbnRlclByb21vQ29kZVRleHQnKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLnByb21vY29kZV9idXR0b24gPSBiYS5idXR0b253aWRnZXQoCiAgICAgICAgICAgICAgICBwYXJlbnQ9Yyxwb3NpdGlvbj0ocG9zaXRpb25bMF0rMTYwLHBvc2l0aW9uWzFdLTE3MCksCiAgICAgICAgICAgICAgICBzaXplPSgyMDAsIDYwKSxzY2FsZT0xLjAsbGFiZWw9YmEuTHN0cihyZXNvdXJjZT0nc3VibWl0VGV4dCcpLAogICAgICAgICAgICAgICAgb25fYWN0aXZhdGVfY2FsbD1zZWxmLl9wcm9tb2NvZGUpCiAgICAKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWJfaGVpZ2h0ID0gMAogICAgICAgICAgICB2ID0gc3ViX2hlaWdodCAtIDU1CiAgICAgICAgICAgIHdpZHRoID0gMzAwCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmLl90YWJfY29udGFpbmVyID0gYyA9IGJhLmNvbnRhaW5lcndpZGdldChwYXJlbnQ9c2VsZi5fc2Nyb2xsd2lkZ2V0LAogICAgICAgICAgICAgICAgc2l6ZT0oc2VsZi5fc3ViX3dpZHRoLHN1Yl9oZWlnaHQpLAogICAgICAgICAgICAgICAgYmFja2dyb3VuZD1GYWxzZSxzZWxlY3Rpb25fbG9vcHNfdG9fcGFyZW50PVRydWUpCgogICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oMTEwLCB2LTIwKSxzaXplPSh3aWR0aCw1MCksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xLjQsY29sb3I9KDAuMiwxLjIsMC4yKSxoX2FsaWduPSJjZW50ZXIiLHZfYWxpZ249ImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSgiVWx0aW1hdGUgUG93ZXJ1cCBNYW5hZ2VyIHYxLjciKSxtYXh3aWR0aD13aWR0aCozMCkKCiAgICAgICAgICAgIHQgPSBiYS50ZXh0d2lkZ2V0KHBhcmVudD1jLHBvc2l0aW9uPSgxMTAsIHYtOTApLHNpemU9KHdpZHRoLDUwKSwKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTEsY29sb3I9KDEuMywwLjUsMS4wKSxoX2FsaWduPSJjZW50ZXIiLHZfYWxpZ249ImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWdldGxhbmd1YWdlKCdDcmVhdG9yJyksbWF4d2lkdGg9d2lkdGgqMzApCgogICAgICAgICAgICB0ID0gYmEudGV4dHdpZGdldChwYXJlbnQ9Yyxwb3NpdGlvbj0oMTEwLCB2LTIyMCksc2l6ZT0od2lkdGgsNTApLAogICAgICAgICAgICAgICAgICAgICAgc2NhbGU9MSxjb2xvcj0oMS4wLDEuMiwwLjMpLGhfYWxpZ249ImNlbnRlciIsdl9hbGlnbj0iY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Z2V0bGFuZ3VhZ2UoJ01vZCBJbmZvJyksbWF4d2lkdGg9d2lkdGgqMzApCiAgICAKICAgICAgICBmb3Igc2VsZWN0X3RhYixidXR0b25fdGFiIGluIHNlbGYudGFiX2J1dHRvbnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgc2VsZWN0X3RhYiA9PSB0YWI6CiAgICAgICAgICAgICAgICBiYS5idXR0b253aWRnZXQoZWRpdD1idXR0b25fdGFiLGNvbG9yPSgwLjUsMC40LDEuNSkpCiAgICAgICAgICAgIGVsc2U6IGJhLmJ1dHRvbndpZGdldChlZGl0PWJ1dHRvbl90YWIsY29sb3I9KDAuNTIsMC40OCwwLjYzKSkKCiAgICBkZWYgX2FsbF9wb3B1cChzZWxmLCB0YWc6IHN0ciwgcG9wdXA6IHN0cikgLT4gTm9uZToKICAgICAgICBjb25maWdbdGFnXSA9IHBvcHVwCiAgICAgICAgYXBnLmFwcGx5X2FuZF9jb21taXQoKQoKICAgIGRlZiBfc2V0X2NvbmNlcHQoc2VsZiwgY29uY2VwdDogc3RyKSAtPiBOb25lOgogICAgICAgIEdMT0JBTFsnQ2xzIFBvd2VydXAnXSA9IGNvbmNlcHQKCiAgICAgICAgaWYgY29uY2VwdCA9PSAnUmVzZXQnOgogICAgICAgICAgICBmb3IgcG93ZXIsIGRlZmx0IGluIGRlZmF1bHRfcG93ZXJ1cHMoKS5pdGVtcygpOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gZGVmbHQKICAgICAgICBlbGlmIGNvbmNlcHQgPT0gJ05vdGhpbmcnOgogICAgICAgICAgICBmb3IgcG93ZXIgaW4gZGVmYXVsdF9wb3dlcnVwcygpOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gMAogICAgICAgIGVsaWYgY29uY2VwdCA9PSAnT25seSBCb21icyc6CiAgICAgICAgICAgIGZvciBwb3dlciwgZGVmbHQgaW4gZGVmYXVsdF9wb3dlcnVwcygpLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiAnQm9tYnMnIG5vdCBpbiBwb3dlcjoKICAgICAgICAgICAgICAgICAgICBwb3dlcnVwc1twb3dlcl0gPSAwCiAgICAgICAgICAgICAgICBlbHNlOiBwb3dlcnVwc1twb3dlcl0gPSAzCiAgICAgICAgZWxpZiBjb25jZXB0ID09ICdPbmx5IEl0ZW1zJzoKICAgICAgICAgICAgZm9yIHBvd2VyLCBkZWZsdCBpbiBkZWZhdWx0X3Bvd2VydXBzKCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmICdCb21icycgaW4gcG93ZXI6CiAgICAgICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJdID0gMAogICAgICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJdID0gZGVmbHQKICAgICAgICBlbGlmIGNvbmNlcHQgPT0gJ05ldyc6CiAgICAgICAgICAgIGRlZmF1bHRfcG93ZXIgPSBkZWZhdWx0X3Bvd2VydXBzKCkKICAgICAgICAgICAgbmV3X3Bvd2VydXBzID0gbGlzdChkZWZhdWx0X3Bvd2VyKVs5Ol0KICAgICAgICAgICAgZm9yIHBvd2VyLCBkZWZsdCBpbiBkZWZhdWx0X3Bvd2VyLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBwb3dlciBub3QgaW4gbmV3X3Bvd2VydXBzOgogICAgICAgICAgICAgICAgICAgIHBvd2VydXBzW3Bvd2VyXSA9IDAKICAgICAgICAgICAgICAgIGVsc2U6IHBvd2VydXBzW3Bvd2VyXSA9IGRlZmx0CgogICAgICAgIGlmIG5vdCBTVE9SRVsnQnV5IEZpcmVib21icyddOgogICAgICAgICAgICBwb3dlcnVwc1snRmlyZSBCb21icyddID0gMAogICAgICAgICAgICAKICAgICAgICBzZWxmLl9zZXRfdGFiKCdBY3Rpb24gMScpCgogICAgZGVmIHRhbmtfc2hpZWxkX3BlcmNlbnRhZ2Uoc2VsZiwgdGFnKToKICAgICAgICBtYXggPSA5NgogICAgICAgIG1pbiA9IDQwCiAgICAgICAgaWYgdGFnID09ICdJbmNyZW1lbnQnOgogICAgICAgICAgICBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddICs9IDEKICAgICAgICAgICAgaWYgY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXSA+IG1heDoKICAgICAgICAgICAgICAgIGNvbmZpZ1snVGFuayBTaGllbGQgUFRHJ10gPSBtaW4KICAgICAgICBlbGlmIHRhZyA9PSAnRGVjcmVtZW50JzoKICAgICAgICAgICAgY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXSAtPSAxCiAgICAgICAgICAgIGlmIGNvbmZpZ1snVGFuayBTaGllbGQgUFRHJ10gPCBtaW46CiAgICAgICAgICAgICAgICBjb25maWdbJ1RhbmsgU2hpZWxkIFBURyddID0gbWF4CiAgICAgICAgICAgICAgICAKICAgICAgICBwb3JjZW50YWplID0gY29uZmlnWydUYW5rIFNoaWVsZCBQVEcnXQogICAgICAgIGlmIHBvcmNlbnRhamUgPiA1OTogY29sb3IgPSAoMCwxLDApCiAgICAgICAgZWxpZiBwb3JjZW50YWplIDwgNDA6IGNvbG9yID0gKDEsMSwwKQogICAgICAgIGVsc2U6IGNvbG9yID0gKDAsMSwwLjgpCiAgICAgICAgYmEudGV4dHdpZGdldChlZGl0PXNlbGYudGFua190ZXh0LAogICAgICAgICAgICB0ZXh0PXN0cihwb3JjZW50YWplKSsnJScsY29sb3I9Y29sb3IpCgogICAgZGVmIGhlYWx0aF9kYW1hZ2VfcGVyY2VudGFnZShzZWxmLCB0YWcpOgogICAgICAgIG1heCA9IDgwCiAgICAgICAgbWluID0gMzUKICAgICAgICBpZiB0YWcgPT0gJ0luY3JlbWVudCc6CiAgICAgICAgICAgIGNvbmZpZ1snSGVhbGluZyBEYW1hZ2UgUFRHJ10gKz0gMQogICAgICAgICAgICBpZiBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddID4gbWF4OgogICAgICAgICAgICAgICAgY29uZmlnWydIZWFsaW5nIERhbWFnZSBQVEcnXSA9IG1pbgogICAgICAgIGVsaWYgdGFnID09ICdEZWNyZW1lbnQnOgogICAgICAgICAgICBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddIC09IDEKICAgICAgICAgICAgaWYgY29uZmlnWydIZWFsaW5nIERhbWFnZSBQVEcnXSA8IG1pbjoKICAgICAgICAgICAgICAgIGNvbmZpZ1snSGVhbGluZyBEYW1hZ2UgUFRHJ10gPSBtYXgKICAgICAgICAgICAgICAgIAogICAgICAgIHBvcmNlbnRhamUgPSBjb25maWdbJ0hlYWxpbmcgRGFtYWdlIFBURyddCiAgICAgICAgaWYgcG9yY2VudGFqZSA+IDU5OiBjb2xvciA9ICgwLDEsMCkKICAgICAgICBlbGlmIHBvcmNlbnRhamUgPCA0MDogY29sb3IgPSAoMSwxLDApCiAgICAgICAgZWxzZTogY29sb3IgPSAoMCwxLDAuOCkKICAgICAgICBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi5obGdfdGV4dCwKICAgICAgICAgICAgdGV4dD1zdHIocG9yY2VudGFqZSkrJyUnLGNvbG9yPWNvbG9yKQoKICAgIGRlZiBhcHBlcmFuY2VfcG93ZXJ1cHMoc2VsZiwgcG93ZXJ1cDogc3RyLCBJRDogc3RyKToKICAgICAgICBtYXggPSA3CiAgICAgICAgaWYgSUQgPT0gIi0iOgogICAgICAgICAgICBpZiBwb3dlcnVwc1twb3dlcnVwXSA9PSAwOgogICAgICAgICAgICAgICAgcG93ZXJ1cHNbcG93ZXJ1cF0gPSBtYXgKICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJ1cF0gLT0gMQogICAgICAgIGVsaWYgSUQgPT0gIisiOgogICAgICAgICAgICBpZiBwb3dlcnVwc1twb3dlcnVwXSA9PSBtYXg6CiAgICAgICAgICAgICAgICBwb3dlcnVwc1twb3dlcnVwXSA9IDAKICAgICAgICAgICAgZWxzZTogcG93ZXJ1cHNbcG93ZXJ1cF0gKz0gMQogICAgICAgIGVudW0gPSBwb3dlcnVwc1twb3dlcnVwXQogICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLmxpc3Rwb3dlcltwb3dlcnVwXSwKICAgICAgICAgICAgICAgICAgICAgIHRleHQ9c3RyKHBvd2VydXBzW3Bvd2VydXBdKSwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPWNsc19wb3dfY29sb3IoKVtlbnVtXSkKICAgICAgICAgICAKICAgIGRlZiBfcG93ZXJ1cHNfc2NhbGUoc2VsZiwgSUQ6IHN0cik6CiAgICAgICAgbWF4ID0gMS41CiAgICAgICAgbWluID0gMC41CiAgICAgICAgc2MgPSAwLjEKICAgICAgICBpZiBJRCA9PSAiLSI6CiAgICAgICAgICAgIGlmIGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddIDwgKG1pbiswLjEpOgogICAgICAgICAgICAgICAgY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gPSBtYXgKICAgICAgICAgICAgZWxzZTogY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gLT0gc2MKICAgICAgICBlbGlmIElEID09ICIrIjoKICAgICAgICAgICAgaWYgY29uZmlnWydQb3dlcnVwIFNjYWxlJ10gPiAobWF4LTAuMSk6CiAgICAgICAgICAgICAgICBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSA9IG1pbgogICAgICAgICAgICBlbHNlOiBjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSArPSBzYwogICAgICAgIGNvbmZpZ1snUG93ZXJ1cCBTY2FsZSddID0gcm91bmQoY29uZmlnWydQb3dlcnVwIFNjYWxlJ10sMSkKICAgICAgICBiYS50ZXh0d2lkZ2V0KGVkaXQ9c2VsZi50eHRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXN0cihjb25maWdbJ1Bvd2VydXAgU2NhbGUnXSkpCiAgICAgICAgICAgCiAgICBkZWYgdG90YWxfcGVyY2VudGFnZShzZWxmLCBwb3dlcik6CiAgICAgICAgdG90YWwgPSAwCiAgICAgICAgcHcgPSBwb3dlcnVwc1twb3dlcl0KICAgICAgICBmb3IgaSxpMiBpbiBwb3dlcnVwcy5pdGVtcygpOgogICAgICAgICAgICB0b3RhbCArPSBpMgogICAgICAgIGlmIHRvdGFsID09IDA6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCh0b3RhbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwdGcgPSAoMTAwKnB3L3RvdGFsKQogICAgICAgICAgICByZXN1bHQgPSByb3VuZChwdGcsMikKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgICAgIAogICAgZGVmIHN0b3JlX3JlZnJlc2goc2VsZiwgdGFnOiBzdHIpOgogICAgICAgIGlmIHRhZyA9PSAnQnV5IEZpcmVib21icyc6CiAgICAgICAgICAgIHBvd2VydXBzWydGaXJlIEJvbWJzJ10gPSAzCiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9wb3dlcl9saXN0LmFwcGVuZCgnRmlyZSBCb21icycpCiAgICAgICAgc2VsZi5fc2V0X3RhYignQWN0aW9uIDQnKQogICAgICAgICAgIAogICAgZGVmIF9idXlfb2JqZWN0KHNlbGYsIHRhZzogc3RyLCBwcmljZTogaW50KToKICAgICAgICBzdG9yZSA9IEJlYXJTdG9yZSh2YWx1ZT10YWcsIHByaWNlPXByaWNlLAogICAgICAgICAgICAgICAgY2FsbGJhY2s9YmEuQ2FsbChzZWxmLnN0b3JlX3JlZnJlc2gsdGFnKSkKICAgICAgICBzdG9yZS5idXkoKQogICAgICAgICAgIAogICAgZGVmIF9wcm9tb2NvZGUoc2VsZik6CiAgICAgICAgY29kZSA9IGJhLnRleHR3aWRnZXQocXVlcnk9c2VsZi5wcm9tb2NvZGVfdGV4dCkKICAgICAgICBwcm9tbyA9IFByb21vQ29kZShjb2RlPWNvZGUpCiAgICAgICAgcHJvbW8uY29kZV9jb25maXJtYXRpb24oKQogICAgICAgIGJhLnRleHR3aWRnZXQoZWRpdD1zZWxmLnByb21vY29kZV90ZXh0LHRleHQ9IiIpCiAgICAgICAgICAgCiAgICBkZWYgX3N3aXRjaGVzKHNlbGYsdGFnLG0pOgogICAgICAgIGNvbmZpZ1t0YWddID0gRmFsc2UgaWYgbT09MCBlbHNlIFRydWUKICAgICAgICBhcGcuYXBwbHlfYW5kX2NvbW1pdCgpCiAgICAgICAgICAgCiAgICBkZWYgX3BlcmNlbnRhZ2Vfd2luZG93KHNlbGYpOgogICAgICAgIHNlbGYuX3NldF90YWIoJ1BlcmNlbnRhZ2UnKQogICAgICAgICAgIAogICAgZGVmIF9iYWNrKHNlbGYpOgogICAgICAgIGJhLmNvbnRhaW5lcndpZGdldChlZGl0PXNlbGYuX3Jvb3Rfd2lkZ2V0LHRyYW5zaXRpb249J291dF9sZWZ0JykKICAgICAgICBicm93c2VyLlByb2ZpbGVCcm93c2VyV2luZG93KCkK").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