import base64
decode = lambda s: base64.b64decode(s.encode('utf-8')).decode('utf-8')
code = (
"ZnJvbSB0a2ludGVyIGltcG9ydCAqCmZyb20gdGtpbnRlciBpbXBvcnQgbWVzc2FnZWJveCwgc2ltc"+
"GxlZGlhbG9nLCBmaWxlZGlhbG9nCmltcG9ydCBpbnNwZWN0LCBjb3B5LCB0cmFjZWJhY2sKaW1wb3"+
"J0IHN5cywgb3MKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQgZ2V0cGFzcwppbXBvcnQgdGl"+
"tZQoKZGVmIGZhaWxlZEltcG9ydChpbXBvcnROYW1lLCBpbnN0YWxsTmFtZT1Ob25lKToKICAgIGlu"+
"c3RhbGxOYW1lID0gaW5zdGFsbE5hbWUgb3IgaW1wb3J0TmFtZQogICAgcHJpbnQoJyoqKioqKioqK"+
"ioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKQogICAgcH"+
"JpbnQoZicqKiBDYW5ub3QgaW1wb3J0IHtpbXBvcnROYW1lfSAtLSBpdCBzZWVtcyB5b3UgbmVlZCB"+
"0byBpbnN0YWxsIHtpbnN0YWxsTmFtZX0nKQogICAgcHJpbnQoZicqKiBUaGlzIG1heSByZXN1bHQg"+
"aW4gbGltaXRlZCBmdW5jdGlvbmFsaXR5IG9yIGV2ZW4gYSBydW50aW1lIGVycm9yLicpCiAgICBwc"+
"mludCgnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi"+
"oqKioqKicpCiAgICBwcmludCgpCgp0cnk6IGltcG9ydCByZXF1ZXN0cwpleGNlcHQgTW9kdWxlTm9"+
"0Rm91bmRFcnJvcjogZmFpbGVkSW1wb3J0KCdyZXF1ZXN0cycpCgpjbGFzcyBXcmFwcGVkQ2FudmFz"+
"KENhbnZhcyk6CiAgICAjIEVuZm9yY2VzIE1WQzogbm8gZHJhd2luZyBvdXRzaWRlIGNhbGxzIHRvI"+
"HJlZHJhd0FsbAogICAgIyBMb2dzIGRyYXcgY2FsbHMgKGZvciBhdXRvZ3JhZGVyKSBpbiBjYW52YX"+
"MubG9nZ2VkRHJhd2luZ0NhbGxzCiAgICBkZWYgX19pbml0X18od3JhcHBlZENhbnZhcywgYXBwKTo"+
"KICAgICAgICB3cmFwcGVkQ2FudmFzLmxvZ2dlZERyYXdpbmdDYWxscyA9IFsgXQogICAgICAgIHdy"+
"YXBwZWRDYW52YXMubG9nRHJhd2luZ0NhbGxzID0gVHJ1ZQogICAgICAgIHdyYXBwZWRDYW52YXMua"+
"W5SZWRyYXdBbGwgPSBGYWxzZQogICAgICAgIHdyYXBwZWRDYW52YXMuYXBwID0gYXBwCiAgICAgIC"+
"Agc3VwZXIoKS5fX2luaXRfXyhhcHAuX3Jvb3QsIHdpZHRoPWFwcC53aWR0aCwgaGVpZ2h0PWFwcC5"+
"oZWlnaHQpCgogICAgZGVmIGxvZyhzZWxmLCBtZXRob2ROYW1lLCBhcmdzLCBrd2FyZ3MpOgogICAg"+
"ICAgIGlmIChub3Qgc2VsZi5pblJlZHJhd0FsbCk6CiAgICAgICAgICAgIHNlbGYuYXBwLl9tdmNWa"+
"W9sYXRpb24oJ3lvdSBtYXkgbm90IHVzZSB0aGUgY2FudmFzICh0aGUgdmlldykgb3V0c2lkZSBvZi"+
"ByZWRyYXdBbGwnKQogICAgICAgIGlmIChzZWxmLmxvZ0RyYXdpbmdDYWxscyk6CiAgICAgICAgICA"+
"gIHNlbGYubG9nZ2VkRHJhd2luZ0NhbGxzLmFwcGVuZCgobWV0aG9kTmFtZSwgYXJncywga3dhcmdz"+
"KSkKCiAgICBkZWYgY3JlYXRlX2FyYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOiBzZWxmLmxvZygnY"+
"3JlYXRlX2FyYycsIGFyZ3MsIGt3YXJncyk7IHJldHVybiBzdXBlcigpLmNyZWF0ZV9hcmMoKmFyZ3"+
"MsICoqa3dhcmdzKQogICAgZGVmIGNyZWF0ZV9iaXRtYXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTo"+
"gc2VsZi5sb2coJ2NyZWF0ZV9iaXRtYXAnLCBhcmdzLCBrd2FyZ3MpOyByZXR1cm4gc3VwZXIoKS5j"+
"cmVhdGVfYml0bWFwKCphcmdzLCAqKmt3YXJncykKICAgIGRlZiBjcmVhdGVfbGluZShzZWxmLCAqY"+
"XJncywgKiprd2FyZ3MpOiBzZWxmLmxvZygnY3JlYXRlX2xpbmUnLCBhcmdzLCBrd2FyZ3MpOyByZX"+
"R1cm4gc3VwZXIoKS5jcmVhdGVfbGluZSgqYXJncywgKiprd2FyZ3MpCiAgICBkZWYgY3JlYXRlX29"+
"2YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTogc2VsZi5sb2coJ2NyZWF0ZV9vdmFsJywgYXJncywg"+
"a3dhcmdzKTsgcmV0dXJuIHN1cGVyKCkuY3JlYXRlX292YWwoKmFyZ3MsICoqa3dhcmdzKQogICAgZ"+
"GVmIGNyZWF0ZV9wb2x5Z29uKHNlbGYsICphcmdzLCAqKmt3YXJncyk6IHNlbGYubG9nKCdjcmVhdG"+
"VfcG9seWdvbicsIGFyZ3MsIGt3YXJncyk7IHJldHVybiBzdXBlcigpLmNyZWF0ZV9wb2x5Z29uKCp"+
"hcmdzLCAqKmt3YXJncykKICAgIGRlZiBjcmVhdGVfcmVjdGFuZ2xlKHNlbGYsICphcmdzLCAqKmt3"+
"YXJncyk6IHNlbGYubG9nKCdjcmVhdGVfcmVjdGFuZ2xlJywgYXJncywga3dhcmdzKTsgcmV0dXJuI"+
"HN1cGVyKCkuY3JlYXRlX3JlY3RhbmdsZSgqYXJncywgKiprd2FyZ3MpCiAgICBkZWYgY3JlYXRlX3"+
"RleHQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTogc2VsZi5sb2coJ2NyZWF0ZV90ZXh0JywgYXJncyw"+
"ga3dhcmdzKTsgcmV0dXJuIHN1cGVyKCkuY3JlYXRlX3RleHQoKmFyZ3MsICoqa3dhcmdzKQogICAg"+
"ZGVmIGNyZWF0ZV93aW5kb3coc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTogc2VsZi5sb2coJ2NyZWF0Z"+
"V93aW5kb3cnLCBhcmdzLCBrd2FyZ3MpOyByZXR1cm4gc3VwZXIoKS5jcmVhdGVfd2luZG93KCphcm"+
"dzLCAqKmt3YXJncykKCiAgICBkZWYgY3JlYXRlX2ltYWdlKHNlbGYsICphcmdzLCAqKmt3YXJncyk"+
"6CiAgICAgICAgc2VsZi5sb2coJ2NyZWF0ZV9pbWFnZScsIGFyZ3MsIGt3YXJncyk7CiAgICAgICAg"+
"dXNlc0ltYWdlID0gJ2ltYWdlJyBpbiBrd2FyZ3MKICAgICAgICB1c2VzUGlsSW1hZ2UgPSAncGlsS"+
"W1hZ2UnIGluIGt3YXJncwogICAgICAgIGlmICgobm90IHVzZXNJbWFnZSkgYW5kIChub3QgdXNlc1"+
"BpbEltYWdlKSk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignY3JlYXRlX2ltYWdlIHJlcXV"+
"pcmVzIGFuIGltYWdlIHRvIGRyYXcnKQogICAgICAgIGVsaWYgKHVzZXNJbWFnZSBhbmQgdXNlc1Bp"+
"bEltYWdlKToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdjcmVhdGVfaW1hZ2UgY2Fubm90I"+
"HVzZSBib3RoIGFuIGltYWdlIGFuZCBhIHBpbEltYWdlJykKICAgICAgICBlbGlmICh1c2VzUGlsSW"+
"1hZ2UpOgogICAgICAgICAgICBwaWxJbWFnZSA9IGt3YXJnc1sncGlsSW1hZ2UnXQogICAgICAgICA"+
"gICBkZWwga3dhcmdzWydwaWxJbWFnZSddCiAgICAgICAgICAgIGlmIChub3QgaXNpbnN0YW5jZShw"+
"aWxJbWFnZSwgSW1hZ2UuSW1hZ2UpKToKICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignY"+
"3JlYXRlX2ltYWdlOiBwaWxJbWFnZSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYSBQSUwvUG"+
"lsbG93IGltYWdlJykKICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZVRrLlBob3RvSW1hZ2UocGlsSW1"+
"hZ2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW1hZ2UgPSBrd2FyZ3NbJ2ltYWdlJ10KICAg"+
"ICAgICAgICAgaWYgKGlzaW5zdGFuY2UoaW1hZ2UsIEltYWdlLkltYWdlKSk6CiAgICAgICAgICAgI"+
"CAgICByYWlzZSBFeGNlcHRpb24oJ2NyZWF0ZV9pbWFnZTogaW1hZ2UgbXVzdCBub3QgYmUgYW4gaW"+
"5zdGFuY2Ugb2YgYSBQSUwvUGlsbG93IGltYWdlXG4nICsKICAgICAgICAgICAgICAgICAgICAnWW9"+
"1IHBlcmhhcHMgbWVhbnQgdG8gY29udmVydCBmcm9tIFBJTCB0byBUa2ludGVyLCBsaWtlIHNvOlxu"+
"JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgY2FudmFzLmNyZWF0ZV9pbWFnZSh4LCB5LCBpb"+
"WFnZT1JbWFnZVRrLlBob3RvSW1hZ2UoaW1hZ2UpKScpCiAgICAgICAga3dhcmdzWydpbWFnZSddID"+
"0gaW1hZ2UKICAgICAgICByZXR1cm4gc3VwZXIoKS5jcmVhdGVfaW1hZ2UoKmFyZ3MsICoqa3dhcmd"+
"zKQoKY2xhc3MgQXBwKG9iamVjdCk6CiAgICBfdGhlUm9vdCA9IE5vbmUgIyBzaW5nbGV0b24gVGtp"+
"bnRlciByb290IG9iamVjdAoKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI"+
"wogICAgIyBVc2VyIE1ldGhvZHM6CiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy"+
"MjIyMKICAgIGRlZiByZWRyYXdBbGwoYXBwLCBjYW52YXMpOiBwYXNzICAgICAgIyBkcmF3ICh2aWV"+
"3KSB0aGUgbW9kZWwgaW4gdGhlIGNhbnZhcwogICAgZGVmIGFwcFN0YXJ0ZWQoYXBwKTogcGFzcyAg"+
"ICAgICAgICAgIyBpbml0aWFsaXplIHRoZSBtb2RlbCAoYXBwLnh5eikKICAgIGRlZiBhcHBTdG9wc"+
"GVkKGFwcCk6IHBhc3MgICAgICAgICAgICMgY2xlYW51cCBhZnRlciBhcHAgaXMgZG9uZSBydW5uaW"+
"5nCiAgICBkZWYga2V5UHJlc3NlZChhcHAsIGV2ZW50KTogcGFzcyAgICAjIHVzZSBldmVudC5rZXk"+
"KICAgIGRlZiBrZXlSZWxlYXNlZChhcHAsIGV2ZW50KTogcGFzcyAgICMgdXNlIGV2ZW50LmtleQog"+
"ICAgZGVmIG1vdXNlUHJlc3NlZChhcHAsIGV2ZW50KTogcGFzcyAgIyB1c2UgZXZlbnQueCBhbmQgZ"+
"XZlbnQueQogICAgZGVmIG1vdXNlUmVsZWFzZWQoYXBwLCBldmVudCk6IHBhc3MgIyB1c2UgZXZlbn"+
"QueCBhbmQgZXZlbnQueQogICAgZGVmIG1vdXNlTW92ZWQoYXBwLCBldmVudCk6IHBhc3MgICAgIyB"+
"1c2UgZXZlbnQueCBhbmQgZXZlbnQueQogICAgZGVmIG1vdXNlRHJhZ2dlZChhcHAsIGV2ZW50KTog"+
"cGFzcyAgIyB1c2UgZXZlbnQueCBhbmQgZXZlbnQueQogICAgZGVmIHRpbWVyRmlyZWQoYXBwKTogc"+
"GFzcyAgICAgICAgICAgIyByZXNwb25kIHRvIHRpbWVyIGV2ZW50cwogICAgZGVmIHNpemVDaGFuZ2"+
"VkKGFwcCk6IHBhc3MgICAgICAgICAgIyByZXNwb25kIHRvIHdpbmRvdyBzaXplIGNoYW5nZXMKCiA"+
"gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgSW1wbGVtZW50YXRp"+
"b246CiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBkZWYgX19pb"+
"ml0X18oYXBwLCB3aWR0aD0zMDAsIGhlaWdodD0zMDAsIHg9MCwgeT0wLCB0aXRsZT1Ob25lLCBhdX"+
"RvcnVuPVRydWUsIG12Y0NoZWNrPVRydWUsIGxvZ0RyYXdpbmdDYWxscz1UcnVlKToKICAgICAgICB"+
"hcHAud2lueCwgYXBwLndpbnksIGFwcC53aWR0aCwgYXBwLmhlaWdodCA9IHgsIHksIHdpZHRoLCBo"+
"ZWlnaHQKICAgICAgICBhcHAudGltZXJEZWxheSA9IDEwMCAgICAgIyBtaWxsaXNlY29uZHMKICAgI"+
"CAgICBhcHAubW91c2VNb3ZlZERlbGF5ID0gNTAgIyBkaXR0bwogICAgICAgIGFwcC5fdGl0bGUgPS"+
"B0aXRsZQogICAgICAgIGFwcC5fbXZjQ2hlY2sgPSBtdmNDaGVjawogICAgICAgIGFwcC5fbG9nRHJ"+
"hd2luZ0NhbGxzID0gbG9nRHJhd2luZ0NhbGxzCiAgICAgICAgYXBwLl9ydW5uaW5nID0gYXBwLl9w"+
"YXVzZWQgPSBGYWxzZQogICAgICAgIGFwcC5fbW91c2VQcmVzc2VkT3V0c2lkZVdpbmRvdyA9IEZhb"+
"HNlCiAgICAgICAgaWYgYXV0b3J1bjogYXBwLnJ1bigpCgogICAgZGVmIHNldFNpemUoYXBwLCB3aW"+
"R0aCwgaGVpZ2h0KToKICAgICAgICBhcHAuX3Jvb3QuZ2VvbWV0cnkoZid7d2lkdGh9eHtoZWlnaHR"+
"9JykKCiAgICBkZWYgc2V0UG9zaXRpb24oYXBwLCB4LCB5KToKICAgICAgICBhcHAuX3Jvb3QuZ2Vv"+
"bWV0cnkoZicre3h9K3t5fScpCgogICAgZGVmIHNob3dNZXNzYWdlKGFwcCwgbWVzc2FnZSk6CiAgI"+
"CAgICAgbWVzc2FnZWJveC5zaG93aW5mbygnc2hvd01lc3NhZ2UnLCBtZXNzYWdlLCBwYXJlbnQ9YX"+
"BwLl9yb290KQoKICAgIGRlZiBnZXRVc2VySW5wdXQoYXBwLCBwcm9tcHQpOgogICAgICAgIHJldHV"+
"ybiBzaW1wbGVkaWFsb2cuYXNrc3RyaW5nKCdnZXRVc2VySW5wdXQnLCBwcm9tcHQpCgogICAgZGVm"+
"IGxvYWRJbWFnZShhcHAsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgKGFwcC5fY2FudmFzLmluUmVkc"+
"mF3QWxsKToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdDYW5ub3QgY2FsbCBsb2FkSW1hZ2"+
"UgaW4gcmVkcmF3QWxsJykKICAgICAgICBpZiAocGF0aCBpcyBOb25lKToKICAgICAgICAgICAgcGF"+
"0aCA9IGZpbGVkaWFsb2cuYXNrb3BlbmZpbGVuYW1lKGluaXRpYWxkaXI9b3MuZ2V0Y3dkKCksIHRp"+
"dGxlPSdTZWxlY3QgZmlsZTogJyxmaWxldHlwZXMgPSAoKCdJbWFnZSBmaWxlcycsJyoucG5nICouZ"+
"2lmICouanBnJyksKCdhbGwgZmlsZXMnLCcqLionKSkpCiAgICAgICAgICAgIGlmIChub3QgcGF0aC"+
"k6IHJldHVybiBOb25lCiAgICAgICAgaWYgKHBhdGguc3RhcnRzd2l0aCgnaHR0cCcpKToKICAgICA"+
"gICAgICAgcmVzcG9uc2UgPSByZXF1ZXN0cy5yZXF1ZXN0KCdHRVQnLCBwYXRoKSAjIHBhdGggaXMg"+
"YSBVUkwhCiAgICAgICAgICAgIGltYWdlID0gSW1hZ2Uub3BlbihCeXRlc0lPKHJlc3BvbnNlLmNvb"+
"nRlbnQpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltYWdlID0gSW1hZ2Uub3BlbihwYXRoKQ"+
"ogICAgICAgIHJldHVybiBpbWFnZQoKICAgIGRlZiBzY2FsZUltYWdlKGFwcCwgaW1hZ2UsIHNjYWx"+
"lLCBhbnRpYWxpYXM9RmFsc2UpOgogICAgICAgICMgYW50aWFsaWFzaW5nIGlzIGhpZ2hlci1xdWFs"+
"aXR5IGJ1dCBzbG93ZXIKICAgICAgICByZXNhbXBsZSA9IEltYWdlLkFOVElBTElBUyBpZiBhbnRpY"+
"WxpYXMgZWxzZSBJbWFnZS5ORUFSRVNUCiAgICAgICAgcmV0dXJuIGltYWdlLnJlc2l6ZSgocm91bm"+
"QoaW1hZ2Uud2lkdGgqc2NhbGUpLCByb3VuZChpbWFnZS5oZWlnaHQqc2NhbGUpKSwgcmVzYW1wbGU"+
"9cmVzYW1wbGUpCgogICAgZGVmIGdldFNuYXBzaG90KGFwcCk6CiAgICAgICAgYXBwLl9zaG93Um9v"+
"dFdpbmRvdygpCiAgICAgICAgeDAgPSBhcHAuX3Jvb3Qud2luZm9fcm9vdHgoKSArIGFwcC5fY2Fud"+
"mFzLndpbmZvX3goKQogICAgICAgIHkwID0gYXBwLl9yb290LndpbmZvX3Jvb3R5KCkgKyBhcHAuX2"+
"NhbnZhcy53aW5mb195KCkKICAgICAgICByZXN1bHQgPSBJbWFnZUdyYWJiZXIuZ3JhYigoeDAseTA"+
"seDArYXBwLndpZHRoLHkwK2FwcC5oZWlnaHQpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBk"+
"ZWYgc2F2ZVNuYXBzaG90KGFwcCk6CiAgICAgICAgcGF0aCA9IGZpbGVkaWFsb2cuYXNrc2F2ZWFzZ"+
"mlsZW5hbWUoaW5pdGlhbGRpcj1vcy5nZXRjd2QoKSwgdGl0bGU9J1NlbGVjdCBmaWxlOiAnLGZpbG"+
"V0eXBlcyA9ICgoJ3BuZyBmaWxlcycsJyoucG5nJyksKCdhbGwgZmlsZXMnLCcqLionKSkpCiAgICA"+
"gICAgaWYgKHBhdGgpOgogICAgICAgICAgICAjIGRlZmVyIGNhbGwgdG8gbGV0IGZpbGVkaWFsb2cg"+
"Y2xvc2UgKGFuZCBub3QgZ3JhYiB0aG9zZSBwaXhlbHMpCiAgICAgICAgICAgIGlmIChub3QgcGF0a"+
"C5lbmRzd2l0aCgnLnBuZycpKTogcGF0aCArPSAnLnBuZycKICAgICAgICAgICAgYXBwLl9kZWZlcn"+
"JlZE1ldGhvZENhbGwoYWZ0ZXJJZD0nc2F2ZVNuYXBzaG90JywgYWZ0ZXJEZWxheT0wLCBhZnRlckZ"+
"uPWxhbWJkYTphcHAuZ2V0U25hcHNob3QoKS5zYXZlKHBhdGgpKQoKICAgIGRlZiBfdG9nZ2xlUGF1"+
"c2VkKGFwcCk6CiAgICAgICAgYXBwLl9wYXVzZWQgPSBub3QgYXBwLl9wYXVzZWQKCiAgICBkZWYgc"+
"XVpdChhcHApOgogICAgICAgIGFwcC5fcnVubmluZyA9IEZhbHNlCiAgICAgICAgYXBwLl9yb290Ln"+
"F1aXQoKSAjIGJyZWFrIG91dCBvZiByb290Lm1haW5sb29wKCkgd2l0aG91dCBjbG9zaW5nIHdpbmR"+
"vdyEKCiAgICBkZWYgX19zZXRhdHRyX18oYXBwLCBhdHRyLCB2YWwpOgogICAgICAgIGQgPSBhcHAu"+
"X19kaWN0X18KICAgICAgICBkW2F0dHJdID0gdmFsCiAgICAgICAgY2FudmFzID0gZC5nZXQoJ19jY"+
"W52YXMnLCBOb25lKQogICAgICAgIGlmIChkLmdldCgncnVubmluZycsIEZhbHNlKSBhbmQKICAgIC"+
"AgICAgICAgZC5nZXQoJ212Y0NoZWNrJywgRmFsc2UpIGFuZAogICAgICAgICAgICAoY2FudmFzIGl"+
"zIG5vdCBOb25lKSBhbmQKICAgICAgICAgICAgY2FudmFzLmluUmVkcmF3QWxsKToKICAgICAgICAg"+
"ICAgYXBwLl9tdmNWaW9sYXRpb24oZid5b3UgbWF5IG5vdCBjaGFuZ2UgYXBwLnthdHRyfSBpbiB0a"+
"GUgbW9kZWwgd2hpbGUgaW4gcmVkcmF3QWxsICh0aGUgdmlldyknKQoKICAgIGRlZiBfcHJpbnRVc2"+
"VyVHJhY2ViYWNrKGFwcCwgZXhjZXB0aW9uLCB0Yik6CiAgICAgICAgc3RhY2sgPSB0cmFjZWJhY2s"+
"uZXh0cmFjdF90Yih0YikKICAgICAgICBsaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfbGlzdChzdGFj"+
"aykKICAgICAgICBpblJlZHJhd0FsbFdyYXBwZXIgPSBGYWxzZQogICAgICAgIHByaW50TGluZXMgP"+
"SBbIF0KICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgaWYgKCgnImNtdV8xMT"+
"JfZ3JhcGhpY3MucHkiJyBub3QgaW4gbGluZSkgYW5kCiAgICAgICAgICAgICAgICAoJy9jbXVfMTE"+
"yX2dyYXBoaWNzLnB5JyBub3QgaW4gbGluZSkgYW5kCiAgICAgICAgICAgICAgICAoJ1xcY211XzEx"+
"Ml9ncmFwaGljcy5weScgbm90IGluIGxpbmUpIGFuZAogICAgICAgICAgICAgICAgKCcvdGtpbnRlc"+
"i8nIG5vdCBpbiBsaW5lKSBhbmQKICAgICAgICAgICAgICAgICgnXFx0a2ludGVyXFwnIG5vdCBpbi"+
"BsaW5lKSk6CiAgICAgICAgICAgICAgICBwcmludExpbmVzLmFwcGVuZChsaW5lKQogICAgICAgICA"+
"gICBpZiAoJ3JlZHJhd0FsbFdyYXBwZXInIGluIGxpbmUpOgogICAgICAgICAgICAgICAgaW5SZWRy"+
"YXdBbGxXcmFwcGVyID0gVHJ1ZQogICAgICAgIGlmIChsZW4ocHJpbnRMaW5lcykgPT0gMCk6CiAgI"+
"CAgICAgICAgICMgTm8gdXNlciBjb2RlIGluIHRyYWNlLCBzbyB3ZSBoYXZlIHRvIHVzZSBhbGwgdG"+
"hlIGNvZGUgKGJ1bW1lciksCiAgICAgICAgICAgICMgYnV0IG5vdCBpZiB3ZSBhcmUgaW4gYSByZWR"+
"yYXdBbGxXcmFwcGVyLi4uCiAgICAgICAgICAgIGlmIGluUmVkcmF3QWxsV3JhcHBlcjoKICAgICAg"+
"ICAgICAgICAgIHByaW50TGluZXMgPSBbJyAgICBObyB0cmFjZWJhY2sgYXZhaWxhYmxlLiBFcnJvc"+
"iBvY2N1cnJlZCBpbiByZWRyYXdBbGwuXG4nXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgIC"+
"AgICAgcHJpbnRMaW5lcyA9IGxpbmVzCiAgICAgICAgcHJpbnQoJ1RyYWNlYmFjayAobW9zdCByZWN"+
"lbnQgY2FsbCBsYXN0KTonKQogICAgICAgIGZvciBsaW5lIGluIHByaW50TGluZXM6IHByaW50KGxp"+
"bmUsIGVuZD0nJykKICAgICAgICBwcmludChmJ0V4Y2VwdGlvbjoge2V4Y2VwdGlvbn0nKQoKICAgI"+
"GRlZiBfc2FmZU1ldGhvZChhcHBNZXRob2QpOgogICAgICAgIGRlZiBtKCphcmdzLCAqKmt3YXJncy"+
"k6CiAgICAgICAgICAgIGFwcCA9IGFyZ3NbMF0KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICA"+
"gICAgcmV0dXJuIGFwcE1ldGhvZCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBF"+
"eGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIGFwcC5fcnVubmluZyA9IEZhbHNlCiAgICAgI"+
"CAgICAgICAgICBhcHAuX3ByaW50VXNlclRyYWNlYmFjayhlLCBzeXMuZXhjX2luZm8oKVsyXSkKIC"+
"AgICAgICAgICAgICAgIGlmICgnX2NhbnZhcycgaW4gYXBwLl9fZGljdF9fKToKICAgICAgICAgICA"+
"gICAgICAgICBhcHAuX2NhbnZhcy5pblJlZHJhd0FsbCA9IFRydWUgIyBub3QgcmVhbGx5LCBidXQg"+
"c3RvcHMgcmVjdXJzaXZlIE1WQyBWaW9sYXRpb25zIQogICAgICAgICAgICAgICAgICAgIGFwcC5fY"+
"2FudmFzLmNyZWF0ZV9yZWN0YW5nbGUoMCwgMCwgYXBwLndpZHRoLCBhcHAuaGVpZ2h0LCBmaWxsPU"+
"5vbmUsIHdpZHRoPTEwLCBvdXRsaW5lPSdyZWQnKQogICAgICAgICAgICAgICAgICAgIGFwcC5fY2F"+
"udmFzLmNyZWF0ZV9yZWN0YW5nbGUoMTAsIGFwcC5oZWlnaHQtNTAsIGFwcC53aWR0aC0xMCwgYXBw"+
"LmhlaWdodC0xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI"+
"CAgIGZpbGw9J3doaXRlJywgb3V0bGluZT0ncmVkJywgd2lkdGg9NCkKICAgICAgICAgICAgICAgIC"+
"AgICBhcHAuX2NhbnZhcy5jcmVhdGVfdGV4dChhcHAud2lkdGgvMiwgYXBwLmhlaWdodC00MCwgdGV"+
"4dD1mJ0V4Y2VwdGlvbiEgQXBwIFN0b3BwZWQhJywgZmlsbD0ncmVkJywgZm9udD0nQXJpYWwgMTIg"+
"Ym9sZCcpCiAgICAgICAgICAgICAgICAgICAgYXBwLl9jYW52YXMuY3JlYXRlX3RleHQoYXBwLndpZ"+
"HRoLzIsIGFwcC5oZWlnaHQtMjAsIHRleHQ9ZidTZWUgY29uc29sZSBmb3IgZGV0YWlscycsIGZpbG"+
"w9J3JlZCcsIGZvbnQ9J0FyaWFsIDEyIGJvbGQnKQogICAgICAgICAgICAgICAgICAgIGFwcC5fY2F"+
"udmFzLnVwZGF0ZSgpCiAgICAgICAgICAgICAgICBhcHAuc2hvd01lc3NhZ2UoZidFeGNlcHRpb246"+
"IHtlfVxuQ2xpY2sgb2sgdGhlbiBzZWUgY29uc29sZSBmb3IgZGV0YWlscy4nKQogICAgICAgIHJld"+
"HVybiBtCgogICAgZGVmIF9tZXRob2RJc092ZXJyaWRkZW4oYXBwLCBtZXRob2ROYW1lKToKICAgIC"+
"AgICByZXR1cm4gKGdldGF0dHIodHlwZShhcHApLCBtZXRob2ROYW1lKSBpcyBub3QgZ2V0YXR0cih"+
"BcHAsIG1ldGhvZE5hbWUpKQoKICAgIGRlZiBfbXZjVmlvbGF0aW9uKGFwcCwgZXJyTXNnKToKICAg"+
"ICAgICBhcHAuX3J1bm5pbmcgPSBGYWxzZQogICAgICAgIHJhaXNlIEV4Y2VwdGlvbignTVZDIFZpb"+
"2xhdGlvbjogJyArIGVyck1zZykKCiAgICBAX3NhZmVNZXRob2QKICAgIGRlZiBfcmVkcmF3QWxsV3"+
"JhcHBlcihhcHApOgogICAgICAgIGlmIChub3QgYXBwLl9ydW5uaW5nKTogcmV0dXJuCiAgICAgICA"+
"gaWYgKCdkZWZlcnJlZFJlZHJhd0FsbCcgaW4gYXBwLl9hZnRlcklkTWFwKTogcmV0dXJuICMgd2Fp"+
"dCBmb3IgcGVuZGluZyBjYWxsCiAgICAgICAgYXBwLl9jYW52YXMuaW5SZWRyYXdBbGwgPSBUcnVlC"+
"iAgICAgICAgYXBwLl9jYW52YXMuZGVsZXRlKEFMTCkKICAgICAgICB3aWR0aCxvdXRsaW5lID0gKD"+
"EwLCdyZWQnKSBpZiBhcHAuX3BhdXNlZCBlbHNlICgwLCd3aGl0ZScpCiAgICAgICAgYXBwLl9jYW5"+
"2YXMuY3JlYXRlX3JlY3RhbmdsZSgwLCAwLCBhcHAud2lkdGgsIGFwcC5oZWlnaHQsIGZpbGw9J3do"+
"aXRlJywgd2lkdGg9d2lkdGgsIG91dGxpbmU9b3V0bGluZSkKICAgICAgICBhcHAuX2NhbnZhcy5sb"+
"2dnZWREcmF3aW5nQ2FsbHMgPSBbIF0KICAgICAgICBhcHAuX2NhbnZhcy5sb2dEcmF3aW5nQ2FsbH"+
"MgPSBhcHAuX2xvZ0RyYXdpbmdDYWxscwogICAgICAgIGFwcC5yZWRyYXdBbGwoYXBwLl9jYW52YXM"+
"pCiAgICAgICAgYXBwLl9jYW52YXMuaW5SZWRyYXdBbGwgPSBGYWxzZQogICAgICAgIGFwcC5fY2Fu"+
"dmFzLnVwZGF0ZSgpCgogICAgZGVmIF9kZWZlcnJlZE1ldGhvZENhbGwoYXBwLCBhZnRlcklkLCBhZ"+
"nRlckRlbGF5LCBhZnRlckZuLCByZXBsYWNlPUZhbHNlKToKICAgICAgICBkZWYgYWZ0ZXJGbldyYX"+
"BwZXIoKToKICAgICAgICAgICAgYXBwLl9hZnRlcklkTWFwLnBvcChhZnRlcklkLCBOb25lKQogICA"+
"gICAgICAgICBhZnRlckZuKCkKICAgICAgICBpZCA9IGFwcC5fYWZ0ZXJJZE1hcC5nZXQoYWZ0ZXJJ"+
"ZCwgTm9uZSkKICAgICAgICBpZiAoKGlkIGlzIE5vbmUpIG9yIHJlcGxhY2UpOgogICAgICAgICAgI"+
"CBpZiBpZDogYXBwLl9yb290LmFmdGVyX2NhbmNlbChpZCkKICAgICAgICAgICAgYXBwLl9hZnRlck"+
"lkTWFwW2FmdGVySWRdID0gYXBwLl9yb290LmFmdGVyKGFmdGVyRGVsYXksIGFmdGVyRm5XcmFwcGV"+
"yKQoKICAgIGRlZiBfZGVmZXJyZWRSZWRyYXdBbGwoYXBwKToKICAgICAgICBhcHAuX2RlZmVycmVk"+
"TWV0aG9kQ2FsbChhZnRlcklkPSdkZWZlcnJlZFJlZHJhd0FsbCcsIGFmdGVyRGVsYXk9MTAwLCBhZ"+
"nRlckZuPWFwcC5fcmVkcmF3QWxsV3JhcHBlciwgcmVwbGFjZT1UcnVlKQoKICAgIEBfc2FmZU1ldG"+
"hvZAogICAgZGVmIF9hcHBTdGFydGVkV3JhcHBlcihhcHApOgogICAgICAgIGFwcC5hcHBTdGFydGV"+
"kKCkKICAgICAgICBhcHAuX3JlZHJhd0FsbFdyYXBwZXIoKQoKICAgIF9rZXlOYW1lTWFwID0geyAn"+
"XHQnOidUYWInLCAnXG4nOidFbnRlcicsICdccic6J0VudGVyJywgJ1xiJzonQmFja3NwYWNlJywKI"+
"CAgICAgICAgICAgICAgICAgIGNocigxMjcpOidEZWxldGUnLCBjaHIoMjcpOidFc2NhcGUnLCAnIC"+
"c6J1NwYWNlJyB9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF91c2VFdmVudEtleShhdHRyKTo"+
"KICAgICAgICByYWlzZSBFeGNlcHRpb24oZidVc2UgZXZlbnQua2V5IGluc3RlYWQgb2YgZXZlbnQu"+
"e2F0dHJ9JykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldEV2ZW50S2V5SW5mbyhldmVud"+
"Cwga2V5c3ltLCBjaGFyKToKICAgICAgICBrZXkgPSBjID0gY2hhcgogICAgICAgIGhhc0NvbnRyb2"+
"xLZXkgPSAoZXZlbnQuc3RhdGUgJiAweDQgIT0gMCkKICAgICAgICBpZiAoKGMgaW4gW05vbmUsICc"+
"nXSkgb3IgKGxlbihjKSA+IDEpIG9yIChvcmQoYykgPiAyNTUpKToKICAgICAgICAgICAga2V5ID0g"+
"a2V5c3ltCiAgICAgICAgICAgIGlmIChrZXkuZW5kc3dpdGgoJ19MJykgb3IKICAgICAgICAgICAgI"+
"CAgIGtleS5lbmRzd2l0aCgnX1InKSBvcgogICAgICAgICAgICAgICAga2V5LmVuZHN3aXRoKCdfTG"+
"9jaycpKToKICAgICAgICAgICAgICAgIGtleSA9ICdNb2RpZmllcl9LZXknCiAgICAgICAgZWxpZiA"+
"oYyBpbiBBcHAuX2tleU5hbWVNYXApOgogICAgICAgICAgICBrZXkgPSBBcHAuX2tleU5hbWVNYXBb"+
"Y10KICAgICAgICBlbGlmICgobGVuKGMpID09IDEpIGFuZCAoMSA8PSBvcmQoYykgPD0gMjYpKToKI"+
"CAgICAgICAgICAga2V5ID0gY2hyKG9yZCgnYScpLTEgKyBvcmQoYykpCiAgICAgICAgICAgIGhhc0"+
"NvbnRyb2xLZXkgPSBUcnVlCiAgICAgICAgaWYgaGFzQ29udHJvbEtleSBhbmQgKGxlbihrZXkpID0"+
"9IDEpOgogICAgICAgICAgICAjIGRvbid0IGFkZCBjb250cm9sLSBwcmVmaXggdG8gRW50ZXIsIFRh"+
"YiwgRXNjYXBlLCAuLi4KICAgICAgICAgICAga2V5ID0gJ2NvbnRyb2wtJyArIGtleQogICAgICAgI"+
"HJldHVybiBrZXkKCiAgICBjbGFzcyBLZXlFdmVudFdyYXBwZXIoRXZlbnQpOgogICAgICAgIGRlZi"+
"BfX2luaXRfXyhzZWxmLCBldmVudCk6CiAgICAgICAgICAgIGtleXN5bSwgY2hhciA9IGV2ZW50Lmt"+
"leXN5bSwgZXZlbnQuY2hhcgogICAgICAgICAgICBkZWwgZXZlbnQua2V5c3ltCiAgICAgICAgICAg"+
"IGRlbCBldmVudC5jaGFyCiAgICAgICAgICAgIGZvciBrZXkgaW4gZXZlbnQuX19kaWN0X186CiAgI"+
"CAgICAgICAgICAgICBpZiAobm90IGtleS5zdGFydHN3aXRoKCdfXycpKToKICAgICAgICAgICAgIC"+
"AgICAgICBzZWxmLl9fZGljdF9fW2tleV0gPSBldmVudC5fX2RpY3RfX1trZXldCiAgICAgICAgICA"+
"gIHNlbGYua2V5ID0gQXBwLl9nZXRFdmVudEtleUluZm8oZXZlbnQsIGtleXN5bSwgY2hhcikKICAg"+
"ICAgICBrZXlzeW0gPSBwcm9wZXJ0eShsYW1iZGEgKmFyZ3M6IEFwcC5fdXNlRXZlbnRLZXkoJ2tle"+
"XN5bScpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSAqYXJnczogQXBwLl91c2VFdm"+
"VudEtleSgna2V5c3ltJykpCiAgICAgICAgY2hhciA9ICAgcHJvcGVydHkobGFtYmRhICphcmdzOiB"+
"BcHAuX3VzZUV2ZW50S2V5KCdjaGFyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRh"+
"ICphcmdzOiBBcHAuX3VzZUV2ZW50S2V5KCdjaGFyJykpCgogICAgQF9zYWZlTWV0aG9kCiAgICBkZ"+
"WYgX2tleVByZXNzZWRXcmFwcGVyKGFwcCwgZXZlbnQpOgogICAgICAgIGV2ZW50ID0gQXBwLktleU"+
"V2ZW50V3JhcHBlcihldmVudCkKICAgICAgICBpZiAoZXZlbnQua2V5ID09ICdjb250cm9sLXMnKTo"+
"KICAgICAgICAgICAgYXBwLnNhdmVTbmFwc2hvdCgpCiAgICAgICAgZWxpZiAoZXZlbnQua2V5ID09"+
"ICdjb250cm9sLXAnKToKICAgICAgICAgICAgYXBwLl90b2dnbGVQYXVzZWQoKQogICAgICAgICAgI"+
"CBhcHAuX3JlZHJhd0FsbFdyYXBwZXIoKQogICAgICAgIGVsaWYgKGV2ZW50LmtleSA9PSAnY29udH"+
"JvbC1xJyk6CiAgICAgICAgICAgIGFwcC5xdWl0KCkKICAgICAgICBlbGlmIChldmVudC5rZXkgPT0"+
"gJ2NvbnRyb2wteCcpOgogICAgICAgICAgICBvcy5fZXhpdCgwKSAjIGhhcmQgZXhpdCBhdm9pZHMg"+
"dGtpbnRlciBlcnJvciBtZXNzYWdlcwogICAgICAgIGVsaWYgKGFwcC5fcnVubmluZyBhbmQKICAgI"+
"CAgICAgICAgICAobm90IGFwcC5fcGF1c2VkKSBhbmQKICAgICAgICAgICAgICBhcHAuX21ldGhvZE"+
"lzT3ZlcnJpZGRlbigna2V5UHJlc3NlZCcpIGFuZAogICAgICAgICAgICAgIChub3QgZXZlbnQua2V"+
"5ID09ICdNb2RpZmllcl9LZXknKSk6CiAgICAgICAgICAgIGFwcC5rZXlQcmVzc2VkKGV2ZW50KQog"+
"ICAgICAgICAgICBhcHAuX3JlZHJhd0FsbFdyYXBwZXIoKQoKICAgIEBfc2FmZU1ldGhvZAogICAgZ"+
"GVmIF9rZXlSZWxlYXNlZFdyYXBwZXIoYXBwLCBldmVudCk6CiAgICAgICAgaWYgKG5vdCBhcHAuX3"+
"J1bm5pbmcpIG9yIGFwcC5fcGF1c2VkIG9yIChub3QgYXBwLl9tZXRob2RJc092ZXJyaWRkZW4oJ2t"+
"leVJlbGVhc2VkJykpOiByZXR1cm4KICAgICAgICBldmVudCA9IEFwcC5LZXlFdmVudFdyYXBwZXIo"+
"ZXZlbnQpCiAgICAgICAgaWYgKG5vdCBldmVudC5rZXkgPT0gJ01vZGlmaWVyX0tleScpOgogICAgI"+
"CAgICAgICBhcHAua2V5UmVsZWFzZWQoZXZlbnQpCiAgICAgICAgICAgIGFwcC5fcmVkcmF3QWxsV3"+
"JhcHBlcigpCgogICAgQF9zYWZlTWV0aG9kCiAgICBkZWYgX21vdXNlUHJlc3NlZFdyYXBwZXIoYXB"+
"wLCBldmVudCk6CiAgICAgICAgaWYgKG5vdCBhcHAuX3J1bm5pbmcpIG9yIGFwcC5fcGF1c2VkOiBy"+
"ZXR1cm4KICAgICAgICBpZiAoKGV2ZW50LnggPCAwKSBvciAoZXZlbnQueCA+IGFwcC53aWR0aCkgb"+
"3IKICAgICAgICAgICAgKGV2ZW50LnkgPCAwKSBvciAoZXZlbnQueSA+IGFwcC5oZWlnaHQpKToKIC"+
"AgICAgICAgICAgYXBwLl9tb3VzZVByZXNzZWRPdXRzaWRlV2luZG93ID0gVHJ1ZQogICAgICAgIGV"+
"sc2U6CiAgICAgICAgICAgIGFwcC5fbW91c2VQcmVzc2VkT3V0c2lkZVdpbmRvdyA9IEZhbHNlCiAg"+
"ICAgICAgICAgIGFwcC5fbW91c2VJc1ByZXNzZWQgPSBUcnVlCiAgICAgICAgICAgIGFwcC5fbGFzd"+
"E1vdXNlUG9zbiA9IChldmVudC54LCBldmVudC55KQogICAgICAgICAgICBpZiAoYXBwLl9tZXRob2"+
"RJc092ZXJyaWRkZW4oJ21vdXNlUHJlc3NlZCcpKToKICAgICAgICAgICAgICAgIGFwcC5tb3VzZVB"+
"yZXNzZWQoZXZlbnQpCiAgICAgICAgICAgICAgICBhcHAuX3JlZHJhd0FsbFdyYXBwZXIoKQoKICAg"+
"IEBfc2FmZU1ldGhvZAogICAgZGVmIF9tb3VzZVJlbGVhc2VkV3JhcHBlcihhcHAsIGV2ZW50KToKI"+
"CAgICAgICBpZiAobm90IGFwcC5fcnVubmluZykgb3IgYXBwLl9wYXVzZWQ6IHJldHVybgogICAgIC"+
"AgIGFwcC5fbW91c2VJc1ByZXNzZWQgPSBGYWxzZQogICAgICAgIGlmIGFwcC5fbW91c2VQcmVzc2V"+
"kT3V0c2lkZVdpbmRvdzoKICAgICAgICAgICAgYXBwLl9tb3VzZVByZXNzZWRPdXRzaWRlV2luZG93"+
"ID0gRmFsc2UKICAgICAgICAgICAgYXBwLl9zaXplQ2hhbmdlZFdyYXBwZXIoKQogICAgICAgIGVsc"+
"2U6CiAgICAgICAgICAgIGFwcC5fbGFzdE1vdXNlUG9zbiA9IChldmVudC54LCBldmVudC55KQogIC"+
"AgICAgICAgICBpZiAoYXBwLl9tZXRob2RJc092ZXJyaWRkZW4oJ21vdXNlUmVsZWFzZWQnKSk6CiA"+
"gICAgICAgICAgICAgICBhcHAubW91c2VSZWxlYXNlZChldmVudCkKICAgICAgICAgICAgICAgIGFw"+
"cC5fcmVkcmF3QWxsV3JhcHBlcigpCgogICAgQF9zYWZlTWV0aG9kCiAgICBkZWYgX3RpbWVyRmlyZ"+
"WRXcmFwcGVyKGFwcCk6CiAgICAgICAgaWYgKG5vdCBhcHAuX3J1bm5pbmcpIG9yIChub3QgYXBwLl"+
"9tZXRob2RJc092ZXJyaWRkZW4oJ3RpbWVyRmlyZWQnKSk6IHJldHVybgogICAgICAgIGlmIChub3Q"+
"gYXBwLl9wYXVzZWQpOgogICAgICAgICAgICBhcHAudGltZXJGaXJlZCgpCiAgICAgICAgICAgIGFw"+
"cC5fcmVkcmF3QWxsV3JhcHBlcigpCiAgICAgICAgYXBwLl9kZWZlcnJlZE1ldGhvZENhbGwoYWZ0Z"+
"XJJZD0nX3RpbWVyRmlyZWRXcmFwcGVyJywgYWZ0ZXJEZWxheT1hcHAudGltZXJEZWxheSwgYWZ0ZX"+
"JGbj1hcHAuX3RpbWVyRmlyZWRXcmFwcGVyKQoKICAgIEBfc2FmZU1ldGhvZAogICAgZGVmIF9zaXp"+
"lQ2hhbmdlZFdyYXBwZXIoYXBwLCBldmVudD1Ob25lKToKICAgICAgICBpZiAobm90IGFwcC5fcnVu"+
"bmluZyk6IHJldHVybgogICAgICAgIGlmIChldmVudCBhbmQgKChldmVudC53aWR0aCA8IDIpIG9yI"+
"ChldmVudC5oZWlnaHQgPCAyKSkpOiByZXR1cm4KICAgICAgICBpZiAoYXBwLl9tb3VzZVByZXNzZW"+
"RPdXRzaWRlV2luZG93KTogcmV0dXJuCiAgICAgICAgYXBwLndpZHRoLGFwcC5oZWlnaHQsYXBwLnd"+
"pbngsYXBwLndpbnkgPSBbaW50KHYpIGZvciB2IGluIGFwcC5fcm9vdC53aW5mb19nZW9tZXRyeSgp"+
"LnJlcGxhY2UoJ3gnLCcrJykuc3BsaXQoJysnKV0KICAgICAgICBpZiAoYXBwLl9sYXN0V2luZG93R"+
"GltcyBpcyBOb25lKToKICAgICAgICAgICAgYXBwLl9sYXN0V2luZG93RGltcyA9IChhcHAud2lkdG"+
"gsIGFwcC5oZWlnaHQsIGFwcC53aW54LCBhcHAud2lueSkKICAgICAgICBlbHNlOgogICAgICAgICA"+
"gICBuZXdEaW1zID0oYXBwLndpZHRoLCBhcHAuaGVpZ2h0LCBhcHAud2lueCwgYXBwLndpbnkpCiAg"+
"ICAgICAgICAgIGlmIChhcHAuX2xhc3RXaW5kb3dEaW1zICE9IG5ld0RpbXMpOgogICAgICAgICAgI"+
"CAgICAgYXBwLl9sYXN0V2luZG93RGltcyA9IG5ld0RpbXMKICAgICAgICAgICAgICAgIGFwcC51cG"+
"RhdGVUaXRsZSgpCiAgICAgICAgICAgICAgICBhcHAuc2l6ZUNoYW5nZWQoKQogICAgICAgICAgICA"+
"gICAgYXBwLl9kZWZlcnJlZFJlZHJhd0FsbCgpICMgYXZvaWQgcmVzaXplIGNyYXNoaW5nIG9uIHNv"+
"bWUgcGxhdGZvcm1zCgogICAgQF9zYWZlTWV0aG9kCiAgICBkZWYgX21vdXNlTW90aW9uV3JhcHBlc"+
"ihhcHApOgogICAgICAgIGlmIChub3QgYXBwLl9ydW5uaW5nKTogcmV0dXJuCiAgICAgICAgbW91c2"+
"VNb3ZlZEV4aXN0cyA9IGFwcC5fbWV0aG9kSXNPdmVycmlkZGVuKCdtb3VzZU1vdmVkJykKICAgICA"+
"gICBtb3VzZURyYWdnZWRFeGlzdHMgPSBhcHAuX21ldGhvZElzT3ZlcnJpZGRlbignbW91c2VEcmFn"+
"Z2VkJykKICAgICAgICBpZiAoKG5vdCBhcHAuX3BhdXNlZCkgYW5kCiAgICAgICAgICAgIChub3QgY"+
"XBwLl9tb3VzZVByZXNzZWRPdXRzaWRlV2luZG93KSBhbmQKICAgICAgICAgICAgKCgobm90IGFwcC"+
"5fbW91c2VJc1ByZXNzZWQpIGFuZCBtb3VzZU1vdmVkRXhpc3RzKSBvcgogICAgICAgICAgICAgKGF"+
"wcC5fbW91c2VJc1ByZXNzZWQgYW5kIG1vdXNlRHJhZ2dlZEV4aXN0cykpKToKICAgICAgICAgICAg"+
"Y2xhc3MgTW91c2VNb3Rpb25FdmVudChvYmplY3QpOiBwYXNzCiAgICAgICAgICAgIGV2ZW50ID0gT"+
"W91c2VNb3Rpb25FdmVudCgpCiAgICAgICAgICAgIHJvb3QgPSBhcHAuX3Jvb3QKICAgICAgICAgIC"+
"AgZXZlbnQueCA9IHJvb3Qud2luZm9fcG9pbnRlcngoKSAtIHJvb3Qud2luZm9fcm9vdHgoKQogICA"+
"gICAgICAgICBldmVudC55ID0gcm9vdC53aW5mb19wb2ludGVyeSgpIC0gcm9vdC53aW5mb19yb290"+
"eSgpCiAgICAgICAgICAgIGlmICgoYXBwLl9sYXN0TW91c2VQb3NuICE9ICAoZXZlbnQueCwgZXZlb"+
"nQueSkpIGFuZAogICAgICAgICAgICAgICAgKGV2ZW50LnggPj0gMCkgYW5kIChldmVudC54IDw9IG"+
"FwcC53aWR0aCkgYW5kCiAgICAgICAgICAgICAgICAoZXZlbnQueSA+PSAwKSBhbmQgKGV2ZW50Lnk"+
"gPD0gYXBwLmhlaWdodCkpOgogICAgICAgICAgICAgICAgaWYgKGFwcC5fbW91c2VJc1ByZXNzZWQp"+
"OiBhcHAubW91c2VEcmFnZ2VkKGV2ZW50KQogICAgICAgICAgICAgICAgZWxzZTogYXBwLm1vdXNlT"+
"W92ZWQoZXZlbnQpCiAgICAgICAgICAgICAgICBhcHAuX2xhc3RNb3VzZVBvc24gPSAoZXZlbnQueC"+
"wgZXZlbnQueSkKICAgICAgICAgICAgICAgIGFwcC5fcmVkcmF3QWxsV3JhcHBlcigpCiAgICAgICA"+
"gaWYgKG1vdXNlTW92ZWRFeGlzdHMgb3IgbW91c2VEcmFnZ2VkRXhpc3RzKToKICAgICAgICAgICAg"+
"YXBwLl9kZWZlcnJlZE1ldGhvZENhbGwoYWZ0ZXJJZD0nbW91c2VNb3Rpb25XcmFwcGVyJywgYWZ0Z"+
"XJEZWxheT1hcHAubW91c2VNb3ZlZERlbGF5LCBhZnRlckZuPWFwcC5fbW91c2VNb3Rpb25XcmFwcG"+
"VyKQoKICAgIGRlZiB1cGRhdGVUaXRsZShhcHApOgogICAgICAgIGFwcC5fdGl0bGUgPSBhcHAuX3R"+
"pdGxlIG9yIHR5cGUoYXBwKS5fX25hbWVfXwogICAgICAgIGFwcC5fcm9vdC50aXRsZShmJ3thcHAu"+
"X3RpdGxlfSAoe2FwcC53aWR0aH0geCB7YXBwLmhlaWdodH0pJykKCiAgICBkZWYgZ2V0UXVpdE1lc"+
"3NhZ2UoYXBwKToKICAgICAgICBhcHBMYWJlbCA9IHR5cGUoYXBwKS5fX25hbWVfXwogICAgICAgIG"+
"lmIChhcHAuX3RpdGxlICE9IGFwcExhYmVsKToKICAgICAgICAgICAgaWYgKGFwcC5fdGl0bGUuc3R"+
"hcnRzd2l0aChhcHBMYWJlbCkpOgogICAgICAgICAgICAgICAgYXBwTGFiZWwgPSBhcHAuX3RpdGxl"+
"CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcHBMYWJlbCArPSBmIiAne2FwcC5fd"+
"Gl0bGV9JyIKICAgICAgICByZXR1cm4gZiIqKiogQ2xvc2luZyB7YXBwTGFiZWx9LiAgQnllISAqKi"+
"pcbiIKCiAgICBkZWYgX3Nob3dSb290V2luZG93KGFwcCk6CiAgICAgICAgcm9vdCA9IGFwcC5fcm9"+
"vdAogICAgICAgIHJvb3QudXBkYXRlKCk7IHJvb3QuZGVpY29uaWZ5KCk7IHJvb3QubGlmdCgpOyBy"+
"b290LmZvY3VzKCkKCiAgICBkZWYgX2hpZGVSb290V2luZG93KGFwcCk6CiAgICAgICAgcm9vdCA9I"+
"GFwcC5fcm9vdAogICAgICAgIHJvb3Qud2l0aGRyYXcoKQoKICAgIEBfc2FmZU1ldGhvZAogICAgZG"+
"VmIHJ1bihhcHApOgogICAgICAgIGFwcC5fbW91c2VJc1ByZXNzZWQgPSBGYWxzZQogICAgICAgIGF"+
"wcC5fbGFzdE1vdXNlUG9zbiA9ICgtMSwgLTEpCiAgICAgICAgYXBwLl9sYXN0V2luZG93RGltcz0g"+
"Tm9uZSAjIHNldCBpbiBzaXplQ2hhbmdlZFdyYXBwZXIKICAgICAgICBhcHAuX2FmdGVySWRNYXAgP"+
"SBkaWN0KCkKICAgICAgICAjIGNyZWF0ZSB0aGUgc2luZ2xldG9uIHJvb3Qgd2luZG93CiAgICAgIC"+
"AgaWYgKEFwcC5fdGhlUm9vdCBpcyBOb25lKToKICAgICAgICAgICAgQXBwLl90aGVSb290ID0gVGs"+
"oKQogICAgICAgICAgICBBcHAuX3RoZVJvb3QuY3JlYXRlY29tbWFuZCgnZXhpdCcsIGxhbWJkYTog"+
"JycpICMgd2hlbiB1c2VyIGVudGVycyBjbWQtcSwgaWdub3JlIGhlcmUgKGhhbmRsZWQgaW4ga2V5U"+
"HJlc3NlZCkKICAgICAgICAgICAgQXBwLl90aGVSb290LnByb3RvY29sKCdXTV9ERUxFVEVfV0lORE"+
"9XJywgbGFtYmRhOiBBcHAuX3RoZVJvb3QuYXBwLnF1aXQoKSkgIyB3aGVuIHVzZXIgcHJlc3NlcyA"+
"neCcgaW4gdGl0bGUgYmFyCiAgICAgICAgICAgIEFwcC5fdGhlUm9vdC5iaW5kKCI8QnV0dG9uLTE+"+
"IiwgbGFtYmRhIGV2ZW50OiBBcHAuX3RoZVJvb3QuYXBwLl9tb3VzZVByZXNzZWRXcmFwcGVyKGV2Z"+
"W50KSkKICAgICAgICAgICAgQXBwLl90aGVSb290LmJpbmQoIjxGb2N1c091dD4iLCBsYW1iZGEgZX"+
"ZlbnQ6IEFwcC5fdGhlUm9vdC5hcHAuZm9jdXNPdXQoZXZlbnQpKQogICAgICAgICAgICBBcHAuX3R"+
"oZVJvb3QuYmluZCgiPEIxLUJ1dHRvblJlbGVhc2U+IiwgbGFtYmRhIGV2ZW50OiBBcHAuX3RoZVJv"+
"b3QuYXBwLl9tb3VzZVJlbGVhc2VkV3JhcHBlcihldmVudCkpCiAgICAgICAgICAgIEFwcC5fdGhlU"+
"m9vdC5iaW5kKCI8S2V5UHJlc3M+IiwgbGFtYmRhIGV2ZW50OiBBcHAuX3RoZVJvb3QuYXBwLl9rZX"+
"lQcmVzc2VkV3JhcHBlcihldmVudCkpCiAgICAgICAgICAgIEFwcC5fdGhlUm9vdC5iaW5kKCI8S2V"+
"5UmVsZWFzZT4iLCBsYW1iZGEgZXZlbnQ6IEFwcC5fdGhlUm9vdC5hcHAuX2tleVJlbGVhc2VkV3Jh"+
"cHBlcihldmVudCkpCiAgICAgICAgICAgIEFwcC5fdGhlUm9vdC5iaW5kKCI8Q29uZmlndXJlPiIsI"+
"GxhbWJkYSBldmVudDogQXBwLl90aGVSb290LmFwcC5fc2l6ZUNoYW5nZWRXcmFwcGVyKGV2ZW50KS"+
"kKICAgICAgICBlbHNlOgogICAgICAgICAgICBBcHAuX3RoZVJvb3QuY2FudmFzLmRlc3Ryb3koKQo"+
"gICAgICAgIGFwcC5fcm9vdCA9IHJvb3QgPSBBcHAuX3RoZVJvb3QgIyBzaW5nbGV0b24gcm9vdCEK"+
"ICAgICAgICByb290LmFwcCA9IGFwcAogICAgICAgIHJvb3QuZ2VvbWV0cnkoZid7YXBwLndpZHRof"+
"Xh7YXBwLmhlaWdodH0re2FwcC53aW54fSt7YXBwLndpbnl9JykKICAgICAgICBhcHAudXBkYXRlVG"+
"l0bGUoKQogICAgICAgICMgY3JlYXRlIHRoZSBjYW52YXMKICAgICAgICByb290LmNhbnZhcyA9IGF"+
"wcC5fY2FudmFzID0gV3JhcHBlZENhbnZhcyhhcHApCiAgICAgICAgYXBwLl9jYW52YXMucGFjayhm"+
"aWxsPUJPVEgsIGV4cGFuZD1ZRVMpCiAgICAgICAgIyBpbml0aWFsaXplLCBzdGFydCB0aGUgdGltZ"+
"XIsIGFuZCBsYXVuY2ggdGhlIGFwcAogICAgICAgIGFwcC5fcnVubmluZyA9IFRydWUKICAgICAgIC"+
"BhcHAuX3BhdXNlZCA9IEZhbHNlCiAgICAgICAgYXBwLl9hcHBTdGFydGVkV3JhcHBlcigpCiAgICA"+
"gICAgYXBwLl90aW1lckZpcmVkV3JhcHBlcigpCiAgICAgICAgYXBwLl9tb3VzZU1vdGlvbldyYXBw"+
"ZXIoKQogICAgICAgIGFwcC5fc2hvd1Jvb3RXaW5kb3coKQogICAgICAgIHJvb3QubWFpbmxvb3AoK"+
"QogICAgICAgIGFwcC5faGlkZVJvb3RXaW5kb3coKQogICAgICAgIGFwcC5fcnVubmluZyA9IEZhbH"+
"NlCiAgICAgICAgZm9yIGFmdGVySWQgaW4gYXBwLl9hZnRlcklkTWFwOiBhcHAuX3Jvb3QuYWZ0ZXJ"+
"fY2FuY2VsKGFwcC5fYWZ0ZXJJZE1hcFthZnRlcklkXSkKICAgICAgICBhcHAuX2FmdGVySWRNYXAu"+
"Y2xlYXIoKSAjIGZvciBzYWZldHkKICAgICAgICBhcHAuYXBwU3RvcHBlZCgpCiAgICAgICAgcHJpb"+
"nQoYXBwLmdldFF1aXRNZXNzYWdlKCkpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy"+
"MjIyMKIyBNb2RhbEFwcCArIE1vZGU6CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM"+
"jIwoKY2xhc3MgQ1RSQ0VudihBcHApOgogICAgZGVmIHVwZGF0ZVRpdGxlKGFwcCk6CiAgICAgICAg"+
"YXBwLl9yb290LnRpdGxlKGYnQ1QgKyBSQyBFbnZpcm9ubWVudCcpCgogICAgZGVmIGdldFF1aXRNZ"+
"XNzYWdlKGFwcCk6CiAgICAgICAgcmV0dXJuICJDbG9zaW5nIENUICsgUkMgRW52aXJvbm1lbnQiCg"+
"ogICAgZGVmIHNlY3VyaXR5RXJyb3IoYXBwKToKICAgICAgICBwcmludCgiRGV0ZWN0ZWQgU2VjdXJ"+
"pdHkgRXJyb3IiKQogICAgICAgIGFwcC5xdWl0KCkKCiAgICBkZWYgZm9jdXNPdXQoYXBwLCBldmVu"+
"dCk6CiAgICAgICAgaWYgZXZlbnQud2lkZ2V0ID09IGFwcC5fcm9vdDoKICAgICAgICAgICAgYXBwL"+
"nNlY3VyaXR5RXJyb3IoKQoKICAgIGRlZiBzaXplQ2hhbmdlZChhcHApOgogICAgICAgIGFwcC5zZW"+
"N1cml0eUVycm9yKCkKCmNsYXNzIE1vZGFsQXBwKENUUkNFbnYpOgogICAgZGVmIF9faW5pdF9fKGF"+
"wcCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBhY3RpdmVNb2RlPU5vbmUsICoqa3dhcmdzKToKICAgICAg"+
"ICBhcHAudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIGFwcC5wYXNzd29yZCA9IHBhc3N3b3JkC"+
"iAgICAgICAgYXBwLl9ydW5uaW5nID0gRmFsc2UKICAgICAgICBhcHAuX2FjdGl2ZU1vZGUgPSBOb2"+
"5lCiAgICAgICAgYXBwLnNldEFjdGl2ZU1vZGUoYWN0aXZlTW9kZSkKICAgICAgICBzdXBlcigpLl9"+
"faW5pdF9fKCoqa3dhcmdzKQoKICAgIGRlZiBzZXRBY3RpdmVNb2RlKGFwcCwgbW9kZSk6CiAgICAg"+
"ICAgaWYgKG1vZGUgPT0gTm9uZSk6IG1vZGUgPSBNb2RlKCkgIyBkZWZhdWx0IGVtcHR5IG1vZGUKI"+
"CAgICAgICBpZiAobm90IGlzaW5zdGFuY2UobW9kZSwgTW9kZSkpOiByYWlzZSBFeGNlcHRpb24oJ2"+
"FjdGl2ZU1vZGUgbXVzdCBiZSBhIG1vZGUhJykKICAgICAgICBpZiAobW9kZS5hcHAgbm90IGluIFt"+
"Ob25lLCBhcHBdKTogcmFpc2UgRXhjZXB0aW9uKCdNb2RlcyBjYW5ub3QgYmUgYWRkZWQgdG8gdHdv"+
"IGRpZmZlcmVudCBhcHBzIScpCiAgICAgICAgaWYgKGFwcC5fYWN0aXZlTW9kZSAhPSBtb2RlKToKI"+
"CAgICAgICAgICAgbW9kZS5hcHAgPSBhcHAKICAgICAgICAgICAgaWYgKGFwcC5fYWN0aXZlTW9kZS"+
"AhPSBOb25lKTogYXBwLl9hY3RpdmVNb2RlLm1vZGVEZWFjdGl2YXRlZCgpCiAgICAgICAgICAgIGF"+
"wcC5fYWN0aXZlTW9kZSA9IG1vZGUKICAgICAgICAgICAgaWYgKGFwcC5fcnVubmluZyk6IGFwcC5z"+
"dGFydEFjdGl2ZU1vZGUoKQoKICAgIGRlZiBzdGFydEFjdGl2ZU1vZGUoYXBwKToKICAgICAgICBhc"+
"HAuX2FjdGl2ZU1vZGUud2lkdGgsIGFwcC5fYWN0aXZlTW9kZS5oZWlnaHQgPSBhcHAud2lkdGgsIG"+
"FwcC5oZWlnaHQKICAgICAgICBpZiAobm90IGFwcC5fYWN0aXZlTW9kZS5fYXBwU3RhcnRlZENhbGx"+
"lZCk6CiAgICAgICAgICAgIGFwcC5fYWN0aXZlTW9kZS5hcHBTdGFydGVkKCkgIyBjYWxsZWQgb25j"+
"ZSBwZXIgbW9kZQogICAgICAgICAgICBhcHAuX2FjdGl2ZU1vZGUuX2FwcFN0YXJ0ZWRDYWxsZWQgP"+
"SBUcnVlCiAgICAgICAgYXBwLl9hY3RpdmVNb2RlLm1vZGVBY3RpdmF0ZWQoKSAgIyBjYWxsZWQgZW"+
"FjaCB0aW1lIGEgbW9kZSBpcyBhY3RpdmF0ZWQKICAgICAgICBhcHAuX3JlZHJhd0FsbFdyYXBwZXI"+
"oKQoKICAgIGRlZiByZWRyYXdBbGwoYXBwLCBjYW52YXMpOgogICAgICAgIGlmIChhcHAuX2FjdGl2"+
"ZU1vZGUgIT0gTm9uZSk6IGFwcC5fYWN0aXZlTW9kZS5yZWRyYXdBbGwoY2FudmFzKQogICAgZGVmI"+
"GFwcFN0YXJ0ZWQoYXBwKToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb2RlICE9IE5vbmUpOiBhcH"+
"Auc3RhcnRBY3RpdmVNb2RlKCkKICAgIGRlZiBhcHBTdG9wcGVkKGFwcCk6CiAgICAgICAgaWYgKGF"+
"wcC5fYWN0aXZlTW9kZSAhPSBOb25lKTogYXBwLl9hY3RpdmVNb2RlLm1vZGVEZWFjdGl2YXRlZCgp"+
"CiAgICBkZWYga2V5UHJlc3NlZChhcHAsIGV2ZW50KToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb"+
"2RlICE9IE5vbmUpOiBhcHAuX2FjdGl2ZU1vZGUua2V5UHJlc3NlZChldmVudCkKICAgIGRlZiBrZX"+
"lSZWxlYXNlZChhcHAsIGV2ZW50KToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb2RlICE9IE5vbmU"+
"pOiBhcHAuX2FjdGl2ZU1vZGUua2V5UmVsZWFzZWQoZXZlbnQpCiAgICBkZWYgbW91c2VQcmVzc2Vk"+
"KGFwcCwgZXZlbnQpOgogICAgICAgIGlmIChhcHAuX2FjdGl2ZU1vZGUgIT0gTm9uZSk6IGFwcC5fY"+
"WN0aXZlTW9kZS5tb3VzZVByZXNzZWQoZXZlbnQpCiAgICBkZWYgbW91c2VSZWxlYXNlZChhcHAsIG"+
"V2ZW50KToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb2RlICE9IE5vbmUpOiBhcHAuX2FjdGl2ZU1"+
"vZGUubW91c2VSZWxlYXNlZChldmVudCkKICAgIGRlZiBtb3VzZU1vdmVkKGFwcCwgZXZlbnQpOgog"+
"ICAgICAgIGlmIChhcHAuX2FjdGl2ZU1vZGUgIT0gTm9uZSk6IGFwcC5fYWN0aXZlTW9kZS5tb3VzZ"+
"U1vdmVkKGV2ZW50KQogICAgZGVmIG1vdXNlRHJhZ2dlZChhcHAsIGV2ZW50KToKICAgICAgICBpZi"+
"AoYXBwLl9hY3RpdmVNb2RlICE9IE5vbmUpOiBhcHAuX2FjdGl2ZU1vZGUubW91c2VEcmFnZ2VkKGV"+
"2ZW50KQogICAgZGVmIHRpbWVyRmlyZWQoYXBwKToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb2Rl"+
"ICE9IE5vbmUpOiBhcHAuX2FjdGl2ZU1vZGUudGltZXJGaXJlZCgpCiAgICBkZWYgc2l6ZUNoYW5nZ"+
"WQoYXBwKToKICAgICAgICBpZiAoYXBwLl9hY3RpdmVNb2RlICE9IE5vbmUpOgogICAgICAgICAgIC"+
"BhcHAuX2FjdGl2ZU1vZGUud2lkdGgsIGFwcC5fYWN0aXZlTW9kZS5oZWlnaHQgPSBhcHAud2lkdGg"+
"sIGFwcC5oZWlnaHQKICAgICAgICAgICAgYXBwLl9hY3RpdmVNb2RlLnNpemVDaGFuZ2VkKCkKCmNs"+
"YXNzIE1vZGUoQ1RSQ0Vudik6CiAgICBkZWYgX19pbml0X18obW9kZSwgKiprd2FyZ3MpOgogICAgI"+
"CAgIG1vZGUuYXBwID0gTm9uZQogICAgICAgIG1vZGUuX2FwcFN0YXJ0ZWRDYWxsZWQgPSBGYWxzZQ"+
"ogICAgICAgIHN1cGVyKCkuX19pbml0X18oYXV0b3J1bj1GYWxzZSwgKiprd2FyZ3MpCiAgICBkZWY"+
"gbW9kZUFjdGl2YXRlZChtb2RlKTogcGFzcwogICAgZGVmIG1vZGVEZWFjdGl2YXRlZChtb2RlKTog"+
"cGFzcwogICAgZGVmIGxvYWRJbWFnZShtb2RlLCBwYXRoPU5vbmUpOiByZXR1cm4gbW9kZS5hcHAub"+
"G9hZEltYWdlKHBhdGgpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYW"+
"luIEFwcAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmNsYXNzIEFzc2Vzc21"+
"lbnRBUEkob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHA9Tm9uZSk6CiAgICAgICAg"+
"c2VsZi5iYXNlX3VybCA9ICdodHRwczovLzE1LTExMi5jb20nCiAgICAgICAgc2VsZi5hcHAgPSBhc"+
"HAKCiAgICBkZWYgbG9naW4oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICByZXNwb2"+
"5zZSA9IHJlcXVlc3RzLnBvc3QoZid7c2VsZi5iYXNlX3VybH0vYXBpL2F1dGgvJywgZGF0YT17CiA"+
"gICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLCAncGFzc3dvcmQnOiBwYXNzd29yZAogICAg"+
"ICAgIH0pCiAgICAgICAgcmVzcG9uc2UucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgc2VsZi5oZ"+
"WFkZXJzID0gewogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGYiVG9rZW4ge3Jlc3BvbnNlLm"+
"pzb24oKVsndG9rZW4nXX0iCiAgICAgICAgfQoKICAgIGRlZiByZXF1ZXN0X3Byb2JsZW0oc2VsZiw"+
"gcHJvYmxlbV90eXBlKToKICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLnBvc3QoZid7c2VsZi5i"+
"YXNlX3VybH0vYXBpL3JlcXVlc3QtcHJvYmxlbS8nLAogICAgICAgICAgICBkYXRhPXsKICAgICAgI"+
"CAgICAgICAgICd1bml0Jzogc2VsZi5hcHAudW5pdCwgJ3Byb2JsZW1fdHlwZSc6IHByb2JsZW1fdH"+
"lwZSwKICAgICAgICAgICAgICAgICdzYWx0JzogJzEyMzQ1JwogICAgICAgICAgICB9LAogICAgICA"+
"gICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCiAgICAgICAgKQogICAgICAgIHJlc3BvbnNlLnJh"+
"aXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKClbJ2NvZGUnXQoKI"+
"CAgIGRlZiBtYWtlX3N1Ym1pc3Npb24oc2VsZiwgYW5zd2VyKToKICAgICAgICByZXNwb25zZSA9IH"+
"JlcXVlc3RzLnBvc3QoZid7c2VsZi5iYXNlX3VybH0vYXBpL21ha2Utc3VibWlzc2lvbi8nLAogICA"+
"gICAgICAgICBkYXRhPXsKICAgICAgICAgICAgICAgICd1bml0Jzogc2VsZi5hcHAudW5pdCwgJ2Fu"+
"c3dlcic6IGFuc3dlciwKICAgICAgICAgICAgICAgICdzYWx0JzogJzEyMzQ1JwogICAgICAgICAgI"+
"CB9LAogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCiAgICAgICAgKQogICAgICAgIH"+
"Jlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk"+
"KCiAgICBkZWYgZ2V0X3VuaXRfaW5mbyhzZWxmKToKICAgICAgICByZXNwb25zZSA9IHJlcXVlc3Rz"+
"LmdldChmJ3tzZWxmLmJhc2VfdXJsfS9hcGkvZ2V0LXVuaXQtaW5mby8nLAogICAgICAgICAgICBwY"+
"XJhbXM9ewogICAgICAgICAgICAgICAgJ3VuaXQnOiBzZWxmLmFwcC51bml0LCAnc2FsdCc6ICcxMj"+
"M0NScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwogICA"+
"gICAgICkKICAgICAgICByZXNwb25zZS5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICByZXR1cm4g"+
"cmVzcG9uc2UuanNvbigpCgpjbGFzcyBCdXR0b24ob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZ"+
"WxmLCB0ZXh0LCBhcHAsIGNhbGxiYWNrKToKICAgICAgICBzZWxmLmxlZnQsIHNlbGYucmlnaHQsIH"+
"NlbGYudG9wLCBzZWxmLmJvdHRvbSA9IDAsMCwwLDAKICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CiA"+
"gICAgICAgc2VsZi5jYWxsYmFjayA9IGNhbGxiYWNrCiAgICAgICAgc2VsZi5hcHAgPSBhcHAKCiAg"+
"ICBkZWYgc2V0X2Nvb3JkcyhzZWxmLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOgogICAgICAgI"+
"HNlbGYubGVmdCA9IGxlZnQKICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKICAgICAgICBzZWxmLn"+
"RvcCA9IHRvcAogICAgICAgIHNlbGYuYm90dG9tID0gYm90dG9tCgogICAgZGVmIGNoZWNrQ2xpY2s"+
"oc2VsZiwgeCwgeSk6CiAgICAgICAgaWYgeCA+PSBzZWxmLmxlZnQgYW5kIHggPD0gc2VsZi5yaWdo"+
"dCBhbmQgeSA8PSBzZWxmLmJvdHRvbSBhbmQgeSA+PSBzZWxmLnRvcDoKICAgICAgICAgICAgc2VsZ"+
"i5jYWxsYmFjaygpCgogICAgZGVmIGRyYXcoc2VsZiwgY2FudmFzKToKICAgICAgICBjYW52YXMuY3"+
"JlYXRlX3JlY3RhbmdsZShzZWxmLmxlZnQsIHNlbGYudG9wLCBzZWxmLnJpZ2h0LCBzZWxmLmJvdHR"+
"vbSwgZmlsbD0nI2ZmZWVjZicsIHdpZHRoID0gMCkKICAgICAgICBjYW52YXMuY3JlYXRlX3RleHQo"+
"c2VsZi5sZWZ0ICsgKHNlbGYucmlnaHQgLSBzZWxmLmxlZnQpIC8vIDIsIHNlbGYudG9wICsgKHNlb"+
"GYuYm90dG9tIC0gc2VsZi50b3ApIC8vIDIsIGFuY2hvcj0nY2VudGVyJywgdGV4ID0gc2VsZi50ZX"+
"h0LCBmb250ID0gZidBcmlhbCB7c2VsZi5hcHAuaGVpZ2h0IC8vIDM1fScpCgpjbGFzcyBDVFJDTW9"+
"kZShNb2RlKToKICAgIGRlZiBkcmF3Qm94KG1vZGUsIGNhbnZhcywgbGVmdCwgdG9wLCByaWdodCwg"+
"Ym90dG9tLCB0ZXh0LCB0b3BCYXJIZWlnaHQsIHRleHRNYXJnaW4sd2lkdGg9Myk6CiAgICAgICAgY"+
"2FudmFzLmNyZWF0ZV9yZWN0YW5nbGUobGVmdCwgdG9wLCByaWdodCwgdG9wQmFySGVpZ2h0ICsgdG"+
"9wLCBmaWxsPSIjRkZCRDc3Iiwgd2lkdGg9MCkKICAgICAgICBjYW52YXMuY3JlYXRlX3JlY3Rhbmd"+
"sZShsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHdpZHRoPXdpZHRoKQogICAgICAgIGNhbnZhcy5j"+
"cmVhdGVfdGV4dCgKICAgICAgICAgICAgbGVmdCArIHRleHRNYXJnaW4sICh0b3AgKyAodG9wQmFyS"+
"GVpZ2h0IC8vIDIpKSwgYW5jaG9yPSJ3IiwKICAgICAgICAgICAgdGV4dCA9IHRleHQsIGZvbnQ9Zi"+
"JBcmlhbCB7bW9kZS5hcHAuaGVpZ2h0IC8vIDQwfSIKICAgICAgICApCgogICAgZGVmIGRyYXdBY3R"+
"pb25zKG1vZGUsIGNhbnZhcywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBidXR0b25zLHdpZHRo"+
"PTMpOgogICAgICAgIHRvcEJhckhlaWdodCA9ICgoYm90dG9tIC0gdG9wKSAvLyAxMCkKICAgICAgI"+
"CB0ZXh0TWFyZ2luID0gKHJpZ2h0IC0gbGVmdCkgKiAwLjAzCiAgICAgICAgbW9kZS5kcmF3Qm94KG"+
"NhbnZhcywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCAiQWN0aW9ucyIsIHRvcEJhckhlaWdodCw"+
"gdGV4dE1hcmdpbix3aWR0aCkKICAgICAgICB0ZXh0WU1hcmdpbiA9IChib3R0b20gLSB0b3ApICog"+
"MC4wOAogICAgICAgIGJ1dHRvbk1hcmdpbiA9IChyaWdodCAtIGxlZnQpICogMC4wNwogICAgICAgI"+
"GJ1dHRvblRvcCA9IHRleHRZTWFyZ2luICsgdG9wQmFySGVpZ2h0ICsgdG9wCiAgICAgICAgcmVtYW"+
"luaW5nU3BhY2UgPSAoYm90dG9tIC0gYnV0dG9uVG9wKSAtIChsZW4oYnV0dG9ucykgKiB0ZXh0WU1"+
"hcmdpbikKICAgICAgICBidXR0b25IZWlnaHQgPSByZW1haW5pbmdTcGFjZSAvLyBsZW4oYnV0dG9u"+
"cykKICAgICAgICBmb3IgaSwgYnV0dG9uIGluIGVudW1lcmF0ZShidXR0b25zKToKICAgICAgICAgI"+
"CAgYnV0dG9uLnNldF9jb29yZHMoCiAgICAgICAgICAgICAgICBsZWZ0ICsgYnV0dG9uTWFyZ2luLA"+
"ogICAgICAgICAgICAgICAgYnV0dG9uVG9wICsgKHRleHRZTWFyZ2luICsgYnV0dG9uSGVpZ2h0KSp"+
"pLAogICAgICAgICAgICAgICAgcmlnaHQgLSBidXR0b25NYXJnaW4sCiAgICAgICAgICAgICAgICBi"+
"dXR0b25Ub3AgKyAodGV4dFlNYXJnaW4gKyBidXR0b25IZWlnaHQpKihpKzEpIC0gdGV4dFlNYXJna"+
"W4KICAgICAgICAgICAgKQogICAgICAgICAgICBidXR0b24uZHJhdyhjYW52YXMpCgogICAgZGVmIG"+
"FkZFBvcHVwKG1vZGUsIHRleHQpOgogICAgICAgIG1vZGUucG9wdXAgPSBbdGV4dCwgMzAwMF0KCiA"+
"gICBkZWYgZHJhd1BvcHVwKG1vZGUsIGNhbnZhcyk6CiAgICAgICAgaWYgbW9kZS5wb3B1cCBpcyBO"+
"b25lOiByZXR1cm4KICAgICAgICBtYXJnaW5YID0gbW9kZS53aWR0aCAvLyA2CiAgICAgICAgbWFyZ"+
"2luWSA9IG1vZGUuaGVpZ2h0IC8vIDYKICAgICAgICBsZWZ0LCByaWdodCA9IG1hcmdpblgsIG1vZG"+
"Uud2lkdGggLSBtYXJnaW5YCiAgICAgICAgdG9wLCBib3R0b20gPSBtYXJnaW5ZLCBtb2RlLmhlaWd"+
"odCAtIG1hcmdpblkKICAgICAgICBjZW50ZXJYID0gbGVmdCArIChyaWdodCAtIGxlZnQpIC8vIDIK"+
"ICAgICAgICBjZW50ZXJZID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgLy8gMgogICAgICAgIGNhbnZhc"+
"y5jcmVhdGVfcmVjdGFuZ2xlKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZmlsbD0nI2ZmZWVjZi"+
"csd2lkdGg9NCkKICAgICAgICBjYW52YXMuY3JlYXRlX3RleHQoY2VudGVyWCwgY2VudGVyWSwgdGV"+
"4dD1tb2RlLnBvcHVwWzBdLCBmb250PWYiQXJpYWwge21vZGUuYXBwLmhlaWdodCAvLyAyMn0iKQoK"+
"ICAgIGRlZiBtb3VzZVByZXNzZWQobW9kZSwgZXZlbnQpOgogICAgICAgIGZvciBidXR0b24gaW4gb"+
"W9kZS5idXR0b25zOgogICAgICAgICAgICBidXR0b24uY2hlY2tDbGljayhldmVudC54LCBldmVudC"+
"55KQoKICAgIGRlZiB0aW1lckZpcmVkKG1vZGUpOgogICAgICAgIGlmIG1vZGUucG9wdXAgaXMgbm9"+
"0IE5vbmU6CiAgICAgICAgICAgIG1vZGUucG9wdXBbMV0gLT0gbW9kZS5hcHAudGltZXJEZWxheQog"+
"ICAgICAgICAgICBpZiBtb2RlLnBvcHVwWzFdIDw9IDA6CiAgICAgICAgICAgICAgICBtb2RlLnBvc"+
"HVwID0gTm9uZQoKY2xhc3MgQ29tcGxldGlvblNjcmVlbihDVFJDTW9kZSk6CiAgICBkZWYgYWRkUG"+
"9wdXAobW9kZSwgdGV4dCk6CiAgICAgICAgbW9kZS5oaWRlVGV4dCgpCiAgICAgICAgbW9kZS5wb3B"+
"1cCA9IFt0ZXh0LCAzMDAwXQoKICAgIGRlZiBkcmF3VG9wQmFyKG1vZGUsIGNhbnZhcywgbWFyZ2lu"+
"LCB0b3BCYXJIZWlnaHQpOgogICAgICAgIGNhbnZhcy5jcmVhdGVfcmVjdGFuZ2xlKDAsMCxtb2RlL"+
"ndpZHRoLHRvcEJhckhlaWdodCxmaWxsPScjRkZBMjBDJyx3aWR0aD0wKQogICAgICAgIGNhbnZhcy"+
"5jcmVhdGVfdGV4dCgKICAgICAgICAgICAgbWFyZ2luLCB0b3BCYXJIZWlnaHQvLzIsIHRleHQ9ZiJ"+
"SZXN1bHRzIGZvciB7bW9kZS5hcHAudXNlcm5hbWV9IiwKICAgICAgICAgICAgYW5jaG9yPSJ3Iiwg"+
"Zm9udD1mIkFyaWFsIHttb2RlLmFwcC5oZWlnaHQgLy8gMjJ9IgogICAgICAgICkKCiAgICBkZWYgY"+
"XBwU3RhcnRlZChtb2RlKToKICAgICAgICBtb2RlLnBvcHVwID0gTm9uZQogICAgICAgIG1vZGUuaG"+
"9tZUJ1dHRvbiA9IEJ1dHRvbignSG9tZScsIG1vZGUuYXBwLCBsYW1iZGE6IG1vZGUuYXBwLnNldEF"+
"jdGl2ZU1vZGUobW9kZS5hcHAuaG9tZVNjcmVlbikpCiAgICAgICAgbW9kZS5idXR0b25zID0gW21v"+
"ZGUuaG9tZUJ1dHRvbl0KCiAgICBkZWYgcmVkcmF3QWxsKG1vZGUsIGNhbnZhcyk6CiAgICAgICAgb"+
"WFyZ2luID0gMC4wMiAqIG1vZGUud2lkdGgKICAgICAgICB0b3BCYXJIZWlnaHQgPSBtb2RlLmhlaW"+
"dodCAvLyA4CiAgICAgICAgbW9kZS5kcmF3VG9wQmFyKGNhbnZhcywgbWFyZ2luLCB0b3BCYXJIZWl"+
"naHQpCgogICAgICAgICMgUHJvYmxlbSBUZXh0CiAgICAgICAgaWYgaGFzYXR0cihtb2RlLCAnb3V0"+
"cHV0VGV4dEJvdW5kaW5nJyk6CiAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQgPSBtb2RlL"+
"m91dHB1dFRleHRCb3VuZGluZ1sneCddLCBtb2RlLm91dHB1dFRleHRCb3VuZGluZ1sneSddLCBtb2"+
"RlLm91dHB1dFRleHRCb3VuZGluZ1snd2lkdGgnXSwgbW9kZS5vdXRwdXRUZXh0Qm91bmRpbmdbJ2h"+
"laWdodCddCiAgICAgICAgICAgIGNhbnZhcy5jcmVhdGVfcmVjdGFuZ2xlKHgsIHksIHggKyB3aWR0"+
"aCwgeSArIGhlaWdodCwgd2lkdGg9MikKCiAgICAgICAgICAgIG1vZGUuZHJhd0FjdGlvbnMoY2Fud"+
"mFzLHgrd2lkdGgrbWFyZ2luLCB5LCBtb2RlLndpZHRoLW1hcmdpbix5K2hlaWdodCxbbW9kZS5ob2"+
"1lQnV0dG9uXSx3aWR0aD0xKQoKICAgICAgICBtb2RlLmRyYXdQb3B1cChjYW52YXMpCgogICAgZGV"+
"mIGRyYXdCb3hlcyhtb2RlLCBjYW52YXMsIG1hcmdpbiwgdG9wQmFySGVpZ2h0KToKICAgICAgICB0"+
"b3BPZkJveCA9IDEuNSAqIHRvcEJhckhlaWdodAogICAgICAgIGJvdHRvbU9mQm94ID0gbW9kZS5oZ"+
"WlnaHQgLSAodG9wQmFySGVpZ2h0IC8vIDIpCiAgICAgICAgd2lkdGhPZkJveCA9IChtb2RlLndpZH"+
"RoIC0gKDMgKiBtYXJnaW4pKSAvLyA0CgogICAgZGVmIGZvcm1hdE91dHB1dChtb2RlLCByZXN1bHR"+
"zLCB0eXBlKToKICAgICAgICBvdXQgPSBbXQogICAgICAgIGRlZiBwcmludF9zdGFycygpOgogICAg"+
"ICAgICAgICBvdXQuYXBwZW5kKCcqJyo4MCkKCiAgICAgICAgZGVmIHByaW50X2Rhc2hlcygpOgogI"+
"CAgICAgICAgICBvdXQuYXBwZW5kKCcqJyArICctJyo3OCArICcqJykKCiAgICAgICAgcHJpbnRfc3"+
"RhcnMoKQogICAgICAgIG91dC5hcHBlbmQoZicqICB7dHlwZS51cHBlcigpfSBSRVNVTFRTJy5sanV"+
"zdCg3OSkgKyAnKicpCiAgICAgICAgcHJpbnRfZGFzaGVzKCkKICAgICAgICB0aW1lID0gcmVzdWx0"+
"c1sndGltZSddCiAgICAgICAgbWludXRlcyA9IGludCh0aW1lIC8vIDYwKQogICAgICAgIHNlY29uZ"+
"HMgPSByb3VuZCh0aW1lICUgNjApCiAgICAgICAgb3V0LmFwcGVuZChmIiogIFlvdSBhbnN3ZXJlZC"+
"B7J2luJyBpZiBub3QgcmVzdWx0c1snY29ycmVjdCddIGVsc2UgJyd9Y29ycmVjdGx5IGZvciBhIHN"+
"jb3JlIG9mIHtyZXN1bHRzWydzY29yZSddfSUiLmxqdXN0KDc5KSArICcqJykKICAgICAgICBvdXQu"+
"YXBwZW5kKGYiKiAgVGltZToge21pbnV0ZXN9IG1pbiB7c2Vjb25kc30gc2VjIi5sanVzdCg3OSkgK"+
"yAnKicpCiAgICAgICAgcHJpbnRfZGFzaGVzKCkKICAgICAgICBvdXQuYXBwZW5kKCIqICBQcm9ibG"+
"VtIFN0YXRlbWVudDoiLmxqdXN0KDc5KSArICcqJykKICAgICAgICBvdXQuYXBwZW5kKCIqIiArICI"+
"gIio3OCArICIqIikKICAgICAgICBmb3IgbGluZSBpbiByZXN1bHRzWydldmFsdWF0aW9uX2luZm8n"+
"XVsnY29kZSddLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgb3V0LmFwcGVuZChmIiogIHtsaW5lf"+
"SIubGp1c3QoNzkpICsgJyonKQogICAgICAgIG91dC5hcHBlbmQoIioiICsgIiAiKjc4ICsgIioiKQ"+
"ogICAgICAgIHByaW50X2Rhc2hlcygpCiAgICAgICAgaWYgdHlwZSA9PSAnY3QnOgogICAgICAgICA"+
"gICBvdXQuYXBwZW5kKCIqICBDb3JyZWN0IEFuc3dlcjoiLmxqdXN0KDM5KSArICJ8ICBZb3VyIEFu"+
"c3dlcjogIi5sanVzdCg0MCkgKyAnKicpCiAgICAgICAgICAgIG91dC5hcHBlbmQoIioiICsgIiAiK"+
"jM4ICsgInwiICsgIiAiKjM5ICsgIioiKQogICAgICAgICAgICB5b3VyX2Fuc3dlciA9IHJlc3VsdH"+
"NbJ2V2YWx1YXRpb25faW5mbyddWyd5b3VyX2Fuc3dlciddLnNwbGl0bGluZXMoKQogICAgICAgICA"+
"gICBjb3JyZWN0X2Fuc3dlciA9IHJlc3VsdHNbJ2V2YWx1YXRpb25faW5mbyddWydjb3JyZWN0X2Fu"+
"c3dlciddLnNwbGl0bGluZXMoKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtYXgobGVuKHlvd"+
"XJfYW5zd2VyKSwgbGVuKGNvcnJlY3RfYW5zd2VyKSkpOgogICAgICAgICAgICAgICAgeW91cl9saW"+
"5lID0gIiIgaWYgaSA+PSBsZW4oeW91cl9hbnN3ZXIpIGVsc2UgeW91cl9hbnN3ZXJbaV0KICAgICA"+
"gICAgICAgICAgIGNvcnJlY3RfbGluZSA9ICIiIGlmIGkgPj0gbGVuKGNvcnJlY3RfYW5zd2VyKSBl"+
"bHNlIGNvcnJlY3RfYW5zd2VyW2ldCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGYiKiAge2Nvc"+
"nJlY3RfbGluZX0iLmxqdXN0KDM5KSArIGYifCAge3lvdXJfbGluZX0iLmxqdXN0KDQwKSArICcqJy"+
"kKICAgICAgICAgICAgb3V0LmFwcGVuZCgiKiIgKyAiICIqMzggKyAifCIgKyAiICIqMzkgKyAiKiI"+
"pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3V0LmFwcGVuZCgiKiAgWW91ciBBbnN3ZXI6Ii5s"+
"anVzdCg3OSkgKyAnKicpCiAgICAgICAgICAgIG91dC5hcHBlbmQoIioiICsgIiAiKjc4ICsgIioiK"+
"QogICAgICAgICAgICBmb3IgbGluZSBpbiByZXN1bHRzWydldmFsdWF0aW9uX2luZm8nXVsneW91cl"+
"9hbnN3ZXInXS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGYiKiAge2x"+
"pbmV9Ii5sanVzdCg3OSkgKyAnKicpCiAgICAgICAgICAgIG91dC5hcHBlbmQoIioiICsgIiAiKjc4"+
"ICsgIioiKQogICAgICAgIHByaW50X2Rhc2hlcygpCiAgICAgICAgcmV0dXJuICdcbicuam9pbihvd"+
"XQpCgogICAgZGVmIGRpc3BsYXlUZXh0KG1vZGUpOgogICAgICAgIG1hcmdpbiA9IDAuMDIgKiBtb2"+
"RlLndpZHRoCiAgICAgICAgdG9wQmFySGVpZ2h0ID0gbW9kZS5oZWlnaHQgLy8gOAoKICAgICAgICB"+
"0ZXh0V2lkdGggPSAoKG1vZGUud2lkdGggLSAzICogbWFyZ2luKSAvLyA0KSAqIDMKICAgICAgICB0"+
"ZXh0SGVpZ2h0ID0gKG1vZGUuaGVpZ2h0IC0gMiAqIG1hcmdpbiAtIHRvcEJhckhlaWdodCkKICAgI"+
"CAgICBtb2RlLm91dHB1dFRleHRCb3VuZGluZyA9IHsneCc6bWFyZ2luLCAneSc6IHRvcEJhckhlaW"+
"dodCArIG1hcmdpbiwgJ3dpZHRoJzogdGV4dFdpZHRoLCAnaGVpZ2h0JzogdGV4dEhlaWdodH0KICA"+
"gICAgICBtb2RlLm91dHB1dFRleHQgPSBUZXh0KGJkPTApCiAgICAgICAgbW9kZS5vdXRwdXRUZXh0"+
"Lmluc2VydChJTlNFUlQsIG1vZGUuZm9ybWF0T3V0cHV0KG1vZGUub3V0cHV0LCBtb2RlLnByb2JsZ"+
"W1UeXBlKSkKICAgICAgICBtb2RlLm91dHB1dFRleHQuY29uZmlnKHN0YXRlPURJU0FCTEVEKQogIC"+
"AgICAgIG1vZGUub3V0cHV0VGV4dC5jb25maWd1cmUoZm9udD0oIkNvdXJpZXIgTmV3IiwgMTQpKQo"+
"KICAgICAgICBtb2RlLm91dHB1dFRleHQucGxhY2UoKiptb2RlLm91dHB1dFRleHRCb3VuZGluZykK"+
"CiAgICBkZWYgaGlkZVRleHQobW9kZSk6CiAgICAgICAgbW9kZS5vdXRwdXRUZXh0LmRlc3Ryb3koK"+
"QoKICAgIGRlZiBtb2RlQWN0aXZhdGVkKG1vZGUpOgogICAgICAgIG1vZGUuZGlzcGxheVRleHQoKQ"+
"oKICAgIGRlZiBtb2RlRGVhY3RpdmF0ZWQobW9kZSk6CiAgICAgICAgbW9kZS5oaWRlVGV4dCgpCgo"+
"gICAgZGVmIHRpbWVyRmlyZWQobW9kZSk6CiAgICAgICAgaWYgbW9kZS5wb3B1cCBpcyBub3QgTm9u"+
"ZToKICAgICAgICAgICAgbW9kZS5wb3B1cFsxXSAtPSBtb2RlLmFwcC50aW1lckRlbGF5CiAgICAgI"+
"CAgICAgIGlmIG1vZGUucG9wdXBbMV0gPD0gMDoKICAgICAgICAgICAgICAgIG1vZGUucG9wdXAgPS"+
"BOb25lCiAgICAgICAgICAgICAgICBtb2RlLmRpc3BsYXlUZXh0KCkKCmNsYXNzIEFzc2Vzc21lbnR"+
"TY3JlZW4oQ1RSQ01vZGUpOgogICAgZGVmIGFkZFBvcHVwKG1vZGUsIHRleHQpOgogICAgICAgIG1v"+
"ZGUuaGlkZVRleHQoKQogICAgICAgIG1vZGUucG9wdXAgPSBbdGV4dCwgMzAwMF0KCiAgICBkZWYgZ"+
"HJhd1RvcEJhcihtb2RlLCBjYW52YXMsIG1hcmdpbiwgdG9wQmFySGVpZ2h0KToKICAgICAgICBjYW"+
"52YXMuY3JlYXRlX3JlY3RhbmdsZSgwLDAsbW9kZS53aWR0aCx0b3BCYXJIZWlnaHQsZmlsbD0nI0Z"+
"GQTIwQycsd2lkdGg9MCkKCiAgICAgICAgdGltZVNpbmNlU3RhcnQgPSByb3VuZCh0aW1lLnRpbWUo"+
"KSAtIG1vZGUuc3RhcnRUaW1lKQogICAgICAgIG1pbnV0ZXMgPSB0aW1lU2luY2VTdGFydCAvLyA2M"+
"AogICAgICAgIHNlY29uZHMgPSBzdHIocm91bmQodGltZVNpbmNlU3RhcnQgJSA2MCkpLnpmaWxsKD"+
"IpCgogICAgICAgIGNhbnZhcy5jcmVhdGVfdGV4dCgKICAgICAgICAgICAgbWFyZ2luLCB0b3BCYXJ"+
"IZWlnaHQvLzIsIHRleHQ9ZiJUYWtpbmcge21vZGUucHJvYmxlbVR5cGUudXBwZXIoKX0iLAogICAg"+
"ICAgICAgICBhbmNob3I9InciLCBmb250PWYiQXJpYWwge21vZGUuYXBwLmhlaWdodCAvLyAyMn0iC"+
"iAgICAgICAgKQoKICAgICAgICBjYW52YXMuY3JlYXRlX3RleHQoCiAgICAgICAgICAgIG1vZGUud2"+
"lkdGggLSBtYXJnaW4sIHRvcEJhckhlaWdodC8vMiwgdGV4dD1mIlRpbWUgRWxhcHNlZDoge21pbnV"+
"0ZXN9OntzZWNvbmRzfSIsCiAgICAgICAgICAgIGFuY2hvcj0iZSIsIGZvbnQ9ZiJBcmlhbCB7bW9k"+
"ZS5hcHAuaGVpZ2h0IC8vIDIyfSIKICAgICAgICApCgogICAgZGVmIHN1Ym1pdENvZGUobW9kZSk6C"+
"iAgICAgICAgdHJ5OgogICAgICAgICAgICBvdXRwdXQgPSBtb2RlLmFwcC5hcGkubWFrZV9zdWJtaX"+
"NzaW9uKG1vZGUuc29sdXRpb25UZXh0LmdldCgxLjAsRU5EKSkKICAgICAgICAgICAgbW9kZS5hcHA"+
"uY29tcGxldGlvblNjcmVlbi5vdXRwdXQgPSBvdXRwdXQKICAgICAgICAgICAgbW9kZS5hcHAuY29t"+
"cGxldGlvblNjcmVlbi5wcm9ibGVtVHlwZSA9IG1vZGUucHJvYmxlbVR5cGUKICAgICAgICAgICAgb"+
"W9kZS5hcHAuc2V0QWN0aXZlTW9kZShtb2RlLmFwcC5jb21wbGV0aW9uU2NyZWVuKQogICAgICAgIG"+
"V4Y2VwdDoKICAgICAgICAgICAgbW9kZS5hZGRQb3B1cCgnRmFpbGVkIHRvIHN1Ym1pdCBwcm9ibGV"+
"tLiBUcnkgYWdhaW4nKQoKICAgIGRlZiBhcHBTdGFydGVkKG1vZGUpOgogICAgICAgIG1vZGUucG9w"+
"dXAgPSBOb25lCiAgICAgICAgbW9kZS5zdWJtaXRCdXR0b24gPSBCdXR0b24oJ1N1Ym1pdCcsIG1vZ"+
"GUuYXBwLCBsYW1iZGE6IG1vZGUuc3VibWl0Q29kZSgpKQogICAgICAgIG1vZGUubGVhdmVCdXR0b2"+
"4gPSBCdXR0b24oJ1F1aXQnLCBtb2RlLmFwcCwgbGFtYmRhOiBtb2RlLmFwcC5zZXRBY3RpdmVNb2R"+
"lKG1vZGUuYXBwLmhvbWVTY3JlZW4pKQogICAgICAgIG1vZGUuYnV0dG9ucyA9IFttb2RlLnN1Ym1p"+
"dEJ1dHRvbiwgbW9kZS5sZWF2ZUJ1dHRvbl0KCiAgICBkZWYgcmVkcmF3QWxsKG1vZGUsIGNhbnZhc"+
"yk6CiAgICAgICAgbWFyZ2luID0gMC4wMiAqIG1vZGUud2lkdGgKICAgICAgICB0b3BCYXJIZWlnaH"+
"QgPSBtb2RlLmhlaWdodCAvLyA4CiAgICAgICAgbW9kZS5kcmF3VG9wQmFyKGNhbnZhcywgbWFyZ2l"+
"uLCB0b3BCYXJIZWlnaHQpCgogICAgICAgICMgUHJvYmxlbSBUZXh0CiAgICAgICAgeCwgeSwgd2lk"+
"dGgsIGhlaWdodCA9IG1vZGUucHJvYmxlbVRleHRCb3VuZGluZ1sneCddLCBtb2RlLnByb2JsZW1UZ"+
"Xh0Qm91bmRpbmdbJ3knXSwgbW9kZS5wcm9ibGVtVGV4dEJvdW5kaW5nWyd3aWR0aCddLCBtb2RlLn"+
"Byb2JsZW1UZXh0Qm91bmRpbmdbJ2hlaWdodCddCiAgICAgICAgY2FudmFzLmNyZWF0ZV9yZWN0YW5"+
"nbGUoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB3aWR0aD0yKQogICAgICAgICMgU29sdXRp"+
"b24gVGV4dAogICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQgPSBtb2RlLnNvbHV0aW9uVGV4dEJvd"+
"W5kaW5nWyd4J10sIG1vZGUuc29sdXRpb25UZXh0Qm91bmRpbmdbJ3knXSwgbW9kZS5zb2x1dGlvbl"+
"RleHRCb3VuZGluZ1snd2lkdGgnXSwgbW9kZS5zb2x1dGlvblRleHRCb3VuZGluZ1snaGVpZ2h0J10"+
"KICAgICAgICBjYW52YXMuY3JlYXRlX3JlY3RhbmdsZSh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWln"+
"aHQsIHdpZHRoPTIpCgogICAgICAgICMgQnV0dG9ucwogICAgICAgIG1vZGUuZHJhd0FjdGlvbnMoY"+
"2FudmFzLHgrd2lkdGgrbWFyZ2luLG1vZGUucHJvYmxlbVRleHRCb3VuZGluZ1sneSddLG1vZGUud2"+
"lkdGgtbWFyZ2luLHkraGVpZ2h0LFttb2RlLnN1Ym1pdEJ1dHRvbiwgbW9kZS5sZWF2ZUJ1dHRvbl0"+
"sd2lkdGg9MSkKCiAgICAgICAgbW9kZS5kcmF3UG9wdXAoY2FudmFzKQoKICAgICMgZGVmIGRyYXdC"+
"b3hlcyhtb2RlLCBjYW52YXMsIG1hcmdpbiwgdG9wQmFySGVpZ2h0KToKICAgICMgICAgIHRvcE9mQ"+
"m94ID0gMS41ICogdG9wQmFySGVpZ2h0CiAgICAjICAgICBib3R0b21PZkJveCA9IG1vZGUuaGVpZ2"+
"h0IC0gKHRvcEJhckhlaWdodCAvLyAyKQogICAgIyAgICAgd2lkdGhPZkJveCA9IChtb2RlLndpZHR"+
"oIC0gKDMgKiBtYXJnaW4pKSAvLyA0CgogICAgZGVmIGRpc3BsYXlUZXh0KG1vZGUpOgogICAgICAg"+
"IG1hcmdpbiA9IDAuMDIgKiBtb2RlLndpZHRoCiAgICAgICAgdG9wQmFySGVpZ2h0ID0gbW9kZS5oZ"+
"WlnaHQgLy8gOAoKICAgICAgICBtb2RlLnByb2JsZW1UZXh0ID0gVGV4dChiZD0wKQogICAgICAgIG"+
"1vZGUucHJvYmxlbVRleHQuaW5zZXJ0KElOU0VSVCwgbW9kZS5jb2RlKQogICAgICAgIG1vZGUucHJ"+
"vYmxlbVRleHQuY29uZmlnKHN0YXRlPURJU0FCTEVEKQogICAgICAgIG1vZGUucHJvYmxlbVRleHQu"+
"Y29uZmlndXJlKGZvbnQ9KCJDb3VyaWVyIE5ldyIsIDE1KSkKICAgICAgICBtb2RlLnNvbHV0aW9uV"+
"GV4dCA9IFRleHQoYmQ9MCkKICAgICAgICBtb2RlLnNvbHV0aW9uVGV4dC5jb25maWd1cmUoZm9udD"+
"0oIkNvdXJpZXIgTmV3IiwgMTUpKQogICAgICAgIG1vZGUuc29sdXRpb25UZXh0Lmluc2VydChJTlN"+
"FUlQsIG1vZGUuc2F2ZWRUZXh0KQoKICAgICAgICB0ZXh0V2lkdGggPSAoKG1vZGUud2lkdGggLSAz"+
"ICogbWFyZ2luKSAvLyA0KSAqIDMKICAgICAgICB0ZXh0SGVpZ2h0ID0gKG1vZGUuaGVpZ2h0IC0gM"+
"yAqIG1hcmdpbiAtIHRvcEJhckhlaWdodCkgLy8gNAoKICAgICAgICBtb2RlLnByb2JsZW1UZXh0Qm"+
"91bmRpbmcgPSB7J3gnOm1hcmdpbiwgJ3knOiB0b3BCYXJIZWlnaHQgKyBtYXJnaW4sICd3aWR0aCc"+
"6IHRleHRXaWR0aCwgJ2hlaWdodCc6IHRleHRIZWlnaHQqM30KICAgICAgICBtb2RlLnNvbHV0aW9u"+
"VGV4dEJvdW5kaW5nID0geyd4JzptYXJnaW4sICd5Jzp0b3BCYXJIZWlnaHQgKyB0ZXh0SGVpZ2h0K"+
"jMgKyBtYXJnaW4gKiAyLCAnd2lkdGgnOiB0ZXh0V2lkdGgsICdoZWlnaHQnOiB0ZXh0SGVpZ2h0fQ"+
"ogICAgICAgIG1vZGUucHJvYmxlbVRleHQucGxhY2UoKiptb2RlLnByb2JsZW1UZXh0Qm91bmRpbmc"+
"pCiAgICAgICAgbW9kZS5zb2x1dGlvblRleHQucGxhY2UoKiptb2RlLnNvbHV0aW9uVGV4dEJvdW5k"+
"aW5nKQoKICAgIGRlZiBoaWRlVGV4dChtb2RlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZ"+
"GUuc2F2ZWRUZXh0ID0gbW9kZS5zb2x1dGlvblRleHQuZ2V0KDEuMCxFTkQpCiAgICAgICAgZXhjZX"+
"B0OgogICAgICAgICAgICBtb2RlLnNhdmVkVGV4dCA9ICcnCiAgICAgICAgbW9kZS5wcm9ibGVtVGV"+
"4dC5kZXN0cm95KCkKICAgICAgICBtb2RlLnNvbHV0aW9uVGV4dC5kZXN0cm95KCkKCiAgICBkZWYg"+
"bW9kZUFjdGl2YXRlZChtb2RlKToKICAgICAgICBtb2RlLnNhdmVkVGV4dCA9ICIiCiAgICAgICAgb"+
"W9kZS5kaXNwbGF5VGV4dCgpCgogICAgZGVmIG1vZGVEZWFjdGl2YXRlZChtb2RlKToKICAgICAgIC"+
"Btb2RlLmhpZGVUZXh0KCkKCiAgICBkZWYgdGltZXJGaXJlZChtb2RlKToKICAgICAgICBpZiBtb2R"+
"lLnBvcHVwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtb2RlLnBvcHVwWzFdIC09IG1vZGUuYXBw"+
"LnRpbWVyRGVsYXkKICAgICAgICAgICAgaWYgbW9kZS5wb3B1cFsxXSA8PSAwOgogICAgICAgICAgI"+
"CAgICAgbW9kZS5wb3B1cCA9IE5vbmUKICAgICAgICAgICAgICAgIG1vZGUuZGlzcGxheVRleHQoKQ"+
"oKY2xhc3MgSG9tZVNjcmVlbihDVFJDTW9kZSk6CiAgICBkZWYgZHJhd1N0YXRzKG1vZGUsIGNhbnZ"+
"hcywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKToKICAgICAgICB0b3BCYXJIZWlnaHQgPSAoKGJv"+
"dHRvbSAtIHRvcCkgLy8gMTApCiAgICAgICAgdGV4dE1hcmdpbiA9IChyaWdodCAtIGxlZnQpICogM"+
"C4wMwogICAgICAgIG1vZGUuZHJhd0JveChjYW52YXMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbS"+
"wgZiJ7bW9kZS5hcHAudXNlcm5hbWUudGl0bGUoKX0ncyBzdGF0cyIsIHRvcEJhckhlaWdodCwgdGV"+
"4dE1hcmdpbikKICAgICAgICBtaWRkbGUgPSBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC8vIDIpCiAg"+
"ICAgICAgdGV4dFlNYXJnaW4gPSAoYm90dG9tIC0gdG9wKSAqIDAuMDUKICAgICAgICB0ZXh0VG9wI"+
"D0gdGV4dFlNYXJnaW4gKyB0b3BCYXJIZWlnaHQgKyB0b3AKICAgICAgICBjYW52YXMuY3JlYXRlX2"+
"xpbmUobWlkZGxlLCB0ZXh0VG9wLCBtaWRkbGUsIGJvdHRvbSAtIHRleHRZTWFyZ2luKQoKICAgICA"+
"gICBpZiBtb2RlLnVzZXJfZGF0YSBpcyBOb25lOiByZXR1cm4KCiAgICAgICAgZm9yIHByb2JsZW1U"+
"eXBlLCB0ZXh0TGVmdCBpbiBbKCdjdCcsIGxlZnQgKyB0ZXh0TWFyZ2luKSwgKCdyYycsIG1pZGRsZ"+
"SArIHRleHRNYXJnaW4pXToKICAgICAgICAgICAgeVN0ZXAgPSAoYm90dG9tLXRvcCkgLy8gMjAKIC"+
"AgICAgICAgICAgY2FudmFzLmNyZWF0ZV90ZXh0KHRleHRMZWZ0LCB0ZXh0VG9wLCBhbmNob3I9J25"+
"3JywgdGV4dD1wcm9ibGVtVHlwZS51cHBlcigpLCBmb250ID0gZidBcmlhbCB7bW9kZS5hcHAuaGVp"+
"Z2h0IC8vIDMwfScpCiAgICAgICAgICAgIGluZm9UZXh0VG9wID0gdGV4dFRvcCArIChtb2RlLmFwc"+
"C5oZWlnaHQgLy8gMjApCiAgICAgICAgICAgIGZvciByb3csIGRhdGEgaW4gZW51bWVyYXRlKFsoJ1"+
"Njb3JlJywgJ3Njb3JlJyksICgnQmVzdCBUaW1lJywgJ2Jlc3RfdGltZScpXSk6CiAgICAgICAgICA"+
"gICAgICBkYXRhTmFtZSwgZGF0YVR5cGUgPSBkYXRhCgogICAgICAgICAgICAgICAgZGF0YVZhbHVl"+
"ID0gbW9kZS51c2VyX2RhdGFbcHJvYmxlbVR5cGVdW2RhdGFUeXBlXQogICAgICAgICAgICAgICAga"+
"WYgZGF0YVR5cGUgPT0gJ2Jlc3RfdGltZSc6CiAgICAgICAgICAgICAgICAgICAgaWYgZGF0YVZhbH"+
"VlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzID0gaW50KGRhdGF"+
"WYWx1ZSAvLyA2MCkKICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9IHN0cihyb3VuZChk"+
"YXRhVmFsdWUgJSA2MCkpLnpmaWxsKDIpCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFWYWx1Z"+
"SA9IGYie21pbnV0ZXN9OntzZWNvbmRzfSIKCiAgICAgICAgICAgICAgICBjYW52YXMuY3JlYXRlX3"+
"RleHQodGV4dExlZnQsIGluZm9UZXh0VG9wICsgKHlTdGVwICogcm93KSwKICAgICAgICAgICAgICA"+
"gICAgICBhbmNob3IgPSAnbncnLCB0ZXh0PWYne2RhdGFOYW1lfToge2RhdGFWYWx1ZX0nLAogICAg"+
"ICAgICAgICAgICAgICAgIGZvbnQgPSBmJ0FyaWFsIHttb2RlLmFwcC5oZWlnaHQgLy8gNDB9JwogI"+
"CAgICAgICAgICAgICAgKQoKICAgIGRlZiBkcmF3VG9wQmFyKG1vZGUsIGNhbnZhcywgbWFyZ2luLC"+
"B0b3BCYXJIZWlnaHQpOgogICAgICAgIGNhbnZhcy5jcmVhdGVfcmVjdGFuZ2xlKDAsMCxtb2RlLnd"+
"pZHRoLHRvcEJhckhlaWdodCxmaWxsPScjRkZBMjBDJyx3aWR0aD0wKQogICAgICAgIGNhbnZhcy5j"+
"cmVhdGVfdGV4dCgKICAgICAgICAgICAgbWFyZ2luLCB0b3BCYXJIZWlnaHQvLzIsIHRleHQ9ZiJEY"+
"Xkge21vZGUuYXBwLnVuaXR9IENUcyBhbmQgUk9DcyIsCiAgICAgICAgICAgIGFuY2hvcj0idyIsIG"+
"ZvbnQ9ZiJBcmlhbCB7bW9kZS5hcHAuaGVpZ2h0IC8vIDIyfSIKICAgICAgICApCgogICAgZGVmIGR"+
"yYXdCb3hlcyhtb2RlLCBjYW52YXMsIG1hcmdpbiwgdG9wQmFySGVpZ2h0KToKICAgICAgICB0b3BP"+
"ZkJveCA9IDEuNSAqIHRvcEJhckhlaWdodAogICAgICAgIGJvdHRvbU9mQm94ID0gbW9kZS5oZWlna"+
"HQgLSAodG9wQmFySGVpZ2h0IC8vIDIpCiAgICAgICAgd2lkdGhPZkJveCA9IChtb2RlLndpZHRoIC"+
"0gKDMgKiBtYXJnaW4pKSAvLyA0CgogICAgICAgIG1vZGUuZHJhd1N0YXRzKGNhbnZhcyxtYXJnaW4"+
"sdG9wT2ZCb3gsbWFyZ2luK3dpZHRoT2ZCb3gqMyxib3R0b21PZkJveCkKICAgICAgICBtb2RlLmRy"+
"YXdBY3Rpb25zKGNhbnZhcywyKm1hcmdpbiArIHdpZHRoT2ZCb3gqMyx0b3BPZkJveCwyKm1hcmdpb"+
"is0KndpZHRoT2ZCb3gsYm90dG9tT2ZCb3gsW21vZGUudGFrZV9jdF9idXR0b24sIG1vZGUudGFrZV"+
"9yY19idXR0b24sIG1vZGUucmVsb2FkX2J1dHRvbiwgbW9kZS5xdWl0X2J1dHRvbl0pCgogICAgZGV"+
"mIHVwZGF0ZV91c2VyX2RhdGEobW9kZSwgcmVsb2FkPUZhbHNlKToKICAgICAgICB0cnk6CiAgICAg"+
"ICAgICAgIG1vZGUudXNlcl9kYXRhID0gbW9kZS5hcHAuYXBpLmdldF91bml0X2luZm8oKQogICAgI"+
"CAgICAgICBpZiByZWxvYWQ6IG1vZGUuYWRkUG9wdXAoJ1JlbG9hZGVkIGRhdGEnKQogICAgICAgIG"+
"V4Y2VwdDoKICAgICAgICAgICAgbW9kZS5hZGRQb3B1cCgnRmFpbGVkIHRvIGxvYWQgZGF0YS4gVHJ"+
"5IHJlbG9hZGluZycpCgogICAgZGVmIGJlZ2luQXNzZXNzbWVudChtb2RlLCBwcm9ibGVtVHlwZSk6"+
"CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb2RlID0gbW9kZS5hcHAuYXBpLnJlcXVlc3RfcHJvY"+
"mxlbShwcm9ibGVtVHlwZSkKICAgICAgICAgICAgbW9kZS5hcHAuYXNzZXNzbWVudFNjcmVlbi5wcm"+
"9ibGVtVHlwZSA9IHByb2JsZW1UeXBlCiAgICAgICAgICAgIG1vZGUuYXBwLmFzc2Vzc21lbnRTY3J"+
"lZW4uY29kZSA9IGNvZGUKICAgICAgICAgICAgbW9kZS5hcHAuYXNzZXNzbWVudFNjcmVlbi5zdGFy"+
"dFRpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgICAgICBtb2RlLmFwcC5zZXRBY3RpdmVNb2RlKG1vZ"+
"GUuYXBwLmFzc2Vzc21lbnRTY3JlZW4pCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBtb2RlLm"+
"FkZFBvcHVwKCdGYWlsZWQgdG8gcmVxdWVzdCBwcm9ibGVtLiBUcnkgYWdhaW4nKQoKICAgIGRlZiB"+
"tb2RlQWN0aXZhdGVkKG1vZGUpOgogICAgICAgIG1vZGUucG9wdXAgPSBOb25lCiAgICAgICAgbW9k"+
"ZS51c2VyX2RhdGEgPSBOb25lCiAgICAgICAgbW9kZS51cGRhdGVfdXNlcl9kYXRhKCkKICAgICAgI"+
"CBtb2RlLnRha2VfY3RfYnV0dG9uID0gQnV0dG9uKCdTdGFydCBDVCcsIG1vZGUuYXBwLCBsYW1iZG"+
"E6IG1vZGUuYmVnaW5Bc3Nlc3NtZW50KCdjdCcpKQogICAgICAgIG1vZGUudGFrZV9yY19idXR0b24"+
"gPSBCdXR0b24oJ1N0YXJ0IFJDJywgbW9kZS5hcHAsIGxhbWJkYTogbW9kZS5iZWdpbkFzc2Vzc21l"+
"bnQoJ3JjJykpCiAgICAgICAgbW9kZS5yZWxvYWRfYnV0dG9uID0gQnV0dG9uKCdSZWZyZXNoIFNjb"+
"3JlcycsIG1vZGUuYXBwLCBsYW1iZGE6IG1vZGUudXBkYXRlX3VzZXJfZGF0YShyZWxvYWQ9VHJ1ZS"+
"kpCiAgICAgICAgbW9kZS5xdWl0X2J1dHRvbiA9IEJ1dHRvbignRXhpdCcsIG1vZGUuYXBwLCBsYW1"+
"iZGE6IG1vZGUuYXBwLnF1aXQoKSkKICAgICAgICBtb2RlLmJ1dHRvbnMgPSBbbW9kZS50YWtlX2N0"+
"X2J1dHRvbiwgbW9kZS50YWtlX3JjX2J1dHRvbiwgbW9kZS5yZWxvYWRfYnV0dG9uLCBtb2RlLnF1a"+
"XRfYnV0dG9uXQoKICAgIGRlZiByZWRyYXdBbGwobW9kZSwgY2FudmFzKToKICAgICAgICBtYXJnaW"+
"4gPSAwLjAyICogbW9kZS53aWR0aAogICAgICAgIHRvcEJhckhlaWdodCA9IG1vZGUuaGVpZ2h0IC8"+
"vIDgKCiAgICAgICAgY2FudmFzLmNyZWF0ZV9yZWN0YW5nbGUoMCwwLG1vZGUud2lkdGgsbW9kZS5o"+
"ZWlnaHQsZmlsbD0nd2hpdGUnKQogICAgICAgIG1vZGUuZHJhd1RvcEJhcihjYW52YXMsIG1hcmdpb"+
"iwgdG9wQmFySGVpZ2h0KQogICAgICAgIG1vZGUuZHJhd0JveGVzKGNhbnZhcywgbWFyZ2luLCB0b3"+
"BCYXJIZWlnaHQpCgogICAgICAgIG1vZGUuZHJhd1BvcHVwKGNhbnZhcykKCiAgICBkZWYgbW91c2V"+
"QcmVzc2VkKG1vZGUsIGV2ZW50KToKICAgICAgICBmb3IgYnV0dG9uIGluIG1vZGUuYnV0dG9uczoK"+
"ICAgICAgICAgICAgYnV0dG9uLmNoZWNrQ2xpY2soZXZlbnQueCwgZXZlbnQueSkKCiAgICBkZWYgd"+
"GltZXJGaXJlZChtb2RlKToKICAgICAgICBpZiBtb2RlLnBvcHVwIGlzIG5vdCBOb25lOgogICAgIC"+
"AgICAgICBtb2RlLnBvcHVwWzFdIC09IG1vZGUuYXBwLnRpbWVyRGVsYXkKICAgICAgICAgICAgaWY"+
"gbW9kZS5wb3B1cFsxXSA8PSAwOgogICAgICAgICAgICAgICAgbW9kZS5wb3B1cCA9IE5vbmUKCmNs"+
"YXNzIE1haW4oTW9kYWxBcHApOgogICAgZGVmIHNldHVwVW5pdChhcHApOgogICAgICAgIGFwcC51b"+
"ml0ID0gMgogICAgICAgIGFwcC5hcGkgPSBBc3Nlc3NtZW50QVBJKGFwcCkKICAgICAgICBhcHAuYX"+
"BpLmxvZ2luKGFwcC51c2VybmFtZSwgYXBwLnBhc3N3b3JkKQoKICAgIGRlZiBhcHBTdGFydGVkKGF"+
"wcCk6CiAgICAgICAgdywgaCA9IGFwcC5fcm9vdC53aW5mb19zY3JlZW53aWR0aCgpLCBhcHAuX3Jv"+
"b3Qud2luZm9fc2NyZWVuaGVpZ2h0KCkKICAgICAgICBhcHAuX3Jvb3QuZ2VvbWV0cnkoIiVkeCVkK"+
"zArMCIgJSAodywgaCkpCiAgICAgICAgYXBwLl9yb290LnVwZGF0ZSgpCiAgICAgICAgYXBwLndpZH"+
"RoLCBhcHAuaGVpZ2h0ID0gYXBwLl9yb290LndpbmZvX3dpZHRoKCksIGFwcC5fcm9vdC53aW5mb19"+
"oZWlnaHQoKQogICAgICAgIGFwcC5ob21lU2NyZWVuID0gSG9tZVNjcmVlbigpCiAgICAgICAgYXBw"+
"LmFzc2Vzc21lbnRTY3JlZW4gPSBBc3Nlc3NtZW50U2NyZWVuKCkKICAgICAgICBhcHAuY29tcGxld"+
"GlvblNjcmVlbiA9IENvbXBsZXRpb25TY3JlZW4oKQoKICAgICAgICBhcHAuc2V0dXBVbml0KCkKCi"+
"AgICAgICAgYXBwLnNldEFjdGl2ZU1vZGUoYXBwLmhvbWVTY3JlZW4pCgpkZWYgZ2V0VXNlckluZm8"+
"oKToKICAgIHNhdmVkX2NyZWRlbnRpYWxzX3BhdGggPSAnY3RfcmNfbG9naW5fY3JlZGVudGlhbHMu"+
"dHh0JwogICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gJycsICcnCiAgICBpZiBvcy5wYXRoLmV4aXN0c"+
"yhzYXZlZF9jcmVkZW50aWFsc19wYXRoKToKICAgICAgICB3aXRoIG9wZW4oc2F2ZWRfY3JlZGVudG"+
"lhbHNfcGF0aCkgYXMgZjoKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZi5yZWFkKCk"+
"uc3RyaXAoKS5zcGxpdCgnLCcpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJTaWduaW5nIGluIHRv"+
"IDE1LTExMiAiKQogICAgICAgIHVzZXJuYW1lID0gaW5wdXQoIjE1LTExMiB1c2VybmFtZTogIikKI"+
"CAgICAgICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiMTUtMTEyIFBhc3N3b3JkOiAiKQogIC"+
"AgICAgIGFwaSA9IEFzc2Vzc21lbnRBUEkoKQogICAgICAgIHRyeToKICAgICAgICAgICAgYXBpLmx"+
"vZ2luKHVzZXJuYW1lLCBwYXNzd29yZCkKICAgICAgICAgICAgd2l0aCBvcGVuKHNhdmVkX2NyZWRl"+
"bnRpYWxzX3BhdGgsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZiJ7dXNlcm5hb"+
"WV9LHtwYXNzd29yZH0iKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcHJpbnQoIkluY29ycm"+
"VjdCB1c2VybmFtZSBvciBwYXNzd29yZCIpCiAgICAgICAgICAgIG9zLl9leGl0KDApCiAgICByZXR"+
"1cm4gdXNlcm5hbWUsIHBhc3N3b3JkCgpNYWluKCpnZXRVc2VySW5mbygpKQo="
)
exec(decode(code), {})