@py -3 -x "%~f0" & if errorlevel 1 pause & exit /b
"""Set up a per-user Windows relay from the files carried by the launcher."""
import base64
import hashlib
import json
import os
from pathlib import Path
import platform
import subprocess
import sys
import venv
import webbrowser
from urllib.request import build_opener, ProxyHandler


APP_URL = 'http://127.0.0.1:8765/'


def relay_ready():
    try:
        with build_opener(ProxyHandler({})).open(APP_URL + 'api/options', timeout=1) as response:
            return json.load(response).get('app') == 'iermu-cam'
    except (OSError, ValueError):
        return False


def run(payload):
    if os.name != 'nt' or sys.version_info < (3, 10) or platform.machine().lower() not in ('amd64', 'x86_64'):
        raise SystemExit('Install Python 3.10 or newer for Windows x64.')
    if relay_ready():
        webbrowser.open(APP_URL)
        return 0

    content = base64.b64decode(payload, validate=True)
    version = hashlib.sha256(content).hexdigest()[:16]
    folder = Path(os.environ['LOCALAPPDATA']) / 'IERMU Cam' / version
    folder.mkdir(parents=True, exist_ok=True)
    lock_path = folder / 'setup.lock'
    with lock_path.open('a+b') as lock:
        import msvcrt
        lock.seek(0)
        msvcrt.locking(lock.fileno(), msvcrt.LK_NBLCK, 1)
        for name, text in json.loads(content).items():
            path = folder / name
            path.parent.mkdir(parents=True, exist_ok=True)
            path.write_bytes(text.encode('utf-8'))
        python = folder / '.venv' / 'Scripts' / 'python.exe'
        ready = folder / 'dependencies.ready'
        if not python.is_file() or not ready.is_file():
            venv.EnvBuilder(with_pip=True).create(folder / '.venv')
            subprocess.run([
                str(python), '-m', 'pip', '--isolated', 'install',
                '--disable-pip-version-check', '--no-cache-dir',
                '--index-url', 'https://pypi.org/simple', '--only-binary=:all:', '--no-deps', '--require-hashes',
                '-r', str(folder / 'requirements.txt'),
            ], check=True)
            ready.touch()
    return subprocess.call([str(python), str(folder / 'iermu_web.py'), '--open'], cwd=folder)


if __name__ == '__main__':
    raise SystemExit(run('eyJjbXNfcmVjb3ZlcnkucHkiOiAiXCJcIlwiQm91bmRlZCByZXRyeSBwb2xpY3kuIE5vIGNhbWVyYSBjb21tYW5kcyBhbmQgbm8gYmFja2dyb3VuZCBsaWZldGltZSBvZiBpdHMgb3duLlwiXCJcIlxuaW1wb3J0IHRpbWVcblxuXG5NQVhfUkVUUklFUyA9IDNcblJFQ09WRVJFRF9WSURFT19TRUNPTkRTID0gNjAuMFxuXG5cbmRlZiBzdXBlcnZpc2UoYXR0ZW1wdCwgc3RvcCwgc2Vjb25kcywgbm90aWZ5LCAqLCBjbG9jaz10aW1lLm1vbm90b25pYywgd2FpdD1Ob25lKTpcbiAgICBpZiBub3QgMCA8IHNlY29uZHMgPD0gMTgwMDpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxheWJhY2sgZHVyYXRpb24gb3V0IG9mIGJvdW5kcycpXG4gICAgd2FpdCA9IHdhaXQgb3Igc3RvcC53YWl0XG4gICAgZGVhZGxpbmUgPSBjbG9jaygpICsgc2Vjb25kc1xuICAgIHJlcG9ydHMgPSBbXVxuICAgIGZyYW1lcyA9IDBcbiAgICByZXRyeV9udW1iZXIgPSAwXG4gICAgcmVhc29uID0gJ1RJTUVfTElNSVQnXG4gICAgd2hpbGUgbm90IHN0b3AuaXNfc2V0KCkgYW5kIGNsb2NrKCkgPCBkZWFkbGluZTpcbiAgICAgICAgbm90aWZ5KCfmjqXntprkuK0nIGlmIG5vdCByZXBvcnRzIGVsc2UgZiflho3mjqXntprkuK3vvIh7cmV0cnlfbnVtYmVyfS97TUFYX1JFVFJJRVN977yJJylcbiAgICAgICAgcmVwb3J0ID0gYXR0ZW1wdChkZWFkbGluZSAtIGNsb2NrKCkpXG4gICAgICAgIHJlcG9ydHMuYXBwZW5kKHJlcG9ydClcbiAgICAgICAgZnJhbWVzICs9IHJlcG9ydC5nZXQoJ2RlY29kZWRfZnJhbWVzJywgMClcbiAgICAgICAgaWYgc3RvcC5pc19zZXQoKTpcbiAgICAgICAgICAgIHJlYXNvbiA9ICdTVE9QUEVEJzsgYnJlYWtcbiAgICAgICAgaWYgY2xvY2soKSA+PSBkZWFkbGluZSBvciByZXBvcnQuZ2V0KCdyZWFzb24nKSA9PSAnVElNRV9MSU1JVCc6XG4gICAgICAgICAgICByZWFzb24gPSAnVElNRV9MSU1JVCc7IGJyZWFrXG4gICAgICAgIGlmIG5vdCBmcmFtZXMgb3Igbm90IHJlcG9ydC5nZXQoJ3JlY292ZXJhYmxlJywgRmFsc2UpOlxuICAgICAgICAgICAgcmVhc29uID0gcmVwb3J0LmdldCgncmVhc29uJywgJ0VSUk9SJyk7IGJyZWFrXG4gICAgICAgIGZpcnN0X2ZyYW1lID0gcmVwb3J0LmdldCgnZmlyc3RfZGVjb2RlZF9mcmFtZV9zJylcbiAgICAgICAgbGFzdF9mcmFtZSA9IHJlcG9ydC5nZXQoJ2xhc3RfZGVjb2RlZF9mcmFtZV9zJylcbiAgICAgICAgaWYgZmlyc3RfZnJhbWUgaXMgbm90IE5vbmUgYW5kIGxhc3RfZnJhbWUgaXMgbm90IE5vbmUgYW5kIGxhc3RfZnJhbWUgLSBmaXJzdF9mcmFtZSA+PSBSRUNPVkVSRURfVklERU9fU0VDT05EUzpcbiAgICAgICAgICAgIHJldHJ5X251bWJlciA9IDBcbiAgICAgICAgaWYgcmV0cnlfbnVtYmVyID49IE1BWF9SRVRSSUVTOlxuICAgICAgICAgICAgcmVhc29uID0gJ1JFVFJZX0xJTUlUJzsgYnJlYWtcbiAgICAgICAgcmV0cnlfbnVtYmVyICs9IDFcbiAgICAgICAgaWYgcmVwb3J0LmdldCgncmVhc29uJykgPT0gJ05PX0RBVEEnOlxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgbm90aWZ5KGYn5pig5YOP44GM6YCU5YiH44KM44G+44GX44Gf44CCNeenkuW+jOOBq+WGjeaOpee2muOBl+OBvuOBme+8iHtyZXRyeV9udW1iZXJ9L3tNQVhfUkVUUklFU33vvInjgIInKVxuICAgICAgICBpZiB3YWl0KG1pbig1LjAsIG1heCgwLjAsIGRlYWRsaW5lLWNsb2NrKCkpKSk6XG4gICAgICAgICAgICByZWFzb24gPSAnU1RPUFBFRCc7IGJyZWFrXG4gICAgaWYgc3RvcC5pc19zZXQoKTogcmVhc29uID0gJ1NUT1BQRUQnXG4gICAgcmV0dXJuIHsncmVhc29uJzogcmVhc29uLCAnYXR0ZW1wdHMnOiByZXBvcnRzLCAncmV0cmllcyc6IG1heCgwLCBsZW4ocmVwb3J0cyktMSksXG4gICAgICAgICAgICAnZGVjb2RlZF9mcmFtZXMnOiBmcmFtZXMsICdmaW5hbCc6IHJlcG9ydHNbLTFdIGlmIHJlcG9ydHMgZWxzZSB7fX1cbiIsICJpZXJtdV9jbXMucHkiOiAiXCJcIlwiTUFDLXZlcmlmaWVkIENNUyBsaXZlLXZpZXcgdHJhbnNwb3J0IGZvciBJRVJNVSBjYW1lcmFzLlwiXCJcIlxuZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlciwgRXhpdFN0YWNrXG5mcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3NcbmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsXG5pbXBvcnQgc29ja2V0XG5pbXBvcnQgc3RydWN0XG5pbXBvcnQgdGltZVxuXG5pbXBvcnQgaW1hZ2Vpb19mZm1wZWdcblxuZnJvbSBpZXJtdV9uZXR3b3JrIGltcG9ydCBxdWVyeV9tYWNcbmZyb20gaWVybXVfcHJvdG9jb2wgaW1wb3J0IGxpdmVfcmVxdWVzdCwgcXVlcnlcblxuXG5BUlBfTk9fUkVQTFkgPSA2NyAgIyBXaW5kb3dzIFNlbmRBUlA6IEVSUk9SX0JBRF9ORVRfTkFNRVxuUkVDT1ZFUllfV0FJVF9TRUNPTkRTID0gMTEwXG5cblxuY2xhc3MgSWRlbnRpdHlFcnJvcihWYWx1ZUVycm9yKTpcbiAgICBwYXNzXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIENhbWVyYVJvdXRlOlxuICAgIGlwOiBzdHJcbiAgICBtYWM6IHN0clxuICAgIHNvdXJjZTogc3RyXG4gICAgaW50ZXJmYWNlOiBpbnRcblxuXG5kZWYgZGVjb2Rlcl9jb21tYW5kKCosIHF1YWxpdHk9J2xvdycpOlxuICAgICMgSEQgY2FuIHN0YXJ0IHdpdGggYXVkaW8gYmVmb3JlIHRoZSBmaXJzdCB2aWRlbyBQRVMuXG4gICAgcHJvYmVfc2l6ZSA9ICc2NTUzNicgaWYgcXVhbGl0eSA9PSAnaGQnIGVsc2UgJzMyJ1xuICAgIHJldHVybiBbaW1hZ2Vpb19mZm1wZWcuZ2V0X2ZmbXBlZ19leGUoKSwgJy1oaWRlX2Jhbm5lcicsICctbG9nbGV2ZWwnLCAnd2FybmluZycsXG4gICAgICAgICAgICAnLW5vc3RkaW4nLCAnLXByb2Jlc2l6ZScsIHByb2JlX3NpemUsICctYW5hbHl6ZWR1cmF0aW9uJywgJzAnLFxuICAgICAgICAgICAgJy1mJywgJ21wZWcnLCAnLXRocmVhZHMnLCAnMScsICctaScsICdwaXBlOjAnLCAnLW1hcCcsICcwOnY6MCcsICctYW4nLCAnLXZzeW5jJywgJzAnLFxuICAgICAgICAgICAgJy1jOnYnLCAnbWpwZWcnLCAnLXE6dicsICc0JywgJy1mJywgJ2ltYWdlMnBpcGUnLCAncGlwZToxJ11cblxuXG5kZWYgX2Nvbm5lY3QoY2FtZXJhLCBwb3J0LCB0aW1lb3V0LCBzdGFjayk6XG4gICAgc29jayA9IHNvY2tldC5zb2NrZXQoKVxuICAgIHN0YWNrLmNhbGxiYWNrKHNvY2suY2xvc2UpXG4gICAgc29jay5zZXR0aW1lb3V0KHRpbWVvdXQpXG4gICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5JUFBST1RPX0lQLCAzMSwgc3RydWN0LnBhY2soJyFJJywgY2FtZXJhLmludGVyZmFjZSkpXG4gICAgc29jay5iaW5kKChjYW1lcmEuc291cmNlLCAwKSlcbiAgICBzb2NrLmNvbm5lY3QoKGNhbWVyYS5pcCwgcG9ydCkpXG4gICAgcmV0dXJuIHNvY2tcblxuXG5kZWYgX2lkZW50aWZ5KGNvbnRyb2wsIGV4cGVjdGVkX21hYywgZXhjaGFuZ2UsIGNoZWNrX3N0b3ApOlxuICAgIGV4Y2hhbmdlKGNvbnRyb2wsIDUsIDE3KVxuICAgIGNoZWNrX3N0b3AoKVxuICAgICMgTGVnYWN5IGxvY2FsIGNhbWVyYSBwcm90b2NvbCBjcmVkZW50aWFscywgaW5kZXBlbmRlbnQgb2YgY2xvdWQgYWNjb3VudHMuXG4gICAgbG9naW4gPSBleGNoYW5nZShjb250cm9sLCA2OSwgNiwgYic4ODg4ODg4OCcubGp1c3QoMjAsIGInXFwwJykgKyBiJ2NtczM1MTgnLmxqdXN0KDIwLCBiJ1xcMCcpKVxuICAgIGlmIGxlbihsb2dpbikgIT0gNDpcbiAgICAgICAgcmFpc2UgSWRlbnRpdHlFcnJvcign6KqN6Ki85b+c562U44KS56K66KqN44Gn44GN44G+44Gb44KTJylcbiAgICBjaGVja19zdG9wKClcbiAgICBpbmZvID0gZXhjaGFuZ2UoY29udHJvbCwgNzQsIDYzKVxuICAgIGlmIGxlbihpbmZvKSA8IDYgb3IgaW5mb1s6Nl0uaGV4KCc6JykgIT0gZXhwZWN0ZWRfbWFjOlxuICAgICAgICByYWlzZSBJZGVudGl0eUVycm9yKCflr77osaHjga7jgqvjg6Hjg6njgpLnorroqo3jgafjgY3jgb7jgZvjgpPvvIjmnKzkvZPmg4XloLHvvIknKVxuICAgIHJldHVybiBpbnQuZnJvbV9ieXRlcyhsb2dpbiwgJ2JpZycpXG5cblxuZGVmIHZlcmlmeV9jYW1lcmEoY2FtZXJhKTpcbiAgICBcIlwiXCJDb25maXJtIGEgZGlzY292ZXJ5IGNhbmRpZGF0ZSB1c2luZyBvbmx5IGxvY2FsIGlkZW50aWZpY2F0aW9uIGNvbW1hbmRzLlwiXCJcIlxuICAgIHRyeTpcbiAgICAgICAgd2l0aCBFeGl0U3RhY2soKSBhcyBzdGFjazpcbiAgICAgICAgICAgIGNvbnRyb2wgPSBfY29ubmVjdChjYW1lcmEsIDMzNTcsIDAuNiwgc3RhY2spXG4gICAgICAgICAgICBleGNoYW5nZSA9IHBhcnRpYWwocXVlcnksIGRlYWRsaW5lPXRpbWUubW9ub3RvbmljKCkgKyAxLjIpXG4gICAgICAgICAgICBfaWRlbnRpZnkoY29udHJvbCwgY2FtZXJhLm1hYywgZXhjaGFuZ2UsIGxhbWJkYTogTm9uZSlcbiAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IsIEVPRkVycm9yKTpcbiAgICAgICAgcmV0dXJuIEZhbHNlXG4gICAgcmV0dXJuIFRydWVcblxuXG5AY29udGV4dG1hbmFnZXJcbmRlZiBjb25uZWN0aW9uKGNhbWVyYSwgbWF0cml4PUZhbHNlLCAqLCBzdG9wPU5vbmUsIHF1YWxpdHk9J2xvdycsIHJlY292ZXJ5X3dhaXQ9MC4wLFxuICAgICAgICAgICAgICAgYXJwPXF1ZXJ5X21hYywgZXhjaGFuZ2U9cXVlcnksIGJ1aWxkX3JlcXVlc3Q9bGl2ZV9yZXF1ZXN0KTpcbiAgICBpZiBub3QgMCA8PSByZWNvdmVyeV93YWl0IDw9IFJFQ09WRVJZX1dBSVRfU0VDT05EUyBvciAocmVjb3Zlcnlfd2FpdCBhbmQgc3RvcCBpcyBOb25lKTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBjYW1lcmEgcmVjb3Zlcnkgd2FpdCcpXG5cbiAgICBkZWYgY2hlY2tfc3RvcCgpOlxuICAgICAgICBpZiBzdG9wIGlzIG5vdCBOb25lIGFuZCBzdG9wLmlzX3NldCgpOlxuICAgICAgICAgICAgcmFpc2UgSW50ZXJydXB0ZWRFcnJvcignUGxheWJhY2sgc3RvcHBlZCcpXG5cbiAgICBkZWFkbGluZSA9IHRpbWUubW9ub3RvbmljKCkgKyByZWNvdmVyeV93YWl0XG4gICAgd2l0aCBFeGl0U3RhY2soKSBhcyBzdGFjazpcbiAgICAgICAgZGVmIGNvbm5lY3QocG9ydCwgdGltZW91dD00LjApOlxuICAgICAgICAgICAgY2hlY2tfc3RvcCgpXG4gICAgICAgICAgICB3aXRoIEV4aXRTdGFjaygpIGFzIHBlbmRpbmc6XG4gICAgICAgICAgICAgICAgc29jayA9IF9jb25uZWN0KGNhbWVyYSwgcG9ydCwgdGltZW91dCwgcGVuZGluZylcbiAgICAgICAgICAgICAgICBzdGFjay5lbnRlcl9jb250ZXh0KHBlbmRpbmcucG9wX2FsbCgpKVxuICAgICAgICAgICAgcmV0dXJuIHNvY2tcblxuICAgICAgICB3aGlsZSBUcnVlOlxuICAgICAgICAgICAgY2hlY2tfc3RvcCgpXG4gICAgICAgICAgICBuZXh0X3Byb2JlID0gdGltZS5tb25vdG9uaWMoKSArIDUuMFxuICAgICAgICAgICAgY29kZSwgbWFjID0gYXJwKGNhbWVyYS5zb3VyY2UsIHRhcmdldF9pcD1jYW1lcmEuaXApXG4gICAgICAgICAgICBpZiAoY29kZSwgbWFjKSA9PSAoMCwgY2FtZXJhLm1hYyk6XG4gICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0ID0gbWluKDQuMCwgZGVhZGxpbmUgLSB0aW1lLm1vbm90b25pYygpKSBpZiByZWNvdmVyeV93YWl0IGVsc2UgNC4wXG4gICAgICAgICAgICAgICAgaWYgY29ubmVjdF90aW1lb3V0IDw9IDA6XG4gICAgICAgICAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRFcnJvcignQ2FtZXJhIHJlY292ZXJ5IHdhaXQgZXhwaXJlZCcpXG4gICAgICAgICAgICAgICAgdHJ5OlxuICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY29ubmVjdCgzMzU3LCBjb25uZWN0X3RpbWVvdXQpXG4gICAgICAgICAgICAgICAgZXhjZXB0IChDb25uZWN0aW9uUmVmdXNlZEVycm9yLCBUaW1lb3V0RXJyb3IpIGFzIGVycm9yOlxuICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVjb3Zlcnlfd2FpdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlXG4gICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlID0gZXJyb3JcbiAgICAgICAgICAgICAgICBlbHNlOlxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZWxzZTpcbiAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZSA9IElkZW50aXR5RXJyb3IoJ+WvvuixoeOBruOCq+ODoeODqeOCkueiuuiqjeOBp+OBjeOBvuOBm+OCk++8iEFSUO+8iScpXG4gICAgICAgICAgICAgICAgaWYgbm90IHJlY292ZXJ5X3dhaXQgb3IgKGNvZGUsIG1hYykgIT0gKEFSUF9OT19SRVBMWSwgTm9uZSk6XG4gICAgICAgICAgICAgICAgICAgIHJhaXNlIHVuYXZhaWxhYmxlXG4gICAgICAgICAgICBub3cgPSB0aW1lLm1vbm90b25pYygpXG4gICAgICAgICAgICBpZiBub3cgPj0gZGVhZGxpbmU6XG4gICAgICAgICAgICAgICAgcmFpc2UgdW5hdmFpbGFibGVcbiAgICAgICAgICAgIHN0b3Aud2FpdChtYXgoMC4wLCBtaW4obmV4dF9wcm9iZSwgZGVhZGxpbmUpIC0gbm93KSlcbiAgICAgICAgICAgIGNoZWNrX3N0b3AoKVxuICAgICAgICAgICAgaWYgdGltZS5tb25vdG9uaWMoKSA+PSBkZWFkbGluZTpcbiAgICAgICAgICAgICAgICByYWlzZSB1bmF2YWlsYWJsZVxuXG4gICAgICAgIGNoZWNrX3N0b3AoKVxuICAgICAgICBpZiByZWNvdmVyeV93YWl0OlxuICAgICAgICAgICAgY29udHJvbC5zZXR0aW1lb3V0KDQuMClcbiAgICAgICAgc2Vzc2lvbiA9IF9pZGVudGlmeShjb250cm9sLCBjYW1lcmEubWFjLCBleGNoYW5nZSwgY2hlY2tfc3RvcClcbiAgICAgICAgcmVxdWVzdCA9IGJ1aWxkX3JlcXVlc3Qoc2Vzc2lvbiwgbWF0cml4PW1hdHJpeCwgcXVhbGl0eT1xdWFsaXR5KVxuICAgICAgICBkYXRhID0gY29ubmVjdCgzMzU2KVxuICAgICAgICBjaGVja19zdG9wKClcbiAgICAgICAgZGF0YS5zZW5kYWxsKHJlcXVlc3QpXG4gICAgICAgIHlpZWxkIGRhdGFcblxuXG5kZWYgcmVjZWl2ZShzb2NrLCBjb25zdW1lLCBzdG9wLCBzZWNvbmRzLCBieXRlX2xpbWl0PU5vbmUsICosIHRpbWluZ3M9Tm9uZSwgc3RhdHM9Tm9uZSwgaWRsZV90aW1lb3V0PU5vbmUpOlxuICAgIFwiXCJcIktlZXAgZmluYWwgcHJvZ3Jlc3MgaW4gb3B0aW9uYWwgc3RhdHMgZXZlbiBvbiBlcnJvcjsgcmUtcmFpc2UgdGhhdCBlcnJvci5cblxuICAgIFRpbWVzIGFyZSBhcHBsaWNhdGlvbiByZWN2IHRpbWVzLCBub3QgTklDIG9yIGRlY29kZWQtZnJhbWUgdGltZXN0YW1wcy5cbiAgICBjb25zdW1lZF9ieXRlcyBjb3VudHMgb25seSBjaHVua3Mgd2hvc2UgY29uc3VtZSBjYWxsYmFjayByZXR1cm5lZCBub3JtYWxseS5cbiAgICBSdW5zIG92ZXIgMzAgbWludXRlcyB1c2UgdGhlIGxhcmdlciBib3VuZGVkIGJ1ZGdldCBmb3IgdGhlIGRpcmVjdCBBUCBjb21wYXJpc29uLlxuICAgIFwiXCJcIlxuICAgIG1heF9ieXRlcyA9ICgxMjggaWYgc2Vjb25kcyA8PSAxODAwIGVsc2UgMjU2KSAqIDEwMjQgKiAxMDI0XG4gICAgaWYgYnl0ZV9saW1pdCBpcyBOb25lOlxuICAgICAgICBieXRlX2xpbWl0ID0gbWF4X2J5dGVzXG4gICAgaWYgbm90IDAgPCBzZWNvbmRzIDw9IDI0MDAgb3Igbm90IDAgPCBieXRlX2xpbWl0IDw9IG1heF9ieXRlczpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2FwdHVyZSBib3VuZHMgZXhjZWVkZWQnKVxuICAgIGlmIGlkbGVfdGltZW91dCBpcyBub3QgTm9uZSBhbmQgaWRsZV90aW1lb3V0IDw9IDA6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0lkbGUgdGltZW91dCBtdXN0IGJlIHBvc2l0aXZlJylcbiAgICBzb2NrLnNldHRpbWVvdXQobWluKDAuNSwgaWRsZV90aW1lb3V0KSBpZiBpZGxlX3RpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSAwLjUpXG4gICAgYmVnaW4gPSB0aW1lLm1vbm90b25pYygpXG4gICAgdG90YWwgPSAwXG4gICAgY29uc3VtZWQgPSAwXG4gICAgZmlyc3QgPSBOb25lXG4gICAgbGFzdCA9IE5vbmVcbiAgICBtYXhfZ2FwID0gTm9uZVxuICAgIHJlYXNvbiA9ICdUSU1FX0xJTUlUJ1xuICAgIHRpbWluZ19zYW1wbGVzX2Ryb3BwZWQgPSAwXG4gICAgcGhhc2UgPSAnUkVDRUlWRV9FUlJPUidcbiAgICB0cnk6XG4gICAgICAgIHdoaWxlIHRpbWUubW9ub3RvbmljKCktYmVnaW4gPCBzZWNvbmRzOlxuICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKTpcbiAgICAgICAgICAgICAgICByZWFzb24gPSAnU1RPUFBFRCc7IGJyZWFrXG4gICAgICAgICAgICBpZiBpZGxlX3RpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUubW9ub3RvbmljKCktYmVnaW4tKGxhc3Qgb3IgMC4wKSA+PSBpZGxlX3RpbWVvdXQ6XG4gICAgICAgICAgICAgICAgcmVhc29uID0gJ05PX0RBVEEnOyBicmVha1xuICAgICAgICAgICAgaWYgdG90YWwgPj0gYnl0ZV9saW1pdDpcbiAgICAgICAgICAgICAgICByZWFzb24gPSAnQllURV9MSU1JVCc7IGJyZWFrXG4gICAgICAgICAgICBwaGFzZSA9ICdSRUNFSVZFX0VSUk9SJ1xuICAgICAgICAgICAgdHJ5OlxuICAgICAgICAgICAgICAgIGJsb2NrID0gc29jay5yZWN2KG1pbig2NTUzNiwgYnl0ZV9saW1pdC10b3RhbCkpXG4gICAgICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIGlmIG5vdCBibG9jazpcbiAgICAgICAgICAgICAgICByZWFzb24gPSAnUEVFUl9DTE9TRUQnOyBicmVha1xuICAgICAgICAgICAgbm93ID0gdGltZS5tb25vdG9uaWMoKS1iZWdpblxuICAgICAgICAgICAgaWYgZmlyc3QgaXMgTm9uZTpcbiAgICAgICAgICAgICAgICBmaXJzdCA9IG5vd1xuICAgICAgICAgICAgaWYgbGFzdCBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgICAgICBnYXAgPSBub3ctbGFzdFxuICAgICAgICAgICAgICAgIG1heF9nYXAgPSBnYXAgaWYgbWF4X2dhcCBpcyBOb25lIGVsc2UgbWF4KG1heF9nYXAsIGdhcClcbiAgICAgICAgICAgIGxhc3QgPSBub3dcbiAgICAgICAgICAgIG9mZnNldCA9IHRvdGFsXG4gICAgICAgICAgICB0b3RhbCArPSBsZW4oYmxvY2spXG4gICAgICAgICAgICBjb25zdW1lX2JlZ2luID0gdGltZS5tb25vdG9uaWMoKS1iZWdpbiBpZiB0aW1pbmdzIGlzIG5vdCBOb25lIGVsc2UgTm9uZVxuICAgICAgICAgICAgcGhhc2UgPSAnQ09OU1VNRV9FUlJPUidcbiAgICAgICAgICAgIGNvbnN1bWUoYmxvY2spXG4gICAgICAgICAgICBjb25zdW1lZCArPSBsZW4oYmxvY2spXG4gICAgICAgICAgICBpZiB0aW1pbmdzIGlzIG5vdCBOb25lOlxuICAgICAgICAgICAgICAgIGNvbnN1bWVfZG9uZSA9IHRpbWUubW9ub3RvbmljKCktYmVnaW5cbiAgICAgICAgICAgICAgICBpZiBsZW4odGltaW5ncykgPCA0MDk2OlxuICAgICAgICAgICAgICAgICAgICB0aW1pbmdzLmFwcGVuZCh7J29mZnNldCc6IG9mZnNldCwgJ2xlbmd0aCc6IGxlbihibG9jayksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjdl9yZXR1cm5fcyc6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zdW1lX3N0YXJ0X3MnOiBjb25zdW1lX2JlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN1bWVfZG9uZV9zJzogY29uc3VtZV9kb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN1bWVfZHVyYXRpb25fcyc6IGNvbnN1bWVfZG9uZS1jb25zdW1lX2JlZ2lufSlcbiAgICAgICAgICAgICAgICBlbHNlOlxuICAgICAgICAgICAgICAgICAgICB0aW1pbmdfc2FtcGxlc19kcm9wcGVkICs9IDFcbiAgICBleGNlcHQgRXhjZXB0aW9uOlxuICAgICAgICByZWFzb24gPSAnU1RPUFBFRCcgaWYgc3RvcC5pc19zZXQoKSBlbHNlIHBoYXNlXG4gICAgICAgIHJhaXNlXG4gICAgZmluYWxseTpcbiAgICAgICAgZWxhcHNlZCA9IHRpbWUubW9ub3RvbmljKCktYmVnaW5cbiAgICAgICAgcmVzdWx0ID0geydyZWNlaXZlZF9ieXRlcyc6IHRvdGFsLCAnY29uc3VtZWRfYnl0ZXMnOiBjb25zdW1lZCxcbiAgICAgICAgICAgICAgICAgICdlbGFwc2VkX3MnOiByb3VuZChlbGFwc2VkLCAzKSwgJ2ZpcnN0X3JlY2VpdmVfcyc6IGZpcnN0LFxuICAgICAgICAgICAgICAgICAgJ2xhc3RfcmVjZWl2ZV9zJzogbGFzdCwgJ21heF9yZWNlaXZlX2dhcF9zJzogbWF4X2dhcCxcbiAgICAgICAgICAgICAgICAgICd0cmFpbGluZ19ub19yZWNlaXZlX3MnOiBtYXgoMC4wLCBlbGFwc2VkLShsYXN0IGlmIGxhc3QgaXMgbm90IE5vbmUgZWxzZSAwLjApKSxcbiAgICAgICAgICAgICAgICAgICdyZWFzb24nOiByZWFzb259XG4gICAgICAgIGlmIHRpbWluZ3MgaXMgbm90IE5vbmU6XG4gICAgICAgICAgICByZXN1bHRbJ3RpbWluZ19zYW1wbGVzX2Ryb3BwZWQnXSA9IHRpbWluZ19zYW1wbGVzX2Ryb3BwZWRcbiAgICAgICAgaWYgc3RhdHMgaXMgbm90IE5vbmU6XG4gICAgICAgICAgICBzdGF0cy51cGRhdGUocmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcblxuXG5jbGFzcyBKcGVnRnJhbWVzOlxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcbiAgICAgICAgc2VsZi5wZW5kaW5nID0gYnl0ZWFycmF5KClcblxuICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOlxuICAgICAgICBzZWxmLnBlbmRpbmcuZXh0ZW5kKGRhdGEpXG4gICAgICAgIGZyYW1lcyA9IFtdXG4gICAgICAgIHdoaWxlIFRydWU6XG4gICAgICAgICAgICBzdGFydCA9IHNlbGYucGVuZGluZy5maW5kKGInXFx4ZmZcXHhkOCcpXG4gICAgICAgICAgICBpZiBzdGFydCA8IDA6XG4gICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nID0gc2VsZi5wZW5kaW5nWy0xOl1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgaWYgc3RhcnQ6XG4gICAgICAgICAgICAgICAgZGVsIHNlbGYucGVuZGluZ1s6c3RhcnRdXG4gICAgICAgICAgICBlbmQgPSBzZWxmLnBlbmRpbmcuZmluZChiJ1xceGZmXFx4ZDknLCAyKVxuICAgICAgICAgICAgaWYgZW5kIDwgMDpcbiAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5wZW5kaW5nKSA+IDIqMTAyNCoxMDI0OlxuICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdEZWNvZGVkIGZyYW1lIGV4Y2VlZGVkIGJvdW5kJylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZnJhbWVzLmFwcGVuZChieXRlcyhzZWxmLnBlbmRpbmdbOmVuZCsyXSkpXG4gICAgICAgICAgICBkZWwgc2VsZi5wZW5kaW5nWzplbmQrMl1cbiAgICAgICAgcmV0dXJuIGZyYW1lc1xuIiwgImllcm11X2Rpc2NvdmVyeS5weSI6ICJcIlwiXCJEaXNjb3ZlciBJRVJNVSBjYW1lcmFzIG9uIHRoZSBQQydzIGNvbm5lY3RlZCBwcml2YXRlIG5ldHdvcmtzLlwiXCJcIlxuZnJvbSBjb25jdXJyZW50LmZ1dHVyZXMgaW1wb3J0IFRocmVhZFBvb2xFeGVjdXRvclxuZnJvbSBjb250ZXh0bGliIGltcG9ydCBFeGl0U3RhY2tcbmltcG9ydCBpcGFkZHJlc3NcbmltcG9ydCBzZWxlY3RcbmltcG9ydCBzb2NrZXRcbmltcG9ydCB0aW1lXG5mcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsc3BsaXRcblxuZnJvbSBpZXJtdV9jbXMgaW1wb3J0IENhbWVyYVJvdXRlLCB2ZXJpZnlfY2FtZXJhXG5mcm9tIGllcm11X25ldHdvcmsgaW1wb3J0IG5laWdoYm9ycywgcXVlcnlfbWFjXG5cblxuRElSRUNUX0lQID0gaXBhZGRyZXNzLklQdjRBZGRyZXNzKCcxOTIuMTY4LjU4LjEnKVxuRElSRUNUX05FVFdPUksgPSBpcGFkZHJlc3MuSVB2NE5ldHdvcmsoJzE5Mi4xNjguNTguMC8yNCcpXG5JQkxBQ0tfTUFDX1BSRUZJWCA9ICcwMDoyMDoxYjonXG5TU0RQID0gKCcyMzkuMjU1LjI1NS4yNTAnLCAxOTAwKVxuU0VBUkNIID0gKFxuICAgIGInTS1TRUFSQ0ggKiBIVFRQLzEuMVxcclxcbk1BTjpcInNzZHA6ZGlzY292ZXJcIlxcclxcbk1YOiAyXFxyXFxuJ1xuICAgIGInSE9TVDoyMzkuMjU1LjI1NS4yNTA6MTkwMFxcclxcblNUOnVybjpzY2hlbWFzLXVwbnAtb3JnOmRldmljZTpNZWRpYVNlcnZlcjpcXHJcXG5cXHJcXG4nXG4pXG5NQVhfQ0FORElEQVRFUyA9IDhcblxuXG5kZWYgY2FtZXJhX3JlcGx5KHBhY2tldCwgc2VuZGVyLCBhZGFwdGVyKTpcbiAgICBcIlwiXCJWYWxpZGF0ZSB0aGUgcmVwbHkgd2l0aG91dCBmZXRjaGluZyBpdHMgTG9jYXRpb24gVVJMLlwiXCJcIlxuICAgIGlwID0gaXBhZGRyZXNzLklQdjRBZGRyZXNzKHNlbmRlcilcbiAgICBpZiBub3QgYWRhcHRlci5jb250YWluc19wZWVyKGlwKSBvciBiJ2Ntc2llcm11JyBub3QgaW4gcGFja2V0Lmxvd2VyKCk6XG4gICAgICAgIHJldHVybiBGYWxzZVxuICAgIGxpbmVzID0gcGFja2V0LnNwbGl0KGInXFxyXFxuJylcbiAgICBpZiBub3QgbGluZXNbMF0uc3RhcnRzd2l0aCgoYidIVFRQLzEuMSAyMDAgJywgYidIVFRQLzEuMCAyMDAgJykpOlxuICAgICAgICByZXR1cm4gRmFsc2VcbiAgICBsb2NhdGlvbnMgPSBbbGluZS5wYXJ0aXRpb24oYic6JylbMl0uc3RyaXAoKSBmb3IgbGluZSBpbiBsaW5lcyBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aChiJ2xvY2F0aW9uOicpXVxuICAgIGlmIGxlbihsb2NhdGlvbnMpICE9IDE6XG4gICAgICAgIHJldHVybiBGYWxzZVxuICAgIHRyeTpcbiAgICAgICAgbG9jYXRpb24gPSB1cmxzcGxpdChsb2NhdGlvbnNbMF0uZGVjb2RlKCdhc2NpaScpKVxuICAgICAgICByZXR1cm4gbG9jYXRpb24uc2NoZW1lID09ICdodHRwJyBhbmQgbG9jYXRpb24uaG9zdG5hbWUgPT0gc2VuZGVyIGFuZCBsb2NhdGlvbi51c2VybmFtZSBpcyBOb25lXG4gICAgZXhjZXB0IFZhbHVlRXJyb3I6XG4gICAgICAgIHJldHVybiBGYWxzZVxuXG5cbmRlZiBzZWFyY2hfbGFuKGFkYXB0ZXJzKTpcbiAgICByZXN1bHRzID0ge31cbiAgICB3aXRoIEV4aXRTdGFjaygpIGFzIHN0YWNrOlxuICAgICAgICBsaXN0ZW5lcnMgPSB7fVxuICAgICAgICBmb3IgYWRhcHRlciBpbiBhZGFwdGVyc1s6OF06XG4gICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgc29jayA9IHN0YWNrLmVudGVyX2NvbnRleHQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pKVxuICAgICAgICAgICAgICAgIHNvY2suYmluZCgoYWRhcHRlci5pcCwgMCkpXG4gICAgICAgICAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5JUFBST1RPX0lQLCBzb2NrZXQuSVBfTVVMVElDQVNUX0lGLCBzb2NrZXQuaW5ldF9hdG9uKGFkYXB0ZXIuaXApKVxuICAgICAgICAgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuSVBQUk9UT19JUCwgc29ja2V0LklQX01VTFRJQ0FTVF9UVEwsIDEpXG4gICAgICAgICAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fQlJPQURDQVNULCAxKVxuICAgICAgICAgICAgICAgIHNvY2suc2V0YmxvY2tpbmcoRmFsc2UpXG4gICAgICAgICAgICAgICAgZm9yIGRlc3RpbmF0aW9uIGluIChTU0RQLCAoc3RyKGFkYXB0ZXIuYWRkcmVzcy5uZXR3b3JrLmJyb2FkY2FzdF9hZGRyZXNzKSwgU1NEUFsxXSkpOlxuICAgICAgICAgICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrLnNlbmR0byhTRUFSQ0gsIGRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tzb2NrXSA9IGFkYXB0ZXJcbiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgZGVhZGxpbmUgPSB0aW1lLm1vbm90b25pYygpICsgMi4yNVxuICAgICAgICBmb3IgXyBpbiByYW5nZSg2NCk6XG4gICAgICAgICAgICBpZiBub3QgbGlzdGVuZXJzIG9yIGxlbihyZXN1bHRzKSA+PSBNQVhfQ0FORElEQVRFUzpcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgcmVtYWluaW5nID0gZGVhZGxpbmUgLSB0aW1lLm1vbm90b25pYygpXG4gICAgICAgICAgICBpZiByZW1haW5pbmcgPD0gMDpcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgcmVhZGFibGUsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KGxpc3QobGlzdGVuZXJzKSwgW10sIFtdLCByZW1haW5pbmcpXG4gICAgICAgICAgICBpZiBub3QgcmVhZGFibGU6XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGZvciBzb2NrIGluIHJlYWRhYmxlOlxuICAgICAgICAgICAgICAgIHRyeTpcbiAgICAgICAgICAgICAgICAgICAgcGFja2V0LCAoc2VuZGVyLCBfKSA9IHNvY2sucmVjdmZyb20oMjA0OClcbiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICBhZGFwdGVyID0gbGlzdGVuZXJzW3NvY2tdXG4gICAgICAgICAgICAgICAgaWYgY2FtZXJhX3JlcGx5KHBhY2tldCwgc2VuZGVyLCBhZGFwdGVyKTpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zZXRkZWZhdWx0KHNlbmRlciwgYWRhcHRlcilcbiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHJlc3VsdHMpID49IE1BWF9DQU5ESURBVEVTOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICByZXR1cm4gcmVzdWx0c1xuXG5cbmRlZiBmaW5kX2NhbWVyYXMoYWRhcHRlcnMpOlxuICAgIFwiXCJcIklkZW50aWZ5IGNhbmRpZGF0ZXMgZnJvbSBBUCBtb2RlLCBTU0RQIGFuZCB0aGUgZXhpc3RpbmcgbmVpZ2hib3IgdGFibGUuXCJcIlwiXG4gICAgY2FuZGlkYXRlcyA9IHt9XG4gICAgZm9yIGFkYXB0ZXIgaW4gYWRhcHRlcnM6XG4gICAgICAgIGlmIGFkYXB0ZXIuYWRkcmVzcy5uZXR3b3JrID09IERJUkVDVF9ORVRXT1JLIGFuZCBhZGFwdGVyLmNvbnRhaW5zX3BlZXIoRElSRUNUX0lQKTpcbiAgICAgICAgICAgIGNhbmRpZGF0ZXNbKHN0cihESVJFQ1RfSVApLCBhZGFwdGVyKV0gPSAoTm9uZSwgRmFsc2UpXG5cbiAgICBmb3IgaXAsIGFkYXB0ZXIgaW4gc2VhcmNoX2xhbihhZGFwdGVycykuaXRlbXMoKTpcbiAgICAgICAgY2FuZGlkYXRlc1soaXAsIGFkYXB0ZXIpXSA9IChOb25lLCBUcnVlKVxuXG4gICAgdHJ5OlxuICAgICAgICBjYWNoZWQgPSBuZWlnaGJvcnMoKVxuICAgIGV4Y2VwdCBPU0Vycm9yOlxuICAgICAgICBjYWNoZWQgPSAoKVxuICAgIGZvciBpcCwgbWFjLCBpbmRleCBpbiBjYWNoZWQ6XG4gICAgICAgIGlmIG5vdCBtYWMuc3RhcnRzd2l0aChJQkxBQ0tfTUFDX1BSRUZJWCk6XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICBmb3IgYWRhcHRlciBpbiBhZGFwdGVyczpcbiAgICAgICAgICAgIGlmIGFkYXB0ZXIuaW5kZXggPT0gaW5kZXggYW5kIGFkYXB0ZXIuY29udGFpbnNfcGVlcihpcCk6XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5zZXRkZWZhdWx0KChzdHIoaXApLCBhZGFwdGVyKSwgKG1hYywgRmFsc2UpKVxuXG4gICAgZGVmIGlkZW50aWZ5KGVudHJ5KTpcbiAgICAgICAgKGlwLCBhZGFwdGVyKSwgKGV4cGVjdGVkX21hYywgYW5ub3VuY2VkKSA9IGVudHJ5XG4gICAgICAgIGNvZGUsIG1hYyA9IHF1ZXJ5X21hYyhhZGFwdGVyLmlwLCB0YXJnZXRfaXA9aXApXG4gICAgICAgIGlmIGNvZGUgIT0gMCBvciBtYWMgaXMgTm9uZSBvciAoZXhwZWN0ZWRfbWFjIGFuZCBtYWMgIT0gZXhwZWN0ZWRfbWFjKTpcbiAgICAgICAgICAgIHJldHVybiBOb25lXG4gICAgICAgIGlmIG5vdCBhbm5vdW5jZWQgYW5kIG5vdCBtYWMuc3RhcnRzd2l0aChJQkxBQ0tfTUFDX1BSRUZJWCk6XG4gICAgICAgICAgICByZXR1cm4gTm9uZVxuICAgICAgICByb3V0ZSA9IENhbWVyYVJvdXRlKGlwLCBtYWMsIGFkYXB0ZXIuaXAsIGFkYXB0ZXIuaW5kZXgpXG4gICAgICAgIHJldHVybiByb3V0ZSBpZiB2ZXJpZnlfY2FtZXJhKHJvdXRlKSBlbHNlIE5vbmVcblxuICAgIGlmIG5vdCBjYW5kaWRhdGVzOlxuICAgICAgICByZXR1cm4gW11cbiAgICByb3V0ZXMgPSB7fVxuICAgIHdpdGggVGhyZWFkUG9vbEV4ZWN1dG9yKG1heF93b3JrZXJzPU1BWF9DQU5ESURBVEVTKSBhcyB3b3JrZXJzOlxuICAgICAgICBmb3Igcm91dGUgaW4gd29ya2Vycy5tYXAoaWRlbnRpZnksIGxpc3QoY2FuZGlkYXRlcy5pdGVtcygpKVs6TUFYX0NBTkRJREFURVNdKTpcbiAgICAgICAgICAgIGlmIHJvdXRlOlxuICAgICAgICAgICAgICAgIHJvdXRlcy5zZXRkZWZhdWx0KHJvdXRlLm1hYywgcm91dGUpXG4gICAgcmV0dXJuIGxpc3Qocm91dGVzLnZhbHVlcygpKVxuIiwgImllcm11X25ldHdvcmsucHkiOiAiXCJcIlwiV2luZG93cyBJUHY0IGFkYXB0ZXIgYW5kIG5laWdoYm9yIGluZm9ybWF0aW9uIGZvciB0aGUgbG9jYWwgdmlld2VyLlwiXCJcIlxuaW1wb3J0IGN0eXBlcyBhcyBDXG5pbXBvcnQgaXBhZGRyZXNzXG5pbXBvcnQgc29ja2V0XG5mcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3NcblxuXG5MT0NBTF9ORVRXT1JLUyA9IHR1cGxlKG1hcChpcGFkZHJlc3MuSVB2NE5ldHdvcmssICgnMTAuMC4wLjAvOCcsICcxNzIuMTYuMC4wLzEyJywgJzE5Mi4xNjguMC4wLzE2JykpKVxuXG5cbmRlZiBwcml2YXRlX2FkZHJlc3MoYWRkcmVzcyk6XG4gICAgcmV0dXJuIGFueShhZGRyZXNzIGluIG5ldHdvcmsgZm9yIG5ldHdvcmsgaW4gTE9DQUxfTkVUV09SS1MpXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIEFkYXB0ZXI6XG4gICAgYWRkcmVzczogaXBhZGRyZXNzLklQdjRJbnRlcmZhY2VcbiAgICBpbmRleDogaW50XG5cbiAgICBAcHJvcGVydHlcbiAgICBkZWYgaXAoc2VsZik6XG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5hZGRyZXNzLmlwKVxuXG4gICAgZGVmIGNvbnRhaW5zX3BlZXIoc2VsZiwgaXApOlxuICAgICAgICByZXR1cm4gKHByaXZhdGVfYWRkcmVzcyhpcCkgYW5kIGlwIGluIHNlbGYuYWRkcmVzcy5uZXR3b3JrXG4gICAgICAgICAgICAgICAgYW5kIGlwIG5vdCBpbiAoc2VsZi5hZGRyZXNzLmlwLCBzZWxmLmFkZHJlc3MubmV0d29yay5uZXR3b3JrX2FkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRyZXNzLm5ldHdvcmsuYnJvYWRjYXN0X2FkZHJlc3MpKVxuXG5cbmNsYXNzIEFkZHJlc3NSb3coQy5TdHJ1Y3R1cmUpOlxuICAgIF9maWVsZHNfID0gW1xuICAgICAgICAoJ2FkZHJlc3MnLCBDLmNfdWludDMyKSwgKCdpbmRleCcsIEMuY191aW50MzIpLCAoJ21hc2snLCBDLmNfdWludDMyKSxcbiAgICAgICAgKCdicm9hZGNhc3QnLCBDLmNfdWludDMyKSwgKCdyZWFzc2VtYmx5JywgQy5jX3VpbnQzMiksXG4gICAgICAgICgncmVzZXJ2ZWQnLCBDLmNfdWludDE2KSwgKCdmbGFncycsIEMuY191aW50MTYpLFxuICAgIF1cblxuXG5jbGFzcyBBZGRyZXNzVGFibGUoQy5TdHJ1Y3R1cmUpOlxuICAgIF9maWVsZHNfID0gWygnY291bnQnLCBDLmNfdWludDMyKSwgKCdmaXJzdCcsIEFkZHJlc3NSb3cpXVxuXG5cbmNsYXNzIE5laWdoYm9yUm93KEMuU3RydWN0dXJlKTpcbiAgICBfZmllbGRzXyA9IFtcbiAgICAgICAgKCdpbmRleCcsIEMuY191aW50MzIpLCAoJ2xlbmd0aCcsIEMuY191aW50MzIpLCAoJ21hYycsIEMuY191Ynl0ZSAqIDgpLFxuICAgICAgICAoJ2FkZHJlc3MnLCBDLmNfdWludDMyKSwgKCdraW5kJywgQy5jX3VpbnQzMiksXG4gICAgXVxuXG5cbmNsYXNzIE5laWdoYm9yVGFibGUoQy5TdHJ1Y3R1cmUpOlxuICAgIF9maWVsZHNfID0gWygnY291bnQnLCBDLmNfdWludDMyKSwgKCdmaXJzdCcsIE5laWdoYm9yUm93KV1cblxuXG5kZWYgcmVhZF9yb3dzKGZ1bmN0aW9uLCB0YWJsZSwgcm93X3R5cGUpOlxuICAgIHJlYWQgPSBnZXRhdHRyKEMuV2luRExMKCdpcGhscGFwaScpLCBmdW5jdGlvbilcbiAgICByZWFkLmFyZ3R5cGVzID0gKEMuY192b2lkX3AsIEMuUE9JTlRFUihDLmNfdWludDMyKSwgQy5jX2ludClcbiAgICByZWFkLnJlc3R5cGUgPSBDLmNfdWludDMyXG4gICAgc2l6ZSA9IEMuY191aW50MzIoKVxuICAgIGZvciBfIGluIHJhbmdlKDIpOlxuICAgICAgICByZXN1bHQgPSByZWFkKE5vbmUsIEMuYnlyZWYoc2l6ZSksIDApXG4gICAgICAgIGlmIHJlc3VsdCBpbiAoMCwgMjMyKTogICMgRW1wdHkgdGFibGUuXG4gICAgICAgICAgICByZXR1cm4gKClcbiAgICAgICAgaWYgcmVzdWx0ICE9IDEyMiBvciBub3QgNCA8PSBzaXplLnZhbHVlIDw9IDFfMDQ4XzU3NjpcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGJ1ZmZlciA9IEMuY3JlYXRlX3N0cmluZ19idWZmZXIoc2l6ZS52YWx1ZSlcbiAgICAgICAgcmVzdWx0ID0gcmVhZChidWZmZXIsIEMuYnlyZWYoc2l6ZSksIDApXG4gICAgICAgIGlmIHJlc3VsdCA9PSAxMjI6ICAjIFRoZSB0YWJsZSBncmV3IHdoaWxlIGl0IHdhcyBiZWluZyByZWFkLlxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgaWYgcmVzdWx0ID09IDA6XG4gICAgICAgICAgICBjb3VudCA9IEMuY191aW50MzIuZnJvbV9idWZmZXIoYnVmZmVyKS52YWx1ZVxuICAgICAgICAgICAgc3RhcnQgPSB0YWJsZS5maXJzdC5vZmZzZXRcbiAgICAgICAgICAgIGlmIHN0YXJ0ICsgY291bnQgKiBDLnNpemVvZihyb3dfdHlwZSkgPD0gbGVuKGJ1ZmZlcik6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb3dfdHlwZSAqIGNvdW50KS5mcm9tX2J1ZmZlcihidWZmZXIsIHN0YXJ0KVxuICAgICAgICBicmVha1xuICAgIHJhaXNlIE9TRXJyb3IoJ1BD44Gu44ON44OD44OI44Ov44O844Kv5LiA6Kan44KS5Y+W5b6X44Gn44GN44G+44Gb44KT44CCJylcblxuXG5kZWYgYWRhcHRlcnMoKTpcbiAgICBcIlwiXCJSZWFkIHByaXZhdGUgSVB2NCBhZGRyZXNzZXMgd2l0aG91dCBjaGFuZ2luZyBuZXR3b3JrIHNldHRpbmdzLlwiXCJcIlxuICAgIHJlc3VsdCA9IFtdXG4gICAgZm9yIHJvdyBpbiByZWFkX3Jvd3MoJ0dldElwQWRkclRhYmxlJywgQWRkcmVzc1RhYmxlLCBBZGRyZXNzUm93KTpcbiAgICAgICAgaXAgPSBpcGFkZHJlc3MuSVB2NEFkZHJlc3Mocm93LmFkZHJlc3MudG9fYnl0ZXMoNCwgJ2xpdHRsZScpKVxuICAgICAgICBpZiBwcml2YXRlX2FkZHJlc3MoaXApOlxuICAgICAgICAgICAgbWFzayA9IGlwYWRkcmVzcy5JUHY0QWRkcmVzcyhyb3cubWFzay50b19ieXRlcyg0LCAnbGl0dGxlJykpXG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kKEFkYXB0ZXIoaXBhZGRyZXNzLklQdjRJbnRlcmZhY2UoZid7aXB9L3ttYXNrfScpLCByb3cuaW5kZXgpKVxuICAgIHJldHVybiBzb3J0ZWQocmVzdWx0LCBrZXk9bGFtYmRhIGFkYXB0ZXI6IChhZGFwdGVyLmFkZHJlc3MuaXAsIGFkYXB0ZXIuaW5kZXgpKVxuXG5cbmRlZiBuZWlnaGJvcnMoKTpcbiAgICBcIlwiXCJSZXR1cm4gdGhlIE9TJ3MgZXhpc3RpbmcgSVB2NCBuZWlnaGJvciBlbnRyaWVzIHdpdGhvdXQgc2VuZGluZyBwYWNrZXRzLlwiXCJcIlxuICAgIHJldHVybiBbXG4gICAgICAgIChpcGFkZHJlc3MuSVB2NEFkZHJlc3Mocm93LmFkZHJlc3MudG9fYnl0ZXMoNCwgJ2xpdHRsZScpKSwgYnl0ZXMocm93Lm1hY1s6Nl0pLmhleCgnOicpLCByb3cuaW5kZXgpXG4gICAgICAgIGZvciByb3cgaW4gcmVhZF9yb3dzKCdHZXRJcE5ldFRhYmxlJywgTmVpZ2hib3JUYWJsZSwgTmVpZ2hib3JSb3cpXG4gICAgICAgIGlmIHJvdy5raW5kIGluICgzLCA0KSBhbmQgcm93Lmxlbmd0aCA9PSA2XG4gICAgXVxuXG5cbmRlZiBxdWVyeV9tYWMoc291cmNlLCAqLCB0YXJnZXRfaXApOlxuICAgIHNlbmQgPSBDLldpbkRMTCgnaXBobHBhcGknKS5TZW5kQVJQXG4gICAgc2VuZC5hcmd0eXBlcyA9IChDLmNfdWludDMyLCBDLmNfdWludDMyLCBDLmNfdm9pZF9wLCBDLlBPSU5URVIoQy5jX3VpbnQzMikpXG4gICAgc2VuZC5yZXN0eXBlID0gQy5jX3VpbnQzMlxuICAgIG1hYyA9IChDLmNfdWJ5dGUgKiA4KSgpXG4gICAgbGVuZ3RoID0gQy5jX3VpbnQzMihsZW4obWFjKSlcbiAgICByZXN1bHQgPSBzZW5kKFxuICAgICAgICBpbnQuZnJvbV9ieXRlcyhzb2NrZXQuaW5ldF9hdG9uKHRhcmdldF9pcCksICdsaXR0bGUnKSxcbiAgICAgICAgaW50LmZyb21fYnl0ZXMoc29ja2V0LmluZXRfYXRvbihzb3VyY2UpLCAnbGl0dGxlJyksXG4gICAgICAgIG1hYywgQy5ieXJlZihsZW5ndGgpLFxuICAgIClcbiAgICByZXR1cm4gcmVzdWx0LCBieXRlcyhtYWNbOjZdKS5oZXgoJzonKSBpZiByZXN1bHQgPT0gMCBhbmQgbGVuZ3RoLnZhbHVlID09IDYgZWxzZSBOb25lXG4iLCAiaWVybXVfcHJvdG9jb2wucHkiOiAiXCJcIlwiSUVSTVUgQ01TIGZyYW1pbmcgYW5kIGxpdmUtdmlldyByZXF1ZXN0IHNlcmlhbGl6YXRpb24uXCJcIlwiXG5pbXBvcnQgc3RydWN0XG5pbXBvcnQgdGltZVxuXG5cbmRlZiByZWNlaXZlX3JlcGx5KHNvY2ssICosIGRlYWRsaW5lPU5vbmUpOlxuICAgIGRlZiBleGFjdChuKTpcbiAgICAgICAgb3V0ID0gYnl0ZWFycmF5KClcbiAgICAgICAgd2hpbGUgbGVuKG91dCkgPCBuOlxuICAgICAgICAgICAgaWYgZGVhZGxpbmUgaXMgbm90IE5vbmU6XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gZGVhZGxpbmUgLSB0aW1lLm1vbm90b25pYygpXG4gICAgICAgICAgICAgICAgaWYgcmVtYWluaW5nIDw9IDA6XG4gICAgICAgICAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRFcnJvcignQ2FtZXJhIGlkZW50aWZpY2F0aW9uIHRpbWVkIG91dCcpXG4gICAgICAgICAgICAgICAgc29jay5zZXR0aW1lb3V0KHJlbWFpbmluZylcbiAgICAgICAgICAgIGNodW5rID0gc29jay5yZWN2KG4tbGVuKG91dCkpXG4gICAgICAgICAgICBpZiBub3QgY2h1bms6XG4gICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IoJ0NhbWVyYSBjbG9zZWQgY29ubmVjdGlvbicpXG4gICAgICAgICAgICBvdXQuZXh0ZW5kKGNodW5rKVxuICAgICAgICByZXR1cm4gYnl0ZXMob3V0KVxuICAgIGhlYWQgPSBleGFjdCg0KVxuICAgIG1haW4sIHN1YiwgbGVuZ3RoID0gc3RydWN0LnVucGFjaygnPkJCSCcsIGhlYWQpXG4gICAgIyBDbXNOZXRVdGlsLnJlY2VpdmVfZGF0YSB0cmVhdHMgdGhlIHNpZ25lZCAweGZmMDAgZmllbGQgYXMgYSBoZWFkZXItb25seVxuICAgICMgc3VjY2VzcyBmb3IgbWFpbiA3MiAobGFzdCBzdGF0dXMgYnl0ZSB6ZXJvKS4gUmVzdHJpY3QgdGhpcyBleGNlcHRpb24gdG9cbiAgICAjIHRoZSBvYnNlcnZlZCBXaS1GaSBjb21tYW5kOyBhdXRoZW50aWNhdGlvbiBlcnJvcnMgc3VjaCBhcyA0NSAwNiBmZiAwOVxuICAgICMgYW5kIG5vbnplcm8gV2ktRmkgc3RhdHVzIHJlbWFpbiByZWplY3RlZC5cbiAgICBpZiBoZWFkID09IGInXFx4NDhcXHgwOFxceGZmXFx4MDAnOlxuICAgICAgICByZXR1cm4gbWFpbiwgc3ViLCBiJydcbiAgICBpZiBoZWFkWzJdID09IDI1NSBvciBsZW5ndGggPiA0MDk2OlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdDYW1lcmEgZXJyb3IgaGVhZGVyICcgKyBoZWFkLmhleCgpKVxuICAgIHJldHVybiBtYWluLCBzdWIsIGV4YWN0KGxlbmd0aClcblxuZGVmIHF1ZXJ5KHNvY2ssIG1haW4sIHN1YiwgcGF5bG9hZD1iJycsICosIGRlYWRsaW5lPU5vbmUpOlxuICAgIGlmIChtYWluLHN1Yikgbm90IGluIHsoNSwxNyksKDY5LDYpLCg3NCw2MyksKDc0LDMpfTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgcGVybWl0dGVkIHJlYWQvYXV0aCBxdWVyeScpXG4gICAgc29jay5zZW5kYWxsKHN0cnVjdC5wYWNrKCc8QkJIJyxtYWluLHN1YixsZW4ocGF5bG9hZCkpK3BheWxvYWQpXG4gICAgZ290X21haW4sIGdvdF9zdWIsIGRhdGEgPSByZWNlaXZlX3JlcGx5KHNvY2ssIGRlYWRsaW5lPWRlYWRsaW5lKVxuICAgIGlmIChnb3RfbWFpbixnb3Rfc3ViKSAhPSAobWFpbixzdWIpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmV4cGVjdGVkIHJlc3BvbnNlIGNvbW1hbmQnKVxuICAgIHJldHVybiBkYXRhXG5cbmRlZiBjcmMzMl9jbXMoZGF0YSk6XG4gICAgY3JjID0gMHhmZmZmZmZmZlxuICAgIGZvciB2YWx1ZSBpbiBkYXRhOlxuICAgICAgICBjcmMgXj0gdmFsdWVcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UoOCk6XG4gICAgICAgICAgICBjcmMgPSAoY3JjID4+IDEpIF4gKDB4ZWRiODgzMjAgaWYgY3JjICYgMSBlbHNlIDApXG4gICAgcmV0dXJuIGNyYyBeIDB4ZmZmZmZmZmZcblxuXG5kZWYgbGl2ZV9yZXF1ZXN0KHNlc3Npb24sIG1hdHJpeD1GYWxzZSwgKiwgcXVhbGl0eT0nbG93Jyk6XG4gICAgaWYgbm90IDAgPCBzZXNzaW9uIDwgMHg4MDAwMDAwMDpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignU2Vzc2lvbiBpcyB6ZXJvIG9yIGFmZmVjdGVkIGJ5IG9yaWdpbmFsIHNpZ25lZC1ieXRlIGFtYmlndWl0eScpXG4gICAgZmlyc3QgPSBzdHJ1Y3QucGFjaygnPEknLCAweGRiZmFjZjAzKVxuICAgIGlmIHR5cGUobWF0cml4KSBpcyBub3QgYm9vbDpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biByZXF1ZXN0IG1vZGUnKVxuICAgIGlmIHF1YWxpdHkgbm90IGluICgnbG93JywgJ2hkJykgb3IgKG1hdHJpeCBhbmQgcXVhbGl0eSA9PSAnaGQnKTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5zdXBwb3J0ZWQgcXVhbGl0eS9yZXF1ZXN0IGNvbWJpbmF0aW9uJylcbiAgICBmaWVsZHMgPSAoMywgMywgNjAsIDEyMCkgaWYgbWF0cml4IGVsc2UgKDIsIDIsIDAsIDApXG4gICAgaWYgcXVhbGl0eSA9PSAnaGQnOlxuICAgICAgICBmaWVsZHMgPSAoMCwgMiwgMCwgMClcbiAgICBmaXJzdCArPSBzdHJ1Y3QucGFjaygnPjZJJywgc2Vzc2lvbiwgMSwgKmZpZWxkcylcbiAgICBmaXJzdCArPSBieXRlcygzMilcbiAgICBhc3NlcnQgbGVuKGZpcnN0KSA9PSA2MFxuICAgIHJldHVybiBmaXJzdCArIHN0cnVjdC5wYWNrKCc8SScsIGNyYzMyX2NtcyhmaXJzdCkpXG4iLCAiaWVybXVfd2ViLnB5IjogIlwiXCJcIlNlcnZlIHRoZSBJRVJNVSB2aWV3ZXIgb24gYSBXaW5kb3dzIFBDLCB3aXRoIG9wdGlvbmFsIGhvbWUtbmV0d29yayBzaGFyaW5nLlwiXCJcIlxuaW1wb3J0IGFyZ3BhcnNlXG5pbXBvcnQgYmFzZTY0XG5pbXBvcnQgaXBhZGRyZXNzXG5pbXBvcnQgaW9cbmltcG9ydCBqc29uXG5pbXBvcnQgcmVcbmltcG9ydCBzZWNyZXRzXG5pbXBvcnQgdGhyZWFkaW5nXG5pbXBvcnQgd2ViYnJvd3NlclxuZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgVGhyZWFkaW5nSFRUUFNlcnZlclxuZnJvbSBwYXRobGliIGltcG9ydCBQYXRoXG5mcm9tIHNvY2tldHNlcnZlciBpbXBvcnQgVENQU2VydmVyXG5mcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgcGFyc2VfcXNcblxuZnJvbSBpZXJtdV9jbXMgaW1wb3J0IENhbWVyYVJvdXRlXG5mcm9tIGllcm11X2Rpc2NvdmVyeSBpbXBvcnQgRElSRUNUX0lQLCBmaW5kX2NhbWVyYXNcbmZyb20gaWVybXVfbmV0d29yayBpbXBvcnQgQWRhcHRlciwgYWRhcHRlcnMsIHByaXZhdGVfYWRkcmVzc1xuZnJvbSB3ZWJfY2FtZXJhIGltcG9ydCBQbGF5YmFja1xuXG5cbkxPT1BCQUNLID0gJzEyNy4wLjAuMSdcbldFQiA9IFBhdGgoX19maWxlX18pLnJlc29sdmUoKS53aXRoX25hbWUoJ3dlYl9pZXJtdScpXG5BU1NFVFMgPSB7XG4gICAgJy8nOiAoJ2luZGV4Lmh0bWwnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyksXG4gICAgJy9hcHAuY3NzJzogKCdhcHAuY3NzJywgJ3RleHQvY3NzOyBjaGFyc2V0PXV0Zi04JyksXG4gICAgJy9hcHAuanMnOiAoJ2FwcC5qcycsICd0ZXh0L2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgnKSxcbiAgICAnL21hcmsuc3ZnJzogKCdtYXJrLnN2ZycsICdpbWFnZS9zdmcreG1sJyksXG59XG5cblxuZGVmIGNhbWVyYV9yb3V0ZShhZGFwdGVyLCBpcF92YWx1ZSwgbWFjX3ZhbHVlKTpcbiAgICB0cnk6XG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGlwX3ZhbHVlLCBzdHIpOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvclxuICAgICAgICBpcCA9IGlwYWRkcmVzcy5JUHY0QWRkcmVzcyhpcF92YWx1ZSlcbiAgICBleGNlcHQgVmFsdWVFcnJvcjpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign44Kr44Oh44Op44GuSVB2NOOCouODieODrOOCueOCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgicpIGZyb20gTm9uZVxuICAgIGlmIG5vdCBhZGFwdGVyLmNvbnRhaW5zX3BlZXIoaXApOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfjgqvjg6Hjg6njgajlkIzjgZjjg43jg4Pjg4jjg6/jg7zjgq/jga5QQ+OCouODieODrOOCueOCkumBuOOCk+OBp+OBj+OBoOOBleOBhOOAgicpXG4gICAgaWYgbm90IGlzaW5zdGFuY2UobWFjX3ZhbHVlLCBzdHIpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfmnKzkvZPjgrfjg7zjg6vjga5NQUPjgqLjg4njg6zjgrnjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIInKVxuICAgIG1hYyA9IG1hY192YWx1ZS5zdHJpcCgpLmxvd2VyKCkucmVwbGFjZSgnLScsICc6JylcbiAgICBpZiByZS5mdWxsbWF0Y2gocidbMC05YS1mXXsxMn0nLCBtYWMpOlxuICAgICAgICBtYWMgPSAnOicuam9pbihtYWNbaW5kZXg6aW5kZXggKyAyXSBmb3IgaW5kZXggaW4gcmFuZ2UoMCwgMTIsIDIpKVxuICAgIGlmIG5vdCByZS5mdWxsbWF0Y2gocicoPzpbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0nLCBtYWMpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfmnKzkvZPjgrfjg7zjg6vjga5NQUPjgqLjg4njg6zjgrnjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIInKVxuICAgIHJldHVybiBDYW1lcmFSb3V0ZShzdHIoaXApLCBtYWMsIGFkYXB0ZXIuaXAsIGFkYXB0ZXIuaW5kZXgpXG5cblxuZGVmIHFyX2RhdGFfdXJsKGxpbmspOlxuICAgIHRyeTpcbiAgICAgICAgaW1wb3J0IHNlZ25vXG4gICAgZXhjZXB0IEltcG9ydEVycm9yOlxuICAgICAgICBwYXNzXG4gICAgZWxzZTpcbiAgICAgICAgcG5nID0gaW8uQnl0ZXNJTygpXG4gICAgICAgIHNlZ25vLm1ha2VfcXIobGluaykuc2F2ZShwbmcsIGtpbmQ9J3BuZycsIHNjYWxlPTYsIGJvcmRlcj00KVxuICAgICAgICByZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgYmFzZTY0LmI2NGVuY29kZShwbmcuZ2V0dmFsdWUoKSkuZGVjb2RlKCdhc2NpaScpXG5cbiAgICB0cnk6XG4gICAgICAgIGltcG9ydCBjdjJcbiAgICBleGNlcHQgSW1wb3J0RXJyb3I6XG4gICAgICAgIHJldHVybiBOb25lXG4gICAgaWYgbm90IGhhc2F0dHIoY3YyLCAnUVJDb2RlRW5jb2Rlcl9jcmVhdGUnKTpcbiAgICAgICAgcmV0dXJuIE5vbmVcbiAgICBjb2RlID0gY3YyLlFSQ29kZUVuY29kZXJfY3JlYXRlKCkuZW5jb2RlKGxpbmspXG4gICAgY29kZSA9IGN2Mi5jb3B5TWFrZUJvcmRlcihjb2RlLCA0LCA0LCA0LCA0LCBjdjIuQk9SREVSX0NPTlNUQU5ULCB2YWx1ZT0yNTUpXG4gICAgY29kZSA9IGN2Mi5yZXNpemUoY29kZSwgTm9uZSwgZng9NiwgZnk9NiwgaW50ZXJwb2xhdGlvbj1jdjIuSU5URVJfTkVBUkVTVClcbiAgICBzdWNjZXNzLCBwbmcgPSBjdjIuaW1lbmNvZGUoJy5wbmcnLCBjb2RlKVxuICAgIHJldHVybiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBiYXNlNjQuYjY0ZW5jb2RlKHBuZykuZGVjb2RlKCdhc2NpaScpIGlmIHN1Y2Nlc3MgZWxzZSBOb25lXG5cblxuY2xhc3MgTG9jYWxIVFRQU2VydmVyKFRocmVhZGluZ0hUVFBTZXJ2ZXIpOlxuICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSBGYWxzZVxuXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIGFwcCwgKiwgbmV0d29yaz1Ob25lLCB0b2tlbj1Ob25lKTpcbiAgICAgICAgc2VsZi5hcHAgPSBhcHBcbiAgICAgICAgc2VsZi5uZXR3b3JrID0gbmV0d29ya1xuICAgICAgICBzZWxmLnRva2VuID0gdG9rZW5cbiAgICAgICAgc2VsZi5yZXZva2VkID0gdGhyZWFkaW5nLkV2ZW50KClcbiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhhZGRyZXNzLCBIYW5kbGVyKVxuXG4gICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOlxuICAgICAgICAjIEFuIGludml0YXRpb24gdXNlcyB0aGUgbnVtZXJpYyBhZGRyZXNzLCBzbyBza2lwIHRoZSByZXZlcnNlIEROUyBsb29rdXAuXG4gICAgICAgIFRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKVxuICAgICAgICBzZWxmLnNlcnZlcl9uYW1lLCBzZWxmLnNlcnZlcl9wb3J0ID0gc2VsZi5zZXJ2ZXJfYWRkcmVzc1xuXG4gICAgQHByb3BlcnR5XG4gICAgZGVmIGF1dGhvcml0eShzZWxmKTpcbiAgICAgICAgcmV0dXJuIGYne3NlbGYuc2VydmVyX2FkZHJlc3NbMF19OntzZWxmLnNlcnZlcl9wb3J0fSdcblxuXG5jbGFzcyBBcHA6XG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQ9ODc2NSwgKiwgcGxheWJhY2s9Tm9uZSwgbGlzdF9hZGFwdGVycz1hZGFwdGVycyk6XG4gICAgICAgIHNlbGYucGxheWJhY2sgPSBQbGF5YmFjaygpIGlmIHBsYXliYWNrIGlzIE5vbmUgZWxzZSBwbGF5YmFja1xuICAgICAgICBzZWxmLmxpc3RfYWRhcHRlcnMgPSBsaXN0X2FkYXB0ZXJzXG4gICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpXG4gICAgICAgIHNlbGYuX2NhbWVyYV9vcGVyYXRpb24gPSB0aHJlYWRpbmcuTG9jaygpXG4gICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlXG4gICAgICAgIHNlbGYuX3NoYXJlID0gTm9uZVxuICAgICAgICBzZWxmLnNlcnZlciA9IExvY2FsSFRUUFNlcnZlcigoTE9PUEJBQ0ssIHBvcnQpLCBzZWxmKVxuXG4gICAgZGVmIGFkYXB0ZXJfZm9yKHNlbGYsIGlwKTpcbiAgICAgICAgY2hvaWNlcyA9IFthZGFwdGVyIGZvciBhZGFwdGVyIGluIHNlbGYubGlzdF9hZGFwdGVycygpIGlmIGFkYXB0ZXIuaXAgPT0gaXBdXG4gICAgICAgIGlmIGxlbihjaG9pY2VzKSAhPSAxOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign54++5Zyo5L2/44GI44KLUEPjga7mjqXntprlhYjjgpLpgbjjgpPjgafjgY/jgaDjgZXjgYTjgIInKVxuICAgICAgICByZXR1cm4gY2hvaWNlc1swXVxuXG4gICAgZGVmIG9wdGlvbnMoc2VsZik6XG4gICAgICAgIHdpdGggc2VsZi5fbG9jazpcbiAgICAgICAgICAgIHNoYXJpbmcgPSBOb25lIGlmIHNlbGYuX3NoYXJlIGlzIE5vbmUgZWxzZSBzZWxmLl9zaGFyZVsyXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2FkYXB0ZXJzJzogW1xuICAgICAgICAgICAgICAgIHsnaXAnOiBhZGFwdGVyLmlwLCAncHJlZml4JzogYWRhcHRlci5hZGRyZXNzLm5ldHdvcmsucHJlZml4bGVuLCAnaW5kZXgnOiBhZGFwdGVyLmluZGV4fVxuICAgICAgICAgICAgICAgIGZvciBhZGFwdGVyIGluIHNlbGYubGlzdF9hZGFwdGVycygpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJ2FwcCc6ICdpZXJtdS1jYW0nLCAnc2hhcmluZyc6IHNoYXJpbmcsXG4gICAgICAgIH1cblxuICAgIGRlZiBkaXNjb3ZlcihzZWxmKTpcbiAgICAgICAgaWYgbm90IHNlbGYuX2NhbWVyYV9vcGVyYXRpb24uYWNxdWlyZShibG9ja2luZz1GYWxzZSk6XG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfjgqvjg6Hjg6njga7mk43kvZzkuK3jgafjgZnjgIInKVxuICAgICAgICB0cnk6XG4gICAgICAgICAgICBpZiBzZWxmLnBsYXliYWNrLnN0YXR1cygpWydwaGFzZSddIG5vdCBpbiAoJ2lkbGUnLCAnZXJyb3InKTpcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCflho3nlJ/jgpLlgZzmraLjgZfjgabjgYvjgonmjqLjgZfjgabjgY/jgaDjgZXjgYTjgIInKVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7J2lwJzogcm91dGUuaXAsICdtYWMnOiByb3V0ZS5tYWMsICdzb3VyY2UnOiByb3V0ZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICdkaXJlY3QnOiByb3V0ZS5pcCA9PSBzdHIoRElSRUNUX0lQKX1cbiAgICAgICAgICAgICAgICBmb3Igcm91dGUgaW4gZmluZF9jYW1lcmFzKHNlbGYubGlzdF9hZGFwdGVycygpKVxuICAgICAgICAgICAgXVxuICAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICAgc2VsZi5fY2FtZXJhX29wZXJhdGlvbi5yZWxlYXNlKClcblxuICAgIGRlZiBzdGFydF9wbGF5YmFjayhzZWxmLCByb3V0ZSwgc2Vjb25kcyk6XG4gICAgICAgIGlmIG5vdCBzZWxmLl9jYW1lcmFfb3BlcmF0aW9uLmFjcXVpcmUoYmxvY2tpbmc9RmFsc2UpOlxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXG4gICAgICAgIHRyeTpcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnBsYXliYWNrLnN0YXJ0KHJvdXRlLCBzZWNvbmRzKVxuICAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICAgc2VsZi5fY2FtZXJhX29wZXJhdGlvbi5yZWxlYXNlKClcblxuICAgIGRlZiBzdGFydF9zaGFyZShzZWxmLCBpcCk6XG4gICAgICAgIGFkYXB0ZXIgPSBzZWxmLmFkYXB0ZXJfZm9yKGlwKVxuICAgICAgICBpZiBub3QgcHJpdmF0ZV9hZGRyZXNzKGFkYXB0ZXIuYWRkcmVzcy5pcCk6XG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCflrrbluq3lhoXjg43jg4Pjg4jjg6/jg7zjgq/jga7jgqLjg4njg6zjgrnjgpLpgbjjgpPjgafjgY/jgaDjgZXjgYTjgIInKVxuICAgICAgICB3aXRoIHNlbGYuX2xvY2s6XG4gICAgICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6XG4gICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcignV2Vi44Ki44OX44Oq44KS57WC5LqG44GX44Gm44GE44G+44GZ44CCJylcbiAgICAgICAgICAgIGlmIHNlbGYuX3NoYXJlIGlzIG5vdCBOb25lOlxuICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NoYXJlWzBdLnNlcnZlcl9hZGRyZXNzWzBdID09IGFkYXB0ZXIuaXA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9zaGFyZVsyXVxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ+aOpee2muWFiOOCkuWkieOBiOOCi+WJjeOBq+OAgeOCueODnuODm+WFseacieOCkue1guS6huOBl+OBpuOBj+OBoOOBleOBhOOAgicpXG4gICAgICAgICAgICB0b2tlbiA9IHNlY3JldHMudG9rZW5fdXJsc2FmZSgyNClcbiAgICAgICAgICAgIHNlcnZlciA9IExvY2FsSFRUUFNlcnZlcihcbiAgICAgICAgICAgICAgICAoYWRhcHRlci5pcCwgMCksIHNlbGYsXG4gICAgICAgICAgICAgICAgbmV0d29yaz1hZGFwdGVyLmFkZHJlc3MubmV0d29yaywgdG9rZW49dG9rZW4sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgbGluayA9IGYnaHR0cDovL3tzZXJ2ZXIuYXV0aG9yaXR5fS8jcGFpcj17dG9rZW59J1xuICAgICAgICAgICAgICAgIGluZm8gPSB7J3VybCc6IGxpbmssICdxcic6IHFyX2RhdGFfdXJsKGxpbmspLCAnaXAnOiBhZGFwdGVyLmlwfVxuICAgICAgICAgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1zZXJ2ZXIuc2VydmVfZm9yZXZlciwga3dhcmdzPXsncG9sbF9pbnRlcnZhbCc6IDAuMn0sXG4gICAgICAgICAgICAgICAgICAgIGRhZW1vbj1UcnVlLCBuYW1lPSdpZXJtdS1waG9uZS1zaGFyZScsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpXG4gICAgICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjpcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKClcbiAgICAgICAgICAgICAgICByYWlzZVxuICAgICAgICAgICAgc2VsZi5fc2hhcmUgPSBzZXJ2ZXIsIHRocmVhZCwgaW5mb1xuICAgICAgICAgICAgcmV0dXJuIGluZm9cblxuICAgIGRlZiBzdG9wX3NoYXJlKHNlbGYpOlxuICAgICAgICB3aXRoIHNlbGYuX2xvY2s6XG4gICAgICAgICAgICBpZiBzZWxmLl9zaGFyZSBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgICAgICBzZXJ2ZXIsIHRocmVhZCwgXyA9IHNlbGYuX3NoYXJlXG4gICAgICAgICAgICAgICAgc2VydmVyLnJldm9rZWQuc2V0KClcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKVxuICAgICAgICAgICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRocmVhZC5qb2luKClcbiAgICAgICAgICAgICAgICBzZWxmLl9zaGFyZSA9IE5vbmVcblxuICAgIGRlZiBjbG9zZShzZWxmKTpcbiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOlxuICAgICAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZVxuICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZXJfY2xvc2UoKVxuICAgICAgICBzZWxmLnN0b3Bfc2hhcmUoKVxuICAgICAgICBzZWxmLnBsYXliYWNrLmNsb3NlKClcblxuXG5jbGFzcyBIYW5kbGVyKEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOlxuICAgIGRlZiBzZXR1cChzZWxmKTpcbiAgICAgICAgc2VsZi5yZXF1ZXN0LnNldHRpbWVvdXQoNClcbiAgICAgICAgc3VwZXIoKS5zZXR1cCgpXG5cbiAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6XG4gICAgICAgICMgSW52aXRhdGlvbiBrZXlzIGFuZCBjYW1lcmEgYWRkcmVzc2VzIGRvIG5vdCBiZWxvbmcgaW4gcmVxdWVzdCBsb2dzLlxuICAgICAgICBwYXNzXG5cbiAgICBkZWYgaGFuZGxlKHNlbGYpOlxuICAgICAgICB0cnk6XG4gICAgICAgICAgICBzdXBlcigpLmhhbmRsZSgpXG4gICAgICAgIGV4Y2VwdCAoQnJva2VuUGlwZUVycm9yLCBDb25uZWN0aW9uUmVzZXRFcnJvciwgQ29ubmVjdGlvbkFib3J0ZWRFcnJvcik6XG4gICAgICAgICAgICBwYXNzXG5cbiAgICBkZWYgcmVzcG9uZChzZWxmLCBzdGF0dXMsIHBheWxvYWQ9YicnLCBjb250ZW50X3R5cGU9Tm9uZSwgKiwgc2VxdWVuY2U9Tm9uZSk6XG4gICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShzdGF0dXMpXG4gICAgICAgIGlmIGNvbnRlbnRfdHlwZSBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRfdHlwZSlcbiAgICAgICAgaWYgc2VxdWVuY2UgaXMgbm90IE5vbmU6XG4gICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdYLUZyYW1lLVNlcXVlbmNlJywgc3RyKHNlcXVlbmNlKSlcbiAgICAgICAgaWYgc3RhdHVzICE9IDIwNDpcbiAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihwYXlsb2FkKSkpXG4gICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tc3RvcmUnKVxuICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKVxuICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5JywgJ3NhbWUtb3JpZ2luJylcbiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignUmVmZXJyZXItUG9saWN5JywgJ25vLXJlZmVycmVyJylcbiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdzZWxmJzsgaW1nLXNyYyAnc2VsZicgYmxvYjogZGF0YTo7IFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCJvYmplY3Qtc3JjICdub25lJzsgYmFzZS11cmkgJ25vbmUnOyBmcmFtZS1hbmNlc3RvcnMgJ25vbmUnXCIpXG4gICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKVxuICAgICAgICBpZiBwYXlsb2FkOlxuICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShwYXlsb2FkKVxuXG4gICAgZGVmIGpzb24oc2VsZiwgc3RhdHVzLCBkYXRhKTpcbiAgICAgICAgc2VsZi5yZXNwb25kKHN0YXR1cywganNvbi5kdW1wcyhkYXRhLCBlbnN1cmVfYXNjaWk9RmFsc2UpLmVuY29kZSgpLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpXG5cbiAgICBkZWYgdmFsaWRfcGVlcihzZWxmKTpcbiAgICAgICAgaWYgc2VsZi5oZWFkZXJzLmdldF9hbGwoJ0hvc3QnKSAhPSBbc2VsZi5zZXJ2ZXIuYXV0aG9yaXR5XSBvciBzZWxmLnNlcnZlci5yZXZva2VkLmlzX3NldCgpOlxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXG4gICAgICAgIGlwID0gaXBhZGRyZXNzLklQdjRBZGRyZXNzKHNlbGYuY2xpZW50X2FkZHJlc3NbMF0pXG4gICAgICAgIGlmIHNlbGYuc2VydmVyLm5ldHdvcmsgaXMgTm9uZTpcbiAgICAgICAgICAgIHJldHVybiBpcC5pc19sb29wYmFja1xuICAgICAgICByZXR1cm4gcHJpdmF0ZV9hZGRyZXNzKGlwKSBhbmQgaXAgaW4gc2VsZi5zZXJ2ZXIubmV0d29ya1xuXG4gICAgZGVmIGNhbl92aWV3KHNlbGYpOlxuICAgICAgICBpZiBzZWxmLnNlcnZlci50b2tlbiBpcyBOb25lOlxuICAgICAgICAgICAgcmV0dXJuIFRydWVcbiAgICAgICAgcmVjZWl2ZWQgPSBzZWxmLmhlYWRlcnMuZ2V0KCdBdXRob3JpemF0aW9uJywgJycpLmVuY29kZSgnbGF0aW4tMScpXG4gICAgICAgIGV4cGVjdGVkID0gZidCZWFyZXIge3NlbGYuc2VydmVyLnRva2VufScuZW5jb2RlKCdhc2NpaScpXG4gICAgICAgIHJldHVybiBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KHJlY2VpdmVkLCBleHBlY3RlZClcblxuICAgIGRlZiBkb19HRVQoc2VsZik6XG4gICAgICAgIGlmIG5vdCBzZWxmLnZhbGlkX3BlZXIoKTpcbiAgICAgICAgICAgIHNlbGYuanNvbig0MDMsIHsnZXJyb3InOiAn44GT44Gu44Ki44OJ44Os44K544GL44KJ44Gv5Yip55So44Gn44GN44G+44Gb44KT44CCJ30pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgcGF0aCwgXywgcXVlcnkgPSBzZWxmLnBhdGgucGFydGl0aW9uKCc/JylcbiAgICAgICAgaWYgcGF0aCBpbiBBU1NFVFM6XG4gICAgICAgICAgICBmaWxlLCBjb250ZW50X3R5cGUgPSBBU1NFVFNbcGF0aF1cbiAgICAgICAgICAgIHNlbGYucmVzcG9uZCgyMDAsIChXRUIgLyBmaWxlKS5yZWFkX2J5dGVzKCksIGNvbnRlbnRfdHlwZSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBpZiBub3Qgc2VsZi5jYW5fdmlldygpOlxuICAgICAgICAgICAgc2VsZi5qc29uKDQwMSwgeydlcnJvcic6ICdQQ+OBp+eZuuihjOOBl+OBn+OCueODnuODm+eUqOODquODs+OCr+OBi+OCiemWi+OBhOOBpuOBj+OBoOOBleOBhOOAgid9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIGFwcCA9IHNlbGYuc2VydmVyLmFwcFxuICAgICAgICBpZiBwYXRoID09ICcvYXBpL3N0YXR1cyc6XG4gICAgICAgICAgICBzZWxmLmpzb24oMjAwLCBhcHAucGxheWJhY2suc3RhdHVzKCkpXG4gICAgICAgIGVsaWYgcGF0aCA9PSAnL2FwaS9mcmFtZSc6XG4gICAgICAgICAgICBhZnRlciA9IHBhcnNlX3FzKHF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1UcnVlKS5nZXQoJ2FmdGVyJywgWycwJ10pWzBdXG4gICAgICAgICAgICBpZiByZS5mdWxsbWF0Y2gocidbMC05XXsxLDE4fScsIGFmdGVyKSBpcyBOb25lOlxuICAgICAgICAgICAgICAgIHNlbGYuanNvbig0MDAsIHsnZXJyb3InOiAn44OV44Os44O844Og55Wq5Y+344GM54Sh5Yq544Gn44GZ44CCJ30pXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICBmcmFtZSA9IGFwcC5wbGF5YmFjay5sYXRlc3QoaW50KGFmdGVyKSlcbiAgICAgICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNwb25kKDIwNClcbiAgICAgICAgICAgIGVsc2U6XG4gICAgICAgICAgICAgICAgc2VxdWVuY2UsIGltYWdlID0gZnJhbWVcbiAgICAgICAgICAgICAgICBzZWxmLnJlc3BvbmQoMjAwLCBpbWFnZSwgJ2ltYWdlL2pwZWcnLCBzZXF1ZW5jZT1zZXF1ZW5jZSlcbiAgICAgICAgZWxpZiBwYXRoID09ICcvYXBpL29wdGlvbnMnIGFuZCBzZWxmLnNlcnZlci5uZXR3b3JrIGlzIE5vbmU6XG4gICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgc2VsZi5qc29uKDIwMCwgYXBwLm9wdGlvbnMoKSlcbiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOlxuICAgICAgICAgICAgICAgIHNlbGYuanNvbig1MDMsIHsnZXJyb3InOiBzdHIoZXJyb3IpfSlcbiAgICAgICAgZWxzZTpcbiAgICAgICAgICAgIHNlbGYuanNvbig0MDQsIHsnZXJyb3InOiAn44Oa44O844K444GM6KaL44Gk44GL44KK44G+44Gb44KT44CCJ30pXG5cbiAgICBkZWYgZG9fUE9TVChzZWxmKTpcbiAgICAgICAgbGVuZ3RocyA9IHNlbGYuaGVhZGVycy5nZXRfYWxsKCdDb250ZW50LUxlbmd0aCcsIFtdKVxuICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3Roc1swXSkgaWYgbGVuKGxlbmd0aHMpID09IDEgYW5kIHJlLmZ1bGxtYXRjaChyJ1swLTldezEsNH0nLCBsZW5ndGhzWzBdKSBlbHNlIDBcbiAgICAgICAgYm91bmRlZF9ib2R5ID0gMSA8PSBsZW5ndGggPD0gMjA0OCBhbmQgbm90IHNlbGYuaGVhZGVycy5nZXQoJ1RyYW5zZmVyLUVuY29kaW5nJylcbiAgICAgICAgaWYgKG5vdCBzZWxmLnZhbGlkX3BlZXIoKSBvciBzZWxmLnNlcnZlci5uZXR3b3JrIGlzIG5vdCBOb25lXG4gICAgICAgICAgICAgICAgb3Igc2VsZi5oZWFkZXJzLmdldF9hbGwoJ09yaWdpbicpICE9IFtmJ2h0dHA6Ly97c2VsZi5zZXJ2ZXIuYXV0aG9yaXR5fSddKTpcbiAgICAgICAgICAgICMgQ29uc3VtZSBhIGJvdW5kZWQgcmVxdWVzdCBib2R5IHNvIFdpbmRvd3MgY2FuIGRlbGl2ZXIgdGhlIHJlamVjdGlvbiBiZWZvcmUgY2xvc2luZy5cbiAgICAgICAgICAgIGlmIGJvdW5kZWRfYm9keTpcbiAgICAgICAgICAgICAgICBzZWxmLnJmaWxlLnJlYWQobGVuZ3RoKVxuICAgICAgICAgICAgc2VsZi5qc29uKDQwMywgeydlcnJvcic6ICdQQ+OBrueUu+mdouOBi+OCieaTjeS9nOOBl+OBpuOBj+OBoOOBleOBhOOAgid9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRyeTpcbiAgICAgICAgICAgIGlmIG5vdCBib3VuZGVkX2JvZHkgb3Igc2VsZi5oZWFkZXJzLmdldF9jb250ZW50X3R5cGUoKSAhPSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign5YWl5Yqb5b2i5byP44GM54Sh5Yq544Gn44GZ44CCJylcbiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHNlbGYucmZpbGUucmVhZChsZW5ndGgpKVxuICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign5YWl5Yqb5b2i5byP44GM54Sh5Yq544Gn44GZ44CCJylcbiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUaW1lb3V0RXJyb3IsIFJlY3Vyc2lvbkVycm9yKTpcbiAgICAgICAgICAgIHNlbGYuanNvbig0MDAsIHsnZXJyb3InOiAn5YWl5Yqb5YaF5a6544KS56K66KqN44GX44Gm44GP44Gg44GV44GE44CCJ30pXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBhcHAgPSBzZWxmLnNlcnZlci5hcHBcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgaWYgc2VsZi5wYXRoID09ICcvYXBpL2Rpc2NvdmVyJzpcbiAgICAgICAgICAgICAgICBzZWxmLmpzb24oMjAwLCB7J2NhbWVyYXMnOiBhcHAuZGlzY292ZXIoKX0pXG4gICAgICAgICAgICBlbGlmIHNlbGYucGF0aCA9PSAnL2FwaS9zdGFydCc6XG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IGRhdGEuZ2V0KCdzZWNvbmRzJylcbiAgICAgICAgICAgICAgICBpZiB0eXBlKHNlY29uZHMpIGlzIG5vdCBpbnQgb3Igc2Vjb25kcyBub3QgaW4gKDEyMCwgNjAwLCAxODAwKTpcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign5YaN55Sf5pmC6ZaT44KS6YG444KT44Gn44GP44Gg44GV44GE44CCJylcbiAgICAgICAgICAgICAgICByb3V0ZSA9IGNhbWVyYV9yb3V0ZShhcHAuYWRhcHRlcl9mb3IoZGF0YS5nZXQoJ3NvdXJjZScpKSwgZGF0YS5nZXQoJ2lwJyksIGRhdGEuZ2V0KCdtYWMnKSlcbiAgICAgICAgICAgICAgICBpZiBub3QgYXBwLnN0YXJ0X3BsYXliYWNrKHJvdXRlLCBzZWNvbmRzKTpcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5qc29uKDQwOSwgeydlcnJvcic6ICfjgqvjg6Hjg6njga7mk43kvZzkuK3jgafjgZnjgIInfSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgc2VsZi5qc29uKDIwMiwgYXBwLnBsYXliYWNrLnN0YXR1cygpKVxuICAgICAgICAgICAgZWxpZiBzZWxmLnBhdGggPT0gJy9hcGkvc3RvcCc6XG4gICAgICAgICAgICAgICAgYXBwLnBsYXliYWNrLnN0b3AoKVxuICAgICAgICAgICAgICAgIHNlbGYuanNvbigyMDAsIGFwcC5wbGF5YmFjay5zdGF0dXMoKSlcbiAgICAgICAgICAgIGVsaWYgc2VsZi5wYXRoID09ICcvYXBpL3NoYXJlJzpcbiAgICAgICAgICAgICAgICBzZWxmLmpzb24oMjAwLCBhcHAuc3RhcnRfc2hhcmUoZGF0YS5nZXQoJ2lwJykpKVxuICAgICAgICAgICAgZWxpZiBzZWxmLnBhdGggPT0gJy9hcGkvdW5zaGFyZSc6XG4gICAgICAgICAgICAgICAgYXBwLnN0b3Bfc2hhcmUoKVxuICAgICAgICAgICAgICAgIHNlbGYuanNvbigyMDAsIHsnc2hhcmluZyc6IE5vbmV9KVxuICAgICAgICAgICAgZWxzZTpcbiAgICAgICAgICAgICAgICBzZWxmLmpzb24oNDA0LCB7J2Vycm9yJzogJ+ODmuODvOOCuOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgid9KVxuICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlcnJvcjpcbiAgICAgICAgICAgIHNlbGYuanNvbig0MDAsIHsnZXJyb3InOiBzdHIoZXJyb3IpfSlcbiAgICAgICAgZXhjZXB0IE9TRXJyb3I6XG4gICAgICAgICAgICBzZWxmLmpzb24oNTAzLCB7J2Vycm9yJzogJ1BD44Gu44ON44OD44OI44Ov44O844Kv44KS56K66KqN44GX44Gm44GP44Gg44GV44GE44CCJ30pXG5cblxuZGVmIG1haW4oKTpcbiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKVxuICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcG9ydCcsIHR5cGU9aW50LCBkZWZhdWx0PTg3NjUpXG4gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vcGVuJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nT3BlbiB0aGUgUEMgdmlld2VyIGluIHRoZSBkZWZhdWx0IGJyb3dzZXInKVxuICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpXG4gICAgYXBwID0gQXBwKGFyZ3MucG9ydClcbiAgICB1cmwgPSBmJ2h0dHA6Ly97YXBwLnNlcnZlci5hdXRob3JpdHl9LydcbiAgICBwcmludChmJ0lFUk1VIENhbeWwgueUqOOCouODl+ODqiAge3VybH1cXG7ntYLkuobjgZnjgovjgavjga8gQ3RybCtDJywgZmx1c2g9VHJ1ZSlcbiAgICBpZiBhcmdzLm9wZW46XG4gICAgICAgIHdlYmJyb3dzZXIub3Blbih1cmwpXG4gICAgdHJ5OlxuICAgICAgICBhcHAuc2VydmVyLnNlcnZlX2ZvcmV2ZXIocG9sbF9pbnRlcnZhbD0wLjIpXG4gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OlxuICAgICAgICBwYXNzXG4gICAgZmluYWxseTpcbiAgICAgICAgYXBwLmNsb3NlKClcblxuXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxuICAgIG1haW4oKVxuIiwgInJlcXVpcmVtZW50cy50eHQiOiAiaW1hZ2Vpby1mZm1wZWc9PTAuNi4wIC0taGFzaD1zaGEyNTY6MDJmYTQ3YzgzNzAzYzM3ZGY2YmZlNDg5NmFhYjMzOTAxM2Y2MmJmMDJjNWViZjJkY2U2ZGE1NmFmMDRmZmMwYVxuc2Vnbm89PTEuNi42IC0taGFzaD1zaGEyNTY6MjhjN2QwODFlZDBjZjkzNWUwNDExMjkzYTQ2NWVmZDRkNTAwNzA0MDcyY2RiMDM5Nzc4YTJhYjg3MzYxOTBjN1xuIiwgIndlYl9jYW1lcmEucHkiOiAiXCJcIlwiS2VlcCBvbmUgZGVjb2RlZCBjYW1lcmEgc3RyZWFtIGZvciBhbGwgdmlld2VycyBvZiB0aGUgbG9jYWwgV2ViIGFwcC5cIlwiXCJcbmltcG9ydCBzb2NrZXRcbmltcG9ydCBzdWJwcm9jZXNzXG5pbXBvcnQgdGhyZWFkaW5nXG5pbXBvcnQgdGltZVxuXG5pbXBvcnQgaWVybXVfY21zXG5pbXBvcnQgY21zX3JlY292ZXJ5XG5cblxuZGVmIGRlY29kZV9zdHJlYW0oc3RyZWFtLCBzZWNvbmRzLCBzdG9wLCBwdWJsaXNoLCByZXBvcnQpOlxuICAgIFwiXCJcIkZlZWQgdGhlIGV4aXN0aW5nIGRlY29kZXIgYW5kIHB1Ymxpc2ggb25seSBjb21wbGV0ZSBKUEVHIGZyYW1lcy5cIlwiXCJcbiAgICBiZWdhbiA9IHRpbWUubW9ub3RvbmljKClcbiAgICBkZWNvZGVyX2ZhaWxlZCA9IHRocmVhZGluZy5FdmVudCgpXG4gICAgZG9uZSA9IHRocmVhZGluZy5FdmVudCgpXG4gICAgcmVwb3J0WydkZWNvZGVkX2ZyYW1lcyddID0gMFxuXG4gICAgd2l0aCBzdWJwcm9jZXNzLlBvcGVuKFxuICAgICAgICBpZXJtdV9jbXMuZGVjb2Rlcl9jb21tYW5kKHF1YWxpdHk9J2hkJyksXG4gICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCxcbiAgICAgICAgY3JlYXRpb25mbGFncz1nZXRhdHRyKHN1YnByb2Nlc3MsICdDUkVBVEVfTk9fV0lORE9XJywgMCksXG4gICAgKSBhcyBkZWNvZGVyOlxuICAgICAgICBkZWYgcmVhZF9mcmFtZXMoKTpcbiAgICAgICAgICAgIHBhcnNlciA9IGllcm11X2Ntcy5KcGVnRnJhbWVzKClcbiAgICAgICAgICAgIHRyeTpcbiAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc3RvcC5pc19zZXQoKTpcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBkZWNvZGVyLnN0ZG91dC5yZWFkMSgzMjc2OClcbiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJsb2NrOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGZvciBmcmFtZSBpbiBwYXJzZXIuZmVlZChibG9jayk6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZS5tb25vdG9uaWMoKSAtIGJlZ2FuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuc2V0ZGVmYXVsdCgnZmlyc3RfZGVjb2RlZF9mcmFtZV9zJywgZWxhcHNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFsnbGFzdF9kZWNvZGVkX2ZyYW1lX3MnXSA9IGVsYXBzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFsnZGVjb2RlZF9mcmFtZXMnXSArPSAxXG4gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoKGZyYW1lKVxuICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKTpcbiAgICAgICAgICAgICAgICBkZWNvZGVyX2ZhaWxlZC5zZXQoKVxuXG4gICAgICAgIGRlZiBpbnRlcnJ1cHRfaWZfbmVlZGVkKCk6XG4gICAgICAgICAgICB3aGlsZSBub3QgZG9uZS53YWl0KDAuMSk6XG4gICAgICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKSBvciBkZWNvZGVyX2ZhaWxlZC5pc19zZXQoKSBvciBkZWNvZGVyLnBvbGwoKSBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgICAgICAgICAgdHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpXG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1xuICAgICAgICAgICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWNvZGVyLnBvbGwoKSBpcyBOb25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIudGVybWluYXRlKClcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIGRlZiBmZWVkKGJsb2NrKTpcbiAgICAgICAgICAgIGRlY29kZXIuc3RkaW4ud3JpdGUoYmxvY2spXG4gICAgICAgICAgICBkZWNvZGVyLnN0ZGluLmZsdXNoKClcblxuICAgICAgICByZWFkZXIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1yZWFkX2ZyYW1lcywgZGFlbW9uPVRydWUpXG4gICAgICAgIHdhdGNoZXIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1pbnRlcnJ1cHRfaWZfbmVlZGVkLCBkYWVtb249VHJ1ZSlcbiAgICAgICAgcmVhZGVyLnN0YXJ0KClcbiAgICAgICAgd2F0Y2hlci5zdGFydCgpXG4gICAgICAgIHRyeTpcbiAgICAgICAgICAgIGllcm11X2Ntcy5yZWNlaXZlKHN0cmVhbSwgZmVlZCwgc3RvcCwgc2Vjb25kcywgc3RhdHM9cmVwb3J0LCBpZGxlX3RpbWVvdXQ9MTUpXG4gICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgICB0cnk6XG4gICAgICAgICAgICAgICAgdHJ5OlxuICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnN0ZGluLmNsb3NlKClcbiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgcGFzc1xuICAgICAgICAgICAgICAgIHRyeTpcbiAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci53YWl0KHRpbWVvdXQ9MylcbiAgICAgICAgICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDpcbiAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5raWxsKClcbiAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci53YWl0KClcbiAgICAgICAgICAgICAgICByZWFkZXIuam9pbigpXG4gICAgICAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICAgICAgIGRvbmUuc2V0KClcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmpvaW4oKVxuXG4gICAgaWYgbm90IHN0b3AuaXNfc2V0KCkgYW5kIChkZWNvZGVyX2ZhaWxlZC5pc19zZXQoKSBvciBkZWNvZGVyLnJldHVybmNvZGUpOlxuICAgICAgICByZXBvcnRbJ3JlYXNvbiddID0gJ0RFQ09ERVJfRVJST1InXG5cblxuZGVmIGNhbWVyYV9hdHRlbXB0KHJvdXRlLCByZW1haW5pbmcsIHN0b3AsIHB1Ymxpc2gsICosIHJlY29ubmVjdGluZyk6XG4gICAgcmVwb3J0ID0geydkZWNvZGVkX2ZyYW1lcyc6IDAsICdyZWFzb24nOiAnRVJST1InfVxuICAgIHN0YXJ0ZWQgPSB0aW1lLm1vbm90b25pYygpXG4gICAgcmVjb3Zlcnlfd2FpdCA9IG1pbihyZW1haW5pbmcsIGllcm11X2Ntcy5SRUNPVkVSWV9XQUlUX1NFQ09ORFMpIGlmIHJlY29ubmVjdGluZyBlbHNlIDBcbiAgICB0cnk6XG4gICAgICAgIHdpdGggaWVybXVfY21zLmNvbm5lY3Rpb24oXG4gICAgICAgICAgICByb3V0ZSwgcXVhbGl0eT0naGQnLCBzdG9wPXN0b3AsIHJlY292ZXJ5X3dhaXQ9cmVjb3Zlcnlfd2FpdCxcbiAgICAgICAgKSBhcyBzdHJlYW06XG4gICAgICAgICAgICBzZWNvbmRzID0gcmVtYWluaW5nIC0gKHRpbWUubW9ub3RvbmljKCkgLSBzdGFydGVkKVxuICAgICAgICAgICAgaWYgc2Vjb25kcyA8PSAwIG9yIHN0b3AuaXNfc2V0KCk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsqKnJlcG9ydCwgJ3JlYXNvbic6ICdUSU1FX0xJTUlUJyBpZiBzZWNvbmRzIDw9IDAgZWxzZSAnU1RPUFBFRCd9XG4gICAgICAgICAgICBkZWNvZGVfc3RyZWFtKHN0cmVhbSwgc2Vjb25kcywgc3RvcCwgcHVibGlzaCwgcmVwb3J0KVxuICAgIGV4Y2VwdCBpZXJtdV9jbXMuSWRlbnRpdHlFcnJvcjpcbiAgICAgICAgcmVwb3J0WydyZWFzb24nXSA9ICdJREVOVElUWV9FUlJPUidcbiAgICBleGNlcHQgKENvbm5lY3Rpb25FcnJvciwgVGltZW91dEVycm9yLCBFT0ZFcnJvcik6XG4gICAgICAgIGlmIHJlcG9ydC5nZXQoJ3JlYXNvbicpICE9ICdDT05TVU1FX0VSUk9SJzpcbiAgICAgICAgICAgIHJlcG9ydC51cGRhdGUocmVhc29uPSdESVNDT05ORUNURUQnLCByZWNvdmVyYWJsZT1UcnVlKVxuICAgIGV4Y2VwdCAoT1NFcnJvciwgVmFsdWVFcnJvcik6XG4gICAgICAgIHBhc3NcblxuICAgIGlmIHN0b3AuaXNfc2V0KCk6XG4gICAgICAgIHJlcG9ydFsncmVhc29uJ10gPSAnU1RPUFBFRCdcbiAgICBlbGlmIHJlcG9ydC5nZXQoJ3JlYXNvbicpIGluICgnTk9fREFUQScsICdQRUVSX0NMT1NFRCcpOlxuICAgICAgICByZXBvcnRbJ3JlY292ZXJhYmxlJ10gPSBUcnVlXG4gICAgcmV0dXJuIHJlcG9ydFxuXG5cbmNsYXNzIFBsYXliYWNrOlxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRlbXB0PWNhbWVyYV9hdHRlbXB0KTpcbiAgICAgICAgc2VsZi5fYXR0ZW1wdCA9IGF0dGVtcHRcbiAgICAgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5Mb2NrKClcbiAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2VcbiAgICAgICAgc2VsZi5fd29ya2VyID0gTm9uZVxuICAgICAgICBzZWxmLl9zdG9wID0gTm9uZVxuICAgICAgICBzZWxmLl9waGFzZSA9ICdpZGxlJ1xuICAgICAgICBzZWxmLl9tZXNzYWdlID0gJydcbiAgICAgICAgc2VsZi5fZnJhbWUgPSBOb25lXG4gICAgICAgIHNlbGYuX3NlcXVlbmNlID0gMFxuXG4gICAgZGVmIHN0YXR1cyhzZWxmKTpcbiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOlxuICAgICAgICAgICAgcmV0dXJuIHsncGhhc2UnOiBzZWxmLl9waGFzZSwgJ21lc3NhZ2UnOiBzZWxmLl9tZXNzYWdlfVxuXG4gICAgZGVmIGxhdGVzdChzZWxmLCBhZnRlcik6XG4gICAgICAgIHdpdGggc2VsZi5fbG9jazpcbiAgICAgICAgICAgIGlmIHNlbGYuX2ZyYW1lIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9zZXF1ZW5jZSA+IGFmdGVyOlxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZXF1ZW5jZSwgc2VsZi5fZnJhbWVcbiAgICAgICAgICAgIHJldHVybiBOb25lXG5cbiAgICBkZWYgc3RhcnQoc2VsZiwgcm91dGUsIHNlY29uZHMpOlxuICAgICAgICB3aXRoIHNlbGYuX2xvY2s6XG4gICAgICAgICAgICBpZiBzZWxmLl9jbG9zZWQgb3Igc2VsZi5fd29ya2VyIGlzIG5vdCBOb25lOlxuICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZVxuICAgICAgICAgICAgc2VsZi5fc3RvcCA9IHRocmVhZGluZy5FdmVudCgpXG4gICAgICAgICAgICBzZWxmLl9waGFzZSA9ICdjb25uZWN0aW5nJ1xuICAgICAgICAgICAgc2VsZi5fbWVzc2FnZSA9ICfjgqvjg6Hjg6njgpLnorroqo3jgZfjgabjgYTjgb7jgZnjgIInXG4gICAgICAgICAgICBzZWxmLl9mcmFtZSA9IE5vbmVcbiAgICAgICAgICAgIHNlbGYuX3dvcmtlciA9IHRocmVhZGluZy5UaHJlYWQoXG4gICAgICAgICAgICAgICAgdGFyZ2V0PXNlbGYuX3BsYXksIGFyZ3M9KHJvdXRlLCBzZWNvbmRzLCBzZWxmLl9zdG9wKSwgbmFtZT0naWVybXUtcGxheWJhY2snLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgc2VsZi5fd29ya2VyLnN0YXJ0KClcbiAgICAgICAgICAgIHJldHVybiBUcnVlXG5cbiAgICBkZWYgc3RvcChzZWxmKTpcbiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOlxuICAgICAgICAgICAgaWYgc2VsZi5fd29ya2VyIGlzIG5vdCBOb25lOlxuICAgICAgICAgICAgICAgIHNlbGYuX3BoYXNlID0gJ3N0b3BwaW5nJ1xuICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSAn44Kr44Oh44Op44Go44Gu5o6l57aa44KS6ZaJ44GY44Gm44GE44G+44GZ44CCJ1xuICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lID0gTm9uZVxuICAgICAgICAgICAgICAgIHNlbGYuX3N0b3Auc2V0KClcblxuICAgIGRlZiBjbG9zZShzZWxmKTpcbiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOlxuICAgICAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZVxuICAgICAgICAgICAgd29ya2VyID0gc2VsZi5fd29ya2VyXG4gICAgICAgIHNlbGYuc3RvcCgpXG4gICAgICAgIGlmIHdvcmtlciBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgIHdvcmtlci5qb2luKClcblxuICAgIGRlZiBfcGxheShzZWxmLCByb3V0ZSwgc2Vjb25kcywgc3RvcCk6XG4gICAgICAgIHRpbWVkX291dCA9IHRocmVhZGluZy5FdmVudCgpXG4gICAgICAgIGF0dGVtcHRzID0gMFxuXG4gICAgICAgIGRlZiBleHBpcmUoKTpcbiAgICAgICAgICAgIHRpbWVkX291dC5zZXQoKVxuICAgICAgICAgICAgc3RvcC5zZXQoKVxuXG4gICAgICAgIGRlZiBwdWJsaXNoKGZyYW1lKTpcbiAgICAgICAgICAgIHdpdGggc2VsZi5fbG9jazpcbiAgICAgICAgICAgICAgICBpZiBub3Qgc3RvcC5pc19zZXQoKTpcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWUgPSBmcmFtZVxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXF1ZW5jZSArPSAxXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BoYXNlID0gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSAn5pig5YOP44KS5Y+X5L+h44GX44Gm44GE44G+44GZ44CCJ1xuXG4gICAgICAgIGRlZiBub3RpZnkobWVzc2FnZSk6XG4gICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6XG4gICAgICAgICAgICAgICAgaWYgbm90IHN0b3AuaXNfc2V0KCk6XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lID0gTm9uZVxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9waGFzZSA9ICdyZWNvbm5lY3RpbmcnIGlmIGF0dGVtcHRzIGVsc2UgJ2Nvbm5lY3RpbmcnXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlXG5cbiAgICAgICAgZGVmIGF0dGVtcHQocmVtYWluaW5nKTpcbiAgICAgICAgICAgIG5vbmxvY2FsIGF0dGVtcHRzXG4gICAgICAgICAgICBhdHRlbXB0cyArPSAxXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0ZW1wdChyb3V0ZSwgcmVtYWluaW5nLCBzdG9wLCBwdWJsaXNoLCByZWNvbm5lY3Rpbmc9YXR0ZW1wdHMgPiAxKVxuXG4gICAgICAgIHRpbWVyID0gdGhyZWFkaW5nLlRpbWVyKHNlY29uZHMsIGV4cGlyZSlcbiAgICAgICAgdGltZXIuZGFlbW9uID0gVHJ1ZVxuICAgICAgICB0aW1lci5zdGFydCgpXG4gICAgICAgIHJlYXNvbiA9ICdFUlJPUidcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgcmVhc29uID0gY21zX3JlY292ZXJ5LnN1cGVydmlzZShhdHRlbXB0LCBzdG9wLCBzZWNvbmRzLCBub3RpZnkpWydyZWFzb24nXVxuICAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICAgdGltZXIuY2FuY2VsKClcbiAgICAgICAgICAgIHRpbWVyLmpvaW4oKVxuICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOlxuICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lID0gTm9uZVxuICAgICAgICAgICAgICAgIGlmIHRpbWVkX291dC5pc19zZXQoKSBvciByZWFzb24gPT0gJ1RJTUVfTElNSVQnOlxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9waGFzZSwgc2VsZi5fbWVzc2FnZSA9ICdpZGxlJywgJ+ioreWumuOBl+OBn+aZgumWk+OBp+iHquWLleWBnOatouOBl+OBvuOBl+OBn+OAgidcbiAgICAgICAgICAgICAgICBlbGlmIHN0b3AuaXNfc2V0KCk6XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BoYXNlLCBzZWxmLl9tZXNzYWdlID0gJ2lkbGUnLCAn5YaN55Sf44KS5YGc5q2i44GX44G+44GX44Gf44CCJ1xuICAgICAgICAgICAgICAgIGVsc2U6XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BoYXNlID0gJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9tZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0lERU5USVRZX0VSUk9SJzogJ+OCq+ODoeODqeOCkueiuuiqjeOBp+OBjeOBvuOBm+OCk+OAgklQ44CBTUFD44CBUEPjga7mjqXntprlhYjjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1JFVFJZX0xJTUlUJzogJ+WGjeaOpee2muOBp+OBjeOBquOBi+OBo+OBn+OBn+OCgeWBnOatouOBl+OBvuOBl+OBn+OAgicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnREVDT0RFUl9FUlJPUic6ICfmmKDlg4/jga7lpInmj5vjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NPTlNVTUVfRVJST1InOiAn5pig5YOP44Gu5aSJ5o+b44Gr5aSx5pWX44GX44G+44GX44Gf44CCJyxcbiAgICAgICAgICAgICAgICAgICAgfS5nZXQocmVhc29uLCAn5pig5YOP44GM5bGK44GN44G+44Gb44KT44CC6Zu75rqQ44GoV2ktRmnjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIInKVxuICAgICAgICAgICAgICAgIHNlbGYuX3dvcmtlciA9IE5vbmVcbiIsICJ3ZWJfaWVybXUvYXBwLmNzcyI6ICI6cm9vdCB7XG4gIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG4gIC0tYmFja2dyb3VuZDogI2Y0ZjVmMjtcbiAgLS1zdXJmYWNlOiAjZmZmZmZmO1xuICAtLXN1cmZhY2UtbXV0ZWQ6ICNlZmYyZWY7XG4gIC0tYm9yZGVyOiAjZGZlNGUwO1xuICAtLWZvcmVncm91bmQ6ICMyMjJjMjk7XG4gIC0tc2Vjb25kYXJ5LXRleHQ6ICM1NjYzNWU7XG4gIC0tYWNjZW50OiAjMzg1ODUwO1xuICAtLWFjY2VudC1ob3ZlcjogIzI5NDYzZjtcbiAgLS1hY2NlbnQtc29mdDogI2U2ZWZlYTtcbiAgLS13YXJuaW5nOiAjNzQ0YjI1O1xuICAtLXdhcm5pbmctc29mdDogI2Y4ZWVlMTtcbiAgLS1kaXNwbGF5OiBcIll1IEdvdGhpYyBVSVwiLCBcIkhpcmFnaW5vIEtha3UgR290aGljIFByb05cIiwgTWVpcnlvLCBzYW5zLXNlcmlmO1xuICBmb250LWZhbWlseTogdmFyKC0tZGlzcGxheSk7XG59XG5cbiosICo6OmJlZm9yZSwgKjo6YWZ0ZXIgeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG5baGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfVxuYm9keSB7IG1hcmdpbjogMDsgY29sb3I6IHZhcigtLWZvcmVncm91bmQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kKTsgfVxuYnV0dG9uLCBzZWxlY3QsIGlucHV0IHsgZm9udDogaW5oZXJpdDsgfVxuYnV0dG9uLCBzZWxlY3QsIHN1bW1hcnkgeyBjdXJzb3I6IHBvaW50ZXI7IH1cbmJ1dHRvbjpkaXNhYmxlZCB7IGN1cnNvcjogZGVmYXVsdDsgb3BhY2l0eTogLjQ2OyB9XG46Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBvdXRsaW5lLW9mZnNldDogM3B4OyB9XG5cbi5tYXN0aGVhZCB7XG4gIHdpZHRoOiBtaW4oMTI0MHB4LCBjYWxjKDEwMCUgLSA0OHB4KSk7XG4gIG1pbi1oZWlnaHQ6IDc4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbn1cbi5icmFuZCB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luOiAwOyBmb250LXNpemU6IDFyZW07IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAuMDI1ZW07IH1cbi5icmFuZCBpbWcgeyBmbGV4OiBub25lOyB9XG4uc2hlbGwgeyB3aWR0aDogbWluKDEyNDBweCwgY2FsYygxMDAlIC0gNDhweCkpOyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMjhweCAwOyB9XG4ud29ya3NwYWNlIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSAzMDBweDsgYWxpZ24taXRlbXM6IHN0YXJ0OyBnYXA6IDE4cHg7IH1cbi5yZW1vdGUgLndvcmtzcGFjZSB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9XG5cbi5tb25pdG9yLCAuY29udHJvbHMgeyBtaW4td2lkdGg6IDA7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAyMHB4OyB9XG4ubW9uaXRvciB7IG92ZXJmbG93OiBoaWRkZW47IH1cbi5tb25pdG9yLWJhciB7IG1pbi1oZWlnaHQ6IDQ5cHg7IHBhZGRpbmc6IDlweCAxNnB4OyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgfVxuLnN0YXR1cy1iYWRnZSB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDdweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IHBhZGRpbmc6IDVweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLW11dGVkKTsgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0KTsgZm9udC1zaXplOiAuNzVyZW07IH1cbi5zdGF0dXMtYmFkZ2UgaSB7IHdpZHRoOiA2cHg7IGhlaWdodDogNnB4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsgfVxuLnN0YXR1cy1iYWRnZVtkYXRhLXBoYXNlPVwicGxheWluZ1wiXSB7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1zb2Z0KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IH1cbi5zdGF0dXMtYmFkZ2VbZGF0YS1waGFzZT1cImNvbm5lY3RpbmdcIl0sIC5zdGF0dXMtYmFkZ2VbZGF0YS1waGFzZT1cInJlY29ubmVjdGluZ1wiXSxcbi5zdGF0dXMtYmFkZ2VbZGF0YS1waGFzZT1cImVycm9yXCJdLCAuc3RhdHVzLWJhZGdlW2RhdGEtcGhhc2U9XCJsb2NrZWRcIl0geyBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nLXNvZnQpOyBjb2xvcjogdmFyKC0td2FybmluZyk7IH1cbi5yZXNvbHV0aW9uIHsgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0KTsgZm9udDogLjc4cmVtIFwiQ2FzY2FkaWEgTW9ub1wiLCBDb25zb2xhcywgbW9ub3NwYWNlOyB9XG4uc2NyZWVuIHsgZGlzcGxheTogZ3JpZDsgcGxhY2UtaXRlbXM6IGNlbnRlcjsgcG9zaXRpb246IHJlbGF0aXZlOyBhc3BlY3QtcmF0aW86IDE2IC8gOTsgYmFja2dyb3VuZDogIzFlMjUyMzsgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuLnNjcmVlbiA+IGltZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgaW5zZXQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9iamVjdC1maXQ6IGNvbnRhaW47IGJhY2tncm91bmQ6ICMxNjFiMTk7IH1cbi5lbXB0eSB7IGRpc3BsYXk6IGdyaWQ7IGp1c3RpZnktaXRlbXM6IGNlbnRlcjsgZ2FwOiA5cHg7IHBhZGRpbmc6IDEycHg7IGNvbG9yOiAjYzVjZmNhOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogLjg0cmVtOyB9XG4uZW1wdHkgcCB7IG1hcmdpbjogMDsgfVxuLnJldGljbGUgeyBmaWxsOiBub25lOyBzdHJva2U6ICNhNGIzYWI7IHN0cm9rZS13aWR0aDogMS4zNTsgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsgfVxuXG4uY29udHJvbHMgeyBwYWRkaW5nOiAxNHB4OyB9XG4uY29udHJvbHMgc2VjdGlvbiB7IHBhZGRpbmc6IDAgNHB4IDNweDsgfVxuaDIgeyBtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IC45M3JlbTsgfVxuLm1vZGUtc3dpdGNoIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDNweDsgcGFkZGluZzogNHB4OyBtYXJnaW4tYm90dG9tOiAxN3B4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLW11dGVkKTsgfVxuLm1vZGUtc3dpdGNoIGJ1dHRvbiB7IG1pbi1oZWlnaHQ6IDM3cHg7IGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OyBib3JkZXItcmFkaXVzOiA5cHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQpOyBmb250LXNpemU6IC44MnJlbTsgfVxuLm1vZGUtc3dpdGNoIGJ1dHRvblthcmlhLXByZXNzZWQ9XCJ0cnVlXCJdIHsgY29sb3I6IHZhcigtLWZvcmVncm91bmQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXIpOyBmb250LXdlaWdodDogNzAwOyB9XG4uaGludCB7IGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dCk7IG1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogLjc5cmVtOyBsaW5lLWhlaWdodDogMS42NTsgfVxubGFiZWwgeyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAxMnB4IDAgNXB4OyBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQpOyBmb250LXNpemU6IC43NnJlbTsgfVxuaW5wdXQsIHNlbGVjdCB7IHdpZHRoOiAxMDAlOyBtaW4taGVpZ2h0OiA0MnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiA4cHggMTBweDsgY29sb3I6IHZhcigtLWZvcmVncm91bmQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsgZm9udC1zaXplOiAuODNyZW07IH1cbmlucHV0OjpwbGFjZWhvbGRlciB7IGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dCk7IH1cbmlucHV0OmRpc2FibGVkLCBzZWxlY3Q6ZGlzYWJsZWQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLW11dGVkKTsgfVxuLmZpZWxkLWhlYWRpbmcgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogYmFzZWxpbmU7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiA2cHg7IH1cbi5saW5rLWJ1dHRvbiB7IHBhZGRpbmc6IDRweDsgYm9yZGVyOiAwOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGZvbnQtc2l6ZTogLjc2cmVtOyB9XG4uYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA3cHg7IG1hcmdpbi10b3A6IDlweDsgfVxuLnByaW1hcnksIC5zZWNvbmRhcnkgeyBtaW4taGVpZ2h0OiA0MnB4OyBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsgYm9yZGVyLXJhZGl1czogMTBweDsgcGFkZGluZzogOHB4IDEycHg7IGZvbnQtc2l6ZTogLjgycmVtOyBmb250LXdlaWdodDogNzAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbi5wcmltYXJ5IHsgY29sb3I6ICNmZmY7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IH1cbi5wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWhvdmVyKTsgfVxuLnNlY29uZGFyeSB7IGNvbG9yOiB2YXIoLS1mb3JlZ3JvdW5kKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsgfVxuLnNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtbXV0ZWQpOyB9XG4jc3RhcnQgeyBmbGV4OiAxOyB9XG4jc3RhcnQgc3BhbiB7IG1hcmdpbi1yaWdodDogM3B4OyBmb250LXNpemU6IC42N3JlbTsgfVxuLnNoYXJlLXN0YXJ0IHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB9XG4uZ3VpZGUgeyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dCk7IGZvbnQtc2l6ZTogLjc3cmVtOyB9XG4uZ3VpZGUgcCB7IG1hcmdpbjogOXB4IDAgMDsgbGluZS1oZWlnaHQ6IDEuNzsgfVxuLmludml0ZSB7IG1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgfVxuLmludml0ZSBpbWcgeyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAwIGF1dG87IH1cbi5ub3RpY2UgeyBtYXJnaW46IDExcHggNHB4IDJweDsgcGFkZGluZzogOHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1zb2Z0KTsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyBmb250LXNpemU6IC43OHJlbTsgbGluZS1oZWlnaHQ6IDEuNTU7IH1cblxuLnNldHVwIHsgbWF4LXdpZHRoOiA2NjBweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxNHB4OyB9XG4uc2V0dXAtY2FyZCB7IHBhZGRpbmc6IDIwcHggMjJweDsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDIwcHg7IH1cbi5zZXR1cC1jYXJkIGgyIHsgZm9udC1zaXplOiAxcmVtOyB9XG4uc2V0dXAtY2FyZCBvbCB7IG1hcmdpbjogMTBweCAwIDE0cHg7IHBhZGRpbmctbGVmdDogMS40ZW07IGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dCk7IGZvbnQtc2l6ZTogLjg2cmVtOyBsaW5lLWhlaWdodDogMS44OyB9XG4uc2V0dXAtY2FyZCBhOm5vdCguc2V0dXAtYWN0aW9uKSB7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9XG4uc2V0dXAtYWN0aW9uIHsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzQwcHgpIHtcbiAgLm1hc3RoZWFkLCAuc2hlbGwgeyB3aWR0aDogY2FsYygxMDAlIC0gMjhweCk7IH1cbiAgLm1hc3RoZWFkIHsgbWluLWhlaWdodDogNjJweDsgfVxuICAuc2hlbGwgeyBwYWRkaW5nOiAxNnB4IDA7IH1cbiAgLndvcmtzcGFjZSB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7IGdhcDogMTJweDsgfVxuICAubW9uaXRvciwgLmNvbnRyb2xzIHsgYm9yZGVyLXJhZGl1czogMTVweDsgfVxuICBpbnB1dCwgc2VsZWN0IHsgZm9udC1zaXplOiAxNnB4OyB9XG59XG4iLCAid2ViX2llcm11L2FwcC5qcyI6ICJcInVzZSBzdHJpY3RcIjtcblxuY29uc3QgYnlJZCA9IChpZCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuY29uc3QgcmVtb3RlID0gbG9jYXRpb24uaG9zdG5hbWUgIT09IFwiMTI3LjAuMC4xXCI7XG5jb25zdCBmZWVkID0gYnlJZChcImZlZWRcIik7XG5jb25zdCBjYW1lcmFJcCA9IGJ5SWQoXCJjYW1lcmEtaXBcIik7XG5jb25zdCBjYW1lcmFNYWMgPSBieUlkKFwiY2FtZXJhLW1hY1wiKTtcbmNvbnN0IGNhbWVyYVNvdXJjZSA9IGJ5SWQoXCJjYW1lcmEtc291cmNlXCIpO1xuY29uc3QgY2FtZXJhQ2hvaWNlID0gYnlJZChcImNhbWVyYS1jaG9pY2VcIik7XG5jb25zdCBzaGFyZVNvdXJjZSA9IGJ5SWQoXCJzaGFyZS1zb3VyY2VcIik7XG5jb25zdCBkdXJhdGlvbiA9IGJ5SWQoXCJkdXJhdGlvblwiKTtcbmNvbnN0IGFjdGl2ZVBoYXNlcyA9IG5ldyBTZXQoW1wiY29ubmVjdGluZ1wiLCBcInBsYXlpbmdcIiwgXCJyZWNvbm5lY3RpbmdcIiwgXCJzdG9wcGluZ1wiXSk7XG5jb25zdCBkZXRhaWxQaGFzZXMgPSBuZXcgU2V0KFtcImlkbGVcIiwgXCJyZWNvbm5lY3RpbmdcIiwgXCJlcnJvclwiLCBcImxvY2tlZFwiXSk7XG5jb25zdCBsYWJlbHMgPSB7XG4gIGlkbGU6IFwi5YGc5q2i5LitXCIsIGNvbm5lY3Rpbmc6IFwi5o6l57aa5LitXCIsIHBsYXlpbmc6IFwi5YaN55Sf5LitXCIsIHJlY29ubmVjdGluZzogXCLlho3mjqXntprkuK1cIixcbiAgc3RvcHBpbmc6IFwi5YGc5q2i5Yem55CG5LitXCIsIGVycm9yOiBcIuaOpee2muOCkueiuuiqjVwiLCBsb2NrZWQ6IFwi44Oq44Oz44Kv44GM5b+F6KaBXCIsXG59O1xuXG5sZXQgcGhhc2UgPSBcImlkbGVcIjtcbmxldCBjb21tYW5kUGVuZGluZyA9IGZhbHNlO1xubGV0IHNoYXJlSW5mbyA9IG51bGw7XG5sZXQgY2FtZXJhcyA9IFtdO1xubGV0IGxhdGVzdFNlcXVlbmNlID0gMDtcbmxldCBmcmFtZVVybCA9IG51bGw7XG5sZXQgZnJhbWVHZW5lcmF0aW9uID0gMDtcbmxldCBwYWlyID0gXCJcIjtcblxuaWYgKHJlbW90ZSkge1xuICBieUlkKFwic2hlbGxcIikuY2xhc3NMaXN0LmFkZChcInJlbW90ZVwiKTtcbiAgY29uc3QgaW52aXRhdGlvbiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uaGFzaC5zbGljZSgxKSkuZ2V0KFwicGFpclwiKTtcbiAgcGFpciA9IGludml0YXRpb24gfHwgXCJcIjtcbiAgdHJ5IHtcbiAgICBpZiAoaW52aXRhdGlvbikge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImllcm11LXBhaXJcIiwgaW52aXRhdGlvbik7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBcIlwiLCBsb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiaWVybXUtcGFpclwiKSB8fCBcIlwiO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGludml0YXRpb24gaW4gdGhlIGFkZHJlc3Mgc3RpbGwgd29ya3MgaWYgc3RvcmFnZSBpcyB1bmF2YWlsYWJsZS5cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIGlmIChsb2NhdGlvbi5oYXNoLnN0YXJ0c1dpdGgoXCIjcGFpcj1cIikpIGxvY2F0aW9uLnJlbG9hZCgpO1xuICB9KTtcbn0gZWxzZSB7XG4gIGJ5SWQoXCJjb250cm9sc1wiKS5oaWRkZW4gPSBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChwYXRoLCBkYXRhLCB0aW1lb3V0ID0gNDUwMCkge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgaWYgKHJlbW90ZSAmJiBwYWlyKSBoZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBwYWlyKTtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG4gIHRyeSB7XG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkgaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocGF0aCwge1xuICAgICAgbWV0aG9kOiBkYXRhID09PSB1bmRlZmluZWQgPyBcIkdFVFwiIDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICBjYWNoZTogXCJuby1zdG9yZVwiLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGNvbnN0IGZhaWx1cmUgPSBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgXCJQQ+OBrldlYuOCouODl+ODquOBq+aOpee2muOBp+OBjeOBvuOBm+OCk+OAglwiKTtcbiAgICAgIGZhaWx1cmUuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgdGhyb3cgZmFpbHVyZTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSByZXR1cm4gbnVsbDtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL2FwaS9mcmFtZT9cIikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyYW1lOiBhd2FpdCByZXNwb25zZS5ibG9iKCksXG4gICAgICAgIHNlcXVlbmNlOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJYLUZyYW1lLVNlcXVlbmNlXCIpKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhckZyYW1lKCkge1xuICBmcmFtZUdlbmVyYXRpb24gKz0gMTtcbiAgaWYgKGZyYW1lVXJsKSB7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChmcmFtZVVybCk7XG4gICAgZnJhbWVVcmwgPSBudWxsO1xuICAgIGZlZWQucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpO1xuICB9XG4gIGZlZWQuaGlkZGVuID0gdHJ1ZTtcbiAgYnlJZChcImVtcHR5XCIpLmhpZGRlbiA9IGZhbHNlO1xuICBieUlkKFwicmVzb2x1dGlvblwiKS5oaWRkZW4gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb250cm9scygpIHtcbiAgY29uc3QgYWN0aXZlID0gYWN0aXZlUGhhc2VzLmhhcyhwaGFzZSk7XG4gIGNvbnN0IGJ1c3kgPSBjb21tYW5kUGVuZGluZyB8fCBhY3RpdmU7XG4gIGJ5SWQoXCJmaW5kLWNhbWVyYVwiKS5kaXNhYmxlZCA9IGJ1c3k7XG4gIGNhbWVyYUNob2ljZS5kaXNhYmxlZCA9IGJ1c3k7XG4gIGJ5SWQoXCJyZWZyZXNoXCIpLmRpc2FibGVkID0gYnVzeTtcbiAgYnlJZChcInN0YXJ0XCIpLmRpc2FibGVkID0gYnVzeSB8fCAhY2FtZXJhSXAudmFsdWUudHJpbSgpIHx8ICFjYW1lcmFNYWMudmFsdWUudHJpbSgpIHx8ICFjYW1lcmFTb3VyY2UudmFsdWU7XG4gIGJ5SWQoXCJzdG9wXCIpLmRpc2FibGVkID0gY29tbWFuZFBlbmRpbmcgfHwgIWFjdGl2ZSB8fCBwaGFzZSA9PT0gXCJzdG9wcGluZ1wiO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIFtjYW1lcmFJcCwgY2FtZXJhTWFjLCBjYW1lcmFTb3VyY2UsIGR1cmF0aW9uXSkge1xuICAgIGZpZWxkLmRpc2FibGVkID0gYnVzeTtcbiAgfVxuICBzaGFyZVNvdXJjZS5kaXNhYmxlZCA9IGNvbW1hbmRQZW5kaW5nIHx8IEJvb2xlYW4oc2hhcmVJbmZvKTtcbiAgYnlJZChcInNoYXJlXCIpLmRpc2FibGVkID0gY29tbWFuZFBlbmRpbmcgfHwgIXNoYXJlU291cmNlLnZhbHVlO1xuICBieUlkKFwidW5zaGFyZVwiKS5kaXNhYmxlZCA9IGNvbW1hbmRQZW5kaW5nO1xufVxuXG5mdW5jdGlvbiBzaG93U3RhdHVzKHN0YXRlKSB7XG4gIGlmIChwaGFzZSAhPT0gc3RhdGUucGhhc2UgJiYgc3RhdGUucGhhc2UgIT09IFwicGxheWluZ1wiKSBjbGVhckZyYW1lKCk7XG4gIHBoYXNlID0gc3RhdGUucGhhc2U7XG4gIGJ5SWQoXCJzdGF0dXMtYmFkZ2VcIikuZGF0YXNldC5waGFzZSA9IHBoYXNlO1xuICBjb25zdCBsYWJlbCA9IGJ5SWQoXCJzdGF0dXMtbGFiZWxcIik7XG4gIGNvbnN0IHN0YXR1cyA9IGxhYmVsc1twaGFzZV0gfHwgXCLmjqXntprjgpLnorroqo1cIjtcbiAgaWYgKGxhYmVsLnRleHRDb250ZW50ICE9PSBzdGF0dXMpIGxhYmVsLnRleHRDb250ZW50ID0gc3RhdHVzO1xuICBjb25zdCBkZXRhaWwgPSBieUlkKFwic3RhdHVzLW1lc3NhZ2VcIik7XG4gIGNvbnN0IHRleHQgPSByZW1vdGUgJiYgcGhhc2UgPT09IFwiaWRsZVwiID8gXCJQQ+OBp+WGjeeUn+OCkumWi+Wni+OBl+OBpuOBj+OBoOOBleOBhOOAglwiXG4gICAgOiBkZXRhaWxQaGFzZXMuaGFzKHBoYXNlKSA/IHN0YXRlLm1lc3NhZ2UgOiBcIlwiO1xuICBpZiAoZGV0YWlsLnRleHRDb250ZW50ICE9PSB0ZXh0KSBkZXRhaWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBkZXRhaWwuaGlkZGVuID0gIXRleHQ7XG4gIGlmICghcmVtb3RlKSBjb250cm9scygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb2xsU3RhdHVzKCkge1xuICBpZiAocmVtb3RlICYmICFwYWlyKSB7XG4gICAgc2hvd1N0YXR1cyh7IHBoYXNlOiBcImxvY2tlZFwiLCBtZXNzYWdlOiBcIlBD44Gn55m66KGM44GX44Gf44Oq44Oz44Kv44KS6ZaL44GE44Gm44GP44Gg44GV44GE44CCXCIgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgc2hvd1N0YXR1cyhhd2FpdCByZXF1ZXN0KFwiL2FwaS9zdGF0dXNcIikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChyZW1vdGUgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHNob3dTdGF0dXMoeyBwaGFzZTogXCJsb2NrZWRcIiwgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2hvd1N0YXR1cyh7IHBoYXNlOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiUEPjga5XZWLjgqLjg5fjg6rjgavmjqXntprjgafjgY3jgb7jgZvjgpPjgIJcIiB9KTtcbiAgfVxuICBzZXRUaW1lb3V0KHBvbGxTdGF0dXMsIGRvY3VtZW50LmhpZGRlbiA/IDE4MDAgOiA2NTApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb2xsRnJhbWUoKSB7XG4gIGNvbnN0IGdlbmVyYXRpb24gPSBmcmFtZUdlbmVyYXRpb247XG4gIGlmIChwaGFzZSA9PT0gXCJwbGF5aW5nXCIgJiYgIWRvY3VtZW50LmhpZGRlbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdChcIi9hcGkvZnJhbWU/YWZ0ZXI9XCIgKyBsYXRlc3RTZXF1ZW5jZSk7XG4gICAgICBpZiAoZGF0YSAmJiBwaGFzZSA9PT0gXCJwbGF5aW5nXCIgJiYgZ2VuZXJhdGlvbiA9PT0gZnJhbWVHZW5lcmF0aW9uKSB7XG4gICAgICAgIGxhdGVzdFNlcXVlbmNlID0gZGF0YS5zZXF1ZW5jZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBmcmFtZVVybDtcbiAgICAgICAgZnJhbWVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEuZnJhbWUpO1xuICAgICAgICBmZWVkLnNyYyA9IGZyYW1lVXJsO1xuICAgICAgICBpZiAocHJldmlvdXMpIFVSTC5yZXZva2VPYmplY3RVUkwocHJldmlvdXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHN0YXR1cyByZXF1ZXN0IHJlcG9ydHMgbG9zcyBvZiB0aGUgUEMgb3IgY2FtZXJhIGNvbm5lY3Rpb24uXG4gICAgfVxuICB9XG4gIHNldFRpbWVvdXQocG9sbEZyYW1lLCBwaGFzZSA9PT0gXCJwbGF5aW5nXCIgJiYgIWRvY3VtZW50LmhpZGRlbiA/IDg1IDogNDAwKTtcbn1cblxuZmVlZC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XG4gIGlmIChwaGFzZSAhPT0gXCJwbGF5aW5nXCIgfHwgIWZyYW1lVXJsIHx8IGZlZWQuc3JjICE9PSBmcmFtZVVybCkgcmV0dXJuO1xuICBmZWVkLmhpZGRlbiA9IGZhbHNlO1xuICBieUlkKFwiZW1wdHlcIikuaGlkZGVuID0gdHJ1ZTtcbiAgYnlJZChcInJlc29sdXRpb25cIikudGV4dENvbnRlbnQgPSBmZWVkLm5hdHVyYWxXaWR0aCArIFwiIMOXIFwiICsgZmVlZC5uYXR1cmFsSGVpZ2h0O1xuICBieUlkKFwicmVzb2x1dGlvblwiKS5oaWRkZW4gPSBmYWxzZTtcbn0pO1xuXG5mdW5jdGlvbiBub3RpY2UobWVzc2FnZSkge1xuICBieUlkKFwibm90aWNlXCIpLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgYnlJZChcIm5vdGljZVwiKS5oaWRkZW4gPSAhbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gbW9kZShwaG9uZSkge1xuICBieUlkKFwicGMtbW9kZVwiKS5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIiwgU3RyaW5nKCFwaG9uZSkpO1xuICBieUlkKFwicGhvbmUtbW9kZVwiKS5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIiwgU3RyaW5nKHBob25lKSk7XG4gIGJ5SWQoXCJwYy1wYW5lbFwiKS5oaWRkZW4gPSBwaG9uZTtcbiAgYnlJZChcInBob25lLXBhbmVsXCIpLmhpZGRlbiA9ICFwaG9uZTtcbiAgaWYgKHBob25lICYmICFzaGFyZVNvdXJjZS52YWx1ZSkgYnlJZChcInNoYXJlLXNldHRpbmdzXCIpLm9wZW4gPSB0cnVlO1xuICBub3RpY2UoXCJcIik7XG59XG5cbmZ1bmN0aW9uIHNob3dTaGFyZShpbmZvKSB7XG4gIHNoYXJlSW5mbyA9IGluZm87XG4gIGJ5SWQoXCJpbnZpdGVcIikuaGlkZGVuID0gIWluZm87XG4gIGJ5SWQoXCJzaGFyZVwiKS5oaWRkZW4gPSBCb29sZWFuKGluZm8pO1xuICBieUlkKFwic2hhcmUtbGlua1wiKS52YWx1ZSA9IGluZm8/LnVybCB8fCBcIlwiO1xuICBieUlkKFwicXJcIikuaGlkZGVuID0gIWluZm8/LnFyO1xuICBpZiAoaW5mbz8ucXIpIGJ5SWQoXCJxclwiKS5zcmMgPSBpbmZvLnFyO1xuICBlbHNlIGJ5SWQoXCJxclwiKS5yZW1vdmVBdHRyaWJ1dGUoXCJzcmNcIik7XG4gIGNvbnRyb2xzKCk7XG59XG5cbmZ1bmN0aW9uIHNldENob2ljZXMoZmllbGQsIGFkZHJlc3NlcywgcHJlZmVycmVkKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSBmaWVsZC52YWx1ZTtcbiAgZmllbGQucmVwbGFjZUNoaWxkcmVuKG5ldyBPcHRpb24oXCJQQ+OBruOCouODieODrOOCueOCkumBuOaKnlwiLCBcIlwiKSk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhZGRyZXNzZXMpIHtcbiAgICBmaWVsZC5hZGQobmV3IE9wdGlvbihpdGVtLmlwICsgXCIgIO+8jyAgXCIgKyBpdGVtLnByZWZpeCwgaXRlbS5pcCkpO1xuICB9XG4gIGlmIChhZGRyZXNzZXMuc29tZSgoaXRlbSkgPT4gaXRlbS5pcCA9PT0gY3VycmVudCkpIGZpZWxkLnZhbHVlID0gY3VycmVudDtcbiAgZWxzZSBpZiAoYWRkcmVzc2VzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaXAgPT09IHByZWZlcnJlZCkpIGZpZWxkLnZhbHVlID0gcHJlZmVycmVkO1xuICBlbHNlIGlmIChhZGRyZXNzZXMubGVuZ3RoID09PSAxKSBmaWVsZC52YWx1ZSA9IGFkZHJlc3Nlc1swXS5pcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL29wdGlvbnNcIik7XG4gIHNldENob2ljZXMoY2FtZXJhU291cmNlLCBvcHRpb25zLmFkYXB0ZXJzLCBcIlwiKTtcbiAgc2V0Q2hvaWNlcyhzaGFyZVNvdXJjZSwgb3B0aW9ucy5hZGFwdGVycywgb3B0aW9ucy5zaGFyaW5nPy5pcCk7XG4gIHNob3dTaGFyZShvcHRpb25zLnNoYXJpbmcpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDYW1lcmEoKSB7XG4gIGNvbnN0IGNhbWVyYSA9IGNhbWVyYXNbY2FtZXJhQ2hvaWNlLnZhbHVlXTtcbiAgaWYgKCFjYW1lcmEpIHJldHVybjtcbiAgY2FtZXJhSXAudmFsdWUgPSBjYW1lcmEuaXA7XG4gIGNhbWVyYU1hYy52YWx1ZSA9IGNhbWVyYS5tYWM7XG4gIGNhbWVyYVNvdXJjZS52YWx1ZSA9IGNhbWVyYS5zb3VyY2U7XG4gIGlmICghc2hhcmVJbmZvKSB7XG4gICAgY29uc3Qgb3RoZXJBZGRyZXNzZXMgPSBbLi4uc2hhcmVTb3VyY2Uub3B0aW9uc11cbiAgICAgIC5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKVxuICAgICAgLmZpbHRlcigoaXApID0+IGlwICYmIGlwICE9PSBjYW1lcmEuc291cmNlKTtcbiAgICBpZiAoIWNhbWVyYS5kaXJlY3QgfHwgb3RoZXJBZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaGFyZVNvdXJjZS52YWx1ZSA9IGNhbWVyYS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXJlU291cmNlLnZhbHVlID0gb3RoZXJBZGRyZXNzZXMubGVuZ3RoID09PSAxID8gb3RoZXJBZGRyZXNzZXNbMF0gOiBcIlwiO1xuICAgIH1cbiAgfVxuICBjb250cm9scygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNjb3ZlcigpIHtcbiAgY29uc3QgYnV0dG9uID0gYnlJZChcImZpbmQtY2FtZXJhXCIpO1xuICBidXR0b24udGV4dENvbnRlbnQgPSBcIuaknOe0ouS4reKAplwiO1xuICB0cnkge1xuICAgIGF3YWl0IHJlZnJlc2goKTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGNhbWVyYXNbY2FtZXJhQ2hvaWNlLnZhbHVlXTtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2Rpc2NvdmVyXCIsIHt9LCAxMjAwMCk7XG4gICAgY2FtZXJhcyA9IGZvdW5kLmNhbWVyYXM7XG4gICAgY2FtZXJhQ2hvaWNlLnJlcGxhY2VDaGlsZHJlbiguLi5jYW1lcmFzLm1hcCgoY2FtZXJhLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3VmZml4ID0gY2FtZXJhLm1hYy5zbGljZSgtOCkudG9VcHBlckNhc2UoKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gY2FtZXJhLmRpcmVjdCA/IFwi55u05o6l5o6l57aaXCIgOiBcIkxBTlwiO1xuICAgICAgcmV0dXJuIG5ldyBPcHRpb24oYElFUk1VICR7c3VmZml4fe+8iCR7cm91dGV977yJYCwgU3RyaW5nKGluZGV4KSk7XG4gICAgfSkpO1xuICAgIGJ5SWQoXCJjYW1lcmEtcmVzdWx0c1wiKS5oaWRkZW4gPSBjYW1lcmFzLmxlbmd0aCA9PT0gMDtcbiAgICBpZiAoY2FtZXJhcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNhbWVDYW1lcmEgPSBjYW1lcmFzLmZpbmRJbmRleCgoY2FtZXJhKSA9PiBjYW1lcmEubWFjID09PSBwcmV2aW91cz8ubWFjKTtcbiAgICAgIGNhbWVyYUNob2ljZS52YWx1ZSA9IFN0cmluZyhNYXRoLm1heCgwLCBzYW1lQ2FtZXJhKSk7XG4gICAgICBzZWxlY3RDYW1lcmEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNhbWVyYUlwLnZhbHVlID0gXCJcIjtcbiAgICAgICAgY2FtZXJhTWFjLnZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIG5vdGljZShcIuOCq+ODoeODqeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAglwiKTtcbiAgICAgIGJ5SWQoXCJkaXJlY3QtZ3VpZGVcIikub3BlbiA9IHRydWU7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IFwi44Kr44Oh44Op44KS5o6i44GZXCI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYWN0aW9uKHJ1bikge1xuICBpZiAoY29tbWFuZFBlbmRpbmcpIHJldHVybjtcbiAgY29tbWFuZFBlbmRpbmcgPSB0cnVlO1xuICBub3RpY2UoXCJcIik7XG4gIGNvbnRyb2xzKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbm90aWNlKGVycm9yLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiID8gXCJQQ+OBrldlYuOCouODl+ODquOBjOW/nOetlOOBl+OBvuOBm+OCk+OAglwiIDogZXJyb3IubWVzc2FnZSk7XG4gIH0gZmluYWxseSB7XG4gICAgY29tbWFuZFBlbmRpbmcgPSBmYWxzZTtcbiAgICBjb250cm9scygpO1xuICB9XG59XG5cbmlmICghcmVtb3RlKSB7XG4gIGJ5SWQoXCJwYy1tb2RlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBtb2RlKGZhbHNlKSk7XG4gIGJ5SWQoXCJwaG9uZS1tb2RlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBtb2RlKHRydWUpKTtcbiAgYnlJZChcInJlZnJlc2hcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFjdGlvbihyZWZyZXNoKSk7XG4gIGJ5SWQoXCJmaW5kLWNhbWVyYVwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gYWN0aW9uKGRpc2NvdmVyKSk7XG4gIGNhbWVyYUNob2ljZS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHNlbGVjdENhbWVyYSk7XG4gIGZvciAoY29uc3QgZmllbGQgb2YgW2NhbWVyYUlwLCBjYW1lcmFNYWMsIGNhbWVyYVNvdXJjZV0pIHtcbiAgICBmaWVsZC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4ge1xuICAgICAgY2FtZXJhQ2hvaWNlLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgIGNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbiAgc2hhcmVTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBjb250cm9scyk7XG4gIGJ5SWQoXCJjYW1lcmEtZm9ybVwiKS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHNob3dTdGF0dXMoYXdhaXQgcmVxdWVzdChcIi9hcGkvc3RhcnRcIiwge1xuICAgICAgICBpcDogY2FtZXJhSXAudmFsdWUudHJpbSgpLCBtYWM6IGNhbWVyYU1hYy52YWx1ZS50cmltKCksXG4gICAgICAgIHNvdXJjZTogY2FtZXJhU291cmNlLnZhbHVlLCBzZWNvbmRzOiBOdW1iZXIoZHVyYXRpb24udmFsdWUpLFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9KTtcbiAgYnlJZChcInN0b3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgc2hvd1N0YXR1cyhhd2FpdCByZXF1ZXN0KFwiL2FwaS9zdG9wXCIsIHt9KSk7XG4gIH0pKTtcbiAgYnlJZChcInNoYXJlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiBhY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIHNob3dTaGFyZShhd2FpdCByZXF1ZXN0KFwiL2FwaS9zaGFyZVwiLCB7IGlwOiBzaGFyZVNvdXJjZS52YWx1ZSB9KSk7XG4gIH0pKTtcbiAgYnlJZChcInVuc2hhcmVcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVxdWVzdChcIi9hcGkvdW5zaGFyZVwiLCB7fSk7XG4gICAgc2hvd1NoYXJlKG51bGwpO1xuICB9KSk7XG4gIGJ5SWQoXCJjb3B5XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBieUlkKFwic2hhcmUtbGlua1wiKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoaW5wdXQudmFsdWUpO1xuICAgICAgbm90aWNlKFwi44Oq44Oz44Kv44KS44Kz44OU44O844GX44G+44GX44Gf44CCXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgbm90aWNlKFwi6YG45oqe44GX44Gf44Oq44Oz44Kv44KS44Kz44OU44O844GX44Gm44GP44Gg44GV44GE44CCXCIpO1xuICAgIH1cbiAgfSk7XG4gIGFjdGlvbihyZWZyZXNoKTtcbn1cblxucG9sbFN0YXR1cygpO1xucG9sbEZyYW1lKCk7XG4iLCAid2ViX2llcm11L2luZGV4Lmh0bWwiOiAiPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbjxoZWFkPlxuICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gIDxtZXRhIG5hbWU9XCJjb2xvci1zY2hlbWVcIiBjb250ZW50PVwibGlnaHRcIj5cbiAgPHRpdGxlPklFUk1VIENhbeWwgueUqOOCouODl+ODqjwvdGl0bGU+XG4gIDxsaW5rIHJlbD1cImljb25cIiBocmVmPVwiL21hcmsuc3ZnXCIgdHlwZT1cImltYWdlL3N2Zyt4bWxcIj5cbiAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvYXBwLmNzc1wiPlxuICA8c2NyaXB0IHNyYz1cIi9hcHAuanNcIiBkZWZlcj48L3NjcmlwdD5cbjwvaGVhZD5cbjxib2R5PlxuICA8aGVhZGVyIGNsYXNzPVwibWFzdGhlYWRcIj5cbiAgICA8aDEgY2xhc3M9XCJicmFuZFwiPlxuICAgICAgPGltZyBzcmM9XCIvbWFyay5zdmdcIiB3aWR0aD1cIjM0XCIgaGVpZ2h0PVwiMzRcIiBhbHQ9XCJcIj5cbiAgICAgIDxzcGFuPklFUk1VIENhbeWwgueUqOOCouODl+ODqjwvc3Bhbj5cbiAgICA8L2gxPlxuICA8L2hlYWRlcj5cbiAgPG1haW4gY2xhc3M9XCJzaGVsbFwiIGlkPVwic2hlbGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid29ya3NwYWNlXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vbml0b3JcIiBhcmlhLWxhYmVsPVwi44Kr44Oh44Op44Gu5pig5YOPXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb25pdG9yLWJhclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlXCIgaWQ9XCJzdGF0dXMtYmFkZ2VcIiBkYXRhLXBoYXNlPVwiaWRsZVwiIHJvbGU9XCJzdGF0dXNcIj48aT48L2k+PHNwYW4gaWQ9XCJzdGF0dXMtbGFiZWxcIj7lgZzmraLkuK08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzb2x1dGlvblwiIGlkPVwicmVzb2x1dGlvblwiIGhpZGRlbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NyZWVuXCI+XG4gICAgICAgICAgPGltZyBpZD1cImZlZWRcIiBhbHQ9XCLjgqvjg6Hjg6njga7jg6njgqTjg5bmmKDlg49cIiBoaWRkZW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5XCIgaWQ9XCJlbXB0eVwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInJldGljbGVcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIzLjVcIiB5PVwiOC41XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjE3XCIgcng9XCI0XCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDguNSAxMiA1LjVoOGwyIDNcIi8+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTdcIiByPVwiNC41XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8cCBpZD1cInN0YXR1cy1tZXNzYWdlXCIgaGlkZGVuPjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDxhc2lkZSBjbGFzcz1cImNvbnRyb2xzXCIgaWQ9XCJjb250cm9sc1wiIGFyaWEtbGFiZWw9XCLlho3nlJ/jgajlhbHmnInjga7oqK3lrppcIiBoaWRkZW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlLXN3aXRjaFwiIGFyaWEtbGFiZWw9XCLopovjgovnq6/mnKvjgpLpgbjmip5cIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cInBjLW1vZGVcIiBhcmlhLXByZXNzZWQ9XCJ0cnVlXCI+UEPjgafopovjgos8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cInBob25lLW1vZGVcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiPuOCueODnuODm+OBp+imi+OCizwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNlY3Rpb24gaWQ9XCJwYy1wYW5lbFwiIGFyaWEtbGFiZWxsZWRieT1cInBjLXRpdGxlXCI+XG4gICAgICAgICAgPGgyIGlkPVwicGMtdGl0bGVcIj7jgqvjg6Hjg6njgpLmjqXntpo8L2gyPlxuICAgICAgICAgIDxmb3JtIGlkPVwiY2FtZXJhLWZvcm1cIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwcmltYXJ5IHNoYXJlLXN0YXJ0XCIgdHlwZT1cImJ1dHRvblwiIGlkPVwiZmluZC1jYW1lcmFcIj7jgqvjg6Hjg6njgpLmjqLjgZk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjYW1lcmEtcmVzdWx0c1wiIGhpZGRlbj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhbWVyYS1jaG9pY2VcIj7opovjgaTjgYvjgaPjgZ/jgqvjg6Hjg6k8L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiY2FtZXJhLWNob2ljZVwiPjwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2Vjb25kYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGlkPVwic3RhcnRcIiBkaXNhYmxlZD48c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7ilrY8L3NwYW4+IOWGjeeUn+mWi+WnizwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlY29uZGFyeVwiIGlkPVwic3RvcFwiIGRpc2FibGVkPuWBnOatojwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGV0YWlscyBjbGFzcz1cImd1aWRlXCI+XG4gICAgICAgICAgICAgIDxzdW1tYXJ5Puips+e0sOioreWumjwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhbWVyYS1pcFwiPuOCq+ODoeODqeOBrklQ44Ki44OJ44Os44K5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2FtZXJhLWlwXCIgaW5wdXRtb2RlPVwiZGVjaW1hbFwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2FtZXJhLW1hY1wiPk1BQ+OCouODieODrOOCue+8iOacrOS9k+OCt+ODvOODq++8iTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cImNhbWVyYS1tYWNcIiBwbGFjZWhvbGRlcj1cIjAwOjAwOjAwOjAwOjAwOjAwXCIgbWF4bGVuZ3RoPVwiMTdcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYW1lcmEtc291cmNlXCI+UEPjga7mjqXntprlhYg8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJsaW5rLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpZD1cInJlZnJlc2hcIj7mm7TmlrA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjYW1lcmEtc291cmNlXCIgcmVxdWlyZWQ+PG9wdGlvbiB2YWx1ZT1cIlwiPuaOpee2muWFiOOCkuWPluW+l+S4rTwvb3B0aW9uPjwvc2VsZWN0PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZHVyYXRpb25cIj7oh6rli5XlgZzmraI8L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTIwXCI+MuWIhjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MDBcIiBzZWxlY3RlZD4xMOWIhjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxODAwXCI+MzDliIY8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPVwiZ3VpZGVcIiBpZD1cImRpcmVjdC1ndWlkZVwiPlxuICAgICAgICAgICAgPHN1bW1hcnk+44Kr44Oh44Op44Gr55u05o6l44Gk44Gq44GQ5aC05ZCIPC9zdW1tYXJ5PlxuICAgICAgICAgICAgPHA+5pys5L2T44GuUuODnOOCv+ODs+OCkueiuuiqjemfs+OBjDLlm57ps7Tjgovjgb7jgafmirzjgZfjgb7jgZnjgIJXaW5kb3dz44Gn44CMaWVybXVseeKApuOAjeOBq+aOpee2muOBl+OAgeOAjOOCq+ODoeODqeOCkuaOouOBmeOAjeOCkuaKvOOBl+OBvuOBmeOAgjwvcD5cbiAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPHNlY3Rpb24gaWQ9XCJwaG9uZS1wYW5lbFwiIGFyaWEtbGFiZWxsZWRieT1cInBob25lLXRpdGxlXCIgaGlkZGVuPlxuICAgICAgICAgIDxoMiBpZD1cInBob25lLXRpdGxlXCI+44K544Oe44Ob44Gr5YWx5pyJPC9oMj5cbiAgICAgICAgICA8cCBjbGFzcz1cImhpbnRcIj5QQ+OBp+WGjeeUn+mWi+Wni+OAguOCueODnuODm+OBr+WQjOOBmExBTuOBuOOAgjwvcD5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHJpbWFyeSBzaGFyZS1zdGFydFwiIHR5cGU9XCJidXR0b25cIiBpZD1cInNoYXJlXCIgZGlzYWJsZWQ+44Oq44Oz44Kv44KS55m66KGMPC9idXR0b24+XG4gICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJndWlkZVwiIGlkPVwic2hhcmUtc2V0dGluZ3NcIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5PuWFseacieOBruaOpee2muWFiDwvc3VtbWFyeT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzaGFyZS1zb3VyY2VcIj7jgrnjg57jg5vjgajlkIzjgZhMQU7jga5QQ+OCouODieODrOOCuTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwic2hhcmUtc291cmNlXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPuaOpee2muWFiOOCkuWPluW+l+S4rTwvb3B0aW9uPjwvc2VsZWN0PlxuICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52aXRlXCIgaWQ9XCJpbnZpdGVcIiBoaWRkZW4+XG4gICAgICAgICAgICA8aW1nIGlkPVwicXJcIiB3aWR0aD1cIjE1MlwiIGhlaWdodD1cIjE1MlwiIGFsdD1cIuOCueODnuODm+eUqOODquODs+OCr+OBrlFS44Kz44O844OJXCIgaGlkZGVuPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNoYXJlLWxpbmtcIj7jgrnjg57jg5vnlKjjg6rjg7Pjgq88L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtbGlua1wiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgYXJpYS1sYWJlbD1cIuOCueODnuODm+eUqOODquODs+OCr1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImNvcHlcIj7jg6rjg7Pjgq/jgpLjgrPjg5Tjg7w8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiBpZD1cInVuc2hhcmVcIj7lhbHmnInntYLkuoY8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxwIGNsYXNzPVwibm90aWNlXCIgaWQ9XCJub3RpY2VcIiByb2xlPVwic3RhdHVzXCIgaGlkZGVuPjwvcD5cbiAgICAgIDwvYXNpZGU+XG4gICAgPC9kaXY+XG4gIDwvbWFpbj5cbjwvYm9keT5cbjwvaHRtbD5cbiIsICJ3ZWJfaWVybXUvbWFyay5zdmciOiAiPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0OCA0OFwiPlxuICA8cmVjdCB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjEzXCIgZmlsbD1cIiNlNWVjZWFcIi8+XG4gIDxnIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzNhNTc1MVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICA8cmVjdCB4PVwiMTBcIiB5PVwiMTVcIiB3aWR0aD1cIjI4XCIgaGVpZ2h0PVwiMjBcIiByeD1cIjRcIi8+XG4gICAgPHBhdGggZD1cIm0xNyAxNSAyLTRoMTBsMiA0XCIvPlxuICAgIDxjaXJjbGUgY3g9XCIyNFwiIGN5PVwiMjVcIiByPVwiNS41XCIvPlxuICA8L2c+XG48L3N2Zz5cbiJ9'))
